@brandup/ui-richeditor 1.0.42 → 1.0.43

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.
package/README.md CHANGED
@@ -151,7 +151,7 @@ new RichEditor(elem, { format: true, actions: ["emoji", "erase", "undo", "redo"]
151
151
  - **Shift+Enter** или **Ctrl/Cmd+Enter** → мягкий перенос (`<br>`) внутри абзаца;
152
152
  - блуждающий текст и `<div>` нормализуются в `<p>` при вводе.
153
153
 
154
- Опция `paragraph: "break"` меняет это местами — Enter даёт мягкий перенос, а абзац набирается модификатором либо просто двумя переносами. Так устроены мессенджеры, и это важно при `storage: "markdown"`: в режиме по умолчанию каждый Enter уходит в значение пустой строкой (`\n\n`), а в `break` — одним переносом (`\n`).
154
+ Опция `paragraph: "break"` меняет это: Enter даёт мягкий перенос, а модификатор в этом режиме ничего не меняет — пустая строка набирается двумя переносами, как в мессенджерах (отдельный абзац дал бы в значении ровно её же). Это важно при `storage: "markdown"`: в режиме по умолчанию каждый Enter уходит в значение пустой строкой (`\n\n`), а в `break` — одним переносом (`\n`).
155
155
 
156
156
  В этом режиме абзацных блоков в содержимом нет вовсе: значение загружается плоским текстом, где каждый `\n` становится `<br>` внутри единственного `<p>`. Иначе два переноса рисовались бы двумя абзацами, а у хоста без отступов между ними это неотличимо от одного переноса — значение расходилось бы с видимым текстом.
157
157
 
package/package.json CHANGED
@@ -27,12 +27,12 @@
27
27
  "email": "it@brandup.online"
28
28
  },
29
29
  "license": "Apache-2.0",
30
- "version": "1.0.42",
30
+ "version": "1.0.43",
31
31
  "main": "source/index.ts",
32
32
  "types": "source/index.ts",
33
33
  "dependencies": {
34
34
  "@brandup/ui": "^2.0.7",
35
- "@brandup/ui-kit": "^1.0.42"
35
+ "@brandup/ui-kit": "^1.0.43"
36
36
  },
37
37
  "files": [
38
38
  "source",
@@ -1047,14 +1047,15 @@ export default class RichEditor extends UIElementBound<RichEditorEvents> {
1047
1047
  if (this.readonly) return;
1048
1048
 
1049
1049
  // В режиме block Enter — новый абзац (<p>), модификатор — мягкий перенос (<br>).
1050
- // В режиме break наоборот: Enter переносит строку, как в мессенджерах, а абзац
1051
- // набирается двумя переносами. Внутри блока правило берётся у его типа: в цитате
1052
- // и в коде Enter переносит строку, иначе одну цитату было бы не набрать.
1050
+ // В режиме break строку переносят оба нажатия: пустая строка набирается двумя
1051
+ // переносами, как в мессенджерах, и отдельный абзац дал бы в значении ровно её же.
1052
+ // Внутри блока правило берётся у его типа: из цитаты и кода Enter выходит,
1053
+ // а модификатор переносит строку внутри.
1053
1054
  const withModifier = e.shiftKey || e.ctrlKey || e.metaKey;
1054
1055
  const current = this.currentBlock;
1055
1056
  const breaks =
1056
1057
  current === DEFAULT_BLOCK ? this.paragraph === "break" : BLOCK_TYPES[current].enter === "break";
1057
- const soft = breaks ? !withModifier : withModifier;
1058
+ const soft = breaks || withModifier;
1058
1059
 
1059
1060
  this.__history?.record("op");
1060
1061
  // Из блока выходят тем же нажатием, что делит его: продолжать цитату или код
@@ -462,12 +462,14 @@ export function cleanupFormatting(root: HTMLElement) {
462
462
  const el = queue.pop()!;
463
463
  if (!el.isConnected || !root.contains(el)) continue;
464
464
 
465
- // пустой тег: после удаления его соседи могут стать смежными одинаковыми,
466
- // а родитель опустеть
465
+ // Тег без текста: оформлять в нём нечего. Разворачиваем, а не удаляем — внутри может
466
+ // лежать перенос строки, и вместе с тегом он унёс бы разделение строк (снятие формата
467
+ // с нескольких строк схлопывало их в одну). Пустой совсем — исчезнет и так.
468
+ // После правки соседи могут стать смежными одинаковыми, а родитель — опустеть.
467
469
  if (el.textContent === "") {
468
470
  enqueue(el.nextSibling);
469
471
  enqueue(el.parentElement);
470
- el.remove();
472
+ unwrapElement(el);
471
473
  continue;
472
474
  }
473
475