leksy-editor 2.2.2 → 2.2.4

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 (2) hide show
  1. package/package.json +1 -1
  2. package/utilities.js +22 -13
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leksy-editor",
3
- "version": "2.2.2",
3
+ "version": "2.2.4",
4
4
  "description": "Leksy Editor is an alternative to traditional WYSIWYG editors, designed primarily for creating mail templates, blogs, and documents without any content manipulation.",
5
5
  "main": "index.js",
6
6
  "directories": {
package/utilities.js CHANGED
@@ -3219,6 +3219,12 @@ const outdentListItem = (li, core) => {
3219
3219
  }
3220
3220
  };
3221
3221
 
3222
+ const isEmptyLi = (li) => {
3223
+ const text = li.textContent.replace(/\u200B/g, '').trim();
3224
+ const hasOnlySublist = li.children.length === 1 && li.querySelector('ul, ol');
3225
+ return text === '' && !hasOnlySublist;
3226
+ }
3227
+
3222
3228
  const makeSublist = (event, core) => {
3223
3229
  if (event.key !== 'Tab') return;
3224
3230
 
@@ -3247,6 +3253,11 @@ const makeSublist = (event, core) => {
3247
3253
 
3248
3254
  if (!selectedLis.length) return;
3249
3255
 
3256
+ if (!event.shiftKey) {
3257
+ const hasContent = selectedLis.some(li => !isEmptyLi(li));
3258
+ if (hasContent) return;
3259
+ }
3260
+
3250
3261
  event.preventDefault();
3251
3262
 
3252
3263
  selectedLis.forEach(li => {
@@ -3933,12 +3944,12 @@ const handleBackspaceInList = (event, core) => {
3933
3944
  if (!range.collapsed) return;
3934
3945
 
3935
3946
  let element = range.startContainer;
3936
- if (element.nodeType === Node.TEXT_NODE) element = element.parentElement;
3947
+ if (element.nodeType === Node.TEXT_NODE) {
3948
+ element = element.parentElement;
3949
+ }
3937
3950
 
3938
3951
  const li = element.closest('li');
3939
- if (!li) return;
3940
-
3941
- if (!core.elements.editor.contains(li)) return;
3952
+ if (!li || !core.elements.editor.contains(li)) return;
3942
3953
 
3943
3954
  const nestedList = li.querySelector('ul, ol');
3944
3955
  if (!nestedList) return;
@@ -3981,15 +3992,13 @@ const handleBackspaceInList = (event, core) => {
3981
3992
 
3982
3993
  selection.removeAllRanges();
3983
3994
  selection.addRange(newRange);
3995
+ }
3996
+ // Case 2: first list item
3997
+ else {
3998
+ const span = document.createElement('span');
3999
+ span.textContent = parentText || '';
3984
4000
 
3985
- }
3986
- else {newRange.collapse(false);
3987
-
3988
- // Case 2: first list item
3989
- const p = document.createElement('p');
3990
- p.textContent = parentText;
3991
-
3992
- parentList.parentElement.insertBefore(p, parentList);
4001
+ parentList.parentElement.insertBefore(span, parentList);
3993
4002
 
3994
4003
  if (children.length > 0) {
3995
4004
  parentList.insertBefore(fragment, li);
@@ -3998,7 +4007,7 @@ const handleBackspaceInList = (event, core) => {
3998
4007
  li.remove();
3999
4008
 
4000
4009
  const newRange = document.createRange();
4001
- newRange.selectNodeContents(p);
4010
+ newRange.selectNodeContents(span);
4002
4011
  newRange.collapse(true);
4003
4012
 
4004
4013
  selection.removeAllRanges();