jodit 4.13.25 → 4.13.27

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 (55) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/es2015/jodit.css +1 -1
  3. package/es2015/jodit.fat.min.js +4 -4
  4. package/es2015/jodit.js +44 -11
  5. package/es2015/jodit.min.js +4 -4
  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 +4 -4
  13. package/es2018/jodit.min.js +4 -4
  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 +5 -5
  18. package/es2021/jodit.js +43 -11
  19. package/es2021/jodit.min.js +5 -5
  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 +5 -5
  28. package/es2021.en/jodit.js +43 -11
  29. package/es2021.en/jodit.min.js +25 -25
  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 +44 -11
  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/core/constants.js +1 -1
  51. package/esm/core/selection/style/api/get-suit-parent.js +10 -0
  52. package/esm/core/ui/popup/popup.js +13 -1
  53. package/esm/modules/toolbar/button/button.js +19 -11
  54. package/esm/modules/widget/color-picker/color-picker.js +8 -0
  55. package/package.json +1 -1
package/es2015/jodit.js CHANGED
@@ -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.13.25
4
+ * Version: v4.13.27
5
5
  * Url: https://xdsoft.net/jodit/
6
6
  * License(s): MIT
7
7
  */
@@ -1849,7 +1849,7 @@ __webpack_require__.r(__webpack_exports__);
1849
1849
  * ```
1850
1850
  * @packageDocumentation
1851
1851
  * @module constants
1852
- */ const APP_VERSION = "4.13.25";
1852
+ */ const APP_VERSION = "4.13.27";
1853
1853
  // prettier-ignore
1854
1854
  const ES = "es2015";
1855
1855
  const IS_ES_MODERN = true;
@@ -11978,6 +11978,7 @@ class Selection {
11978
11978
  * @param root - editor root
11979
11979
  * @private
11980
11980
  */ function getSuitParent(style, node, root) {
11981
+ var _style_options_attributes;
11981
11982
  const { parentNode } = node;
11982
11983
  if (parentNode === root || !jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.isHTMLElement(parentNode) || jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.next(node, _is_normal_node__WEBPACK_IMPORTED_MODULE_1__.isNormalNode, parentNode) || jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.prev(node, _is_normal_node__WEBPACK_IMPORTED_MODULE_1__.isNormalNode, parentNode)) {
11983
11984
  return null;
@@ -11986,6 +11987,13 @@ class Selection {
11986
11987
  if (style.isElementCommit && style.elementIsBlock && !jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.isBlock(parentNode)) {
11987
11988
  return getSuitParent(style, parentNode, root);
11988
11989
  }
11990
+ // <li>|test|</li> => apply the CSS style to the <li> itself, so the
11991
+ // list marker (bullet/number) gets the same color and size as the text.
11992
+ // Only for pure style commits: bold/italic keep wrapping the content.
11993
+ // See #1460
11994
+ if (jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.isTag(parentNode, 'li') && !style.isElementCommit && ((_style_options_attributes = style.options.attributes) === null || _style_options_attributes === void 0 ? void 0 : _style_options_attributes.style)) {
11995
+ return parentNode;
11996
+ }
11989
11997
  if ((0,_is_suit_element__WEBPACK_IMPORTED_MODULE_2__.isSuitElement)(style, parentNode, false) && (!jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.isBlock(parentNode) || style.elementIsBlock)) {
11990
11998
  return parentNode;
11991
11999
  }
@@ -16595,6 +16603,15 @@ class Popup extends jodit_core_ui_group_group__WEBPACK_IMPORTED_MODULE_11__.UIGr
16595
16603
  this.j.e.fire(this, 'beforeClose');
16596
16604
  this.j.e.fire('beforePopupClose', this);
16597
16605
  this.__removeGlobalListeners();
16606
+ // Blur a focused control (e.g. the color picker hex input) before
16607
+ // the container goes away. Chrome fires `blur`/`change` for a
16608
+ // removed focused element in the middle of `removeChild`, Firefox
16609
+ // does not fire them at all. Blurring first makes both browsers
16610
+ // run those handlers while the popup is still in the DOM. See #1458
16611
+ const { activeElement } = this.od;
16612
+ if (activeElement && activeElement !== this.container && jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_6__.Dom.isOrContains(this.container, activeElement) && (0,jodit_core_helpers__WEBPACK_IMPORTED_MODULE_8__.isFunction)(activeElement.blur)) {
16613
+ activeElement.blur();
16614
+ }
16598
16615
  jodit_core_dom_dom__WEBPACK_IMPORTED_MODULE_6__.Dom.safeRemove(this.container);
16599
16616
  return this;
16600
16617
  }
@@ -24284,15 +24301,23 @@ class ToolbarButton extends jodit_core_ui_button__WEBPACK_IMPORTED_MODULE_21__.U
24284
24301
  return this.openedPopup;
24285
24302
  }
24286
24303
  __closePopup() {
24287
- if (this.openedPopup) {
24288
- this.j.e.off(this.ow, 'mousedown touchstart', this.onOutsideClick).off('escape closeAllPopups', this.onOutsideClick);
24289
- this.state.activated = false;
24290
- this.openedPopup.close();
24291
- this.openedPopup.destruct();
24292
- this.openedPopup = null;
24293
- if (this.trigger) {
24294
- (0,jodit_core_helpers_utils_attr__WEBPACK_IMPORTED_MODULE_19__.attr)(this.trigger, 'aria-expanded', false);
24295
- }
24304
+ const popup = this.openedPopup;
24305
+ if (!popup) {
24306
+ return;
24307
+ }
24308
+ // Detach first: removing a popup that holds the focused element
24309
+ // makes Chrome fire `blur`/`change` on it synchronously, and a
24310
+ // handler there may call the popup's `close` callback again.
24311
+ // A re-entrant call must be a no-op, otherwise it destructs the
24312
+ // popup while the outer `removeChild` is still running and Chrome
24313
+ // throws NotFoundError. See #1458
24314
+ this.openedPopup = null;
24315
+ this.j.e.off(this.ow, 'mousedown touchstart', this.onOutsideClick).off('escape closeAllPopups', this.onOutsideClick);
24316
+ this.state.activated = false;
24317
+ popup.close();
24318
+ popup.destruct();
24319
+ if (this.trigger) {
24320
+ (0,jodit_core_helpers_utils_attr__WEBPACK_IMPORTED_MODULE_19__.attr)(this.trigger, 'aria-expanded', false);
24296
24321
  }
24297
24322
  }
24298
24323
  /**
@@ -25646,8 +25671,15 @@ jodit_core_ui__WEBPACK_IMPORTED_MODULE_2__.Icon.set('palette', (_palette_svg__WE
25646
25671
  const { extra } = (0,jodit_core_helpers___WEBPACK_IMPORTED_MODULE_1__.refs)(form);
25647
25672
  extra.appendChild(editor.c.fromHTML(`<div class="${cn}__hex"><input data-ref="hexInput" type="text" spellcheck="false" aria-label="HEX" placeholder="#FF0000" value="${valueHex || ''}"/></div>`));
25648
25673
  const { hexInput } = (0,jodit_core_helpers___WEBPACK_IMPORTED_MODULE_1__.refs)(form);
25674
+ // Enter applies the value and closes the popup; removing the focused
25675
+ // input then makes Chrome fire `change` on it, which would apply the
25676
+ // same color a second time and toggle it off again. See #1459
25677
+ let appliedHexValue = null;
25649
25678
  const applyHexInput = ()=>{
25650
25679
  const raw = hexInput.value.trim();
25680
+ if (raw === appliedHexValue) {
25681
+ return;
25682
+ }
25651
25683
  const isHex = /^#?[0-9a-f]{3}(?:[0-9a-f]{3})?$/i.test(raw);
25652
25684
  const isRgb = /^rgba?\([\d\s.,%]+\)$/i.test(raw);
25653
25685
  if (!isHex && !isRgb) {
@@ -25655,6 +25687,7 @@ jodit_core_ui__WEBPACK_IMPORTED_MODULE_2__.Icon.set('palette', (_palette_svg__WE
25655
25687
  }
25656
25688
  const color = (0,jodit_core_helpers___WEBPACK_IMPORTED_MODULE_1__.normalizeColor)(isHex && !raw.startsWith('#') ? '#' + raw : raw);
25657
25689
  if (color && (0,jodit_core_helpers___WEBPACK_IMPORTED_MODULE_1__.isFunction)(callback)) {
25690
+ appliedHexValue = raw;
25658
25691
  callback(color);
25659
25692
  }
25660
25693
  };