jodit 3.9.6 → 3.11.2

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 (144) hide show
  1. package/.idea/dictionaries/v_chupurnov.xml +1 -0
  2. package/.idea/workspace.xml +197 -179
  3. package/CHANGELOG.MD +279 -133
  4. package/build/jodit.css +185 -130
  5. package/build/jodit.es2018.css +175 -126
  6. package/build/jodit.es2018.en.css +175 -126
  7. package/build/jodit.es2018.en.js +709 -367
  8. package/build/jodit.es2018.en.min.css +1 -1
  9. package/build/jodit.es2018.en.min.js +1 -1
  10. package/build/jodit.es2018.js +709 -367
  11. package/build/jodit.es2018.min.css +1 -1
  12. package/build/jodit.es2018.min.js +1 -1
  13. package/build/jodit.js +1362 -900
  14. package/build/jodit.min.css +2 -2
  15. package/build/jodit.min.js +1 -1
  16. package/package.json +22 -11
  17. package/src/core/async.ts +4 -0
  18. package/src/core/component/statuses.ts +6 -6
  19. package/src/core/dom.ts +25 -5
  20. package/src/core/events/event-emitter.ts +4 -2
  21. package/src/core/global.ts +15 -4
  22. package/src/core/helpers/append-script.ts +14 -0
  23. package/src/core/helpers/selector.ts +8 -3
  24. package/src/core/request/ajax.ts +5 -2
  25. package/src/core/request/response.ts +8 -4
  26. package/src/core/selection/style/api/toggle/toggle-css.ts +1 -1
  27. package/src/core/ui/button/button/button.less +8 -8
  28. package/src/core/ui/button/button/button.ts +9 -9
  29. package/src/core/ui/button/group/group.ts +2 -2
  30. package/src/core/ui/element.ts +4 -3
  31. package/src/core/ui/form/block/block.ts +1 -1
  32. package/src/core/ui/form/form.ts +8 -0
  33. package/src/core/ui/form/inputs/area/area.less +5 -0
  34. package/src/core/ui/form/inputs/area/area.ts +22 -1
  35. package/src/core/ui/form/inputs/checkbox/checkbox.less +50 -0
  36. package/src/core/ui/form/inputs/checkbox/checkbox.ts +48 -4
  37. package/src/core/ui/form/inputs/input/input.less +1 -1
  38. package/src/core/ui/form/inputs/input/input.ts +14 -4
  39. package/src/core/ui/icon.ts +2 -1
  40. package/src/core/ui/list/group.ts +2 -2
  41. package/src/core/ui/popup/popup.ts +59 -3
  42. package/src/jodit.ts +17 -14
  43. package/src/modules/dialog/dialog.less +0 -1
  44. package/src/modules/dialog/dialog.ts +2 -2
  45. package/src/modules/toolbar/collection/collection.ts +1 -6
  46. package/src/modules/toolbar/collection/editor-collection.ts +5 -1
  47. package/src/modules/widget/file-selector/file-selector.ts +1 -1
  48. package/src/modules/widget/tabs/tabs.less +1 -1
  49. package/src/modules/widget/tabs/tabs.ts +5 -3
  50. package/src/plugins/add-new-line/add-new-line.ts +1 -0
  51. package/src/plugins/clipboard/paste/paste.ts +1 -1
  52. package/src/plugins/image/image-properties/image-properties.ts +7 -0
  53. package/src/plugins/index.ts +1 -1
  54. package/src/plugins/keyboard/backspace/backspace.ts +183 -0
  55. package/src/plugins/keyboard/backspace/cases/check-join-neighbors.ts +117 -0
  56. package/src/plugins/keyboard/backspace/cases/check-join-two-lists.ts +55 -0
  57. package/src/plugins/keyboard/backspace/cases/check-not-collapsed.ts +27 -0
  58. package/src/plugins/keyboard/backspace/cases/check-remove-char.ts +191 -0
  59. package/src/plugins/keyboard/backspace/cases/check-remove-content-not-editable.ts +46 -0
  60. package/src/plugins/keyboard/backspace/cases/check-remove-empty-neighbor.ts +43 -0
  61. package/src/plugins/keyboard/backspace/cases/check-remove-empty-parent.ts +80 -0
  62. package/src/plugins/keyboard/backspace/cases/check-remove-unbreakable-element.ts +46 -0
  63. package/src/plugins/keyboard/backspace/cases/check-table-cell.ts +30 -0
  64. package/src/plugins/keyboard/backspace/cases/check-unwrap-first-list-item.ts +57 -0
  65. package/src/plugins/keyboard/backspace/cases/index.ts +27 -0
  66. package/src/plugins/keyboard/backspace/config.ts +33 -0
  67. package/src/plugins/keyboard/backspace/interface.d.ts +7 -0
  68. package/src/plugins/keyboard/helpers.ts +7 -3
  69. package/src/plugins/link/template.ts +2 -2
  70. package/src/plugins/print/preview.ts +103 -55
  71. package/src/plugins/resizer/resizer.ts +7 -2
  72. package/src/plugins/select.ts +0 -1
  73. package/src/plugins/source/const.ts +7 -0
  74. package/src/plugins/source/editor/engines/ace.ts +5 -0
  75. package/src/plugins/source/source.ts +19 -7
  76. package/src/styles/jodit.less +6 -0
  77. package/src/types/ajax.d.ts +3 -0
  78. package/src/types/async.d.ts +2 -0
  79. package/src/types/jodit.d.ts +5 -8
  80. package/src/types/popup.d.ts +1 -0
  81. package/src/types/ui.d.ts +23 -4
  82. package/types/core/async.d.ts +1 -0
  83. package/types/core/component/component.d.ts +6 -2
  84. package/types/core/component/statuses.d.ts +6 -6
  85. package/types/core/dom.d.ts +6 -2
  86. package/types/core/global.d.ts +1 -1
  87. package/types/core/helpers/append-script.d.ts +1 -0
  88. package/types/core/helpers/selector.d.ts +2 -3
  89. package/types/core/request/response.d.ts +2 -1
  90. package/types/core/ui/button/button/button.d.ts +3 -3
  91. package/types/core/ui/form/form.d.ts +1 -0
  92. package/types/core/ui/form/inputs/area/area.d.ts +7 -1
  93. package/types/core/ui/form/inputs/checkbox/checkbox.d.ts +10 -3
  94. package/types/core/ui/icon.d.ts +1 -1
  95. package/types/core/ui/list/group.d.ts +2 -1
  96. package/types/core/ui/popup/popup.d.ts +2 -1
  97. package/types/jodit.d.ts +6 -6
  98. package/types/modules/toolbar/button/button.d.ts +1 -1
  99. package/types/modules/widget/tabs/tabs.d.ts +2 -1
  100. package/types/plugins/index.d.ts +1 -1
  101. package/types/plugins/keyboard/backspace/backspace.d.ts +28 -0
  102. package/types/plugins/keyboard/backspace/cases/check-join-neighbors.d.ts +10 -0
  103. package/types/plugins/keyboard/backspace/cases/check-join-two-lists.d.ts +19 -0
  104. package/types/plugins/keyboard/backspace/cases/check-not-collapsed.d.ts +19 -0
  105. package/types/plugins/keyboard/backspace/cases/check-remove-char.d.ts +20 -0
  106. package/types/plugins/keyboard/backspace/cases/check-remove-content-not-editable.d.ts +10 -0
  107. package/types/plugins/keyboard/backspace/cases/check-remove-empty-neighbor.d.ts +19 -0
  108. package/types/plugins/keyboard/backspace/cases/check-remove-empty-parent.d.ts +19 -0
  109. package/types/plugins/keyboard/backspace/cases/check-remove-unbreakable-element.d.ts +19 -0
  110. package/types/plugins/keyboard/backspace/cases/check-table-cell.d.ts +19 -0
  111. package/types/plugins/keyboard/backspace/cases/check-unwrap-first-list-item.d.ts +19 -0
  112. package/types/plugins/keyboard/backspace/cases/index.d.ts +8 -0
  113. package/types/plugins/keyboard/backspace/config.d.ts +20 -0
  114. package/types/plugins/keyboard/helpers.d.ts +2 -2
  115. package/types/plugins/select.d.ts +0 -1
  116. package/types/plugins/source/const.d.ts +6 -0
  117. package/types/plugins/source/editor/engines/ace.d.ts +1 -0
  118. package/types/plugins/source/source.d.ts +1 -0
  119. package/types/types/{ajax.d.ts → types/ajax.d.ts} +3 -0
  120. package/types/types/{async.d.ts → types/async.d.ts} +2 -0
  121. package/types/types/{context.d.ts → types/context.d.ts} +0 -0
  122. package/types/types/{core.ts → types/core.ts} +0 -0
  123. package/types/types/{create.d.ts → types/create.d.ts} +0 -0
  124. package/types/types/{dialog.d.ts → types/dialog.d.ts} +0 -0
  125. package/types/types/{events.d.ts → types/events.d.ts} +0 -0
  126. package/types/types/{file-browser.d.ts → types/file-browser.d.ts} +0 -0
  127. package/types/types/{form.d.ts → types/form.d.ts} +0 -0
  128. package/types/types/{index.d.ts → types/index.d.ts} +0 -0
  129. package/types/types/{jodit.d.ts → types/jodit.d.ts} +5 -8
  130. package/types/types/{observe.d.ts → types/observe.d.ts} +0 -0
  131. package/types/types/{plugin.d.ts → types/plugin.d.ts} +0 -0
  132. package/types/types/{popup.d.ts → types/popup.d.ts} +1 -0
  133. package/types/types/{select.d.ts → types/select.d.ts} +0 -0
  134. package/types/types/{source.d.ts → types/source.d.ts} +0 -0
  135. package/types/types/{storage.ts → types/storage.ts} +0 -0
  136. package/types/types/{style.d.ts → types/style.d.ts} +0 -0
  137. package/types/types/{toolbar.d.ts → types/toolbar.d.ts} +0 -0
  138. package/types/types/{traits.d.ts → types/traits.d.ts} +0 -0
  139. package/types/types/{types.d.ts → types/types.d.ts} +0 -0
  140. package/types/types/{ui.d.ts → types/ui.d.ts} +23 -4
  141. package/types/types/{uploader.d.ts → types/uploader.d.ts} +0 -0
  142. package/types/types/{view.d.ts → types/view.d.ts} +0 -0
  143. package/src/plugins/keyboard/delete.ts +0 -746
  144. package/types/plugins/keyboard/delete.d.ts +0 -161
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * jodit - Jodit is awesome and usefully wysiwyg editor with filebrowser
3
3
  * Author: Chupurnov <chupurnov@gmail.com> (https://xdsoft.net/)
4
- * Version: v3.9.6
4
+ * Version: v3.11.2
5
5
  * Url: https://xdsoft.net/jodit/
6
6
  * License(s): MIT
7
7
  */
@@ -801,7 +801,7 @@ class EventEmitter {
801
801
  }
802
802
  const newCallback = (...args) => {
803
803
  this.off(subject, events, newCallback);
804
- callback(...args);
804
+ return callback(...args);
805
805
  };
806
806
  this.on(subject, events, newCallback, onTop);
807
807
  return this;
@@ -1254,6 +1254,7 @@ __webpack_require__.d(__webpack_exports__, {
1254
1254
  "keys": function() { return /* reexport */ utils/* keys */.XP; },
1255
1255
  "loadImage": function() { return /* reexport */ utils/* loadImage */.po; },
1256
1256
  "loadNext": function() { return /* reexport */ loadNext; },
1257
+ "loadNextStyle": function() { return /* reexport */ loadNextStyle; },
1257
1258
  "markAsAtomic": function() { return /* reexport */ markAsAtomic; },
1258
1259
  "markDeprecated": function() { return /* reexport */ utils/* markDeprecated */.Q8; },
1259
1260
  "markOwner": function() { return /* reexport */ utils/* markOwner */.MN; },
@@ -2028,6 +2029,12 @@ const loadNext = (jodit, urls, i = 0) => {
2028
2029
  }
2029
2030
  return appendScriptAsync(jodit, urls[i]).then(() => loadNext(jodit, urls, i + 1));
2030
2031
  };
2032
+ const loadNextStyle = (jodit, urls, i = 0) => {
2033
+ if (!(0,checker/* isString */.HD)(urls[i])) {
2034
+ return Promise.resolve();
2035
+ }
2036
+ return appendStyleAsync(jodit, urls[i]).then(() => loadNextStyle(jodit, urls, i + 1));
2037
+ };
2031
2038
 
2032
2039
  ;// CONCATENATED MODULE: ./src/core/helpers/browser.ts
2033
2040
  /*!
@@ -2663,13 +2670,12 @@ __webpack_require__.d(__webpack_exports__, {
2663
2670
  * Released under MIT see LICENSE.txt in the project root for license information.
2664
2671
  * Copyright (c) 2013-2021 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
2665
2672
  */
2666
- var STATUSES;
2667
- (function (STATUSES) {
2668
- STATUSES["beforeInit"] = "beforeInit";
2669
- STATUSES["ready"] = "ready";
2670
- STATUSES["beforeDestruct"] = "beforeDestruct";
2671
- STATUSES["destructed"] = "destructed";
2672
- })(STATUSES || (STATUSES = {}));
2673
+ const STATUSES = {
2674
+ beforeInit: 'beforeInit',
2675
+ ready: 'ready',
2676
+ beforeDestruct: 'beforeDestruct',
2677
+ destructed: 'destructed'
2678
+ };
2673
2679
 
2674
2680
  // EXTERNAL MODULE: ./src/core/helpers/index.ts + 33 modules
2675
2681
  var helpers = __webpack_require__(8);
@@ -2854,9 +2860,18 @@ class ViewComponent extends Component {
2854
2860
 
2855
2861
  const instances = {};
2856
2862
  let counter = 1;
2863
+ const uuids = new Set();
2857
2864
  function uniqueUid() {
2858
- counter += 10 * (Math.random() + 1);
2859
- return Math.round(counter).toString(16);
2865
+ function gen() {
2866
+ counter += 10 * (Math.random() + 1);
2867
+ return Math.round(counter).toString(16);
2868
+ }
2869
+ let uid = gen();
2870
+ while (uuids.has(uid)) {
2871
+ uid = gen();
2872
+ }
2873
+ uuids.add(uid);
2874
+ return uid;
2860
2875
  }
2861
2876
  const pluginSystem = new _plugin_system__WEBPACK_IMPORTED_MODULE_0__/* .PluginSystem */ .h();
2862
2877
  const modules = {};
@@ -2873,7 +2888,7 @@ const extendLang = (langs) => {
2873
2888
  };
2874
2889
  const boxes = new WeakMap();
2875
2890
  function getContainer(jodit, classFunc, tag = 'div', createInsideEditor = false) {
2876
- const name = (0,_helpers___WEBPACK_IMPORTED_MODULE_2__.getClassName)(classFunc.prototype);
2891
+ const name = classFunc ? (0,_helpers___WEBPACK_IMPORTED_MODULE_2__.getClassName)(classFunc.prototype) : 'jodit-utils';
2877
2892
  const data = boxes.get(jodit) || {}, key = name + tag;
2878
2893
  const view = (0,_helpers___WEBPACK_IMPORTED_MODULE_2__.isViewObject)(jodit) ? jodit : jodit.j;
2879
2894
  if (!data[key]) {
@@ -3164,6 +3179,9 @@ class Dom {
3164
3179
  }
3165
3180
  }
3166
3181
  static replace(elm, newTagName, create, withAttributes = false, notMoveContent = false) {
3182
+ if ((0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isHTML)(newTagName)) {
3183
+ newTagName = create.fromHTML(newTagName);
3184
+ }
3167
3185
  const tag = (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.isString)(newTagName)
3168
3186
  ? create.element(newTagName)
3169
3187
  : newTagName;
@@ -3192,6 +3210,11 @@ class Dom {
3192
3210
  static isEmptyContent(node) {
3193
3211
  return Dom.each(node, (elm) => Dom.isEmptyTextNode(elm));
3194
3212
  }
3213
+ static isContentEditable(node, root) {
3214
+ return (Dom.isNode(node) &&
3215
+ !Dom.closest(node, elm => Dom.isElement(elm) &&
3216
+ elm.getAttribute('contenteditable') === 'false', root));
3217
+ }
3195
3218
  static isEmpty(node, condNoEmptyElement = /^(img|svg|canvas|input|textarea|form)$/) {
3196
3219
  if (!node) {
3197
3220
  return true;
@@ -3386,9 +3409,7 @@ class Dom {
3386
3409
  return null;
3387
3410
  }
3388
3411
  static findSibling(node, left = true, cond = (n) => !Dom.isEmptyTextNode(n)) {
3389
- const getSibling = (node) => {
3390
- return left ? node.previousSibling : node.nextSibling;
3391
- };
3412
+ const getSibling = (node) => left ? node.previousSibling : node.nextSibling;
3392
3413
  let start = getSibling(node);
3393
3414
  while (start && !cond(start)) {
3394
3415
  start = getSibling(start);
@@ -3637,7 +3658,7 @@ function getShadowRoot(jodit) {
3637
3658
  if ((0,helpers.dataBind)(jodit, 'shadowRoot') !== undefined) {
3638
3659
  return (0,helpers.dataBind)(jodit, 'shadowRoot');
3639
3660
  }
3640
- const container = (0,global/* getContainer */.ZO)(jodit, function Utils() { });
3661
+ const container = (0,global/* getContainer */.ZO)(jodit);
3641
3662
  const iframe = document.createElement('iframe');
3642
3663
  (0,helpers.css)(iframe, {
3643
3664
  width: 0,
@@ -7104,9 +7125,9 @@ class UIElement extends _component__WEBPACK_IMPORTED_MODULE_0__/* .ViewComponent
7104
7125
  return null;
7105
7126
  }
7106
7127
  static closestElement(node, type) {
7107
- const elm = _dom__WEBPACK_IMPORTED_MODULE_1__/* .Dom.up */ .i.up(node, node => {
7108
- if (node) {
7109
- const { component } = node;
7128
+ const elm = _dom__WEBPACK_IMPORTED_MODULE_1__/* .Dom.up */ .i.up(node, elm => {
7129
+ if (elm) {
7130
+ const { component } = elm;
7110
7131
  return component && component instanceof type;
7111
7132
  }
7112
7133
  return false;
@@ -7261,6 +7282,7 @@ class Icon {
7261
7282
  }
7262
7283
  static set(name, value) {
7263
7284
  this.icons[name.replace('_', '-')] = value;
7285
+ return this;
7264
7286
  }
7265
7287
  static makeIcon(jodit, icon) {
7266
7288
  var _a;
@@ -7346,7 +7368,7 @@ const UIButtonState = () => ({
7346
7368
  type: 'button',
7347
7369
  name: '',
7348
7370
  value: '',
7349
- status: 'initial',
7371
+ variant: 'initial',
7350
7372
  disabled: false,
7351
7373
  activated: false,
7352
7374
  icon: {
@@ -7394,7 +7416,7 @@ let UIButton = class UIButton extends ui_element/* UIElement */.u {
7394
7416
  }
7395
7417
  }
7396
7418
  onChangeStatus() {
7397
- this.setMod('status', this.state.status);
7419
+ this.setMod('variant', this.state.variant);
7398
7420
  }
7399
7421
  onChangeText() {
7400
7422
  this.text.textContent = this.jodit.i18n(this.state.text);
@@ -7480,7 +7502,7 @@ let UIButton = class UIButton extends ui_element/* UIElement */.u {
7480
7502
  (0,decorators.watch)('parentElement')
7481
7503
  ], UIButton.prototype, "updateSize", null);
7482
7504
  (0,tslib_es6/* __decorate */.gn)([
7483
- (0,decorators.watch)('state.status')
7505
+ (0,decorators.watch)('state.variant')
7484
7506
  ], UIButton.prototype, "onChangeStatus", null);
7485
7507
  (0,tslib_es6/* __decorate */.gn)([
7486
7508
  (0,decorators.watch)('state.text')
@@ -7513,14 +7535,14 @@ UIButton = (0,tslib_es6/* __decorate */.gn)([
7513
7535
  decorators.component
7514
7536
  ], UIButton);
7515
7537
 
7516
- function Button(jodit, stateOrText, text, status) {
7538
+ function Button(jodit, stateOrText, text, variant) {
7517
7539
  const button = new UIButton(jodit);
7518
7540
  button.state.tabIndex = jodit.o.allowTabNavigation ? 0 : -1;
7519
7541
  if ((0,helpers.isString)(stateOrText)) {
7520
7542
  button.state.icon.name = stateOrText;
7521
7543
  button.state.name = stateOrText;
7522
- if (status) {
7523
- button.state.status = status;
7544
+ if (variant) {
7545
+ button.state.variant = variant;
7524
7546
  }
7525
7547
  if (text) {
7526
7548
  button.state.text = text;
@@ -7554,7 +7576,7 @@ let UIButtonGroup = class UIButtonGroup extends group/* UIGroup */.q {
7554
7576
  const btn = new UIButton(jodit, {
7555
7577
  text: opt.text,
7556
7578
  value: opt.value,
7557
- status: 'primary'
7579
+ variant: 'primary'
7558
7580
  });
7559
7581
  btn.onAction(() => {
7560
7582
  this.select(opt.value);
@@ -7877,6 +7899,7 @@ var UIGroup_1;
7877
7899
  let UIGroup = UIGroup_1 = class UIGroup extends _element__WEBPACK_IMPORTED_MODULE_0__/* .UIElement */ .u {
7878
7900
  constructor(jodit, elements, options) {
7879
7901
  super(jodit, options);
7902
+ this.options = options;
7880
7903
  this.syncMod = false;
7881
7904
  this.elements = [];
7882
7905
  this.buttonSize = 'middle';
@@ -7913,7 +7936,7 @@ let UIGroup = UIGroup_1 = class UIGroup extends _element__WEBPACK_IMPORTED_MODUL
7913
7936
  }
7914
7937
  append(elm, distElement) {
7915
7938
  if ((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isArray)(elm)) {
7916
- elm.forEach(item => this.append(item));
7939
+ elm.forEach(item => this.append(item, distElement));
7917
7940
  return this;
7918
7941
  }
7919
7942
  this.elements.push(elm);
@@ -8155,6 +8178,7 @@ class Popup extends ui_element/* UIElement */.u {
8155
8178
  }
8156
8179
  open(getBound, keepPosition = false) {
8157
8180
  (0,helpers.markOwner)(this.jodit, this.container);
8181
+ this.calculateZIndex();
8158
8182
  this.isOpened = true;
8159
8183
  this.addGlobalListeners();
8160
8184
  this.targetBound = !keepPosition
@@ -8168,6 +8192,40 @@ class Popup extends ui_element/* UIElement */.u {
8168
8192
  this.j.e.fire(this, 'afterOpen');
8169
8193
  return this;
8170
8194
  }
8195
+ calculateZIndex() {
8196
+ if (this.container.style.zIndex) {
8197
+ return;
8198
+ }
8199
+ const checkView = (view) => {
8200
+ const zIndex = view.container.style.zIndex || view.o.zIndex;
8201
+ if (zIndex) {
8202
+ this.setZIndex(1 + parseInt(zIndex.toString(), 10));
8203
+ return true;
8204
+ }
8205
+ return false;
8206
+ };
8207
+ if (checkView(this.j)) {
8208
+ return;
8209
+ }
8210
+ let pe = this.parentElement;
8211
+ while (pe) {
8212
+ if (checkView(pe.j)) {
8213
+ return;
8214
+ }
8215
+ if (pe.container.style.zIndex) {
8216
+ this.setZIndex(1 + parseInt(pe.container.style.zIndex.toString(), 10));
8217
+ return;
8218
+ }
8219
+ if (!pe.parentElement && pe.container.parentElement) {
8220
+ const elm = ui_element/* UIElement.closestElement */.u.closestElement(pe.container.parentElement, ui_element/* UIElement */.u);
8221
+ if (elm) {
8222
+ pe = elm;
8223
+ continue;
8224
+ }
8225
+ }
8226
+ pe = pe.parentElement;
8227
+ }
8228
+ }
8171
8229
  getKeepBound(getBound) {
8172
8230
  const oldBound = getBound();
8173
8231
  const elmUnderCursor = this.od.elementFromPoint(oldBound.left, oldBound.top);
@@ -8264,14 +8322,16 @@ class Popup extends ui_element/* UIElement */.u {
8264
8322
  return this;
8265
8323
  }
8266
8324
  closeOnOutsideClick(e) {
8325
+ var _a;
8267
8326
  if (!this.isOpened) {
8268
8327
  return;
8269
8328
  }
8270
- if (!e.target) {
8329
+ const target = (_a = ((0,helpers.isFunction)(e.composedPath) && e.composedPath()[0])) !== null && _a !== void 0 ? _a : e.target;
8330
+ if (!target) {
8271
8331
  this.close();
8272
8332
  return;
8273
8333
  }
8274
- const box = ui_element/* UIElement.closestElement */.u.closestElement(e.target, Popup);
8334
+ const box = ui_element/* UIElement.closestElement */.u.closestElement(target, Popup);
8275
8335
  if (box && (this === box || box.closest(this))) {
8276
8336
  return;
8277
8337
  }
@@ -8457,6 +8517,9 @@ let UIInput = UIInput_1 = class UIInput extends ui_element/* UIElement */.u {
8457
8517
  this.state = { ...UIInput_1.defaultState };
8458
8518
  this.__errorBox = this.j.c.span(this.getFullElName('error'));
8459
8519
  this.validators = new Set([]);
8520
+ if ((options === null || options === void 0 ? void 0 : options.value) !== undefined) {
8521
+ options.value = options.value.toString();
8522
+ }
8460
8523
  Object.assign(this.state, options);
8461
8524
  if (this.state.clearButton !== undefined) {
8462
8525
  this.j.e
@@ -8553,14 +8616,19 @@ let UIInput = UIInput_1 = class UIInput extends ui_element/* UIElement */.u {
8553
8616
  }
8554
8617
  }
8555
8618
  onChangeStateValue() {
8556
- this.value = this.state.value;
8619
+ const value = this.state.value.toString();
8620
+ if (value !== this.value) {
8621
+ this.value = value;
8622
+ }
8557
8623
  }
8558
8624
  onChangeValue() {
8559
8625
  var _a, _b;
8560
8626
  const { value } = this;
8561
- this.state.value = value;
8562
- this.j.e.fire(this, 'change', value);
8563
- (_b = (_a = this.state).onChange) === null || _b === void 0 ? void 0 : _b.call(_a, value);
8627
+ if (this.state.value !== value) {
8628
+ this.state.value = value;
8629
+ this.j.e.fire(this, 'change', value);
8630
+ (_b = (_a = this.state).onChange) === null || _b === void 0 ? void 0 : _b.call(_a, value);
8631
+ }
8564
8632
  }
8565
8633
  validate() {
8566
8634
  this.error = '';
@@ -8639,11 +8707,20 @@ UIInput = UIInput_1 = (0,tslib_es6/* __decorate */.gn)([
8639
8707
  * Released under MIT see LICENSE.txt in the project root for license information.
8640
8708
  * Copyright (c) 2013-2021 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
8641
8709
  */
8710
+ var UITextArea_1;
8642
8711
 
8643
8712
 
8644
8713
 
8645
8714
 
8646
- let UITextArea = class UITextArea extends UIInput {
8715
+ let UITextArea = UITextArea_1 = class UITextArea extends UIInput {
8716
+ constructor(jodit, state) {
8717
+ super(jodit, state);
8718
+ this.state = { ...UITextArea_1.defaultState };
8719
+ Object.assign(this.state, state);
8720
+ if (this.state.resizable === false) {
8721
+ this.nativeInput.style.resize = 'none';
8722
+ }
8723
+ }
8647
8724
  className() {
8648
8725
  return 'UITextArea';
8649
8726
  }
@@ -8652,7 +8729,12 @@ let UITextArea = class UITextArea extends UIInput {
8652
8729
  return super.createContainer(options);
8653
8730
  }
8654
8731
  };
8655
- UITextArea = (0,tslib_es6/* __decorate */.gn)([
8732
+ UITextArea.defaultState = {
8733
+ ...UIInput.defaultState,
8734
+ size: 5,
8735
+ resizable: true
8736
+ };
8737
+ UITextArea = UITextArea_1 = (0,tslib_es6/* __decorate */.gn)([
8656
8738
  decorators.component
8657
8739
  ], UITextArea);
8658
8740
 
@@ -8663,11 +8745,18 @@ UITextArea = (0,tslib_es6/* __decorate */.gn)([
8663
8745
  * Released under MIT see LICENSE.txt in the project root for license information.
8664
8746
  * Copyright (c) 2013-2021 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
8665
8747
  */
8748
+ var UICheckbox_1;
8666
8749
 
8667
8750
 
8668
8751
 
8669
8752
 
8670
- let UICheckbox = class UICheckbox extends UIInput {
8753
+
8754
+ let UICheckbox = UICheckbox_1 = class UICheckbox extends UIInput {
8755
+ constructor(jodit, options) {
8756
+ super(jodit, { ...options, type: 'checkbox' });
8757
+ this.state = { ...UICheckbox_1.defaultState };
8758
+ Object.assign(this.state, options);
8759
+ }
8671
8760
  className() {
8672
8761
  return 'UICheckbox';
8673
8762
  }
@@ -8676,11 +8765,45 @@ let UICheckbox = class UICheckbox extends UIInput {
8676
8765
  className: this.componentName
8677
8766
  });
8678
8767
  }
8679
- constructor(jodit, options) {
8680
- super(jodit, { ...options, type: 'checkbox' });
8768
+ onChangeChecked() {
8769
+ this.value = this.state.checked.toString();
8770
+ this.nativeInput.checked = this.state.checked;
8771
+ this.setMod('checked', this.state.checked);
8772
+ }
8773
+ onChangeNativeCheckBox() {
8774
+ this.state.checked = this.nativeInput.checked;
8775
+ }
8776
+ onChangeSwitch() {
8777
+ this.setMod('switch', this.state.switch);
8778
+ let slider = this.getElm('switch-slider');
8779
+ if (this.state.switch) {
8780
+ if (!slider) {
8781
+ slider = this.j.c.div(this.getFullElName('switch-slider'));
8782
+ }
8783
+ dom/* Dom.after */.i.after(this.nativeInput, slider);
8784
+ }
8785
+ else {
8786
+ dom/* Dom.safeRemove */.i.safeRemove(slider);
8787
+ }
8681
8788
  }
8682
8789
  };
8683
- UICheckbox = (0,tslib_es6/* __decorate */.gn)([
8790
+ UICheckbox.defaultState = {
8791
+ ...UIInput.defaultState,
8792
+ checked: false,
8793
+ switch: false
8794
+ };
8795
+ (0,tslib_es6/* __decorate */.gn)([
8796
+ (0,decorators.watch)('state.checked'),
8797
+ (0,decorators.hook)('ready')
8798
+ ], UICheckbox.prototype, "onChangeChecked", null);
8799
+ (0,tslib_es6/* __decorate */.gn)([
8800
+ (0,decorators.watch)('nativeInput:change')
8801
+ ], UICheckbox.prototype, "onChangeNativeCheckBox", null);
8802
+ (0,tslib_es6/* __decorate */.gn)([
8803
+ (0,decorators.watch)('state.switch'),
8804
+ (0,decorators.hook)('ready')
8805
+ ], UICheckbox.prototype, "onChangeSwitch", null);
8806
+ UICheckbox = UICheckbox_1 = (0,tslib_es6/* __decorate */.gn)([
8684
8807
  decorators.component
8685
8808
  ], UICheckbox);
8686
8809
 
@@ -8839,6 +8962,13 @@ var utils = __webpack_require__(9);
8839
8962
 
8840
8963
 
8841
8964
  let UIForm = class UIForm extends group/* UIGroup */.q {
8965
+ constructor(...args) {
8966
+ var _a, _b;
8967
+ super(...args);
8968
+ if ((_a = this.options) === null || _a === void 0 ? void 0 : _a.className) {
8969
+ this.container.classList.add((_b = this.options) === null || _b === void 0 ? void 0 : _b.className);
8970
+ }
8971
+ }
8842
8972
  className() {
8843
8973
  return 'UIForm';
8844
8974
  }
@@ -9066,7 +9196,7 @@ const TabsWidget = (editor, tabs, state) => {
9066
9196
  buttonList.push(button);
9067
9197
  button.container.classList.add('jodit-tabs__button', 'jodit-tabs__button_columns_' + tabs.length);
9068
9198
  if (!(0,helpers.isFunction)(content)) {
9069
- tab.appendChild(content);
9199
+ tab.appendChild(content instanceof ui/* UIElement */.u1 ? content.container : content);
9070
9200
  }
9071
9201
  else {
9072
9202
  tab.appendChild(editor.c.div('jodit-tab_empty'));
@@ -9165,7 +9295,7 @@ const FileSelectorWidget = (editor, callbacks, elm, close, isImage = true) => {
9165
9295
  if (callbacks.url) {
9166
9296
  const button = new ui/* UIButton */.y3(editor, {
9167
9297
  type: 'submit',
9168
- status: 'primary',
9298
+ variant: 'primary',
9169
9299
  text: 'Insert'
9170
9300
  }), form = new ui/* UIForm */.x4(editor, [
9171
9301
  new ui/* UIInput */.u3(editor, {
@@ -10197,7 +10327,7 @@ __webpack_require__.d(modules_namespaceObject, {
10197
10327
  var plugins_namespaceObject = {};
10198
10328
  __webpack_require__.r(plugins_namespaceObject);
10199
10329
  __webpack_require__.d(plugins_namespaceObject, {
10200
- "Delete": function() { return Delete; },
10330
+ "Backspace": function() { return Backspace; },
10201
10331
  "DragAndDrop": function() { return DragAndDrop; },
10202
10332
  "DragAndDropElement": function() { return DragAndDropElement; },
10203
10333
  "KeyArrowOutside": function() { return KeyArrowOutside; },
@@ -10381,6 +10511,9 @@ class Async {
10381
10511
  });
10382
10512
  this.isDestructed = false;
10383
10513
  }
10514
+ delay(timeout) {
10515
+ return this.promise(resolve => this.setTimeout(resolve, timeout));
10516
+ }
10384
10517
  setTimeout(callback, timeout, ...args) {
10385
10518
  if (this.isDestructed) {
10386
10519
  return 0;
@@ -10566,6 +10699,9 @@ class response_Response {
10566
10699
  text() {
10567
10700
  return Promise.resolve(this.body);
10568
10701
  }
10702
+ async blob() {
10703
+ return this.body;
10704
+ }
10569
10705
  }
10570
10706
 
10571
10707
  ;// CONCATENATED MODULE: ./src/core/request/config.ts
@@ -10645,12 +10781,15 @@ class Ajax {
10645
10781
  };
10646
10782
  const onResolve = () => {
10647
10783
  this.resolved = true;
10648
- resolve(new response_Response(request, xhr.status, xhr.statusText, xhr.responseText));
10784
+ resolve(new response_Response(request, xhr.status, xhr.statusText, !xhr.responseType ? xhr.responseText : xhr.response));
10649
10785
  };
10786
+ xhr.onload = onResolve;
10650
10787
  xhr.onabort = onReject;
10651
10788
  xhr.onerror = onReject;
10652
10789
  xhr.ontimeout = onReject;
10653
- xhr.onload = onResolve;
10790
+ if (o.responseType) {
10791
+ xhr.responseType = o.responseType;
10792
+ }
10654
10793
  xhr.onprogress = (e) => {
10655
10794
  var _a, _b;
10656
10795
  let percentComplete = 0;
@@ -10966,7 +11105,7 @@ class View extends component/* Component */.wA {
10966
11105
  this.isView = true;
10967
11106
  this.mods = {};
10968
11107
  this.components = new Set();
10969
- this.version = "3.9.6";
11108
+ this.version = "3.11.2";
10970
11109
  this.async = new Async();
10971
11110
  this.buffer = Storage.makeStorage();
10972
11111
  this.storage = Storage.makeStorage(true, this.componentName);
@@ -11064,10 +11203,10 @@ class View extends component/* Component */.wA {
11064
11203
  return this.__isFullSize;
11065
11204
  }
11066
11205
  getVersion() {
11067
- return "3.9.6";
11206
+ return "3.11.2";
11068
11207
  }
11069
11208
  static getVersion() {
11070
- return "3.9.6";
11209
+ return "3.11.2";
11071
11210
  }
11072
11211
  initOptions(options) {
11073
11212
  this.options = (0,helpers.ConfigProto)(options || {}, (0,helpers.ConfigProto)(this.options || {}, View.defaultOptions));
@@ -11182,9 +11321,6 @@ let ToolbarCollection = class ToolbarCollection extends ui/* UIList */.bz {
11182
11321
  return makeButton(this.j, control, target);
11183
11322
  }
11184
11323
  shouldBeActive(button) {
11185
- if ((0,helpers.isJoditObject)(this.j) && !this.j.editorIsActive) {
11186
- return false;
11187
- }
11188
11324
  if ((0,helpers.isFunction)(button.control.isActive)) {
11189
11325
  return button.control.isActive(this.j, button.control, button);
11190
11326
  }
@@ -11308,6 +11444,9 @@ let ToolbarEditorCollection = class ToolbarEditorCollection extends ToolbarColle
11308
11444
  return !(mode === constants.MODE_SPLIT || mode === this.j.getRealMode());
11309
11445
  }
11310
11446
  shouldBeActive(button) {
11447
+ if ((0,helpers.isJoditObject)(this.j) && !this.j.editorIsActive) {
11448
+ return false;
11449
+ }
11311
11450
  const active = super.shouldBeActive(button);
11312
11451
  if (active !== undefined) {
11313
11452
  return active;
@@ -12212,8 +12351,8 @@ let Dialog = class Dialog extends ViewWithToolbar {
12212
12351
  e.stopImmediatePropagation();
12213
12352
  e.preventDefault();
12214
12353
  }
12215
- if (this.e) {
12216
- this.e.fire('beforeClose', this);
12354
+ if (this.e && this.e.fire('beforeClose', this) === false) {
12355
+ return this;
12217
12356
  }
12218
12357
  this.setMod('active', false);
12219
12358
  this.isOpened = false;
@@ -16303,12 +16442,6 @@ class Jodit extends ViewWithToolbar {
16303
16442
  div.innerHTML = this.getElementValue();
16304
16443
  return div.innerText || '';
16305
16444
  }
16306
- get value() {
16307
- return this.getEditorValue();
16308
- }
16309
- set value(html) {
16310
- this.setEditorValue(html);
16311
- }
16312
16445
  get defaultTimeout() {
16313
16446
  return this.options && this.o.observer
16314
16447
  ? this.o.observer.timeout
@@ -16441,9 +16574,15 @@ class Jodit extends ViewWithToolbar {
16441
16574
  this.editor.innerHTML = data.value;
16442
16575
  }
16443
16576
  }
16444
- getEditorValue(removeSelectionMarkers = true) {
16577
+ get value() {
16578
+ return this.getEditorValue();
16579
+ }
16580
+ set value(html) {
16581
+ this.setEditorValue(html);
16582
+ }
16583
+ getEditorValue(removeSelectionMarkers = true, consumer) {
16445
16584
  let value;
16446
- value = this.e.fire('beforeGetValueFromEditor');
16585
+ value = this.e.fire('beforeGetValueFromEditor', consumer);
16447
16586
  if (value !== undefined) {
16448
16587
  return value;
16449
16588
  }
@@ -16455,7 +16594,7 @@ class Jodit extends ViewWithToolbar {
16455
16594
  value = '';
16456
16595
  }
16457
16596
  const new_value = { value };
16458
- this.e.fire('afterGetValueFromEditor', new_value);
16597
+ this.e.fire('afterGetValueFromEditor', new_value, consumer);
16459
16598
  return new_value.value;
16460
16599
  }
16461
16600
  setEditorValue(value) {
@@ -17095,6 +17234,7 @@ config/* Config.prototype.addNewLineTagsTriggers */.D.prototype.addNewLineTagsTr
17095
17234
  'iframe',
17096
17235
  'img',
17097
17236
  'hr',
17237
+ 'pre',
17098
17238
  'jodit'
17099
17239
  ];
17100
17240
  config/* Config.prototype.addNewLineDeltaShow */.D.prototype.addNewLineDeltaShow = 20;
@@ -17501,11 +17641,11 @@ function findMostNestedNeighbor(node, right, root, onlyInlide = false) {
17501
17641
  }
17502
17642
  return null;
17503
17643
  }
17504
- function normalizeCursorPosition(node, backspace) {
17644
+ function normalizeCursorPosition(jodit, node, backspace) {
17505
17645
  let sibling = dom/* Dom.findSibling */.i.findSibling(node, backspace), anotherSibling = dom/* Dom.findSibling */.i.findSibling(node, !backspace);
17506
17646
  while (dom/* Dom.isElement */.i.isElement(sibling) &&
17507
17647
  !dom/* Dom.isTag */.i.isTag(sibling, constants.INSEPARABLE_TAGS) &&
17508
- !anotherSibling) {
17648
+ (!anotherSibling || !dom/* Dom.closest */.i.closest(node, dom/* Dom.isElement */.i.isElement, jodit.editor))) {
17509
17649
  if (backspace || !sibling.firstChild) {
17510
17650
  sibling.appendChild(node);
17511
17651
  }
@@ -17517,7 +17657,7 @@ function normalizeCursorPosition(node, backspace) {
17517
17657
  }
17518
17658
  }
17519
17659
 
17520
- ;// CONCATENATED MODULE: ./src/plugins/keyboard/delete.ts
17660
+ ;// CONCATENATED MODULE: ./src/plugins/keyboard/backspace/cases/check-join-two-lists.ts
17521
17661
  /*!
17522
17662
  * Jodit Editor (https://xdsoft.net/jodit/)
17523
17663
  * Released under MIT see LICENSE.txt in the project root for license information.
@@ -17525,26 +17665,420 @@ function normalizeCursorPosition(node, backspace) {
17525
17665
  */
17526
17666
 
17527
17667
 
17668
+ function checkJoinTwoLists(jodit, fakeNode, backspace) {
17669
+ const next = dom/* Dom.findSibling */.i.findSibling(fakeNode, backspace), prev = dom/* Dom.findSibling */.i.findSibling(fakeNode, !backspace);
17670
+ if (!dom/* Dom.closest */.i.closest(fakeNode, dom/* Dom.isElement */.i.isElement, jodit.editor) &&
17671
+ dom/* Dom.isTag */.i.isTag(next, ['ul', 'ol']) &&
17672
+ dom/* Dom.isTag */.i.isTag(prev, ['ul', 'ol']) &&
17673
+ dom/* Dom.isTag */.i.isTag(next.lastElementChild, 'li') &&
17674
+ dom/* Dom.isTag */.i.isTag(prev.firstElementChild, 'li')) {
17675
+ const { setCursorBefore, setCursorAfter } = jodit.s;
17676
+ const target = next.lastElementChild, second = prev.firstElementChild;
17677
+ (0,helpers.call)(!backspace ? dom/* Dom.append */.i.append : dom/* Dom.prepend */.i.prepend, second, fakeNode);
17678
+ dom/* Dom.moveContent */.i.moveContent(prev, next, !backspace);
17679
+ dom/* Dom.safeRemove */.i.safeRemove(prev);
17680
+ (0,helpers.call)(backspace ? dom/* Dom.append */.i.append : dom/* Dom.prepend */.i.prepend, target, fakeNode);
17681
+ (0,helpers.call)(backspace ? setCursorBefore : setCursorAfter, fakeNode);
17682
+ return true;
17683
+ }
17684
+ return false;
17685
+ }
17686
+
17687
+ ;// CONCATENATED MODULE: ./src/plugins/keyboard/backspace/cases/check-remove-empty-parent.ts
17688
+ /*!
17689
+ * Jodit Editor (https://xdsoft.net/jodit/)
17690
+ * Released under MIT see LICENSE.txt in the project root for license information.
17691
+ * Copyright (c) 2013-2021 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
17692
+ */
17528
17693
 
17529
17694
 
17530
17695
 
17531
17696
 
17697
+ function checkRemoveEmptyParent(jodit, fakeNode, backspace) {
17698
+ let found = false;
17699
+ const { setCursorBefore, setCursorIn } = jodit.s;
17700
+ let prn = dom/* Dom.closest */.i.closest(fakeNode, dom/* Dom.isElement */.i.isElement, jodit.editor);
17701
+ if (!prn || !dom/* Dom.isEmpty */.i.isEmpty(prn)) {
17702
+ return false;
17703
+ }
17704
+ const neighbor = findNotEmptyNeighbor(fakeNode, backspace, jodit.editor);
17705
+ do {
17706
+ if (prn && dom/* Dom.isEmpty */.i.isEmpty(prn) && !dom/* Dom.isCell */.i.isCell(prn)) {
17707
+ dom/* Dom.after */.i.after(prn, fakeNode);
17708
+ const tmp = dom/* Dom.closest */.i.closest(prn, n => dom/* Dom.isElement */.i.isElement(n) && n !== prn, jodit.editor);
17709
+ dom/* Dom.safeRemove */.i.safeRemove(prn);
17710
+ found = true;
17711
+ prn = tmp;
17712
+ }
17713
+ else {
17714
+ break;
17715
+ }
17716
+ } while (prn);
17717
+ if (found && checkJoinTwoLists(jodit, fakeNode, backspace)) {
17718
+ return true;
17719
+ }
17720
+ if (neighbor &&
17721
+ !dom/* Dom.isText */.i.isText(neighbor) &&
17722
+ !dom/* Dom.isTag */.i.isTag(neighbor, constants.INSEPARABLE_TAGS)) {
17723
+ setCursorIn(neighbor, !backspace);
17724
+ }
17725
+ else {
17726
+ setCursorBefore(fakeNode);
17727
+ }
17728
+ return found;
17729
+ }
17730
+
17731
+ ;// CONCATENATED MODULE: ./src/plugins/keyboard/backspace/cases/check-remove-unbreakable-element.ts
17732
+ /*!
17733
+ * Jodit Editor (https://xdsoft.net/jodit/)
17734
+ * Released under MIT see LICENSE.txt in the project root for license information.
17735
+ * Copyright (c) 2013-2021 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
17736
+ */
17737
+
17738
+
17739
+
17740
+ function checkRemoveUnbreakableElement(jodit, fakeNode, backspace) {
17741
+ const neighbor = dom/* Dom.findSibling */.i.findSibling(fakeNode, backspace);
17742
+ if (dom/* Dom.isElement */.i.isElement(neighbor) &&
17743
+ (dom/* Dom.isTag */.i.isTag(neighbor, constants.INSEPARABLE_TAGS) || dom/* Dom.isEmpty */.i.isEmpty(neighbor))) {
17744
+ dom/* Dom.safeRemove */.i.safeRemove(neighbor);
17745
+ jodit.s.setCursorBefore(fakeNode);
17746
+ if (dom/* Dom.isTag */.i.isTag(neighbor, 'br')) {
17747
+ checkRemoveEmptyParent(jodit, fakeNode, backspace);
17748
+ }
17749
+ return true;
17750
+ }
17751
+ return false;
17752
+ }
17753
+
17754
+ ;// CONCATENATED MODULE: ./src/plugins/keyboard/backspace/cases/check-remove-content-not-editable.ts
17755
+
17756
+
17757
+
17758
+ function checkRemoveContentNotEditable(jodit, fakeNode, backspace) {
17759
+ let neighbor = dom/* Dom.findSibling */.i.findSibling(fakeNode, backspace);
17760
+ if (!neighbor &&
17761
+ fakeNode.parentElement &&
17762
+ fakeNode.parentElement !== jodit.editor) {
17763
+ neighbor = dom/* Dom.findSibling */.i.findSibling(fakeNode.parentElement, backspace);
17764
+ }
17765
+ if (dom/* Dom.isElement */.i.isElement(neighbor) &&
17766
+ !dom/* Dom.isContentEditable */.i.isContentEditable(neighbor, jodit.editor)) {
17767
+ (0,helpers.call)(backspace ? dom/* Dom.before */.i.before : dom/* Dom.after */.i.after, neighbor, fakeNode);
17768
+ dom/* Dom.safeRemove */.i.safeRemove(neighbor);
17769
+ normalizeCursorPosition(jodit, fakeNode, backspace);
17770
+ (0,helpers.call)(backspace ? jodit.s.setCursorBefore : jodit.s.setCursorAfter, fakeNode);
17771
+ return true;
17772
+ }
17773
+ return false;
17774
+ }
17775
+
17776
+ ;// CONCATENATED MODULE: ./src/plugins/keyboard/backspace/cases/check-remove-char.ts
17777
+ /*!
17778
+ * Jodit Editor (https://xdsoft.net/jodit/)
17779
+ * Released under MIT see LICENSE.txt in the project root for license information.
17780
+ * Copyright (c) 2013-2021 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
17781
+ */
17782
+
17783
+
17784
+
17785
+
17786
+ function checkRemoveChar(jodit, fakeNode, backspace, mode) {
17787
+ var _a, _b, _c;
17788
+ const step = backspace ? -1 : 1;
17789
+ const anotherSibling = getSibling(fakeNode, !backspace);
17790
+ let sibling = getSibling(fakeNode, backspace), removeNeighbor = null;
17791
+ let charRemoved = false, removed;
17792
+ while (sibling && (dom/* Dom.isText */.i.isText(sibling) || dom/* Dom.isInlineBlock */.i.isInlineBlock(sibling))) {
17793
+ while (dom/* Dom.isInlineBlock */.i.isInlineBlock(sibling)) {
17794
+ sibling = (backspace ? sibling === null || sibling === void 0 ? void 0 : sibling.lastChild : sibling === null || sibling === void 0 ? void 0 : sibling.firstChild);
17795
+ }
17796
+ if (!sibling) {
17797
+ break;
17798
+ }
17799
+ if ((_a = sibling.nodeValue) === null || _a === void 0 ? void 0 : _a.length) {
17800
+ let value = (0,helpers.toArray)(sibling.nodeValue);
17801
+ const length = value.length;
17802
+ let index = backspace ? length - 1 : 0;
17803
+ if (value[index] === constants.INVISIBLE_SPACE) {
17804
+ while (value[index] === constants.INVISIBLE_SPACE) {
17805
+ index += step;
17806
+ }
17807
+ }
17808
+ removed = value[index];
17809
+ if (value[index + step] === constants.INVISIBLE_SPACE) {
17810
+ index += step;
17811
+ while (value[index] === constants.INVISIBLE_SPACE) {
17812
+ index += step;
17813
+ }
17814
+ index += backspace ? 1 : -1;
17815
+ }
17816
+ if (backspace && index < 0) {
17817
+ value = [];
17818
+ }
17819
+ else {
17820
+ value = value.slice(backspace ? 0 : index + 1, backspace ? index : length);
17821
+ }
17822
+ if (!anotherSibling ||
17823
+ !dom/* Dom.isText */.i.isText(anotherSibling) ||
17824
+ (!backspace ? / $/ : /^ /).test((_b = anotherSibling.nodeValue) !== null && _b !== void 0 ? _b : '') ||
17825
+ !(0,helpers.trimInv)(anotherSibling.nodeValue || '').length) {
17826
+ for (let i = backspace ? value.length - 1 : 0; backspace ? i >= 0 : i < value.length; i += backspace ? -1 : 1) {
17827
+ if (value[i] === ' ') {
17828
+ value[i] = constants.NBSP_SPACE;
17829
+ }
17830
+ else {
17831
+ break;
17832
+ }
17833
+ }
17834
+ }
17835
+ sibling.nodeValue = value.join('');
17836
+ }
17837
+ if (!((_c = sibling.nodeValue) === null || _c === void 0 ? void 0 : _c.length)) {
17838
+ removeNeighbor = sibling;
17839
+ }
17840
+ if (!(0,helpers.isVoid)(removed) && removed !== constants.INVISIBLE_SPACE) {
17841
+ charRemoved = true;
17842
+ (0,helpers.call)(backspace ? dom/* Dom.after */.i.after : dom/* Dom.before */.i.before, sibling, fakeNode);
17843
+ if (mode === 'sentence' ||
17844
+ (mode === 'word' && removed !== ' ' && removed !== constants.NBSP_SPACE)) {
17845
+ checkRemoveChar(jodit, fakeNode, backspace, mode);
17846
+ }
17847
+ break;
17848
+ }
17849
+ let nextSibling = getSibling(sibling, backspace);
17850
+ if (!nextSibling &&
17851
+ sibling.parentNode &&
17852
+ sibling.parentNode !== jodit.editor) {
17853
+ nextSibling = findMostNestedNeighbor(sibling, !backspace, jodit.editor, true);
17854
+ }
17855
+ if (removeNeighbor) {
17856
+ dom/* Dom.safeRemove */.i.safeRemove(removeNeighbor);
17857
+ removeNeighbor = null;
17858
+ }
17859
+ sibling = nextSibling;
17860
+ }
17861
+ if (charRemoved) {
17862
+ removeEmptyInlineParent(fakeNode);
17863
+ addBRInsideEmptyBlock(jodit, fakeNode);
17864
+ jodit.s.setCursorBefore(fakeNode);
17865
+ }
17866
+ return charRemoved;
17867
+ }
17868
+ function removeEmptyInlineParent(node) {
17869
+ let parent = node.parentElement;
17870
+ while (parent && dom/* Dom.isInlineBlock */.i.isInlineBlock(parent)) {
17871
+ const p = parent.parentElement;
17872
+ if (dom/* Dom.isEmpty */.i.isEmpty(parent)) {
17873
+ dom/* Dom.after */.i.after(parent, node);
17874
+ dom/* Dom.safeRemove */.i.safeRemove(parent);
17875
+ }
17876
+ parent = p;
17877
+ }
17878
+ }
17879
+ function addBRInsideEmptyBlock(jodit, node) {
17880
+ if (node.parentElement !== jodit.editor &&
17881
+ dom/* Dom.isBlock */.i.isBlock(node.parentElement) &&
17882
+ dom/* Dom.each */.i.each(node.parentElement, dom/* Dom.isEmptyTextNode */.i.isEmptyTextNode)) {
17883
+ dom/* Dom.after */.i.after(node, jodit.createInside.element('br'));
17884
+ }
17885
+ }
17886
+
17887
+ ;// CONCATENATED MODULE: ./src/plugins/keyboard/backspace/cases/check-table-cell.ts
17888
+ /*!
17889
+ * Jodit Editor (https://xdsoft.net/jodit/)
17890
+ * Released under MIT see LICENSE.txt in the project root for license information.
17891
+ * Copyright (c) 2013-2021 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
17892
+ */
17893
+
17894
+ function checkTableCell(jodit, fakeNode) {
17895
+ const cell = fakeNode.parentElement;
17896
+ if (dom/* Dom.isCell */.i.isCell(cell)) {
17897
+ return true;
17898
+ }
17899
+ return false;
17900
+ }
17901
+
17902
+ ;// CONCATENATED MODULE: ./src/plugins/keyboard/backspace/cases/check-remove-empty-neighbor.ts
17903
+ /*!
17904
+ * Jodit Editor (https://xdsoft.net/jodit/)
17905
+ * Released under MIT see LICENSE.txt in the project root for license information.
17906
+ * Copyright (c) 2013-2021 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
17907
+ */
17908
+
17909
+
17910
+ function checkRemoveEmptyNeighbor(jodit, fakeNode, backspace) {
17911
+ const parent = dom/* Dom.closest */.i.closest(fakeNode, dom/* Dom.isElement */.i.isElement, jodit.editor);
17912
+ if (!parent) {
17913
+ return false;
17914
+ }
17915
+ const neighbor = findNotEmptySibling(parent, backspace);
17916
+ if (neighbor && dom/* Dom.isEmpty */.i.isEmpty(neighbor)) {
17917
+ dom/* Dom.safeRemove */.i.safeRemove(neighbor);
17918
+ jodit.s.setCursorBefore(fakeNode);
17919
+ return true;
17920
+ }
17921
+ return false;
17922
+ }
17923
+
17924
+ ;// CONCATENATED MODULE: ./src/plugins/keyboard/backspace/cases/check-join-neighbors.ts
17925
+ /*!
17926
+ * Jodit Editor (https://xdsoft.net/jodit/)
17927
+ * Released under MIT see LICENSE.txt in the project root for license information.
17928
+ * Copyright (c) 2013-2021 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
17929
+ */
17930
+
17931
+
17932
+ function checkJoinNeighbors(jodit, fakeNode, backspace) {
17933
+ let nextBox = fakeNode, mainClosestBox = nextBox;
17934
+ while (nextBox &&
17935
+ !findNotEmptySibling(nextBox, backspace) &&
17936
+ nextBox.parentElement !== jodit.editor) {
17937
+ nextBox = nextBox.parentElement;
17938
+ mainClosestBox = nextBox;
17939
+ }
17940
+ if (dom/* Dom.isElement */.i.isElement(mainClosestBox) &&
17941
+ dom/* Dom.isContentEditable */.i.isContentEditable(mainClosestBox, jodit.editor)) {
17942
+ const sibling = findNotEmptySibling(mainClosestBox, backspace);
17943
+ if (sibling &&
17944
+ (checkMoveListContent(jodit, mainClosestBox, sibling, backspace) ||
17945
+ moveContentAndRemoveEmpty(jodit, mainClosestBox, sibling, backspace))) {
17946
+ jodit.s.setCursorBefore(fakeNode);
17947
+ return true;
17948
+ }
17949
+ }
17950
+ return false;
17951
+ }
17952
+ function checkMoveListContent(jodit, mainClosestBox, sibling, backspace) {
17953
+ const siblingIsList = dom/* Dom.isTag */.i.isTag(sibling, ['ol', 'ul']);
17954
+ const boxIsList = dom/* Dom.isTag */.i.isTag(mainClosestBox, ['ol', 'ul']);
17955
+ const elementChild = (elm, side) => side ? elm.firstElementChild : elm.lastElementChild;
17956
+ if (boxIsList) {
17957
+ sibling = jodit.createInside.element(jodit.o.enterBlock);
17958
+ dom/* Dom.before */.i.before(mainClosestBox, sibling);
17959
+ return moveContentAndRemoveEmpty(jodit, elementChild(mainClosestBox, backspace), sibling, backspace);
17960
+ }
17961
+ if (sibling && siblingIsList && !boxIsList) {
17962
+ return moveContentAndRemoveEmpty(jodit, mainClosestBox, elementChild(sibling, !backspace), backspace);
17963
+ }
17964
+ return false;
17965
+ }
17966
+ function moveContentAndRemoveEmpty(jodit, mainClosestBox, sibling, backspace) {
17967
+ if (mainClosestBox && dom/* Dom.isElement */.i.isElement(sibling)) {
17968
+ dom/* Dom.moveContent */.i.moveContent(mainClosestBox, sibling, !backspace);
17969
+ let remove = mainClosestBox;
17970
+ while (remove && remove !== jodit.editor && dom/* Dom.isEmpty */.i.isEmpty(remove)) {
17971
+ const parent = remove.parentElement;
17972
+ dom/* Dom.safeRemove */.i.safeRemove(remove);
17973
+ remove = parent;
17974
+ }
17975
+ return true;
17976
+ }
17977
+ return false;
17978
+ }
17979
+
17980
+ ;// CONCATENATED MODULE: ./src/plugins/keyboard/backspace/cases/check-unwrap-first-list-item.ts
17981
+ /*!
17982
+ * Jodit Editor (https://xdsoft.net/jodit/)
17983
+ * Released under MIT see LICENSE.txt in the project root for license information.
17984
+ * Copyright (c) 2013-2021 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
17985
+ */
17986
+
17987
+
17988
+ function checkUnwrapFirstListItem(jodit, fakeNode, backspace) {
17989
+ var _a;
17990
+ const li = dom/* Dom.closest */.i.closest(fakeNode, dom/* Dom.isElement */.i.isElement, jodit.editor);
17991
+ const { s } = jodit;
17992
+ if (dom/* Dom.isTag */.i.isTag(li, 'li') &&
17993
+ ((_a = li === null || li === void 0 ? void 0 : li.parentElement) === null || _a === void 0 ? void 0 : _a[backspace ? 'firstElementChild' : 'lastElementChild']) === li &&
17994
+ s.cursorInTheEdge(backspace, li)) {
17995
+ const ul = li.parentElement;
17996
+ const p = jodit.createInside.element(jodit.o.enterBlock);
17997
+ (0,helpers.call)(backspace ? dom/* Dom.before */.i.before : dom/* Dom.after */.i.after, ul, p);
17998
+ dom/* Dom.moveContent */.i.moveContent(li, p);
17999
+ dom/* Dom.safeRemove */.i.safeRemove(li);
18000
+ if (dom/* Dom.isEmpty */.i.isEmpty(ul)) {
18001
+ dom/* Dom.safeRemove */.i.safeRemove(ul);
18002
+ }
18003
+ (0,helpers.call)(backspace ? s.setCursorBefore : s.setCursorAfter, fakeNode);
18004
+ return true;
18005
+ }
18006
+ return false;
18007
+ }
18008
+
18009
+ ;// CONCATENATED MODULE: ./src/plugins/keyboard/backspace/cases/index.ts
18010
+ /*!
18011
+ * Jodit Editor (https://xdsoft.net/jodit/)
18012
+ * Released under MIT see LICENSE.txt in the project root for license information.
18013
+ * Copyright (c) 2013-2021 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
18014
+ */
18015
+
18016
+
18017
+
18018
+
18019
+
18020
+
18021
+
18022
+
18023
+
18024
+ const cases = [
18025
+ checkRemoveUnbreakableElement,
18026
+ checkRemoveContentNotEditable,
18027
+ checkRemoveChar,
18028
+ checkTableCell,
18029
+ checkRemoveEmptyParent,
18030
+ checkRemoveEmptyNeighbor,
18031
+ checkJoinTwoLists,
18032
+ checkJoinNeighbors,
18033
+ checkUnwrapFirstListItem
18034
+ ];
18035
+
18036
+ ;// CONCATENATED MODULE: ./src/plugins/keyboard/backspace/cases/check-not-collapsed.ts
18037
+ function checkNotCollapsed(jodit) {
18038
+ if (!jodit.s.isCollapsed()) {
18039
+ jodit.execCommand('Delete');
18040
+ return true;
18041
+ }
18042
+ return false;
18043
+ }
18044
+
18045
+ ;// CONCATENATED MODULE: ./src/plugins/keyboard/backspace/config.ts
18046
+ /*!
18047
+ * Jodit Editor (https://xdsoft.net/jodit/)
18048
+ * Released under MIT see LICENSE.txt in the project root for license information.
18049
+ * Copyright (c) 2013-2021 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
18050
+ */
18051
+
17532
18052
  config/* Config.prototype.delete */.D.prototype["delete"] = {
17533
18053
  hotkeys: {
17534
18054
  delete: ['delete', 'cmd+backspace'],
17535
18055
  deleteWord: ['ctrl+delete', 'cmd+alt+backspace', 'ctrl+alt+backspace'],
18056
+ deleteSentence: ['ctrl+shift+delete', 'cmd+shift+delete'],
17536
18057
  backspace: ['backspace'],
17537
- backspaceWord: ['ctrl+backspace']
18058
+ backspaceWord: ['ctrl+backspace'],
18059
+ backspaceSentence: ['ctrl+shift+backspace', 'cmd+shift+backspace']
17538
18060
  }
17539
18061
  };
17540
- class Delete extends Plugin {
18062
+
18063
+ ;// CONCATENATED MODULE: ./src/plugins/keyboard/backspace/backspace.ts
18064
+ /*!
18065
+ * Jodit Editor (https://xdsoft.net/jodit/)
18066
+ * Released under MIT see LICENSE.txt in the project root for license information.
18067
+ * Copyright (c) 2013-2021 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
18068
+ */
18069
+
18070
+
18071
+
18072
+
18073
+
18074
+
18075
+
18076
+
18077
+ class Backspace extends Plugin {
17541
18078
  constructor() {
17542
18079
  super(...arguments);
17543
18080
  this.requires = ['hotkeys'];
17544
18081
  }
17545
- get root() {
17546
- return this.j.editor;
17547
- }
17548
18082
  afterInit(jodit) {
17549
18083
  jodit.e.on('afterCommand.delete', (command) => {
17550
18084
  if (command === 'delete') {
@@ -17565,12 +18099,20 @@ class Delete extends Plugin {
17565
18099
  stopPropagation: false
17566
18100
  })
17567
18101
  .registerCommand('deleteWordButton', {
17568
- exec: () => this.onDelete(false, true),
18102
+ exec: () => this.onDelete(false, 'word'),
17569
18103
  hotkeys: jodit.o.delete.hotkeys.deleteWord
17570
18104
  })
17571
18105
  .registerCommand('backspaceWordButton', {
17572
- exec: () => this.onDelete(true, true),
18106
+ exec: () => this.onDelete(true, 'word'),
17573
18107
  hotkeys: jodit.o.delete.hotkeys.backspaceWord
18108
+ })
18109
+ .registerCommand('deleteSentenceButton', {
18110
+ exec: () => this.onDelete(false, 'sentence'),
18111
+ hotkeys: jodit.o.delete.hotkeys.deleteSentence
18112
+ })
18113
+ .registerCommand('backspaceSentenceButton', {
18114
+ exec: () => this.onDelete(true, 'sentence'),
18115
+ hotkeys: jodit.o.delete.hotkeys.backspaceSentence
17574
18116
  });
17575
18117
  }
17576
18118
  beforeDestruct(jodit) {
@@ -17590,16 +18132,15 @@ class Delete extends Plugin {
17590
18132
  jodit.s.removeNode(node);
17591
18133
  }
17592
18134
  }
17593
- onDelete(backspace, block = false) {
17594
- var _a;
17595
- const sel = this.j.selection;
18135
+ onDelete(backspace, mode = 'char') {
18136
+ const jodit = this.j;
18137
+ const sel = jodit.selection;
17596
18138
  if (!sel.isFocused()) {
17597
18139
  sel.focus();
17598
18140
  }
17599
- if (!((_a = sel.sel) === null || _a === void 0 ? void 0 : _a.rangeCount) || this.checkNotCollapsed()) {
18141
+ if (checkNotCollapsed(jodit)) {
17600
18142
  return false;
17601
18143
  }
17602
- const jodit = this.j;
17603
18144
  const range = sel.range;
17604
18145
  const fakeNode = jodit.createInside.text(constants.INVISIBLE_SPACE);
17605
18146
  try {
@@ -17607,15 +18148,9 @@ class Delete extends Plugin {
17607
18148
  if (!dom/* Dom.isOrContains */.i.isOrContains(jodit.editor, fakeNode)) {
17608
18149
  return;
17609
18150
  }
17610
- normalizeCursorPosition(fakeNode, backspace);
17611
- if (this.checkRemoveInseparableElement(fakeNode, backspace) ||
17612
- this.checkRemoveChar(fakeNode, backspace, block) ||
17613
- this.checkTableCell(fakeNode) ||
17614
- this.checkRemoveEmptyParent(fakeNode, backspace) ||
17615
- this.checkRemoveEmptyNeighbor(fakeNode, backspace) ||
17616
- this.checkJoinTwoLists(fakeNode, backspace) ||
17617
- this.checkJoinNeighbors(fakeNode, backspace) ||
17618
- this.checkRewrapListItem(fakeNode, backspace)) {
18151
+ normalizeCursorPosition(jodit, fakeNode, backspace);
18152
+ if (cases.some((func) => (0,helpers.isFunction)(func) &&
18153
+ func(jodit, fakeNode, backspace, mode))) {
17619
18154
  return false;
17620
18155
  }
17621
18156
  }
@@ -17628,261 +18163,6 @@ class Delete extends Plugin {
17628
18163
  }
17629
18164
  return false;
17630
18165
  }
17631
- checkNotCollapsed() {
17632
- const jodit = this.j;
17633
- if (!jodit.s.isCollapsed()) {
17634
- jodit.execCommand('Delete');
17635
- return true;
17636
- }
17637
- }
17638
- checkRemoveChar(fakeNode, backspace, block) {
17639
- var _a, _b, _c;
17640
- const step = backspace ? -1 : 1;
17641
- const anotherSibling = getSibling(fakeNode, !backspace);
17642
- let sibling = getSibling(fakeNode, backspace), removeNeighbor = null;
17643
- let charRemoved = false, removed;
17644
- while (sibling && (dom/* Dom.isText */.i.isText(sibling) || dom/* Dom.isInlineBlock */.i.isInlineBlock(sibling))) {
17645
- while (dom/* Dom.isInlineBlock */.i.isInlineBlock(sibling)) {
17646
- sibling = (backspace ? sibling === null || sibling === void 0 ? void 0 : sibling.lastChild : sibling === null || sibling === void 0 ? void 0 : sibling.firstChild);
17647
- }
17648
- if (!sibling) {
17649
- break;
17650
- }
17651
- if ((_a = sibling.nodeValue) === null || _a === void 0 ? void 0 : _a.length) {
17652
- let value = (0,helpers.toArray)(sibling.nodeValue);
17653
- const length = value.length;
17654
- let index = backspace ? length - 1 : 0;
17655
- if (value[index] === constants.INVISIBLE_SPACE) {
17656
- while (value[index] === constants.INVISIBLE_SPACE) {
17657
- index += step;
17658
- }
17659
- }
17660
- removed = value[index];
17661
- if (value[index + step] === constants.INVISIBLE_SPACE) {
17662
- index += step;
17663
- while (value[index] === constants.INVISIBLE_SPACE) {
17664
- index += step;
17665
- }
17666
- index += backspace ? 1 : -1;
17667
- }
17668
- if (backspace && index < 0) {
17669
- value = [];
17670
- }
17671
- else {
17672
- value = value.slice(backspace ? 0 : index + 1, backspace ? index : length);
17673
- }
17674
- if (!anotherSibling ||
17675
- !dom/* Dom.isText */.i.isText(anotherSibling) ||
17676
- (!backspace ? / $/ : /^ /).test((_b = anotherSibling.nodeValue) !== null && _b !== void 0 ? _b : '') ||
17677
- !(0,helpers.trimInv)(anotherSibling.nodeValue || '').length) {
17678
- for (let i = backspace ? value.length - 1 : 0; backspace ? i >= 0 : i < value.length; i += backspace ? -1 : 1) {
17679
- if (value[i] === ' ') {
17680
- value[i] = constants.NBSP_SPACE;
17681
- }
17682
- else {
17683
- break;
17684
- }
17685
- }
17686
- }
17687
- sibling.nodeValue = value.join('');
17688
- }
17689
- if (!((_c = sibling.nodeValue) === null || _c === void 0 ? void 0 : _c.length)) {
17690
- removeNeighbor = sibling;
17691
- }
17692
- if (!(0,helpers.isVoid)(removed) && removed !== constants.INVISIBLE_SPACE) {
17693
- charRemoved = true;
17694
- (0,helpers.call)(backspace ? dom/* Dom.after */.i.after : dom/* Dom.before */.i.before, sibling, fakeNode);
17695
- if (block) {
17696
- while (this.checkRemoveChar(fakeNode, backspace, false)) { }
17697
- }
17698
- break;
17699
- }
17700
- let nextSibling = getSibling(sibling, backspace);
17701
- if (!nextSibling &&
17702
- sibling.parentNode &&
17703
- sibling.parentNode !== this.root) {
17704
- nextSibling = findMostNestedNeighbor(sibling, !backspace, this.root, true);
17705
- }
17706
- if (removeNeighbor) {
17707
- dom/* Dom.safeRemove */.i.safeRemove(removeNeighbor);
17708
- removeNeighbor = null;
17709
- }
17710
- sibling = nextSibling;
17711
- }
17712
- if (charRemoved) {
17713
- this.removeEmptyInlineParent(fakeNode);
17714
- this.addBRInsideEmptyBlock(fakeNode);
17715
- this.j.s.setCursorBefore(fakeNode);
17716
- }
17717
- return charRemoved || undefined;
17718
- }
17719
- removeEmptyInlineParent(node) {
17720
- let parent = node.parentElement;
17721
- while (parent && dom/* Dom.isInlineBlock */.i.isInlineBlock(parent)) {
17722
- const p = parent.parentElement;
17723
- if (dom/* Dom.isEmpty */.i.isEmpty(parent)) {
17724
- dom/* Dom.after */.i.after(parent, node);
17725
- dom/* Dom.safeRemove */.i.safeRemove(parent);
17726
- }
17727
- parent = p;
17728
- }
17729
- }
17730
- addBRInsideEmptyBlock(node) {
17731
- if (node.parentElement !== this.root &&
17732
- dom/* Dom.isBlock */.i.isBlock(node.parentElement) &&
17733
- dom/* Dom.each */.i.each(node.parentElement, dom/* Dom.isEmptyTextNode */.i.isEmptyTextNode)) {
17734
- dom/* Dom.after */.i.after(node, this.j.createInside.element('br'));
17735
- }
17736
- }
17737
- checkRemoveInseparableElement(fakeNode, backspace) {
17738
- const neighbor = dom/* Dom.findSibling */.i.findSibling(fakeNode, backspace);
17739
- if (dom/* Dom.isElement */.i.isElement(neighbor) &&
17740
- (dom/* Dom.isTag */.i.isTag(neighbor, constants.INSEPARABLE_TAGS) ||
17741
- dom/* Dom.isEmpty */.i.isEmpty(neighbor) ||
17742
- (0,helpers.attr)(neighbor, 'contenteditable') === 'false')) {
17743
- dom/* Dom.safeRemove */.i.safeRemove(neighbor);
17744
- this.j.s.setCursorBefore(fakeNode);
17745
- if (dom/* Dom.isTag */.i.isTag(neighbor, 'br')) {
17746
- this.checkRemoveEmptyParent(fakeNode, backspace);
17747
- }
17748
- return true;
17749
- }
17750
- }
17751
- checkTableCell(fakeNode) {
17752
- const cell = fakeNode.parentElement;
17753
- if (dom/* Dom.isCell */.i.isCell(cell)) {
17754
- return true;
17755
- }
17756
- }
17757
- checkRemoveEmptyParent(fakeNode, backspace) {
17758
- let found = false;
17759
- const { setCursorBefore, setCursorIn } = this.j.s;
17760
- let prn = dom/* Dom.closest */.i.closest(fakeNode, dom/* Dom.isElement */.i.isElement, this.root);
17761
- if (!prn || !dom/* Dom.isEmpty */.i.isEmpty(prn)) {
17762
- return;
17763
- }
17764
- const neighbor = findNotEmptyNeighbor(fakeNode, backspace, this.root);
17765
- do {
17766
- if (prn && dom/* Dom.isEmpty */.i.isEmpty(prn) && !dom/* Dom.isCell */.i.isCell(prn)) {
17767
- dom/* Dom.after */.i.after(prn, fakeNode);
17768
- const tmp = dom/* Dom.closest */.i.closest(prn, n => dom/* Dom.isElement */.i.isElement(n) && n !== prn, this.root);
17769
- dom/* Dom.safeRemove */.i.safeRemove(prn);
17770
- found = true;
17771
- prn = tmp;
17772
- }
17773
- else {
17774
- break;
17775
- }
17776
- } while (prn);
17777
- if (found && this.checkJoinTwoLists(fakeNode, backspace)) {
17778
- return true;
17779
- }
17780
- if (neighbor &&
17781
- !dom/* Dom.isText */.i.isText(neighbor) &&
17782
- !dom/* Dom.isTag */.i.isTag(neighbor, constants.INSEPARABLE_TAGS)) {
17783
- setCursorIn(neighbor, !backspace);
17784
- }
17785
- else {
17786
- setCursorBefore(fakeNode);
17787
- }
17788
- return found || undefined;
17789
- }
17790
- checkJoinTwoLists(fakeNode, backspace) {
17791
- const next = dom/* Dom.findSibling */.i.findSibling(fakeNode, backspace), prev = dom/* Dom.findSibling */.i.findSibling(fakeNode, !backspace);
17792
- if (!dom/* Dom.closest */.i.closest(fakeNode, dom/* Dom.isElement */.i.isElement, this.root) &&
17793
- dom/* Dom.isTag */.i.isTag(next, ['ul', 'ol']) &&
17794
- dom/* Dom.isTag */.i.isTag(prev, ['ul', 'ol']) &&
17795
- dom/* Dom.isTag */.i.isTag(next.lastElementChild, 'li') &&
17796
- dom/* Dom.isTag */.i.isTag(prev.firstElementChild, 'li')) {
17797
- const { setCursorBefore, setCursorAfter } = this.j.s;
17798
- const target = next.lastElementChild, second = prev.firstElementChild;
17799
- (0,helpers.call)(!backspace ? dom/* Dom.append */.i.append : dom/* Dom.prepend */.i.prepend, second, fakeNode);
17800
- dom/* Dom.moveContent */.i.moveContent(prev, next, !backspace);
17801
- dom/* Dom.safeRemove */.i.safeRemove(prev);
17802
- (0,helpers.call)(backspace ? dom/* Dom.append */.i.append : dom/* Dom.prepend */.i.prepend, target, fakeNode);
17803
- (0,helpers.call)(backspace ? setCursorBefore : setCursorAfter, fakeNode);
17804
- return true;
17805
- }
17806
- }
17807
- checkRemoveEmptyNeighbor(fakeNode, backspace) {
17808
- const parent = dom/* Dom.closest */.i.closest(fakeNode, dom/* Dom.isElement */.i.isElement, this.root);
17809
- if (!parent) {
17810
- return;
17811
- }
17812
- const neighbor = findNotEmptySibling(parent, backspace);
17813
- if (neighbor && dom/* Dom.isEmpty */.i.isEmpty(neighbor)) {
17814
- dom/* Dom.safeRemove */.i.safeRemove(neighbor);
17815
- this.j.s.setCursorBefore(fakeNode);
17816
- return true;
17817
- }
17818
- }
17819
- checkJoinNeighbors(fakeNode, backspace) {
17820
- const { jodit } = this;
17821
- let nextBox = fakeNode, mainClosestBox = nextBox;
17822
- while (nextBox &&
17823
- !findNotEmptySibling(nextBox, backspace) &&
17824
- nextBox.parentElement !== this.root) {
17825
- nextBox = nextBox.parentElement;
17826
- mainClosestBox = nextBox;
17827
- }
17828
- if (dom/* Dom.isElement */.i.isElement(mainClosestBox)) {
17829
- const sibling = findNotEmptySibling(mainClosestBox, backspace);
17830
- if (sibling &&
17831
- (this.checkMoveListContent(mainClosestBox, sibling, backspace) ||
17832
- this.moveContentAndRemoveEmpty(mainClosestBox, sibling, backspace))) {
17833
- jodit.s.setCursorBefore(fakeNode);
17834
- return true;
17835
- }
17836
- }
17837
- }
17838
- checkMoveListContent(mainClosestBox, sibling, backspace) {
17839
- const { jodit } = this;
17840
- const siblingIsList = dom/* Dom.isTag */.i.isTag(sibling, ['ol', 'ul']);
17841
- const boxIsList = dom/* Dom.isTag */.i.isTag(mainClosestBox, ['ol', 'ul']);
17842
- const elementChild = (elm, side) => side ? elm.firstElementChild : elm.lastElementChild;
17843
- if (boxIsList) {
17844
- sibling = jodit.createInside.element(jodit.o.enterBlock);
17845
- dom/* Dom.before */.i.before(mainClosestBox, sibling);
17846
- return this.moveContentAndRemoveEmpty(elementChild(mainClosestBox, backspace), sibling, backspace);
17847
- }
17848
- if (sibling && siblingIsList && !boxIsList) {
17849
- return this.moveContentAndRemoveEmpty(mainClosestBox, elementChild(sibling, !backspace), backspace);
17850
- }
17851
- return false;
17852
- }
17853
- moveContentAndRemoveEmpty(mainClosestBox, sibling, backspace) {
17854
- if (mainClosestBox && dom/* Dom.isElement */.i.isElement(sibling)) {
17855
- dom/* Dom.moveContent */.i.moveContent(mainClosestBox, sibling, !backspace);
17856
- let remove = mainClosestBox;
17857
- while (remove && remove !== this.root && dom/* Dom.isEmpty */.i.isEmpty(remove)) {
17858
- const parent = remove.parentElement;
17859
- dom/* Dom.safeRemove */.i.safeRemove(remove);
17860
- remove = parent;
17861
- }
17862
- return true;
17863
- }
17864
- return false;
17865
- }
17866
- checkRewrapListItem(fakeNode, backspace) {
17867
- var _a;
17868
- if (backspace) {
17869
- const li = dom/* Dom.closest */.i.closest(fakeNode, dom/* Dom.isElement */.i.isElement, this.root);
17870
- if (dom/* Dom.isTag */.i.isTag(li, 'li') &&
17871
- ((_a = li === null || li === void 0 ? void 0 : li.parentElement) === null || _a === void 0 ? void 0 : _a.firstElementChild) === li &&
17872
- this.j.s.cursorInTheEdge(true, li)) {
17873
- const ul = li.parentElement;
17874
- const p = this.j.createInside.element(this.j.o.enterBlock);
17875
- dom/* Dom.before */.i.before(ul, p);
17876
- dom/* Dom.moveContent */.i.moveContent(li, p);
17877
- dom/* Dom.safeRemove */.i.safeRemove(li);
17878
- if (dom/* Dom.isEmpty */.i.isEmpty(ul)) {
17879
- dom/* Dom.safeRemove */.i.safeRemove(ul);
17880
- }
17881
- this.j.s.setCursorBefore(fakeNode);
17882
- return true;
17883
- }
17884
- }
17885
- }
17886
18166
  safeRemoveEmptyNode(fakeNode) {
17887
18167
  var _a, _b;
17888
18168
  const { range } = this.j.s;
@@ -18791,7 +19071,7 @@ class paste extends Plugin {
18791
19071
  const keep = (0,ui_button/* Button */.zx)(this.j, {
18792
19072
  text: 'Keep',
18793
19073
  name: 'keep',
18794
- status: 'primary',
19074
+ variant: 'primary',
18795
19075
  tabIndex: 0
18796
19076
  });
18797
19077
  const clear = (0,ui_button/* Button */.zx)(this.j, {
@@ -21109,6 +21389,10 @@ class imageProperties extends Plugin {
21109
21389
  return;
21110
21390
  }
21111
21391
  if (editor.o.image.openOnDblClick) {
21392
+ if (this.j.e.fire('openOnDblClick', image) ===
21393
+ false) {
21394
+ return;
21395
+ }
21112
21396
  self.state.image = image;
21113
21397
  if (!editor.o.readonly) {
21114
21398
  e.stopImmediatePropagation();
@@ -21381,12 +21665,12 @@ config/* Config.prototype.toolbarInlineForSelection */.D.prototype.toolbarInline
21381
21665
  config/* Config.prototype.toolbarInlineDisableFor */.D.prototype.toolbarInlineDisableFor = [];
21382
21666
  config/* Config.prototype.toolbarInlineDisabledButtons */.D.prototype.toolbarInlineDisabledButtons = ['source'];
21383
21667
  config/* Config.prototype.popup */.D.prototype.popup = {
21384
- a: __webpack_require__(49)/* ["default"] */ .Z,
21385
- img: __webpack_require__(50)/* ["default"] */ .Z,
21386
- cells: __webpack_require__(51)/* ["default"] */ .Z,
21387
- toolbar: __webpack_require__(52)/* ["default"] */ .Z,
21388
- jodit: __webpack_require__(53)/* ["default"] */ .Z,
21389
- 'jodit-media': __webpack_require__(53)/* ["default"] */ .Z,
21668
+ a: (__webpack_require__(49)/* ["default"] */ .Z),
21669
+ img: (__webpack_require__(50)/* ["default"] */ .Z),
21670
+ cells: (__webpack_require__(51)/* ["default"] */ .Z),
21671
+ toolbar: (__webpack_require__(52)/* ["default"] */ .Z),
21672
+ jodit: (__webpack_require__(53)/* ["default"] */ .Z),
21673
+ 'jodit-media': (__webpack_require__(53)/* ["default"] */ .Z),
21390
21674
  selection: [
21391
21675
  'bold',
21392
21676
  'underline',
@@ -21902,13 +22186,13 @@ const formTemplate = (editor) => {
21902
22186
  new ui_form/* UIBlock */.eC(editor, [
21903
22187
  new ui_button/* UIButton */.y3(editor, {
21904
22188
  name: 'unlink',
21905
- status: 'default',
22189
+ variant: 'default',
21906
22190
  text: 'Unlink'
21907
22191
  }),
21908
22192
  new ui_button/* UIButton */.y3(editor, {
21909
22193
  name: 'insert',
21910
22194
  type: 'submit',
21911
- status: 'primary',
22195
+ variant: 'primary',
21912
22196
  text: 'Insert'
21913
22197
  })
21914
22198
  ], {
@@ -23140,10 +23424,11 @@ class resizer extends Plugin {
23140
23424
  return (0,helpers.offset)((this.rect.parentNode || this.j.od.documentElement), this.j, this.j.od, true);
23141
23425
  }
23142
23426
  applySize(element, key, value) {
23143
- if (dom/* Dom.isImage */.i.isImage(element) && this.j.o.resizer.forImageChangeAttributes) {
23427
+ const changeAttrs = dom/* Dom.isImage */.i.isImage(element) && this.j.o.resizer.forImageChangeAttributes;
23428
+ if (changeAttrs) {
23144
23429
  (0,helpers.attr)(element, key, value);
23145
23430
  }
23146
- else {
23431
+ if (!changeAttrs || element.style[key]) {
23147
23432
  (0,helpers.css)(element, key, value);
23148
23433
  }
23149
23434
  }
@@ -24214,6 +24499,9 @@ class AceEditor extends SourceEditor {
24214
24499
  constructor() {
24215
24500
  super(...arguments);
24216
24501
  this.className = 'jodit_ace_editor';
24502
+ this.proxyOnBlur = (e) => {
24503
+ this.j.e.fire('blur', e);
24504
+ };
24217
24505
  this.proxyOnFocus = (e) => {
24218
24506
  this.j.e.fire('focus', e);
24219
24507
  };
@@ -24289,6 +24577,7 @@ class AceEditor extends SourceEditor {
24289
24577
  this.instance.on('change', this.toWYSIWYG);
24290
24578
  this.instance.on('focus', this.proxyOnFocus);
24291
24579
  this.instance.on('mousedown', this.proxyOnMouseDown);
24580
+ this.instance.on('blur', this.proxyOnBlur);
24292
24581
  if (editor.getRealMode() !== constants.MODE_WYSIWYG) {
24293
24582
  this.setValue(this.getValue());
24294
24583
  }
@@ -24429,6 +24718,14 @@ function createSourceEditor(type, editor, container, toWYSIWYG, fromWYSIWYG) {
24429
24718
  return sourceEditor;
24430
24719
  }
24431
24720
 
24721
+ ;// CONCATENATED MODULE: ./src/plugins/source/const.ts
24722
+ /*!
24723
+ * Jodit Editor (https://xdsoft.net/jodit/)
24724
+ * Released under MIT see LICENSE.txt in the project root for license information.
24725
+ * Copyright (c) 2013-2021 Valeriy Chupurnov. All rights reserved. https://xdsoft.net
24726
+ */
24727
+ const SOURCE_CONSUMER = 'source-consumer';
24728
+
24432
24729
  ;// CONCATENATED MODULE: ./src/plugins/source/source.ts
24433
24730
  /*!
24434
24731
  * Jodit Editor (https://xdsoft.net/jodit/)
@@ -24444,6 +24741,7 @@ function createSourceEditor(type, editor, container, toWYSIWYG, fromWYSIWYG) {
24444
24741
 
24445
24742
 
24446
24743
 
24744
+
24447
24745
  class source extends Plugin {
24448
24746
  constructor() {
24449
24747
  super(...arguments);
@@ -24479,7 +24777,7 @@ class source extends Plugin {
24479
24777
  fromWYSIWYG(force = false) {
24480
24778
  if (!this.__lock || force === true) {
24481
24779
  this.__lock = true;
24482
- const new_value = this.j.getEditorValue(false);
24780
+ const new_value = this.j.getEditorValue(false, SOURCE_CONSUMER);
24483
24781
  if (new_value !== this.getMirrorValue()) {
24484
24782
  this.setMirrorValue(new_value);
24485
24783
  }
@@ -24640,7 +24938,7 @@ class source extends Plugin {
24640
24938
  var _a;
24641
24939
  (_a = this.sourceEditor) === null || _a === void 0 ? void 0 : _a.setPlaceHolder(text);
24642
24940
  })
24643
- .on('change.source', this.fromWYSIWYG)
24941
+ .on('change.source', this.syncValueFromWYSIWYG)
24644
24942
  .on('beautifyHTML', html => html);
24645
24943
  if (editor.o.beautifyHTML) {
24646
24944
  const addEventListener = () => {
@@ -24656,9 +24954,16 @@ class source extends Plugin {
24656
24954
  (0,helpers.loadNext)(editor, editor.o.beautifyHTMLCDNUrlsJS).then(addEventListener);
24657
24955
  }
24658
24956
  }
24659
- this.fromWYSIWYG();
24957
+ this.syncValueFromWYSIWYG(true);
24660
24958
  this.initSourceEditor(editor);
24661
24959
  }
24960
+ syncValueFromWYSIWYG(force = false) {
24961
+ const editor = this.j;
24962
+ if (editor.getMode() === constants.MODE_SPLIT ||
24963
+ editor.getMode() === constants.MODE_SOURCE) {
24964
+ this.fromWYSIWYG(force);
24965
+ }
24966
+ }
24662
24967
  initSourceEditor(editor) {
24663
24968
  var _a;
24664
24969
  if (editor.o.sourceEditor !== 'area') {
@@ -24667,14 +24972,14 @@ class source extends Plugin {
24667
24972
  var _a, _b;
24668
24973
  (_a = this.sourceEditor) === null || _a === void 0 ? void 0 : _a.destruct();
24669
24974
  this.sourceEditor = sourceEditor;
24670
- this.fromWYSIWYG(true);
24975
+ this.syncValueFromWYSIWYG(true);
24671
24976
  (_b = editor.events) === null || _b === void 0 ? void 0 : _b.fire('sourceEditorReady', editor);
24672
24977
  });
24673
24978
  }
24674
24979
  else {
24675
24980
  (_a = this.sourceEditor) === null || _a === void 0 ? void 0 : _a.onReadyAlways(() => {
24676
24981
  var _a;
24677
- this.fromWYSIWYG(true);
24982
+ this.syncValueFromWYSIWYG(true);
24678
24983
  (_a = editor.events) === null || _a === void 0 ? void 0 : _a.fire('sourceEditorReady', editor);
24679
24984
  });
24680
24985
  }
@@ -24714,6 +25019,9 @@ class source extends Plugin {
24714
25019
  (0,tslib_es6/* __decorate */.gn)([
24715
25020
  (0,decorators.watch)(':readonly.source')
24716
25021
  ], source.prototype, "onReadonlyReact", null);
25022
+ (0,tslib_es6/* __decorate */.gn)([
25023
+ decorators.autobind
25024
+ ], source.prototype, "syncValueFromWYSIWYG", null);
24717
25025
 
24718
25026
  ;// CONCATENATED MODULE: ./src/plugins/source/index.ts
24719
25027
  /*!
@@ -26165,7 +26473,15 @@ class tooltip extends Plugin {
26165
26473
 
26166
26474
  config/* Config.prototype.controls.preview */.D.prototype.controls.preview = {
26167
26475
  icon: 'eye',
26168
- exec: (editor) => {
26476
+ command: 'preview',
26477
+ mode: constants.MODE_SOURCE + constants.MODE_WYSIWYG,
26478
+ tooltip: 'Preview'
26479
+ };
26480
+ function preview(editor) {
26481
+ editor.registerButton({
26482
+ name: 'preview'
26483
+ });
26484
+ editor.registerCommand('preview', (_, _1, defaultValue) => {
26169
26485
  const dialog = editor.getInstance('Dialog', {
26170
26486
  language: editor.o.language,
26171
26487
  theme: editor.o.theme
@@ -26175,7 +26491,8 @@ config/* Config.prototype.controls.preview */.D.prototype.controls.preview = {
26175
26491
  position: 'relative',
26176
26492
  padding: 16
26177
26493
  });
26178
- const value = editor.value ||
26494
+ const value = defaultValue ||
26495
+ editor.value ||
26179
26496
  `<div style='position: absolute;left:50%;top:50%;transform: translateX(-50%) translateY(-50%);color:#ccc;'>${editor.i18n('Empty')}</div>`;
26180
26497
  if (editor.iframe) {
26181
26498
  const iframe = editor.create.element('iframe');
@@ -26198,17 +26515,42 @@ config/* Config.prototype.controls.preview */.D.prototype.controls.preview = {
26198
26515
  minHeight: 600,
26199
26516
  border: 0
26200
26517
  });
26201
- div.innerHTML = value;
26202
- dialog.open(div, editor.i18n('Preview'));
26518
+ dialog.setSize(1024, 600).open(div, editor.i18n('Preview'));
26519
+ const setHTML = (box, value) => {
26520
+ const dv = editor.c.div();
26521
+ dv.innerHTML = value;
26522
+ for (let i = 0; i < dv.children.length; i += 1) {
26523
+ const c = dv.children[i];
26524
+ const newNode = document.createElement(c.nodeName);
26525
+ for (let j = 0; j < c.attributes.length; j += 1) {
26526
+ (0,helpers.attr)(newNode, c.attributes[j].nodeName, c.attributes[j].nodeValue);
26527
+ }
26528
+ if (c.children.length === 0) {
26529
+ switch (c.nodeName) {
26530
+ case 'SCRIPT':
26531
+ if (c.textContent) {
26532
+ newNode.textContent = c.textContent;
26533
+ }
26534
+ break;
26535
+ default:
26536
+ if (c.innerHTML) {
26537
+ newNode.innerHTML = c.innerHTML;
26538
+ }
26539
+ break;
26540
+ }
26541
+ }
26542
+ else {
26543
+ setHTML(newNode, c.innerHTML);
26544
+ }
26545
+ try {
26546
+ box.appendChild(newNode);
26547
+ }
26548
+ catch (_a) { }
26549
+ }
26550
+ };
26551
+ setHTML(div, value);
26203
26552
  }
26204
26553
  dialog.setModal(true);
26205
- },
26206
- mode: constants.MODE_SOURCE + constants.MODE_WYSIWYG,
26207
- tooltip: 'Preview'
26208
- };
26209
- function preview(editor) {
26210
- editor.registerButton({
26211
- name: 'preview'
26212
26554
  });
26213
26555
  }
26214
26556