jodit 4.18.7 → 4.18.9

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 (145) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/es2015/jodit.css +1 -1
  3. package/es2015/jodit.fat.min.js +9 -9
  4. package/es2015/jodit.js +215 -47
  5. package/es2015/jodit.min.js +7 -7
  6. package/es2015/plugins/debug/debug.css +1 -1
  7. package/es2015/plugins/debug/debug.js +1 -1
  8. package/es2015/plugins/debug/debug.min.js +1 -1
  9. package/es2015/plugins/speech-recognize/speech-recognize.css +1 -1
  10. package/es2015/plugins/speech-recognize/speech-recognize.js +1 -1
  11. package/es2015/plugins/speech-recognize/speech-recognize.min.js +1 -1
  12. package/es2018/jodit.fat.min.js +9 -9
  13. package/es2018/jodit.min.js +7 -7
  14. package/es2018/plugins/debug/debug.min.js +1 -1
  15. package/es2018/plugins/speech-recognize/speech-recognize.min.js +1 -1
  16. package/es2021/jodit.css +1 -1
  17. package/es2021/jodit.fat.min.js +10 -10
  18. package/es2021/jodit.js +215 -47
  19. package/es2021/jodit.min.js +7 -7
  20. package/es2021/plugins/debug/debug.css +1 -1
  21. package/es2021/plugins/debug/debug.js +1 -1
  22. package/es2021/plugins/debug/debug.min.js +1 -1
  23. package/es2021/plugins/speech-recognize/speech-recognize.css +1 -1
  24. package/es2021/plugins/speech-recognize/speech-recognize.js +1 -1
  25. package/es2021/plugins/speech-recognize/speech-recognize.min.js +1 -1
  26. package/es2021.en/jodit.css +1 -1
  27. package/es2021.en/jodit.fat.min.js +10 -10
  28. package/es2021.en/jodit.js +189 -21
  29. package/es2021.en/jodit.min.js +7 -7
  30. package/es2021.en/plugins/debug/debug.css +1 -1
  31. package/es2021.en/plugins/debug/debug.js +1 -1
  32. package/es2021.en/plugins/debug/debug.min.js +1 -1
  33. package/es2021.en/plugins/speech-recognize/speech-recognize.css +1 -1
  34. package/es2021.en/plugins/speech-recognize/speech-recognize.js +1 -1
  35. package/es2021.en/plugins/speech-recognize/speech-recognize.min.js +1 -1
  36. package/es5/jodit.css +2 -2
  37. package/es5/jodit.fat.min.js +2 -2
  38. package/es5/jodit.js +223 -47
  39. package/es5/jodit.min.css +2 -2
  40. package/es5/jodit.min.js +2 -2
  41. package/es5/plugins/debug/debug.css +1 -1
  42. package/es5/plugins/debug/debug.js +1 -1
  43. package/es5/plugins/debug/debug.min.js +1 -1
  44. package/es5/plugins/speech-recognize/speech-recognize.css +1 -1
  45. package/es5/plugins/speech-recognize/speech-recognize.js +1 -1
  46. package/es5/plugins/speech-recognize/speech-recognize.min.js +1 -1
  47. package/es5/polyfills.fat.min.js +1 -1
  48. package/es5/polyfills.js +1 -1
  49. package/es5/polyfills.min.js +1 -1
  50. package/esm/config.d.ts +2 -2
  51. package/esm/core/constants.js +1 -1
  52. package/esm/core/ui/button/tooltip/tooltip.js +7 -0
  53. package/esm/langs/ar.d.ts +1 -0
  54. package/esm/langs/ar.js +2 -1
  55. package/esm/langs/az.d.ts +1 -0
  56. package/esm/langs/az.js +2 -1
  57. package/esm/langs/cs_cz.d.ts +1 -0
  58. package/esm/langs/cs_cz.js +2 -1
  59. package/esm/langs/de.d.ts +1 -0
  60. package/esm/langs/de.js +2 -1
  61. package/esm/langs/es.d.ts +1 -0
  62. package/esm/langs/es.js +2 -1
  63. package/esm/langs/fa.d.ts +1 -0
  64. package/esm/langs/fa.js +2 -1
  65. package/esm/langs/fi.d.ts +1 -0
  66. package/esm/langs/fi.js +2 -1
  67. package/esm/langs/fr.d.ts +1 -0
  68. package/esm/langs/fr.js +2 -1
  69. package/esm/langs/he.d.ts +1 -0
  70. package/esm/langs/he.js +2 -1
  71. package/esm/langs/hu.d.ts +1 -0
  72. package/esm/langs/hu.js +2 -1
  73. package/esm/langs/id.d.ts +1 -0
  74. package/esm/langs/id.js +2 -1
  75. package/esm/langs/it.d.ts +1 -0
  76. package/esm/langs/it.js +2 -1
  77. package/esm/langs/ja.d.ts +1 -0
  78. package/esm/langs/ja.js +2 -1
  79. package/esm/langs/ko.d.ts +1 -0
  80. package/esm/langs/ko.js +2 -1
  81. package/esm/langs/mn.d.ts +1 -0
  82. package/esm/langs/mn.js +2 -1
  83. package/esm/langs/nl.d.ts +1 -0
  84. package/esm/langs/nl.js +2 -1
  85. package/esm/langs/no.d.ts +1 -0
  86. package/esm/langs/no.js +2 -1
  87. package/esm/langs/pl.d.ts +1 -0
  88. package/esm/langs/pl.js +2 -1
  89. package/esm/langs/pt_br.d.ts +1 -0
  90. package/esm/langs/pt_br.js +2 -1
  91. package/esm/langs/ru.d.ts +1 -0
  92. package/esm/langs/ru.js +2 -1
  93. package/esm/langs/sk.d.ts +1 -0
  94. package/esm/langs/sk.js +2 -1
  95. package/esm/langs/sv.d.ts +1 -0
  96. package/esm/langs/sv.js +2 -1
  97. package/esm/langs/tr.d.ts +1 -0
  98. package/esm/langs/tr.js +2 -1
  99. package/esm/langs/ua.d.ts +1 -0
  100. package/esm/langs/ua.js +2 -1
  101. package/esm/langs/zh_cn.d.ts +1 -0
  102. package/esm/langs/zh_cn.js +2 -1
  103. package/esm/langs/zh_tw.d.ts +1 -0
  104. package/esm/langs/zh_tw.js +2 -1
  105. package/esm/modules/dialog/dialog.js +19 -3
  106. package/esm/plugins/ai-assistant/ui/ui-ai-assistant.js +11 -2
  107. package/esm/plugins/backspace/cases/check-join-neighbors.js +81 -0
  108. package/esm/plugins/backspace/cases/check-remove-char.js +6 -5
  109. package/esm/plugins/backspace/cases/check-unwrap-list-item.d.ts +26 -0
  110. package/esm/plugins/backspace/cases/check-unwrap-list-item.js +56 -0
  111. package/esm/plugins/backspace/cases/index.js +2 -0
  112. package/esm/plugins/backspace/config.d.ts +2 -2
  113. package/esm/plugins/bold/config.js +2 -2
  114. package/esm/plugins/enter/enter.js +1 -1
  115. package/esm/plugins/enter/helpers/check-br.js +7 -2
  116. package/package.json +1 -1
  117. package/types/config.d.ts +2 -2
  118. package/types/langs/ar.d.ts +1 -0
  119. package/types/langs/az.d.ts +1 -0
  120. package/types/langs/cs_cz.d.ts +1 -0
  121. package/types/langs/de.d.ts +1 -0
  122. package/types/langs/es.d.ts +1 -0
  123. package/types/langs/fa.d.ts +1 -0
  124. package/types/langs/fi.d.ts +1 -0
  125. package/types/langs/fr.d.ts +1 -0
  126. package/types/langs/he.d.ts +1 -0
  127. package/types/langs/hu.d.ts +1 -0
  128. package/types/langs/id.d.ts +1 -0
  129. package/types/langs/it.d.ts +1 -0
  130. package/types/langs/ja.d.ts +1 -0
  131. package/types/langs/ko.d.ts +1 -0
  132. package/types/langs/mn.d.ts +1 -0
  133. package/types/langs/nl.d.ts +1 -0
  134. package/types/langs/no.d.ts +1 -0
  135. package/types/langs/pl.d.ts +1 -0
  136. package/types/langs/pt_br.d.ts +1 -0
  137. package/types/langs/ru.d.ts +1 -0
  138. package/types/langs/sk.d.ts +1 -0
  139. package/types/langs/sv.d.ts +1 -0
  140. package/types/langs/tr.d.ts +1 -0
  141. package/types/langs/ua.d.ts +1 -0
  142. package/types/langs/zh_cn.d.ts +1 -0
  143. package/types/langs/zh_tw.d.ts +1 -0
  144. package/types/plugins/backspace/cases/check-unwrap-list-item.d.ts +26 -0
  145. package/types/plugins/backspace/config.d.ts +2 -2
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * jodit - Jodit is an awesome and useful wysiwyg editor with filebrowser
3
3
  * Author: Chupurnov <chupurnov@gmail.com> (https://xdsoft.net/jodit/)
4
- * Version: v4.18.7
4
+ * Version: v4.18.9
5
5
  * Url: https://xdsoft.net/jodit/
6
6
  * License(s): MIT
7
7
  */
@@ -1822,7 +1822,7 @@ __webpack_require__.r(__webpack_exports__);
1822
1822
  * ```
1823
1823
  * @packageDocumentation
1824
1824
  * @module constants
1825
- */ const APP_VERSION = "4.18.7";
1825
+ */ const APP_VERSION = "4.18.9";
1826
1826
  // prettier-ignore
1827
1827
  const ES = "es2021";
1828
1828
  const IS_ES_MODERN = true;
@@ -15394,6 +15394,12 @@ class UITooltip extends jodit_core_ui_element__WEBPACK_IMPORTED_MODULE_9__.UIEle
15394
15394
  if (!isOwn) {
15395
15395
  return;
15396
15396
  }
15397
+ // A dialog's `aria-label` is its title and a file input's names its
15398
+ // click target. Neither is a tooltip, and both boxes would put one off
15399
+ // the screen
15400
+ if ((0,jodit_core_helpers_utils__WEBPACK_IMPORTED_MODULE_8__.attr)(e.target, 'role') === 'dialog' || jodit_core_dom__WEBPACK_IMPORTED_MODULE_4__.Dom.isTag(e.target, 'input') && e.target.type === 'file') {
15401
+ return;
15402
+ }
15397
15403
  this.__currentTarget = e.target;
15398
15404
  const target = e.target;
15399
15405
  this.__open(()=>{
@@ -19822,6 +19828,9 @@ ContextMenu = (0,_swc_helpers_ts_decorate__WEBPACK_IMPORTED_MODULE_0__.__decorat
19822
19828
 
19823
19829
 
19824
19830
 
19831
+ /**
19832
+ * A position from 0 up to `max`, or 0 when the panel is larger than the window
19833
+ */ const clampToWindow = (value, max)=>Math.max(0, Math.min(value, max));
19825
19834
  jodit_config__WEBPACK_IMPORTED_MODULE_15__.Config.prototype.dialog = {
19826
19835
  namespace: '',
19827
19836
  extraButtons: [],
@@ -19841,6 +19850,7 @@ jodit_config__WEBPACK_IMPORTED_MODULE_15__.Config.prototype.dialog = {
19841
19850
  jodit_config__WEBPACK_IMPORTED_MODULE_15__.Config.prototype.controls.dialog = {
19842
19851
  close: {
19843
19852
  icon: 'cancel',
19853
+ tooltip: 'Close',
19844
19854
  exec: (dialog)=>{
19845
19855
  dialog.close();
19846
19856
  }
@@ -19912,6 +19922,11 @@ class Dialog extends jodit_core_view_view_with_toolbar__WEBPACK_IMPORTED_MODULE_
19912
19922
  this.startY = e.clientY;
19913
19923
  this.startPoint.x = (0,jodit_core_helpers_utils__WEBPACK_IMPORTED_MODULE_10__.css)(this.dialog, 'left');
19914
19924
  this.startPoint.y = (0,jodit_core_helpers_utils__WEBPACK_IMPORTED_MODULE_10__.css)(this.dialog, 'top');
19925
+ // Rounded up: at the right edge a fraction of a pixel less room would
19926
+ // wrap the header of a panel that has no width of its own
19927
+ const { width, height } = this.dialog.getBoundingClientRect();
19928
+ this.startPoint.w = Math.ceil(width);
19929
+ this.startPoint.h = Math.ceil(height);
19915
19930
  this.setMaxZIndex();
19916
19931
  if (e.cancelable) {
19917
19932
  e.preventDefault();
@@ -19927,7 +19942,11 @@ class Dialog extends jodit_core_view_view_with_toolbar__WEBPACK_IMPORTED_MODULE_
19927
19942
  }
19928
19943
  __onMouseMove(e) {
19929
19944
  if (this.draggable && this.o.draggable) {
19930
- this.setPosition(this.startPoint.x + e.clientX - this.startX, this.startPoint.y + e.clientY - this.startY);
19945
+ const { documentElement } = this.od;
19946
+ // Keep the whole panel in the window at the size it had when the
19947
+ // drag began. A panel with no width of its own would otherwise
19948
+ // shrink as it neared the right edge, and then leave the window
19949
+ this.setPosition(clampToWindow(this.startPoint.x + e.clientX - this.startX, (documentElement.clientWidth || this.ow.innerWidth) - this.startPoint.w), clampToWindow(this.startPoint.y + e.clientY - this.startY, (documentElement.clientHeight || this.ow.innerHeight) - this.startPoint.h));
19931
19950
  if (this.e) {
19932
19951
  /**
19933
19952
  * Fired when dialog box is moved
@@ -20052,8 +20071,8 @@ class Dialog extends jodit_core_view_view_with_toolbar__WEBPACK_IMPORTED_MODULE_
20052
20071
  }
20053
20072
  // strings on purpose: `css()` would truncate fractional pixels
20054
20073
  ;(0,jodit_core_helpers_utils__WEBPACK_IMPORTED_MODULE_10__.css)(this.dialog, {
20055
- left: (x || left) + 'px',
20056
- top: (y || top) + 'px'
20074
+ left: (x ?? left) + 'px',
20075
+ top: (y ?? top) + 'px'
20057
20076
  });
20058
20077
  return this;
20059
20078
  }
@@ -27967,8 +27986,21 @@ class UiAiAssistant extends jodit_core_ui_element__WEBPACK_IMPORTED_MODULE_7__.U
27967
27986
  this.__toggleSubmitButton(true);
27968
27987
  }
27969
27988
  };
27970
- this.__submitButton = (0,jodit_core_ui__WEBPACK_IMPORTED_MODULE_6__.Button)(jodit, 'ai-assistant', '').onAction(onSubmit);
27971
- this.__tryAgainButton = (0,jodit_core_ui__WEBPACK_IMPORTED_MODULE_6__.Button)(jodit, 'update', '', 'initial').onAction(onSubmit);
27989
+ this.__submitButton = (0,jodit_core_ui__WEBPACK_IMPORTED_MODULE_6__.Button)(jodit, {
27990
+ icon: {
27991
+ name: 'ai-assistant'
27992
+ },
27993
+ name: 'ai-assistant',
27994
+ tooltip: 'Submit'
27995
+ }).onAction(onSubmit);
27996
+ this.__tryAgainButton = (0,jodit_core_ui__WEBPACK_IMPORTED_MODULE_6__.Button)(jodit, {
27997
+ icon: {
27998
+ name: 'update'
27999
+ },
28000
+ name: 'update',
28001
+ tooltip: 'Try Again',
28002
+ variant: 'initial'
28003
+ }).onAction(onSubmit);
27972
28004
  this.promptInput = new jodit_core_ui__WEBPACK_IMPORTED_MODULE_6__.UITextArea(jodit, {
27973
28005
  name: 'prompt',
27974
28006
  required: true,
@@ -28191,6 +28223,9 @@ jodit_core_global__WEBPACK_IMPORTED_MODULE_3__.pluginSystem.add('backspace', bac
28191
28223
  * Check if two separate elements can be connected
28192
28224
  * @private
28193
28225
  */ function checkJoinNeighbors(jodit, fakeNode, backspace) {
28226
+ if (checkJoinBareText(jodit, fakeNode, backspace)) {
28227
+ return true;
28228
+ }
28194
28229
  let nextBox = fakeNode, mainClosestBox = nextBox;
28195
28230
  // Find the main big closest element
28196
28231
  while(nextBox && !jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.findNotEmptySibling(nextBox, backspace) && nextBox.parentElement !== jodit.editor){
@@ -28218,7 +28253,7 @@ jodit_core_global__WEBPACK_IMPORTED_MODULE_3__.pluginSystem.add('backspace', bac
28218
28253
  return true;
28219
28254
  }
28220
28255
  const box = findCaretBox(fakeNode, mainClosestBox);
28221
- if (sibling && (checkPullNextLine(jodit, fakeNode, box, sibling, backspace) || checkMoveListContent(jodit, box, sibling, backspace) || moveContentAndRemoveEmpty(jodit, box, findEdgeBlock(resolveTableSibling(sibling, backspace), backspace, jodit.editor), backspace))) {
28256
+ if (sibling && (checkPullNextLine(jodit, fakeNode, box, sibling, backspace) || checkMoveListContent(jodit, box, sibling, backspace) || checkJoinInlineSibling(jodit, box, sibling, backspace) || moveContentAndRemoveEmpty(jodit, box, findEdgeBlock(resolveTableSibling(sibling, backspace), backspace, jodit.editor), backspace))) {
28222
28257
  jodit.s.setCursorBefore(fakeNode);
28223
28258
  return true;
28224
28259
  }
@@ -28303,6 +28338,70 @@ jodit_core_global__WEBPACK_IMPORTED_MODULE_3__.pluginSystem.add('backspace', bac
28303
28338
  }
28304
28339
  return true;
28305
28340
  }
28341
+ /**
28342
+ * A block next to bare text in the same parent joins that text, as the
28343
+ * browsers do: `<li>one<p>|two</p></li>` gives `<li>one|two</li>`, and
28344
+ * `<li><p>one|</p>two</li>` gives `<li><p>one|two</p></li>`
28345
+ * @private
28346
+ */ function checkJoinInlineSibling(jodit, box, sibling, backspace) {
28347
+ if (jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isBlock(sibling) || !jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isBlock(box) || jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isList(box) || // The caret's block is nested deeper than the text: `text<div><p>|x</p></div>`
28348
+ box.parentNode !== sibling.parentNode || Array.from(box.childNodes).some((node)=>jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isBlock(node))) {
28349
+ return false;
28350
+ }
28351
+ if (backspace) {
28352
+ // Text after the block keeps its own line
28353
+ const next = jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.findNotEmptySibling(box, false);
28354
+ if (next && !jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isBlock(next) && !jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isTag(next, 'br')) {
28355
+ jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.after(box, jodit.createInside.element('br'));
28356
+ }
28357
+ jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.unwrap(box);
28358
+ return true;
28359
+ }
28360
+ const filter = (0,jodit_plugins_backspace_helpers__WEBPACK_IMPORTED_MODULE_2__.getMoveFilter)(jodit);
28361
+ for(let node = sibling; node && !jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isBlock(node);){
28362
+ const next = node.nextSibling;
28363
+ if (jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isTag(node, 'br')) {
28364
+ jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.safeRemove(node);
28365
+ break;
28366
+ }
28367
+ filter(node) ? jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.append(box, node) : jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.safeRemove(node);
28368
+ node = next;
28369
+ }
28370
+ return true;
28371
+ }
28372
+ /**
28373
+ * Bare text next to a block in the same parent, as the browsers join them:
28374
+ * Backspace in `<div><p>a</p>|b</div>` gives `<div><p>a|b</p></div>`, Delete
28375
+ * in `<div>a|<p>b</p>c</div>` gives `<div>a|b<br>c</div>`
28376
+ */ function checkJoinBareText(jodit, fakeNode, backspace) {
28377
+ const block = jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.findNotEmptySibling(fakeNode, backspace);
28378
+ if (!jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isElement(block) || !jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isBlock(block) || jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isList(block) || jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isTag(block, 'table') || jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isCell(block) || !jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isContentEditable(block, jodit.editor) || Array.from(block.childNodes).some((node)=>jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isBlock(node))) {
28379
+ return false;
28380
+ }
28381
+ const filter = (0,jodit_plugins_backspace_helpers__WEBPACK_IMPORTED_MODULE_2__.getMoveFilter)(jodit);
28382
+ if (backspace) {
28383
+ // The caret's line goes to the end of the block before it
28384
+ for(let node = fakeNode; node && !jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isBlock(node);){
28385
+ const next = node.nextSibling;
28386
+ if (jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isTag(node, 'br')) {
28387
+ jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.safeRemove(node);
28388
+ break;
28389
+ }
28390
+ filter(node) ? jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.append(block, node) : jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.safeRemove(node);
28391
+ node = next;
28392
+ }
28393
+ } else {
28394
+ // The block's content joins the caret's line, and text after the
28395
+ // block keeps its own line
28396
+ const next = jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.findNotEmptySibling(block, false);
28397
+ if (next && !jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isBlock(next) && !jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isTag(next, 'br')) {
28398
+ jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.after(block, jodit.createInside.element('br'));
28399
+ }
28400
+ jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.unwrap(block);
28401
+ }
28402
+ jodit.s.setCursorBefore(fakeNode);
28403
+ return true;
28404
+ }
28306
28405
  function checkMoveListContent(jodit, mainClosestBox, sibling, backspace) {
28307
28406
  // Process UL/LI/OL cases
28308
28407
  const siblingIsList = jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isTag(sibling, jodit_core_constants__WEBPACK_IMPORTED_MODULE_0__.LIST_TAGS);
@@ -28514,10 +28613,11 @@ function getNextInlineSibling(sibling, backspace, root) {
28514
28613
  let nextSibling = jodit_core_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.sibling(sibling, backspace);
28515
28614
  if (!nextSibling && sibling.parentNode && sibling.parentNode !== root) {
28516
28615
  nextSibling = (0,jodit_plugins_backspace_helpers__WEBPACK_IMPORTED_MODULE_3__.findMostNestedNeighbor)(sibling, !backspace, root, true);
28517
- // Do not cross a list-item boundary. At the start of a list item the
28518
- // neighbor can be the text of the parent/previous item; deleting a char
28519
- // there is wrong — the list cases must handle the outdent/merge (#1277).
28520
- if (nextSibling && jodit_core_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.closest(sibling, 'li', root) !== jodit_core_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.closest(nextSibling, 'li', root)) {
28616
+ // Do not cross a block boundary. At the start of a list item the
28617
+ // neighbor can be the text of the parent/previous item (#1277), and at
28618
+ // the start of a paragraph the text before it in the same parent
28619
+ // (#1693); deleting a char there is wrong — the join cases handle them.
28620
+ if (nextSibling && jodit_core_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.closest(sibling, jodit_core_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isBlock, root) !== jodit_core_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.closest(nextSibling, jodit_core_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isBlock, root)) {
28521
28621
  return null;
28522
28622
  }
28523
28623
  }
@@ -28895,6 +28995,69 @@ function isSpace(char) {
28895
28995
  }
28896
28996
 
28897
28997
 
28998
+ /***/ }),
28999
+
29000
+ /***/ 88426:
29001
+ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
29002
+
29003
+ "use strict";
29004
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
29005
+ /* harmony export */ checkUnwrapListItem: function() { return /* binding */ checkUnwrapListItem; }
29006
+ /* harmony export */ });
29007
+ /* harmony import */ var jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(23211);
29008
+ /*!
29009
+ * Jodit Editor (https://xdsoft.net/jodit/)
29010
+ * Released under MIT see LICENSE.txt in the project root for license information.
29011
+ * Copyright (c) 2013-2026 Valerii Chupurnov. All rights reserved. https://xdsoft.net
29012
+ */ /**
29013
+ * @module plugins/backspace
29014
+ */
29015
+ /**
29016
+ * Backspace at the start of a later list item takes the bullet off, as Word
29017
+ * does: the item becomes a paragraph where it was, and the list is split
29018
+ * around it. A split `<ol>` carries its numbering on with `start`.
29019
+ *
29020
+ * @example
29021
+ * ```html
29022
+ * <ol><li>first</li><li>|second</li><li>third</li></ol>
29023
+ * ```
29024
+ * Result
29025
+ * ```html
29026
+ * <ol><li>first</li></ol><p>|second</p><ol start="2"><li>third</li></ol>
29027
+ * ```
29028
+ *
29029
+ * @private
29030
+ */ function checkUnwrapListItem(jodit, fakeNode, backspace) {
29031
+ if (!backspace) {
29032
+ return false;
29033
+ }
29034
+ const li = jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.closest(fakeNode, 'li', jodit.editor);
29035
+ const list = li ? li.parentElement : null;
29036
+ if (!li || !jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.isList(list) || !li.previousElementSibling || jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.isEmpty(li) || Array.from(li.childNodes).some((node)=>jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.isBlock(node)) || !jodit.s.cursorInTheEdge(true, li)) {
29037
+ return false;
29038
+ }
29039
+ const p = jodit.createInside.element(jodit.o.enterBlock);
29040
+ jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.after(list, p);
29041
+ if (li.nextElementSibling) {
29042
+ const rest = list.cloneNode(false);
29043
+ // Two lists cannot share one id
29044
+ rest.removeAttribute('id');
29045
+ while(li.nextSibling){
29046
+ jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.append(rest, li.nextSibling);
29047
+ }
29048
+ if (jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.isTag(list, 'ol')) {
29049
+ const start = parseInt(list.getAttribute('start') || '1', 10) || 1;
29050
+ rest.setAttribute('start', String(start + list.children.length - 1));
29051
+ }
29052
+ jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.after(p, rest);
29053
+ }
29054
+ jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.moveContent(li, p);
29055
+ jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.safeRemove(li);
29056
+ jodit.s.setCursorBefore(fakeNode);
29057
+ return true;
29058
+ }
29059
+
29060
+
28898
29061
  /***/ }),
28899
29062
 
28900
29063
  /***/ 17523:
@@ -28911,6 +29074,7 @@ function isSpace(char) {
28911
29074
  /* harmony import */ var _check_remove_unbreakable_element__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(93890);
28912
29075
  /* harmony import */ var _check_table_cell__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(12443);
28913
29076
  /* harmony import */ var _check_unwrap_first_list_item__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(10157);
29077
+ /* harmony import */ var _check_unwrap_list_item__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(88426);
28914
29078
  /*!
28915
29079
  * Jodit Editor (https://xdsoft.net/jodit/)
28916
29080
  * Released under MIT see LICENSE.txt in the project root for license information.
@@ -28926,6 +29090,7 @@ function isSpace(char) {
28926
29090
 
28927
29091
 
28928
29092
 
29093
+
28929
29094
  /**
28930
29095
  * Ordered delete/backspace cases with stable keys. The first one returning
28931
29096
  * `true` wins. The keys are stable across minified builds (function names are
@@ -28960,6 +29125,10 @@ function isSpace(char) {
28960
29125
  'join-two-lists',
28961
29126
  _check_join_two_lists__WEBPACK_IMPORTED_MODULE_1__.checkJoinTwoLists
28962
29127
  ],
29128
+ [
29129
+ 'unwrap-list-item',
29130
+ _check_unwrap_list_item__WEBPACK_IMPORTED_MODULE_9__.checkUnwrapListItem
29131
+ ],
28963
29132
  [
28964
29133
  'join-neighbors',
28965
29134
  _check_join_neighbors__WEBPACK_IMPORTED_MODULE_0__.checkJoinNeighbors
@@ -29206,13 +29375,13 @@ jodit_config__WEBPACK_IMPORTED_MODULE_0__.Config.prototype.controls.subscript =
29206
29375
  tags: [
29207
29376
  'sub'
29208
29377
  ],
29209
- tooltip: 'subscript'
29378
+ tooltip: 'Subscript'
29210
29379
  };
29211
29380
  jodit_config__WEBPACK_IMPORTED_MODULE_0__.Config.prototype.controls.superscript = {
29212
29381
  tags: [
29213
29382
  'sup'
29214
29383
  ],
29215
- tooltip: 'superscript'
29384
+ tooltip: 'Superscript'
29216
29385
  };
29217
29386
  jodit_config__WEBPACK_IMPORTED_MODULE_0__.Config.prototype.controls.bold = {
29218
29387
  tagRegExp: /^(strong|b)$/i,
@@ -32307,7 +32476,7 @@ jodit_core_global__WEBPACK_IMPORTED_MODULE_2__.pluginSystem.add('dtd', dtd);
32307
32476
  ]);
32308
32477
  let block = (0,_helpers__WEBPACK_IMPORTED_MODULE_7__.getBlockWrapper)(fake, jodit);
32309
32478
  const isLi = jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_3__.Dom.isLeaf(block);
32310
- // if use <br> defaultTag for break line or when was entered SHIFt key or in <td> or <th> or <blockquote>
32479
+ // if use <br> defaultTag for break line or when was entered SHIFt key or in <td>, <th> or <blockquote> without an inner block
32311
32480
  if ((!isLi || event?.shiftKey) && (0,_helpers__WEBPACK_IMPORTED_MODULE_7__.checkBR)(fake, jodit, event?.shiftKey, block)) {
32312
32481
  return false;
32313
32482
  }
@@ -32371,10 +32540,9 @@ jodit_core_global__WEBPACK_IMPORTED_MODULE_4__.pluginSystem.add('enter', enter);
32371
32540
  * Checks the possibility and necessity of inserting a BR instead of a block
32372
32541
  * @private
32373
32542
  */ function checkBR(fake, jodit, shiftKeyPressed, block) {
32374
- const isMultiLineBlock = Boolean(jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.closest(fake, [
32375
- 'pre',
32376
- 'blockquote'
32377
- ], jodit.editor));
32543
+ // Text in a <pre>, or bare text in a quote, gets a BR. A real block inside
32544
+ // a quote (<p>, <h3>, ...) is split like anywhere else, as in a cell below.
32545
+ const isMultiLineBlock = Boolean(jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.closest(fake, 'pre', jodit.editor)) || (block ? jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.isTag(block, 'blockquote') : Boolean(jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_1__.Dom.closest(fake, 'blockquote', jodit.editor)));
32378
32546
  // A cell itself can't be split into two cells, so bare cell content gets
32379
32547
  // a BR. But when the cell already holds a real block (<p>, <h3>, ...) that
32380
32548
  // block is split like anywhere else, otherwise every line of the cell
@@ -32384,7 +32552,7 @@ jodit_core_global__WEBPACK_IMPORTED_MODULE_4__.pluginSystem.add('enter', enter);
32384
32552
  'th'
32385
32553
  ], jodit.editor)));
32386
32554
  const isBRMode = jodit.o.enter.toLowerCase() === jodit_core_constants__WEBPACK_IMPORTED_MODULE_0__.BR.toLowerCase();
32387
- // if you use <br> defaultTag for break line or when was entered SHIFt key or in <td> or <th> or <blockquote>
32555
+ // if you use <br> defaultTag for break line or when was entered SHIFt key or in <td>, <th> or <blockquote> without an inner block
32388
32556
  if (isBRMode || isCell || shiftKeyPressed && !isMultiLineBlock || !shiftKeyPressed && isMultiLineBlock) {
32389
32557
  // 2 BR before
32390
32558
  if (isMultiLineBlock && checkSeveralBR(fake)) {
@@ -47223,7 +47391,7 @@ module.exports["default"] = {"Type something":"Start writing...","pencil":"Edit"
47223
47391
  /***/ 53414:
47224
47392
  /***/ (function(module) {
47225
47393
 
47226
- module.exports["default"] = [" URL","--Not Set--","About Jodit","Add column","Add folder","Add row","Advanced","Align","Align Center","Align Justify","Align Left","Align Right","All","Alternative","Alternative text","Anchor","Apply","Are you sure?","Audio properties","Autoplay","Background","Bold","Border","Border radius","Bottom","Break","Browse","Buy full version","Cancel","Center","Change mode","Chars: %d","Choose Content to Paste","Circle","Class name","Classes","Clean","Clear Formatting","Code","Controls","Copy selection","Copyright © XDSoft.net - Chupurnov Valeriy. All rights reserved.","Create directory","Crop","Cut selection","Decrease Indent","Default","Delete","Delete column","Delete row","Delete table","Dot","Drop file","Drop image","Edit","Edit image","Edit link","Embed code","Empty cell","Enter Directory name","Enter new name","Error on load folders","Error on load list","Eye","File Browser","Fill color or set the text color","Filter","Find","Find Next","Find Previous","Font family","Font size","For information about the license, please go to our website:","Free Non-commercial Version","Heading 1","Heading 2","Heading 3","Heading 4","Height","Horizontal align","Image","Image properties","Increase Indent","Insert","Insert Horizontal Line","Insert Image","Insert Ordered List","Insert Special Character","Insert Unordered List","Insert as Text","Insert className","Insert column after","Insert column before","Insert file","Insert format block","Insert link","Insert only Text","Insert row above","Insert row below","Insert table","Insert youtube/vimeo video","Interim Results","Italic","Jodit Editor","Jodit User's Guide","Keep","Keep Aspect Ratio","Left","License: %s","Line height","Link","List view","Loop","Lower Alpha","Lower Greek","Lower Roman","Margins","Merge","Middle","Muted","No","No follow","Normal","Number for the first item","Ok","Open in fullsize","Open in new tab","Open link","Open link in new tab","Paint format","Paste","Paste as HTML","Paste from clipboard","Please enter a web address","Please fill out this field","Poster","Press Alt for custom resizing","Print","Quadrate","Quote","Redo","Remove","Remove file","Rename","Replace","Replace with","Reset","Resize","Right","Save","Save as ...","Search for","Select","Select %s","Select Special Character","Select all","Select file","Show all","Sort by changed","Sort by name","Sort by size","Sound","Speech Recognize","Spellcheck","Split","Split horizontal","Split vertical","Src","Start at...","Start numbering at","Strike through","Styles","Text","The image has been successfully uploaded to the host!","The pasted content is coming from a Microsoft Word/Excel document. Do you want to keep the format or clean it up?","There are no files","Tiles view","Title","Top","Type something","Underline","Undo","Unlink","Update","Update file list","Upload","Upload file","Upper Alpha","Upper Roman","Vertical align","Video properties","Width","Word Paste Detected","Words: %d","Yes","You can only edit your own images. Download this image on the host?","Your browser doesn't support direct access to the clipboard.","Your code is similar to HTML. Keep as HTML?","about","apply","bold","bottom","brush","circle","contains detailed help for using","copy","cut","default","delete","dot","download","edit","eraser","file","font","fontsize","fullsize","hr","image","indent","italic","left","link","newline","ol","or click","outdent","palette","paragraph","pencil","preview","print","redo","right","selectall","shrink","sound","source","space","spellcheck","square","strikethrough","subscript","superscript","table","top","type dir name","type name","ul","underline","undo","video"]
47394
+ module.exports["default"] = [" URL","--Not Set--","About Jodit","Add column","Add folder","Add row","Advanced","Align","Align Center","Align Justify","Align Left","Align Right","All","Alternative","Alternative text","Anchor","Apply","Are you sure?","Audio properties","Autoplay","Background","Bold","Border","Border radius","Bottom","Break","Browse","Buy full version","Cancel","Center","Change mode","Chars: %d","Choose Content to Paste","Circle","Class name","Classes","Clean","Clear Formatting","Close","Code","Controls","Copy selection","Copyright © XDSoft.net - Chupurnov Valeriy. All rights reserved.","Create directory","Crop","Cut selection","Decrease Indent","Default","Delete","Delete column","Delete row","Delete table","Dot","Drop file","Drop image","Edit","Edit image","Edit link","Embed code","Empty cell","Enter Directory name","Enter new name","Error on load folders","Error on load list","Eye","File Browser","Fill color or set the text color","Filter","Find","Find Next","Find Previous","Font family","Font size","For information about the license, please go to our website:","Free Non-commercial Version","Heading 1","Heading 2","Heading 3","Heading 4","Height","Horizontal align","Image","Image properties","Increase Indent","Insert","Insert Horizontal Line","Insert Image","Insert Ordered List","Insert Special Character","Insert Unordered List","Insert as Text","Insert className","Insert column after","Insert column before","Insert file","Insert format block","Insert link","Insert only Text","Insert row above","Insert row below","Insert table","Insert youtube/vimeo video","Interim Results","Italic","Jodit Editor","Jodit User's Guide","Keep","Keep Aspect Ratio","Left","License: %s","Line height","Link","List view","Loop","Lower Alpha","Lower Greek","Lower Roman","Margins","Merge","Middle","Muted","No","No follow","Normal","Number for the first item","Ok","Open in fullsize","Open in new tab","Open link","Open link in new tab","Paint format","Paste","Paste as HTML","Paste from clipboard","Please enter a web address","Please fill out this field","Poster","Press Alt for custom resizing","Print","Quadrate","Quote","Redo","Remove","Remove file","Rename","Replace","Replace with","Reset","Resize","Right","Save","Save as ...","Search for","Select","Select %s","Select Special Character","Select all","Select file","Show all","Sort by changed","Sort by name","Sort by size","Sound","Speech Recognize","Spellcheck","Split","Split horizontal","Split vertical","Src","Start at...","Start numbering at","Strike through","Styles","Text","The image has been successfully uploaded to the host!","The pasted content is coming from a Microsoft Word/Excel document. Do you want to keep the format or clean it up?","There are no files","Tiles view","Title","Top","Type something","Underline","Undo","Unlink","Update","Update file list","Upload","Upload file","Upper Alpha","Upper Roman","Vertical align","Video properties","Width","Word Paste Detected","Words: %d","Yes","You can only edit your own images. Download this image on the host?","Your browser doesn't support direct access to the clipboard.","Your code is similar to HTML. Keep as HTML?","about","apply","bold","bottom","brush","circle","contains detailed help for using","copy","cut","default","delete","dot","download","edit","eraser","file","font","fontsize","fullsize","hr","image","indent","italic","left","link","newline","ol","or click","outdent","palette","paragraph","pencil","preview","print","redo","right","selectall","shrink","sound","source","space","spellcheck","square","strikethrough","subscript","superscript","table","top","type dir name","type name","ul","underline","undo","video"]
47227
47395
 
47228
47396
  /***/ }),
47229
47397