suneditor 3.1.4 → 3.2.1

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 (217) hide show
  1. package/dist/suneditor-contents.min.css +1 -1
  2. package/dist/suneditor.min.css +28 -1
  3. package/dist/suneditor.min.js +1 -1
  4. package/package.json +2 -1
  5. package/src/assets/design/color.css +12 -0
  6. package/src/assets/design/size.css +9 -2
  7. package/src/assets/icons/defaultIcons.js +96 -47
  8. package/src/assets/suneditor-contents.css +3 -2
  9. package/src/assets/suneditor.css +481 -31
  10. package/src/core/config/contextProvider.js +2 -1
  11. package/src/core/config/eventManager.js +41 -2
  12. package/src/core/config/optionProvider.js +23 -2
  13. package/src/core/editor.js +32 -14
  14. package/src/core/event/actions/index.js +76 -9
  15. package/src/core/event/effects/common.registry.js +2 -1
  16. package/src/core/event/effects/keydown.registry.js +169 -33
  17. package/src/core/event/effects/ruleHelpers.js +20 -6
  18. package/src/core/event/eventOrchestrator.js +162 -30
  19. package/src/core/event/handlers/handler_toolbar.js +4 -2
  20. package/src/core/event/handlers/handler_ww_dragDrop.js +10 -0
  21. package/src/core/event/handlers/handler_ww_input.js +84 -2
  22. package/src/core/event/handlers/handler_ww_key.js +82 -21
  23. package/src/core/event/handlers/handler_ww_mouse.js +45 -8
  24. package/src/core/event/ports.js +27 -13
  25. package/src/core/event/reducers/keydown.reducer.js +33 -5
  26. package/src/core/event/rules/keydown.rule.arrow.js +12 -2
  27. package/src/core/event/rules/keydown.rule.backspace.js +110 -15
  28. package/src/core/event/rules/keydown.rule.delete.js +62 -7
  29. package/src/core/event/rules/keydown.rule.enter.js +62 -31
  30. package/src/core/event/support/defaultLineManager.js +9 -2
  31. package/src/core/event/support/selectionState.js +13 -3
  32. package/src/core/kernel/coreKernel.js +1 -0
  33. package/src/core/logic/dom/char.js +13 -3
  34. package/src/core/logic/dom/format.js +171 -39
  35. package/src/core/logic/dom/html.js +350 -72
  36. package/src/core/logic/dom/inline.js +229 -34
  37. package/src/core/logic/dom/listFormat.js +111 -20
  38. package/src/core/logic/dom/nodeTransform.js +36 -11
  39. package/src/core/logic/dom/offset.js +116 -31
  40. package/src/core/logic/dom/selection.js +147 -29
  41. package/src/core/logic/panel/blockHandle.js +785 -0
  42. package/src/core/logic/panel/blockResolver.js +278 -0
  43. package/src/core/logic/panel/finder.js +16 -6
  44. package/src/core/logic/panel/menu.js +119 -18
  45. package/src/core/logic/panel/toolbar.js +75 -19
  46. package/src/core/logic/panel/viewer.js +76 -20
  47. package/src/core/logic/shell/_commandExecutor.js +44 -9
  48. package/src/core/logic/shell/commandDispatcher.js +46 -4
  49. package/src/core/logic/shell/component.js +102 -25
  50. package/src/core/logic/shell/focusManager.js +13 -3
  51. package/src/core/logic/shell/history.js +21 -6
  52. package/src/core/logic/shell/pluginManager.js +21 -13
  53. package/src/core/logic/shell/shortcuts.js +9 -1
  54. package/src/core/logic/shell/ui.js +139 -37
  55. package/src/core/schema/frameContext.js +34 -3
  56. package/src/core/schema/options.js +46 -4
  57. package/src/core/section/constructor.js +537 -106
  58. package/src/core/section/documentType.js +35 -6
  59. package/src/helper/converter.js +24 -7
  60. package/src/helper/dom/domCheck.js +25 -5
  61. package/src/helper/dom/domQuery.js +2 -1
  62. package/src/helper/dom/domUtils.js +17 -4
  63. package/src/helper/env.js +11 -2
  64. package/src/helper/keyCodeMap.js +6 -2
  65. package/src/helper/markdown.js +24 -5
  66. package/src/helper/msOffice.js +9 -2
  67. package/src/interfaces/plugins.js +1 -1
  68. package/src/langs/ckb.js +0 -1
  69. package/src/langs/cs.js +0 -1
  70. package/src/langs/da.js +0 -1
  71. package/src/langs/de.js +0 -1
  72. package/src/langs/en.js +0 -1
  73. package/src/langs/es.js +0 -1
  74. package/src/langs/fa.js +0 -1
  75. package/src/langs/fr.js +0 -1
  76. package/src/langs/he.js +0 -1
  77. package/src/langs/hu.js +0 -1
  78. package/src/langs/index.js +27 -1
  79. package/src/langs/it.js +0 -1
  80. package/src/langs/ja.js +0 -1
  81. package/src/langs/km.js +0 -1
  82. package/src/langs/ko.js +0 -1
  83. package/src/langs/lv.js +0 -1
  84. package/src/langs/nl.js +0 -1
  85. package/src/langs/pl.js +0 -1
  86. package/src/langs/pt_br.js +0 -1
  87. package/src/langs/ro.js +0 -1
  88. package/src/langs/ru.js +0 -1
  89. package/src/langs/se.js +0 -1
  90. package/src/langs/tr.js +0 -1
  91. package/src/langs/uk.js +0 -1
  92. package/src/langs/ur.js +0 -1
  93. package/src/langs/zh_cn.js +0 -1
  94. package/src/modules/contract/Browser.js +58 -14
  95. package/src/modules/contract/ColorPicker.js +12 -4
  96. package/src/modules/contract/Controller.js +37 -7
  97. package/src/modules/contract/Figure.js +156 -36
  98. package/src/modules/contract/HueSlider.js +27 -4
  99. package/src/modules/contract/Modal.js +50 -10
  100. package/src/modules/manager/FileManager.js +50 -8
  101. package/src/modules/ui/CommandMenu.js +597 -0
  102. package/src/modules/ui/ModalAnchorEditor.js +33 -6
  103. package/src/modules/ui/SelectMenu.js +481 -36
  104. package/src/modules/ui/index.js +1 -0
  105. package/src/plugins/browser/audioGallery.js +2 -1
  106. package/src/plugins/browser/fileBrowser.js +9 -2
  107. package/src/plugins/browser/fileGallery.js +2 -1
  108. package/src/plugins/browser/imageGallery.js +18 -3
  109. package/src/plugins/browser/videoGallery.js +13 -4
  110. package/src/plugins/command/blockquote.js +6 -1
  111. package/src/plugins/command/codeBlock.js +43 -5
  112. package/src/plugins/command/exportPDF.js +20 -4
  113. package/src/plugins/command/fileUpload.js +46 -11
  114. package/src/plugins/command/list_bulleted.js +6 -1
  115. package/src/plugins/command/list_numbered.js +6 -1
  116. package/src/plugins/dropdown/align.js +21 -33
  117. package/src/plugins/dropdown/backgroundColor.js +10 -2
  118. package/src/plugins/dropdown/blockStyle.js +17 -22
  119. package/src/plugins/dropdown/font.js +34 -34
  120. package/src/plugins/dropdown/hr.js +15 -43
  121. package/src/plugins/dropdown/layout.js +10 -27
  122. package/src/plugins/dropdown/lineHeight.js +10 -33
  123. package/src/plugins/dropdown/list.js +19 -25
  124. package/src/plugins/dropdown/paragraphStyle.js +16 -24
  125. package/src/plugins/dropdown/table/index.js +72 -17
  126. package/src/plugins/dropdown/table/render/table.html.js +3 -1
  127. package/src/plugins/dropdown/table/services/table.cell.js +33 -7
  128. package/src/plugins/dropdown/table/services/table.clipboard.js +5 -1
  129. package/src/plugins/dropdown/table/services/table.grid.js +40 -9
  130. package/src/plugins/dropdown/table/services/table.resize.js +55 -11
  131. package/src/plugins/dropdown/table/services/table.selection.js +27 -7
  132. package/src/plugins/dropdown/table/services/table.style.js +120 -20
  133. package/src/plugins/dropdown/template.js +13 -29
  134. package/src/plugins/dropdown/textStyle.js +22 -35
  135. package/src/plugins/field/autocomplete.js +8 -4
  136. package/src/plugins/field/slashCommand.js +297 -0
  137. package/src/plugins/index.js +3 -0
  138. package/src/plugins/input/fontSize.js +37 -8
  139. package/src/plugins/input/pageNavigator.js +7 -1
  140. package/src/plugins/modal/audio.js +71 -17
  141. package/src/plugins/modal/drawing.js +41 -11
  142. package/src/plugins/modal/embed.js +92 -22
  143. package/src/plugins/modal/image/index.js +114 -28
  144. package/src/plugins/modal/image/services/image.size.js +9 -2
  145. package/src/plugins/modal/image/services/image.upload.js +38 -4
  146. package/src/plugins/modal/link.js +9 -2
  147. package/src/plugins/modal/math.js +10 -2
  148. package/src/plugins/modal/video/index.js +112 -26
  149. package/src/plugins/modal/video/render/video.html.js +4 -1
  150. package/src/plugins/modal/video/services/video.size.js +15 -4
  151. package/src/plugins/modal/video/services/video.upload.js +10 -2
  152. package/src/plugins/popup/anchor.js +14 -2
  153. package/src/suneditor.js +8 -2
  154. package/src/themes/cobalt.css +12 -0
  155. package/src/themes/cream.css +12 -0
  156. package/src/themes/dark.css +12 -0
  157. package/src/themes/midnight.css +12 -0
  158. package/src/typedef.js +32 -21
  159. package/types/assets/icons/defaultIcons.d.ts +1 -0
  160. package/types/core/config/contextProvider.d.ts +7 -1
  161. package/types/core/config/eventManager.d.ts +37 -4
  162. package/types/core/config/optionProvider.d.ts +5 -1
  163. package/types/core/event/actions/index.d.ts +44 -6
  164. package/types/core/event/effects/keydown.registry.d.ts +37 -7
  165. package/types/core/event/effects/ruleHelpers.d.ts +6 -1
  166. package/types/core/event/eventOrchestrator.d.ts +13 -3
  167. package/types/core/event/handlers/handler_ww_clipboard.d.ts +15 -3
  168. package/types/core/event/handlers/handler_ww_dragDrop.d.ts +14 -2
  169. package/types/core/event/handlers/handler_ww_input.d.ts +10 -2
  170. package/types/core/event/handlers/handler_ww_key.d.ts +10 -2
  171. package/types/core/event/handlers/handler_ww_mouse.d.ts +25 -5
  172. package/types/core/event/ports.d.ts +11 -4
  173. package/types/core/event/reducers/keydown.reducer.d.ts +12 -3
  174. package/types/core/event/rules/keydown.rule.backspace.d.ts +6 -1
  175. package/types/core/kernel/store.d.ts +4 -1
  176. package/types/core/logic/dom/format.d.ts +32 -14
  177. package/types/core/logic/dom/html.d.ts +11 -3
  178. package/types/core/logic/dom/nodeTransform.d.ts +6 -6
  179. package/types/core/logic/panel/blockHandle.d.ts +64 -0
  180. package/types/core/logic/panel/blockResolver.d.ts +50 -0
  181. package/types/core/logic/panel/menu.d.ts +72 -3
  182. package/types/core/logic/shell/commandDispatcher.d.ts +8 -0
  183. package/types/core/logic/shell/component.d.ts +5 -3
  184. package/types/core/logic/shell/shortcuts.d.ts +10 -1
  185. package/types/core/logic/shell/ui.d.ts +7 -1
  186. package/types/core/schema/context.d.ts +7 -1
  187. package/types/core/schema/frameContext.d.ts +36 -4
  188. package/types/core/schema/options.d.ts +83 -2
  189. package/types/core/section/constructor.d.ts +38 -1
  190. package/types/events.d.ts +208 -32
  191. package/types/helper/converter.d.ts +4 -2
  192. package/types/helper/dom/domCheck.d.ts +12 -2
  193. package/types/helper/dom/domQuery.d.ts +35 -7
  194. package/types/helper/dom/domUtils.d.ts +4 -1
  195. package/types/interfaces/plugins.d.ts +2 -2
  196. package/types/langs/_Lang.d.ts +0 -1
  197. package/types/modules/contract/ColorPicker.d.ts +2 -2
  198. package/types/modules/contract/Controller.d.ts +7 -0
  199. package/types/modules/contract/Figure.d.ts +31 -4
  200. package/types/modules/ui/CommandMenu.d.ts +262 -0
  201. package/types/modules/ui/SelectMenu.d.ts +56 -3
  202. package/types/modules/ui/index.d.ts +1 -0
  203. package/types/plugins/browser/audioGallery.d.ts +1 -1
  204. package/types/plugins/browser/fileBrowser.d.ts +1 -1
  205. package/types/plugins/browser/fileGallery.d.ts +1 -1
  206. package/types/plugins/browser/imageGallery.d.ts +1 -1
  207. package/types/plugins/browser/videoGallery.d.ts +1 -1
  208. package/types/plugins/dropdown/align.d.ts +1 -1
  209. package/types/plugins/dropdown/blockStyle.d.ts +3 -1
  210. package/types/plugins/dropdown/table/index.d.ts +4 -1
  211. package/types/plugins/dropdown/table/services/table.clipboard.d.ts +5 -1
  212. package/types/plugins/dropdown/table/services/table.grid.d.ts +10 -2
  213. package/types/plugins/field/autocomplete.d.ts +0 -1
  214. package/types/plugins/field/slashCommand.d.ts +165 -0
  215. package/types/plugins/index.d.ts +3 -0
  216. package/types/plugins/modal/link.d.ts +4 -1
  217. package/types/typedef.d.ts +48 -23
@@ -34,7 +34,12 @@ export class TableCellService {
34
34
 
35
35
  // members - SelectMenu - split
36
36
  const splitMenu = CreateSplitMenu(this.#$.lang);
37
- this.selectMenu_split = new SelectMenu(this.#$, { checkList: false, position: 'bottom-center', openMethod: openCellMenuFunc, closeMethod: closeCellMenuFunc });
37
+ this.selectMenu_split = new SelectMenu(this.#$, {
38
+ checkList: false,
39
+ position: 'bottom-center',
40
+ openMethod: openCellMenuFunc,
41
+ closeMethod: closeCellMenuFunc,
42
+ });
38
43
  this.selectMenu_split.on(this.splitButton, this._OnSplitCells.bind(this));
39
44
  this.selectMenu_split.create(splitMenu.items, splitMenu.menus);
40
45
  }
@@ -59,7 +64,9 @@ export class TableCellService {
59
64
  mergeCells(selectedCells, skipPostProcess = false) {
60
65
  const originTable = selectedCells[0].closest('table');
61
66
  InvalidateTableCache(originTable);
62
- const { clonedTable, clonedSelectedCells } = skipPostProcess ? { clonedTable: originTable, clonedSelectedCells: selectedCells } : CloneTable(originTable, selectedCells);
67
+ const { clonedTable, clonedSelectedCells } = skipPostProcess
68
+ ? { clonedTable: originTable, clonedSelectedCells: selectedCells }
69
+ : CloneTable(originTable, selectedCells);
63
70
 
64
71
  this.#main.setTableInfo(clonedTable);
65
72
  selectedCells = clonedSelectedCells;
@@ -160,7 +167,9 @@ export class TableCellService {
160
167
 
161
168
  const originTable = selectedCells[0].closest('table');
162
169
  InvalidateTableCache(originTable);
163
- const { clonedTable, clonedSelectedCells } = skipPostProcess ? { clonedTable: originTable, clonedSelectedCells: selectedCells } : CloneTable(originTable, selectedCells);
170
+ const { clonedTable, clonedSelectedCells } = skipPostProcess
171
+ ? { clonedTable: originTable, clonedSelectedCells: selectedCells }
172
+ : CloneTable(originTable, selectedCells);
164
173
 
165
174
  this.#main.setState('ref', null);
166
175
  this.#main.setTableInfo(clonedTable);
@@ -217,7 +226,12 @@ export class TableCellService {
217
226
 
218
227
  // set info
219
228
  if (firstCell !== lastCell) {
220
- lastCell = !newLastCell || lastCell.closest('tr').rowIndex > newLastCell.closest('tr').rowIndex || lastCell.cellIndex > newLastCell.cellIndex ? lastCell : newLastCell;
229
+ lastCell =
230
+ !newLastCell ||
231
+ lastCell.closest('tr').rowIndex > newLastCell.closest('tr').rowIndex ||
232
+ lastCell.cellIndex > newLastCell.cellIndex
233
+ ? lastCell
234
+ : newLastCell;
221
235
  this.#selectionService.setMultiCells(firstCell, lastCell);
222
236
  this.#main.setState('selectedCells', Array.from(table.querySelectorAll('.se-selected-table-cell')));
223
237
  } else {
@@ -265,7 +279,11 @@ export class TableCellService {
265
279
  * @description Sets the unmerge button visibility.
266
280
  */
267
281
  setUnMergeButton() {
268
- if (this.findMergedCells(!this.#state.selectedCells?.length ? [this.#state.fixedCell] : this.#state.selectedCells).length > 0) {
282
+ if (
283
+ this.findMergedCells(
284
+ !this.#state.selectedCells?.length ? [this.#state.fixedCell] : this.#state.selectedCells,
285
+ ).length > 0
286
+ ) {
269
287
  this.unmergeButton.disabled = false;
270
288
  } else {
271
289
  this.unmergeButton.disabled = true;
@@ -345,7 +363,11 @@ export class TableCellService {
345
363
  });
346
364
  }
347
365
 
348
- if (cell !== currentCell && logcalIndex <= index && logcalIndex + cs >= index + currentColSpan - 1) {
366
+ if (
367
+ cell !== currentCell &&
368
+ logcalIndex <= index &&
369
+ logcalIndex + cs >= index + currentColSpan - 1
370
+ ) {
349
371
  cell.colSpan += 1;
350
372
  break;
351
373
  }
@@ -399,7 +421,11 @@ export class TableCellService {
399
421
  const nextCells = nextRow.cells;
400
422
  let rs = rowSpanArr.shift();
401
423
 
402
- for (let c = 0, cLen = nextCells.length, colSpan = 0, cell, cs, logcalIndex, insertIndex; c < cLen; c++) {
424
+ for (
425
+ let c = 0, cLen = nextCells.length, colSpan = 0, cell, cs, logcalIndex, insertIndex;
426
+ c < cLen;
427
+ c++
428
+ ) {
403
429
  logcalIndex = c + colSpan;
404
430
  cell = nextCells[c];
405
431
  cs = cell.colSpan - 1;
@@ -292,7 +292,11 @@ export class TableClipboardService {
292
292
  const cEnd = cStart + cs - 1;
293
293
  const mergeCells = [];
294
294
 
295
- for (let targetR = targetInfo.rowIndex + r, tRowCnt = targetR + rs, rowOffset = 0; targetR < tRowCnt; targetR++, rowOffset++) {
295
+ for (
296
+ let targetR = targetInfo.rowIndex + r, tRowCnt = targetR + rs, rowOffset = 0;
297
+ targetR < tRowCnt;
298
+ targetR++, rowOffset++
299
+ ) {
296
300
  const targetRow = targetRows[targetR];
297
301
  const targetCells = targetRow.cells;
298
302
 
@@ -28,13 +28,23 @@ export class TableGridService {
28
28
 
29
29
  // members - SelectMenu - column
30
30
  const columnMenu = CreateColumnMenu(this.#$.lang, this.#$.icons);
31
- this.selectMenu_column = new SelectMenu(this.#$, { checkList: false, position: 'bottom-center', openMethod: openCellMenuFunc, closeMethod: closeCellMenuFunc });
31
+ this.selectMenu_column = new SelectMenu(this.#$, {
32
+ checkList: false,
33
+ position: 'bottom-center',
34
+ openMethod: openCellMenuFunc,
35
+ closeMethod: closeCellMenuFunc,
36
+ });
32
37
  this.selectMenu_column.on(columnButton, this.#OnColumnEdit.bind(this));
33
38
  this.selectMenu_column.create(columnMenu.items, columnMenu.menus);
34
39
 
35
40
  // members - SelectMenu - row
36
41
  const rownMenu = CreateRowMenu(this.#$.lang, this.#$.icons);
37
- this.selectMenu_row = new SelectMenu(this.#$, { checkList: false, position: 'bottom-center', openMethod: openCellMenuFunc, closeMethod: closeCellMenuFunc });
42
+ this.selectMenu_row = new SelectMenu(this.#$, {
43
+ checkList: false,
44
+ position: 'bottom-center',
45
+ openMethod: openCellMenuFunc,
46
+ closeMethod: closeCellMenuFunc,
47
+ });
38
48
  this.selectMenu_row.on(rowButton, this.#OnRowEdit.bind(this));
39
49
  this.selectMenu_row.create(rownMenu.items, rownMenu.menus);
40
50
  }
@@ -54,7 +64,11 @@ export class TableGridService {
54
64
  * @description Opens the row menu.
55
65
  */
56
66
  openRowMenu() {
57
- this.selectMenu_row.menus[0].style.display = this.selectMenu_row.menus[1].style.display = /^TH$/i.test(this.#state.tdElement?.nodeName) ? 'none' : '';
67
+ this.selectMenu_row.menus[0].style.display = this.selectMenu_row.menus[1].style.display = /^TH$/i.test(
68
+ this.#state.tdElement?.nodeName,
69
+ )
70
+ ? 'none'
71
+ : '';
58
72
  this.selectMenu_row.open();
59
73
  }
60
74
 
@@ -77,7 +91,8 @@ export class TableGridService {
77
91
  dom.utils.removeItem(this.#state.figureElement);
78
92
  this.#main._closeTableSelectInfo();
79
93
  } else {
80
- table.innerHTML += '<tbody><tr>' + CreateCellsString('td', this.#state.logical_cellCnt) + '</tr></tbody>';
94
+ table.innerHTML +=
95
+ '<tbody><tr>' + CreateCellsString('td', this.#state.logical_cellCnt) + '</tr></tbody>';
81
96
  }
82
97
  return;
83
98
  }
@@ -274,7 +289,12 @@ export class TableGridService {
274
289
  if (removeIndex >= insertIndex && removeIndex + cs <= insertIndex + colSpan) {
275
290
  removeCell.push(cell);
276
291
  } else if (removeIndex <= insertIndex + colSpan && removeIndex + cs >= insertIndex) {
277
- cell.colSpan -= numbers.getOverlapRangeAtIndex(cellIndex, cellIndex + colSpan, removeIndex, removeIndex + cs);
292
+ cell.colSpan -= numbers.getOverlapRangeAtIndex(
293
+ cellIndex,
294
+ cellIndex + colSpan,
295
+ removeIndex,
296
+ removeIndex + cs,
297
+ );
278
298
  } else if (rs > 0 && (removeIndex < insertIndex || removeIndex + cs > insertIndex + colSpan)) {
279
299
  removeSpanArr.push({
280
300
  cell: cell,
@@ -311,8 +331,11 @@ export class TableGridService {
311
331
  if (remove) {
312
332
  dom.utils.removeItem(cols[insertIndex]);
313
333
  } else {
314
- const isAutoLayout = !dom.utils.hasClass(this.#main._element, 'se-table-layout-fixed') && this.#main._element.style.tableLayout !== 'fixed';
315
- const hasWidth = !isAutoLayout && Array.prototype.some.call(cols, (col) => numbers.get(col.style.width) > 0);
334
+ const isAutoLayout =
335
+ !dom.utils.hasClass(this.#main._element, 'se-table-layout-fixed') &&
336
+ this.#main._element.style.tableLayout !== 'fixed';
337
+ const hasWidth =
338
+ !isAutoLayout && Array.prototype.some.call(cols, (col) => numbers.get(col.style.width) > 0);
316
339
 
317
340
  if (hasWidth) {
318
341
  let totalW = 0;
@@ -345,7 +368,12 @@ export class TableGridService {
345
368
 
346
369
  for (let c = 0, cLen = removeSpanArr.length, rowSpanCell; c < cLen; c++) {
347
370
  rowSpanCell = removeSpanArr[c];
348
- rowSpanCell.cell.rowSpan = numbers.getOverlapRangeAtIndex(removeFirst, removeEnd, rowSpanCell.i, rowSpanCell.rs);
371
+ rowSpanCell.cell.rowSpan = numbers.getOverlapRangeAtIndex(
372
+ removeFirst,
373
+ removeEnd,
374
+ rowSpanCell.i,
375
+ rowSpanCell.rs,
376
+ );
349
377
  }
350
378
 
351
379
  this.#main._closeController();
@@ -408,7 +436,10 @@ export class TableGridService {
408
436
 
409
437
  if (cell.rowSpan > 1) {
410
438
  cell.rowSpan -= 1;
411
- spanCells.push({ cell: /** @type {HTMLTableCellElement} */ (cell.cloneNode(true)), index: logcalIndex });
439
+ spanCells.push({
440
+ cell: /** @type {HTMLTableCellElement} */ (cell.cloneNode(true)),
441
+ index: logcalIndex,
442
+ });
412
443
  }
413
444
  }
414
445
 
@@ -61,7 +61,12 @@ export class TableResizeService {
61
61
  this.#removeGlobalEvents();
62
62
  if (this.#resizeLine?.style.display === 'block') this.#resizeLine.style.display = 'none';
63
63
  this.#resizeLine = this.#$.frameContext.get('wrapper').querySelector(Constants.RESIZE_CELL_CLASS);
64
- this.#setResizeLinePosition(dom.query.getParentElement(target, dom.check.isTable), target, this.#resizeLine, cellEdge.isLeft);
64
+ this.#setResizeLinePosition(
65
+ dom.query.getParentElement(target, dom.check.isTable),
66
+ target,
67
+ this.#resizeLine,
68
+ cellEdge.isLeft,
69
+ );
65
70
  this.#resizeLine.style.display = 'block';
66
71
  return false;
67
72
  }
@@ -98,12 +103,15 @@ export class TableResizeService {
98
103
  try {
99
104
  this.#selectionService.deleteStyleSelectedCells();
100
105
  this.#main.setCellInfo(target, true);
101
- const colIndex = this.#state.logical_cellIndex + this.#state.current_colSpan - (cellEdge.isLeft ? 1 : 0);
106
+ const colIndex =
107
+ this.#state.logical_cellIndex + this.#state.current_colSpan - (cellEdge.isLeft ? 1 : 0);
102
108
 
103
109
  // ready
104
110
  this.#$.ui.enableBackWrapper('ew-resize');
105
111
  this.#resizeLine ||= this.#$.frameContext.get('wrapper').querySelector(Constants.RESIZE_CELL_CLASS);
106
- this.#resizeLinePrev = this.#$.frameContext.get('wrapper').querySelector(Constants.RESIZE_CELL_PREV_CLASS);
112
+ this.#resizeLinePrev = this.#$.frameContext
113
+ .get('wrapper')
114
+ .querySelector(Constants.RESIZE_CELL_PREV_CLASS);
107
115
 
108
116
  // select figure
109
117
  if (colIndex < 0 || colIndex === this.#state.logical_cellCnt - 1) {
@@ -112,8 +120,15 @@ export class TableResizeService {
112
120
  return false;
113
121
  }
114
122
 
115
- const col = this.#main._element.querySelector('colgroup').querySelectorAll('col')[colIndex < 0 ? 0 : colIndex];
116
- this._startCellResizing(col, cellEdge.startX, numbers.get(_w.getComputedStyle(col).width, Constants.CELL_DECIMAL_END), cellEdge.isLeft);
123
+ const col = this.#main._element.querySelector('colgroup').querySelectorAll('col')[
124
+ colIndex < 0 ? 0 : colIndex
125
+ ];
126
+ this._startCellResizing(
127
+ col,
128
+ cellEdge.startX,
129
+ numbers.get(_w.getComputedStyle(col).width, Constants.CELL_DECIMAL_END),
130
+ cellEdge.isLeft,
131
+ );
117
132
  this.#main._editorEnable(false);
118
133
  } catch (err) {
119
134
  console.warn('[SUNEDITOR.plugins.table.error]', err);
@@ -148,9 +163,15 @@ export class TableResizeService {
148
163
  // ready
149
164
  this.#$.ui.enableBackWrapper('ns-resize');
150
165
  this.#resizeLine ||= this.#$.frameContext.get('wrapper').querySelector(Constants.RESIZE_ROW_CLASS);
151
- this.#resizeLinePrev = this.#$.frameContext.get('wrapper').querySelector(Constants.RESIZE_ROW_PREV_CLASS);
152
-
153
- this._startRowResizing(row, rowEdge.startY, numbers.get(_w.getComputedStyle(row).height, Constants.CELL_DECIMAL_END));
166
+ this.#resizeLinePrev = this.#$.frameContext
167
+ .get('wrapper')
168
+ .querySelector(Constants.RESIZE_ROW_PREV_CLASS);
169
+
170
+ this._startRowResizing(
171
+ row,
172
+ rowEdge.startY,
173
+ numbers.get(_w.getComputedStyle(row).height, Constants.CELL_DECIMAL_END),
174
+ );
154
175
  this.#main._editorEnable(false);
155
176
  } catch (err) {
156
177
  console.warn('[SUNEDITOR.plugins.table.error]', err);
@@ -204,7 +225,9 @@ export class TableResizeService {
204
225
  const prevValue = col.style.width;
205
226
  const nextCol = /** @type {HTMLElement} */ (col.nextElementSibling);
206
227
  const nextColPrevValue = nextCol.style.width;
207
- const realWidth = dom.utils.hasClass(this.#main._element, 'se-table-layout-fixed') ? nextColPrevValue : converter.getWidthInPercentage(nextCol || col);
228
+ const realWidth = dom.utils.hasClass(this.#main._element, 'se-table-layout-fixed')
229
+ ? nextColPrevValue
230
+ : converter.getWidthInPercentage(nextCol || col);
208
231
 
209
232
  if (_DragHandle.get('__dragHandler')) _DragHandle.get('__dragHandler').style.display = 'none';
210
233
  this.#addResizeGlobalEvents(
@@ -251,7 +274,20 @@ export class TableResizeService {
251
274
  * @param {number} tableWidth The total width of the table.
252
275
  * @param {MouseEvent} e The mouse event.
253
276
  */
254
- #cellResize(col, nextCol, figure, tdEl, resizeLine, isLeftEdge, startX, startWidth, prevWidthPercent, nextColWidthPercent, tableWidth, e) {
277
+ #cellResize(
278
+ col,
279
+ nextCol,
280
+ figure,
281
+ tdEl,
282
+ resizeLine,
283
+ isLeftEdge,
284
+ startX,
285
+ startWidth,
286
+ prevWidthPercent,
287
+ nextColWidthPercent,
288
+ tableWidth,
289
+ e,
290
+ ) {
255
291
  const deltaX = e.clientX - startX;
256
292
  const newWidthPx = startWidth + deltaX;
257
293
  const newWidthPercent = (newWidthPx / tableWidth) * 100;
@@ -324,7 +360,15 @@ export class TableResizeService {
324
360
 
325
361
  if (_DragHandle.get('__dragHandler')) _DragHandle.get('__dragHandler').style.display = 'none';
326
362
  this.#addResizeGlobalEvents(
327
- this.#figureResize.bind(this, figure, this.#resizeLine, isLeftEdge, startX, figure.offsetWidth, numbers.get(realWidth, Constants.CELL_DECIMAL_END)),
363
+ this.#figureResize.bind(
364
+ this,
365
+ figure,
366
+ this.#resizeLine,
367
+ isLeftEdge,
368
+ startX,
369
+ figure.offsetWidth,
370
+ numbers.get(realWidth, Constants.CELL_DECIMAL_END),
371
+ ),
328
372
  () => {
329
373
  this.#removeGlobalEvents();
330
374
  if (numbers.get(figure.style.width, 0) > 100) figure.style.width = '100%';
@@ -93,7 +93,10 @@ export class TableSelectionService {
93
93
  }
94
94
 
95
95
  // try cache
96
- const cacheKey = getCacheKey(/** @type {HTMLTableCellElement} */ (startCell), /** @type {HTMLTableCellElement} */ (endCell));
96
+ const cacheKey = getCacheKey(
97
+ /** @type {HTMLTableCellElement} */ (startCell),
98
+ /** @type {HTMLTableCellElement} */ (endCell),
99
+ );
97
100
  let tableCache = refCache.get(table);
98
101
  const cachedRef = tableCache?.get(cacheKey);
99
102
 
@@ -186,7 +189,10 @@ export class TableSelectionService {
186
189
  const newRs = ref.rs < i ? ref.rs : i;
187
190
  const newRe = ref.re > i + rs ? ref.re : i + rs;
188
191
 
189
- if (numbers.getOverlapRangeAtIndex(ref.cs, ref.ce, logcalIndex, logcalIndex + cs) && numbers.getOverlapRangeAtIndex(ref.rs, ref.re, i, i + rs)) {
192
+ if (
193
+ numbers.getOverlapRangeAtIndex(ref.cs, ref.ce, logcalIndex, logcalIndex + cs) &&
194
+ numbers.getOverlapRangeAtIndex(ref.rs, ref.re, i, i + rs)
195
+ ) {
190
196
  if (ref.cs !== newCs || ref.ce !== newCe || ref.rs !== newRs || ref.re !== newRe) {
191
197
  ref.cs = newCs;
192
198
  ref.ce = newCe;
@@ -262,7 +268,10 @@ export class TableSelectionService {
262
268
  }
263
269
  }
264
270
 
265
- if (numbers.getOverlapRangeAtIndex(ref.cs, ref.ce, logcalIndex, logcalIndex + cs) && numbers.getOverlapRangeAtIndex(ref.rs, ref.re, i, i + rs)) {
271
+ if (
272
+ numbers.getOverlapRangeAtIndex(ref.cs, ref.ce, logcalIndex, logcalIndex + cs) &&
273
+ numbers.getOverlapRangeAtIndex(ref.rs, ref.re, i, i + rs)
274
+ ) {
266
275
  dom.utils.addClass(cell, 'se-selected-table-cell');
267
276
  }
268
277
 
@@ -362,7 +371,9 @@ export class TableSelectionService {
362
371
  */
363
372
  #OnCellMultiSelect(e) {
364
373
  this.#$.store.set('_preventBlur', true);
365
- const target = /** @type {HTMLTableCellElement} */ (dom.query.getParentElement(dom.query.getEventTarget(e), dom.check.isTableCell));
374
+ const target = /** @type {HTMLTableCellElement} */ (
375
+ dom.query.getParentElement(dom.query.getEventTarget(e), dom.check.isTableCell)
376
+ );
366
377
 
367
378
  if (this.#state.isShiftPressed) {
368
379
  if (target === this.#state.fixedCell) {
@@ -379,7 +390,12 @@ export class TableSelectionService {
379
390
  else this.#main._editorEnable(false);
380
391
  }
381
392
 
382
- if (!target || target === this.#state.selectedCell || this.#fixedCellName !== target.nodeName || this.#state.selectedTable !== dom.query.getParentElement(target, 'TABLE')) {
393
+ if (
394
+ !target ||
395
+ target === this.#state.selectedCell ||
396
+ this.#fixedCellName !== target.nodeName ||
397
+ this.#state.selectedTable !== dom.query.getParentElement(target, 'TABLE')
398
+ ) {
383
399
  return;
384
400
  }
385
401
 
@@ -405,7 +421,10 @@ export class TableSelectionService {
405
421
  if (!fixedCell || !this.#state.selectedTable) return;
406
422
 
407
423
  this.#cellService.setMergeSplitButton();
408
- this.#main.setState('selectedCells', Array.from(this.#state.selectedTable.querySelectorAll('.se-selected-table-cell')));
424
+ this.#main.setState(
425
+ 'selectedCells',
426
+ Array.from(this.#state.selectedTable.querySelectorAll('.se-selected-table-cell')),
427
+ );
409
428
 
410
429
  if (this.#state.isShiftPressed) return;
411
430
 
@@ -432,7 +451,8 @@ export class TableSelectionService {
432
451
 
433
452
  this.focusCellEdge(this.#state.fixedCell);
434
453
 
435
- const displayCell = this.#state.selectedCells?.length > 0 ? this.#state.selectedCell : this.#state.fixedCell;
454
+ const displayCell =
455
+ this.#state.selectedCells?.length > 0 ? this.#state.selectedCell : this.#state.fixedCell;
436
456
  this.#main._setController(displayCell);
437
457
  }
438
458
  }
@@ -44,7 +44,11 @@ export class TableStyleService {
44
44
  // props
45
45
  const controller_props = CreateHTML_controller_properties(this.#$);
46
46
  const propsTargets = [this.#main.controller_table, this.#main.controller_cell];
47
- this.controller_props = new Controller(this, this.#$, controller_props.html, { position: 'bottom', parents: propsTargets, isInsideForm: true });
47
+ this.controller_props = new Controller(this, this.#$, controller_props.html, {
48
+ position: 'bottom',
49
+ parents: propsTargets,
50
+ isInsideForm: true,
51
+ });
48
52
  this.controller_props_title = controller_props.controller_props_title;
49
53
 
50
54
  // color picker
@@ -65,7 +69,9 @@ export class TableStyleService {
65
69
  colorList: pluginOptions.colorList || Constants.DEFAULT_COLOR_LIST,
66
70
  splitNum: 5,
67
71
  disableRemove: true,
68
- hueSliderOptions: { controllerOptions: { isOutsideForm: true, parents: [this.controller_colorPicker], parentsHide: true } },
72
+ hueSliderOptions: {
73
+ controllerOptions: { isOutsideForm: true, parents: [this.controller_colorPicker], parentsHide: true },
74
+ },
69
75
  });
70
76
 
71
77
  // members - SelectMenu - properties - border style
@@ -78,14 +84,34 @@ export class TableStyleService {
78
84
  // members - SelectMenu - properties - border format
79
85
  const borderFormatMenu = CreateBorderFormatMenu(this.#$.lang, this.#$.icons, []);
80
86
  const borderFormatButton = controller_props.borderFormatButton;
81
- this.selectMenu_props_border_format = new SelectMenu(this.#$, { checkList: false, position: 'bottom-left', dir: 'ltr', splitNum: 5 });
87
+ this.selectMenu_props_border_format = new SelectMenu(this.#$, {
88
+ checkList: false,
89
+ position: 'bottom-left',
90
+ dir: 'ltr',
91
+ splitNum: 5,
92
+ });
82
93
  this.selectMenu_props_border_format.on(borderFormatButton, this.#OnPropsBorderFormatEdit.bind(this, 'all'));
83
94
  this.selectMenu_props_border_format.create(borderFormatMenu.items, borderFormatMenu.menus);
84
95
 
85
- const borderFormatMenu_oneCell = CreateBorderFormatMenu(this.#$.lang, this.#$.icons, Constants.BORDER_FORMAT_INSIDE);
86
- this.selectMenu_props_border_format_oneCell = new SelectMenu(this.#$, { checkList: false, position: 'bottom-left', dir: 'ltr', splitNum: 6 });
87
- this.selectMenu_props_border_format_oneCell.on(borderFormatButton, this.#OnPropsBorderFormatEdit.bind(this, 'outside'));
88
- this.selectMenu_props_border_format_oneCell.create(borderFormatMenu_oneCell.items, borderFormatMenu_oneCell.menus);
96
+ const borderFormatMenu_oneCell = CreateBorderFormatMenu(
97
+ this.#$.lang,
98
+ this.#$.icons,
99
+ Constants.BORDER_FORMAT_INSIDE,
100
+ );
101
+ this.selectMenu_props_border_format_oneCell = new SelectMenu(this.#$, {
102
+ checkList: false,
103
+ position: 'bottom-left',
104
+ dir: 'ltr',
105
+ splitNum: 6,
106
+ });
107
+ this.selectMenu_props_border_format_oneCell.on(
108
+ borderFormatButton,
109
+ this.#OnPropsBorderFormatEdit.bind(this, 'outside'),
110
+ );
111
+ this.selectMenu_props_border_format_oneCell.create(
112
+ borderFormatMenu_oneCell.items,
113
+ borderFormatMenu_oneCell.menus,
114
+ );
89
115
 
90
116
  // memberts - elements..
91
117
  this.maxText = this.#$.lang.maxSize;
@@ -170,7 +196,11 @@ export class TableStyleService {
170
196
  } else {
171
197
  this.controller_props_title.textContent = this.#$.lang.tableProperties;
172
198
  this.#setCtrlProps('table');
173
- this.controller_props.open(target, this.#main.controller_table.form, { isWWTarget: false, initMethod: null, addOffset: null });
199
+ this.controller_props.open(target, this.#main.controller_table.form, {
200
+ isWWTarget: false,
201
+ initMethod: null,
202
+ addOffset: null,
203
+ });
174
204
  }
175
205
  }
176
206
 
@@ -184,7 +214,11 @@ export class TableStyleService {
184
214
  } else {
185
215
  this.controller_props_title.textContent = this.#$.lang.cellProperties;
186
216
  this.#setCtrlProps('cell');
187
- this.controller_props.open(target, this.#main.controller_cell.form, { isWWTarget: false, initMethod: null, addOffset: null });
217
+ this.controller_props.open(target, this.#main.controller_cell.form, {
218
+ isWWTarget: false,
219
+ initMethod: null,
220
+ addOffset: null,
221
+ });
188
222
  }
189
223
  }
190
224
 
@@ -268,7 +302,9 @@ export class TableStyleService {
268
302
  const table = this.#main._element;
269
303
 
270
304
  if (!active) {
271
- const caption = dom.utils.createElement('CAPTION', { class: `se-table-caption-${this.#main.captionPosition}` });
305
+ const caption = dom.utils.createElement('CAPTION', {
306
+ class: `se-table-caption-${this.#main.captionPosition}`,
307
+ });
272
308
  caption.innerHTML = '<div><br></div>';
273
309
  table.insertBefore(caption, table.firstElementChild);
274
310
  } else {
@@ -404,7 +440,16 @@ export class TableStyleService {
404
440
  const targets = isTable ? [this.#main._element] : this.#state.selectedCells;
405
441
  const tr = /** @type {HTMLTableCellElement} */ (targets[0]);
406
442
  const trStyles = _w.getComputedStyle(tr);
407
- const { border_format, border_color, border_style, border_width, back_color, font_color, cell_alignment, cell_alignment_vertical } = this.propTargets;
443
+ const {
444
+ border_format,
445
+ border_color,
446
+ border_style,
447
+ border_width,
448
+ back_color,
449
+ font_color,
450
+ cell_alignment,
451
+ cell_alignment_vertical,
452
+ } = this.propTargets;
408
453
 
409
454
  const borderFormat = border_format.getAttribute('se-border-format') || '';
410
455
  const hasFormat = borderFormat !== 'all';
@@ -445,7 +490,11 @@ export class TableStyleService {
445
490
  ce -= cs;
446
491
  cs -= cs;
447
492
  let prevRow = /** @type {HTMLElement} */ (trRow);
448
- for (let i = 0, cellCnt = 0, len = targets.length, e, es, rowIndex = 0, cellIndex, colspan, rowspan; i < len; i++, cellCnt++) {
493
+ for (
494
+ let i = 0, cellCnt = 0, len = targets.length, e, es, rowIndex = 0, cellIndex, colspan, rowspan;
495
+ i < len;
496
+ i++, cellCnt++
497
+ ) {
449
498
  e = /** @type {HTMLTableCellElement} */ (targets[i]);
450
499
  colspan = e.colSpan;
451
500
  rowspan = e.rowSpan;
@@ -481,7 +530,8 @@ export class TableStyleService {
481
530
  if (rowIndex === re || isBottom) cells.bottom.push(e);
482
531
  if (cellIndex === cs) cells.left.push(e);
483
532
  if (cellIndex === ce || cellIndex + colspan - 1 === ce) cells.right.push(e);
484
- if (!isBottom && rowIndex !== rs && rowIndex !== re && cellIndex !== cs && cellIndex !== ce) cells.middle.push(e);
533
+ if (!isBottom && rowIndex !== rs && rowIndex !== re && cellIndex !== cs && cellIndex !== ce)
534
+ cells.middle.push(e);
485
535
 
486
536
  // --- set styles
487
537
  es = e.style;
@@ -575,11 +625,28 @@ export class TableStyleService {
575
625
  const targets = isTable ? [this.#main._element] : this.#state.selectedCells;
576
626
  if (!targets?.[0]) return;
577
627
 
578
- const { border_format, border_color, border_style, border_width, back_color, font_color, cell_alignment, cell_alignment_vertical, cell_alignment_table_text, font_bold, font_underline, font_italic, font_strike } = this.propTargets;
579
- const { border, backgroundColor, color, textAlign, verticalAlign, fontWeight, textDecoration, fontStyle } = _w.getComputedStyle(targets[0]);
628
+ const {
629
+ border_format,
630
+ border_color,
631
+ border_style,
632
+ border_width,
633
+ back_color,
634
+ font_color,
635
+ cell_alignment,
636
+ cell_alignment_vertical,
637
+ cell_alignment_table_text,
638
+ font_bold,
639
+ font_underline,
640
+ font_italic,
641
+ font_strike,
642
+ } = this.propTargets;
643
+ const { border, backgroundColor, color, textAlign, verticalAlign, fontWeight, textDecoration, fontStyle } =
644
+ _w.getComputedStyle(targets[0]);
580
645
  const cellBorder = this.#getBorderStyle(border);
581
646
 
582
- /** @type {HTMLElement} */ (cell_alignment.querySelector('[data-value="justify"]')).style.display = isTable ? 'none' : '';
647
+ /** @type {HTMLElement} */ (cell_alignment.querySelector('[data-value="justify"]')).style.display = isTable
648
+ ? 'none'
649
+ : '';
583
650
  cell_alignment_table_text.style.display = isTable ? '' : 'none';
584
651
  if (isTable) cell_alignment_vertical.style.display = 'none';
585
652
  else cell_alignment_vertical.style.display = '';
@@ -640,7 +707,8 @@ export class TableStyleService {
640
707
  }
641
708
 
642
709
  // border - format
643
- border_format.firstElementChild.innerHTML = this.#$.icons[Constants.BORDER_FORMATS[targets.length === 1 ? 'outside' : 'all']];
710
+ border_format.firstElementChild.innerHTML =
711
+ this.#$.icons[Constants.BORDER_FORMATS[targets.length === 1 ? 'outside' : 'all']];
644
712
  border_format.setAttribute('se-border-format', 'all');
645
713
  dom.utils.removeClass(border_format, 'active');
646
714
 
@@ -674,7 +742,10 @@ export class TableStyleService {
674
742
  const { font_bold, font_italic, font_strike, font_underline } = this.propTargets;
675
743
  styles.fontWeight = dom.utils.hasClass(font_bold, 'on') ? 'bold' : '';
676
744
  styles.fontStyle = dom.utils.hasClass(font_italic, 'on') ? 'italic' : '';
677
- styles.textDecoration = ((dom.utils.hasClass(font_strike, 'on') ? 'line-through ' : '') + (dom.utils.hasClass(font_underline, 'on') ? 'underline' : '')).trim();
745
+ styles.textDecoration = (
746
+ (dom.utils.hasClass(font_strike, 'on') ? 'line-through ' : '') +
747
+ (dom.utils.hasClass(font_underline, 'on') ? 'underline' : '')
748
+ ).trim();
678
749
  }
679
750
 
680
751
  /**
@@ -841,8 +912,37 @@ export class TableStyleService {
841
912
  * @description Initialize the style service (resets properties).
842
913
  */
843
914
  init() {
844
- const { border_format, border_color, border_style, border_width, back_color, font_color, cell_alignment, cell_alignment_vertical, font_bold, font_underline, font_italic, font_strike } = this.propTargets;
845
- dom.utils.removeClass([border_format, border_color, border_style, border_width, back_color, font_color, cell_alignment, cell_alignment_vertical, font_bold, font_underline, font_italic, font_strike], 'on');
915
+ const {
916
+ border_format,
917
+ border_color,
918
+ border_style,
919
+ border_width,
920
+ back_color,
921
+ font_color,
922
+ cell_alignment,
923
+ cell_alignment_vertical,
924
+ font_bold,
925
+ font_underline,
926
+ font_italic,
927
+ font_strike,
928
+ } = this.propTargets;
929
+ dom.utils.removeClass(
930
+ [
931
+ border_format,
932
+ border_color,
933
+ border_style,
934
+ border_width,
935
+ back_color,
936
+ font_color,
937
+ cell_alignment,
938
+ cell_alignment_vertical,
939
+ font_bold,
940
+ font_underline,
941
+ font_italic,
942
+ font_strike,
943
+ ],
944
+ 'on',
945
+ );
846
946
  }
847
947
  }
848
948