suneditor 3.0.0-rc.4 → 3.0.0

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 (171) hide show
  1. package/README.md +4 -3
  2. package/dist/suneditor-contents.min.css +1 -1
  3. package/dist/suneditor.min.css +1 -1
  4. package/dist/suneditor.min.js +1 -1
  5. package/package.json +10 -6
  6. package/src/assets/design/color.css +14 -2
  7. package/src/assets/design/typography.css +5 -0
  8. package/src/assets/icons/defaultIcons.js +22 -4
  9. package/src/assets/suneditor-contents.css +1 -1
  10. package/src/assets/suneditor.css +312 -18
  11. package/src/core/config/eventManager.js +6 -9
  12. package/src/core/editor.js +1 -1
  13. package/src/core/event/actions/index.js +5 -0
  14. package/src/core/event/effects/keydown.registry.js +25 -0
  15. package/src/core/event/eventOrchestrator.js +69 -2
  16. package/src/core/event/handlers/handler_ww_mouse.js +1 -0
  17. package/src/core/event/rules/keydown.rule.backspace.js +9 -1
  18. package/src/core/kernel/coreKernel.js +4 -0
  19. package/src/core/kernel/store.js +2 -0
  20. package/src/core/logic/dom/char.js +11 -0
  21. package/src/core/logic/dom/format.js +22 -0
  22. package/src/core/logic/dom/html.js +126 -11
  23. package/src/core/logic/dom/nodeTransform.js +13 -0
  24. package/src/core/logic/dom/offset.js +100 -37
  25. package/src/core/logic/dom/selection.js +54 -22
  26. package/src/core/logic/panel/finder.js +982 -0
  27. package/src/core/logic/panel/menu.js +8 -6
  28. package/src/core/logic/panel/toolbar.js +112 -19
  29. package/src/core/logic/panel/viewer.js +214 -43
  30. package/src/core/logic/shell/_commandExecutor.js +7 -1
  31. package/src/core/logic/shell/commandDispatcher.js +1 -1
  32. package/src/core/logic/shell/component.js +5 -7
  33. package/src/core/logic/shell/history.js +24 -0
  34. package/src/core/logic/shell/shortcuts.js +3 -3
  35. package/src/core/logic/shell/ui.js +25 -26
  36. package/src/core/schema/frameContext.js +15 -1
  37. package/src/core/schema/options.js +180 -39
  38. package/src/core/section/constructor.js +61 -20
  39. package/src/core/section/documentType.js +2 -2
  40. package/src/events.js +12 -0
  41. package/src/helper/clipboard.js +1 -1
  42. package/src/helper/converter.js +15 -0
  43. package/src/helper/dom/domQuery.js +12 -0
  44. package/src/helper/dom/domUtils.js +26 -14
  45. package/src/helper/index.js +3 -0
  46. package/src/helper/markdown.js +876 -0
  47. package/src/interfaces/plugins.js +7 -5
  48. package/src/langs/ckb.js +9 -0
  49. package/src/langs/cs.js +9 -0
  50. package/src/langs/da.js +9 -0
  51. package/src/langs/de.js +9 -0
  52. package/src/langs/en.js +9 -0
  53. package/src/langs/es.js +9 -0
  54. package/src/langs/fa.js +9 -0
  55. package/src/langs/fr.js +9 -0
  56. package/src/langs/he.js +9 -0
  57. package/src/langs/hu.js +9 -0
  58. package/src/langs/it.js +9 -0
  59. package/src/langs/ja.js +9 -0
  60. package/src/langs/km.js +9 -0
  61. package/src/langs/ko.js +9 -0
  62. package/src/langs/lv.js +9 -0
  63. package/src/langs/nl.js +9 -0
  64. package/src/langs/pl.js +9 -0
  65. package/src/langs/pt_br.js +9 -0
  66. package/src/langs/ro.js +9 -0
  67. package/src/langs/ru.js +9 -0
  68. package/src/langs/se.js +9 -0
  69. package/src/langs/tr.js +9 -0
  70. package/src/langs/uk.js +9 -0
  71. package/src/langs/ur.js +9 -0
  72. package/src/langs/zh_cn.js +9 -0
  73. package/src/modules/contract/Browser.js +31 -1
  74. package/src/modules/contract/ColorPicker.js +6 -0
  75. package/src/modules/contract/Controller.js +77 -39
  76. package/src/modules/contract/Figure.js +57 -0
  77. package/src/modules/contract/Modal.js +6 -0
  78. package/src/modules/manager/ApiManager.js +53 -4
  79. package/src/modules/manager/FileManager.js +18 -1
  80. package/src/modules/ui/ModalAnchorEditor.js +35 -2
  81. package/src/modules/ui/SelectMenu.js +44 -12
  82. package/src/plugins/browser/fileBrowser.js +5 -2
  83. package/src/plugins/command/codeBlock.js +324 -0
  84. package/src/plugins/command/exportPDF.js +15 -3
  85. package/src/plugins/command/fileUpload.js +4 -1
  86. package/src/plugins/dropdown/backgroundColor.js +5 -1
  87. package/src/plugins/dropdown/blockStyle.js +8 -2
  88. package/src/plugins/dropdown/fontColor.js +5 -1
  89. package/src/plugins/dropdown/hr.js +6 -0
  90. package/src/plugins/dropdown/layout.js +4 -1
  91. package/src/plugins/dropdown/lineHeight.js +3 -0
  92. package/src/plugins/dropdown/paragraphStyle.js +5 -5
  93. package/src/plugins/dropdown/table/index.js +4 -1
  94. package/src/plugins/dropdown/table/render/table.html.js +1 -1
  95. package/src/plugins/dropdown/table/services/table.grid.js +16 -8
  96. package/src/plugins/dropdown/table/services/table.style.js +5 -9
  97. package/src/plugins/dropdown/template.js +3 -0
  98. package/src/plugins/dropdown/textStyle.js +5 -1
  99. package/src/plugins/field/mention.js +5 -1
  100. package/src/plugins/index.js +3 -0
  101. package/src/plugins/input/fontSize.js +10 -3
  102. package/src/plugins/modal/audio.js +7 -3
  103. package/src/plugins/modal/embed.js +23 -20
  104. package/src/plugins/modal/image/index.js +5 -1
  105. package/src/plugins/modal/math.js +7 -2
  106. package/src/plugins/modal/video/index.js +21 -4
  107. package/src/themes/cobalt.css +13 -4
  108. package/src/themes/cream.css +11 -2
  109. package/src/themes/dark.css +13 -4
  110. package/src/themes/midnight.css +13 -4
  111. package/src/typedef.js +4 -4
  112. package/types/assets/icons/defaultIcons.d.ts +12 -1
  113. package/types/assets/suneditor.css.d.ts +1 -1
  114. package/types/core/config/eventManager.d.ts +6 -8
  115. package/types/core/event/actions/index.d.ts +1 -0
  116. package/types/core/event/effects/keydown.registry.d.ts +2 -0
  117. package/types/core/event/eventOrchestrator.d.ts +2 -1
  118. package/types/core/kernel/coreKernel.d.ts +5 -0
  119. package/types/core/kernel/store.d.ts +5 -0
  120. package/types/core/logic/dom/char.d.ts +11 -0
  121. package/types/core/logic/dom/format.d.ts +22 -0
  122. package/types/core/logic/dom/html.d.ts +16 -0
  123. package/types/core/logic/dom/nodeTransform.d.ts +13 -0
  124. package/types/core/logic/dom/offset.d.ts +23 -2
  125. package/types/core/logic/dom/selection.d.ts +9 -3
  126. package/types/core/logic/panel/finder.d.ts +83 -0
  127. package/types/core/logic/panel/toolbar.d.ts +14 -1
  128. package/types/core/logic/panel/viewer.d.ts +22 -2
  129. package/types/core/logic/shell/shortcuts.d.ts +1 -1
  130. package/types/core/schema/frameContext.d.ts +22 -0
  131. package/types/core/schema/options.d.ts +362 -79
  132. package/types/events.d.ts +11 -0
  133. package/types/helper/converter.d.ts +15 -0
  134. package/types/helper/dom/domQuery.d.ts +12 -0
  135. package/types/helper/dom/domUtils.d.ts +23 -2
  136. package/types/helper/index.d.ts +5 -0
  137. package/types/helper/markdown.d.ts +27 -0
  138. package/types/interfaces/plugins.d.ts +7 -5
  139. package/types/langs/_Lang.d.ts +9 -0
  140. package/types/modules/contract/Browser.d.ts +36 -2
  141. package/types/modules/contract/ColorPicker.d.ts +6 -0
  142. package/types/modules/contract/Controller.d.ts +35 -1
  143. package/types/modules/contract/Figure.d.ts +57 -0
  144. package/types/modules/contract/Modal.d.ts +6 -0
  145. package/types/modules/manager/ApiManager.d.ts +26 -0
  146. package/types/modules/manager/FileManager.d.ts +17 -0
  147. package/types/modules/ui/ModalAnchorEditor.d.ts +41 -4
  148. package/types/modules/ui/SelectMenu.d.ts +40 -2
  149. package/types/plugins/browser/fileBrowser.d.ts +10 -4
  150. package/types/plugins/command/codeBlock.d.ts +53 -0
  151. package/types/plugins/command/fileUpload.d.ts +8 -2
  152. package/types/plugins/dropdown/backgroundColor.d.ts +10 -2
  153. package/types/plugins/dropdown/blockStyle.d.ts +14 -2
  154. package/types/plugins/dropdown/fontColor.d.ts +10 -2
  155. package/types/plugins/dropdown/hr.d.ts +12 -0
  156. package/types/plugins/dropdown/layout.d.ts +8 -2
  157. package/types/plugins/dropdown/lineHeight.d.ts +6 -0
  158. package/types/plugins/dropdown/paragraphStyle.d.ts +14 -3
  159. package/types/plugins/dropdown/table/index.d.ts +9 -3
  160. package/types/plugins/dropdown/template.d.ts +6 -0
  161. package/types/plugins/dropdown/textStyle.d.ts +10 -2
  162. package/types/plugins/field/mention.d.ts +10 -2
  163. package/types/plugins/index.d.ts +3 -0
  164. package/types/plugins/input/fontSize.d.ts +18 -4
  165. package/types/plugins/modal/audio.d.ts +14 -6
  166. package/types/plugins/modal/embed.d.ts +44 -38
  167. package/types/plugins/modal/image/index.d.ts +9 -1
  168. package/types/plugins/modal/link.d.ts +6 -2
  169. package/types/plugins/modal/math.d.ts +23 -5
  170. package/types/plugins/modal/video/index.d.ts +49 -9
  171. package/types/typedef.d.ts +5 -2
@@ -114,6 +114,8 @@ export function jsonToHtml(jsonData) {
114
114
  * @description Convert HTML string to HTML Entity
115
115
  * @param {string} content
116
116
  * @returns {string} Content string
117
+ * @example
118
+ * converter.htmlToEntity('<div>'); // '&lt;div&gt;'
117
119
  */
118
120
  export function htmlToEntity(content) {
119
121
  return content.replace(_RE_HTML_CHARS, (m) => {
@@ -125,6 +127,8 @@ export function htmlToEntity(content) {
125
127
  * @description Convert HTML Entity to HTML string
126
128
  * @param {string} content Content string
127
129
  * @returns {string}
130
+ * @example
131
+ * converter.entityToHTML('&lt;div&gt;'); // '<div>'
128
132
  */
129
133
  export function entityToHTML(content) {
130
134
  return content.replace(_RE_HTML_ENTITIES, (m) => {
@@ -137,6 +141,9 @@ export function entityToHTML(content) {
137
141
  * @param {(...args: *) => void} func function
138
142
  * @param {number} wait delay ms
139
143
  * @returns {*} executedFunction
144
+ * @example
145
+ * const debouncedSave = converter.debounce(() => save(), 300);
146
+ * input.addEventListener('input', debouncedSave);
140
147
  */
141
148
  export function debounce(func, wait) {
142
149
  let timeout;
@@ -206,6 +213,9 @@ export function getValues(obj) {
206
213
  /**
207
214
  * @description Convert the `CamelCase` To the `KebabCase`.
208
215
  * @param {string|Array<string>} param [Camel string]
216
+ * @example
217
+ * converter.camelToKebabCase('fontSize'); // 'font-size'
218
+ * converter.camelToKebabCase(['fontSize', 'fontFamily']); // ['font-size', 'font-family']
209
219
  */
210
220
  export function camelToKebabCase(param) {
211
221
  if (typeof param === 'string') {
@@ -226,6 +236,8 @@ export function camelToKebabCase(param) {
226
236
  * @overload
227
237
  * @param {Array<string>} param - Array of `Kebab-case` strings.
228
238
  * @returns {Array<string>} Array of `CamelCase` strings.
239
+ * @example
240
+ * converter.kebabToCamelCase('font-size'); // 'fontSize'
229
241
  */
230
242
  export function kebabToCamelCase(param) {
231
243
  if (typeof param === 'string') {
@@ -334,6 +346,9 @@ export function isHexColor(str) {
334
346
  * @description Function to convert hex format to a `rgb` color
335
347
  * @param {string} rgba RGBA color format
336
348
  * @returns {string}
349
+ * @example
350
+ * converter.rgb2hex('rgb(255, 0, 0)'); // '#ff0000'
351
+ * converter.rgb2hex('rgba(255, 0, 0, 0.5)'); // '#ff000080'
337
352
  */
338
353
  export function rgb2hex(rgba) {
339
354
  if (isHexColor(rgba) || !rgba) return rgba;
@@ -75,6 +75,8 @@ export function getNodePath(node, parentNode, _newOffsets) {
75
75
  * @param {Array<number>} offsets Position array, array obtained from `helper.dom.getNodePath`
76
76
  * @param {Node} parentNode Base parent element
77
77
  * @returns {T}
78
+ * @example
79
+ * const node = dom.query.getNodeFromPath([0, 1, 0], wysiwygElement);
78
80
  */
79
81
  export function getNodeFromPath(offsets, parentNode) {
80
82
  let current = parentNode;
@@ -170,6 +172,8 @@ export function getListChildren(element, validation, depth) {
170
172
  * @param {?(current: *) => boolean} validation Conditional function
171
173
  * @param {?number} depth Number of child levels to depth.
172
174
  * @returns {Array<T>}
175
+ * @example
176
+ * const allNodes = dom.query.getListChildNodes(container, (node) => node.nodeType === 3);
173
177
  */
174
178
  export function getListChildNodes(element, validation, depth) {
175
179
  const children = [];
@@ -221,6 +225,8 @@ export function getNodeDepth(node) {
221
225
  * @description Sort a node array by depth of element.
222
226
  * @param {Array<Node>} array Node array
223
227
  * @param {boolean} des `true`: descending order / `false`: ascending order
228
+ * @example
229
+ * const sorted = dom.query.sortNodeByDepth([nodeA, nodeB], true);
224
230
  */
225
231
  export function sortNodeByDepth(array, des) {
226
232
  const t = !des ? -1 : 1;
@@ -239,6 +245,9 @@ export function sortNodeByDepth(array, des) {
239
245
  * @param {Node} a Node to compare.
240
246
  * @param {Node} b Node to compare.
241
247
  * @returns {{ancestor: ?HTMLElement, a: Node, b: Node, result: number}} { ancesstor, a, b, result: (a > b ? 1 : a < b ? -1 : 0) };
248
+ * @example
249
+ * const result = dom.query.compareElements(nodeA, nodeB);
250
+ * // result: { ancestor: true, result: 0 } (same node), { ancestor: true, result: 1 } (a before b)
242
251
  */
243
252
  export function compareElements(a, b) {
244
253
  let aNode = a,
@@ -439,6 +448,9 @@ export function getEventTarget(event) {
439
448
  * Not use it like jquery.
440
449
  * Only one condition can be entered at a time.
441
450
  * @returns {T|null} Not found: `null`
451
+ * @example
452
+ * const firstLeaf = dom.query.getEdgeChild(container, (n) => n.nodeType === 3, false);
453
+ * const lastLeaf = dom.query.getEdgeChild(container, (n) => n.nodeType === 3, true);
442
454
  */
443
455
  export function getEdgeChild(node, query, last) {
444
456
  let valid;
@@ -107,6 +107,8 @@ export function createTextNode(text) {
107
107
  * @param {Node} element Element object
108
108
  * @param {?Array<string>} exceptAttrs Array of attribute names to exclude from the result
109
109
  * @returns {string}
110
+ * @example
111
+ * const attrs = dom.utils.getAttributesToString(element, ['id', 'class']);
110
112
  */
111
113
  export function getAttributesToString(element, exceptAttrs) {
112
114
  const attrs = /** @type {HTMLElement} */ (element).attributes;
@@ -227,6 +229,8 @@ export function prevIndex(array, item) {
227
229
  * @param {Node} originEl Origin element
228
230
  * @param {Node} copyEl Element to copy
229
231
  * @param {?Array<string>} [blacklist] Blacklist array(LowerCase)
232
+ * @example
233
+ * dom.utils.copyTagAttributes(newElement, originalElement, ['contenteditable']);
230
234
  */
231
235
  export function copyTagAttributes(originEl, copyEl, blacklist) {
232
236
  const o = /** @type {HTMLElement} */ (originEl);
@@ -271,6 +275,9 @@ export function removeItem(item) {
271
275
  * @description Replace element
272
276
  * @param {Node} element Target element
273
277
  * @param {string|Node} newElement String or element of the new element to apply
278
+ * @example
279
+ * dom.utils.changeElement(oldSpan, 'STRONG');
280
+ * dom.utils.changeElement(oldElement, newElement);
274
281
  */
275
282
  export function changeElement(element, newElement) {
276
283
  if (!element) return;
@@ -303,6 +310,9 @@ export function changeTxt(node, txt) {
303
310
  * @param {Node|Node[]} elements Element to set style
304
311
  * @param {string} styleName Style attribute name (`marginLeft`, `textAlign`...)
305
312
  * @param {string|number} value Style value
313
+ * @example
314
+ * dom.utils.setStyle(element, 'color', 'red');
315
+ * dom.utils.setStyle([el1, el2], 'display', 'none');
306
316
  */
307
317
  export function setStyle(elements, styleName, value) {
308
318
  elements = Array.isArray(elements) ? elements : [elements];
@@ -358,13 +368,17 @@ export function setDisabled(buttonList, disabled, important) {
358
368
  */
359
369
  export function hasClass(element, className) {
360
370
  if (!element || element.nodeType !== 1) return;
361
- return /** @type {HTMLElement} */ (element).classList.contains(className);
371
+
372
+ return className.split('|').some((cls) => /** @type {HTMLElement} */ (element).classList.contains(cls));
362
373
  }
363
374
 
364
375
  /**
365
376
  * @description Append the className value of the argument value element
366
377
  * @param {Node|SunEditor.NodeCollection} element Elements to add class name
367
378
  * @param {string} className Class name to be add
379
+ * @example
380
+ * dom.utils.addClass(element, 'active');
381
+ * dom.utils.addClass(element.children, 'highlight');
368
382
  */
369
383
  export function addClass(element, className) {
370
384
  if (!element) return;
@@ -385,6 +399,8 @@ export function addClass(element, className) {
385
399
  * @description Delete the className value of the argument value element
386
400
  * @param {Node|SunEditor.NodeCollection} element Elements to remove class name
387
401
  * @param {string} className Class name to be remove
402
+ * @example
403
+ * dom.utils.removeClass(element, 'active');
388
404
  */
389
405
  export function removeClass(element, className) {
390
406
  if (!element) return;
@@ -405,25 +421,15 @@ export function removeClass(element, className) {
405
421
  * @description Argument value If there is no class name, insert it and delete the class name if it exists
406
422
  * @param {Node} element Element to replace class name
407
423
  * @param {string} className Class name to be change
408
- * @returns {boolean|undefined}
424
+ * @param {boolean} [force] If true, adds the class; if false, removes it.
409
425
  */
410
- export function toggleClass(element, className) {
426
+ export function toggleClass(element, className, force) {
411
427
  if (!element || element.nodeType !== 1) return;
412
428
 
413
429
  const el = /** @type {HTMLElement} */ (element);
414
-
415
- let result = false;
416
- const valid = new RegExp(`(\\s|^)${className}(\\s|$)`);
417
- if (valid.test(el.className)) {
418
- el.className = el.className.replace(valid, ' ').trim();
419
- } else {
420
- el.className += ' ' + className;
421
- result = true;
422
- }
430
+ el.classList.toggle(className, force);
423
431
 
424
432
  if (!el.className.trim()) el.removeAttribute('class');
425
-
426
- return result;
427
433
  }
428
434
 
429
435
  /**
@@ -431,6 +437,8 @@ export function toggleClass(element, className) {
431
437
  * @param {Node} element Element to flash class name
432
438
  * @param {string} className class name
433
439
  * @param {number} [duration=120] duration milliseconds
440
+ * @example
441
+ * dom.utils.flashClass(element, 'blink', 500);
434
442
  */
435
443
  export function flashClass(element, className, duration = 120) {
436
444
  addClass(element, className);
@@ -477,6 +485,8 @@ export function getViewportSize() {
477
485
  * @param {boolean} includeWW Include the `wwTarget` element in the copy
478
486
  * @param {Iterable<string>} styles Style list - kamel case
479
487
  * @returns
488
+ * @example
489
+ * dom.utils.applyInlineStylesAll(wysiwygElement, true, ['font-family', 'font-size']);
480
490
  */
481
491
  export function applyInlineStylesAll(wwTarget, includeWW, styles) {
482
492
  if (!wwTarget) {
@@ -525,6 +535,8 @@ export function applyInlineStylesAll(wwTarget, includeWW, styles) {
525
535
  * @param {Node} target Target element
526
536
  * @param {number} timeout Timeout milliseconds
527
537
  * @returns {Promise<void>}
538
+ * @example
539
+ * await dom.utils.waitForMediaLoad(imgElement, 5000);
528
540
  */
529
541
  export function waitForMediaLoad(target, timeout = 5000) {
530
542
  const doc = /** @type {HTMLElement|Document} */ (target || _d);
@@ -5,6 +5,7 @@ import Dom from './dom';
5
5
  import Numbers from './numbers';
6
6
  import KeyCodeMap from './keyCodeMap';
7
7
  import Clipboard from './clipboard';
8
+ import Markdown from './markdown';
8
9
 
9
10
  export const env = Env;
10
11
  export const unicode = Unicode;
@@ -13,6 +14,7 @@ export const dom = Dom;
13
14
  export const numbers = Numbers;
14
15
  export const keyCodeMap = KeyCodeMap;
15
16
  export const clipboard = Clipboard;
17
+ export const markdown = Markdown;
16
18
 
17
19
  export default {
18
20
  env,
@@ -22,4 +24,5 @@ export default {
22
24
  numbers,
23
25
  keyCodeMap,
24
26
  clipboard,
27
+ markdown,
25
28
  };