suneditor 3.0.0-beta.2 → 3.0.0-beta.20
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/CONTRIBUTING.md +186 -184
- package/LICENSE +21 -21
- package/README.md +157 -180
- package/dist/suneditor.min.css +1 -1
- package/dist/suneditor.min.js +1 -1
- package/package.json +126 -123
- package/src/assets/design/color.css +131 -121
- package/src/assets/design/index.css +3 -3
- package/src/assets/design/size.css +37 -35
- package/src/assets/design/typography.css +37 -37
- package/src/assets/icons/defaultIcons.js +247 -232
- package/src/assets/suneditor-contents.css +779 -778
- package/src/assets/suneditor.css +43 -35
- package/src/core/base/eventHandlers/handler_toolbar.js +135 -135
- package/src/core/base/eventHandlers/handler_ww_clipboard.js +56 -56
- package/src/core/base/eventHandlers/handler_ww_dragDrop.js +115 -113
- package/src/core/base/eventHandlers/handler_ww_key_input.js +1200 -1200
- package/src/core/base/eventHandlers/handler_ww_mouse.js +194 -194
- package/src/core/base/eventManager.js +1550 -1484
- package/src/core/base/history.js +355 -355
- package/src/core/class/char.js +163 -162
- package/src/core/class/component.js +856 -842
- package/src/core/class/format.js +3433 -3422
- package/src/core/class/html.js +1927 -1890
- package/src/core/class/menu.js +357 -346
- package/src/core/class/nodeTransform.js +424 -424
- package/src/core/class/offset.js +858 -891
- package/src/core/class/selection.js +710 -620
- package/src/core/class/shortcuts.js +98 -98
- package/src/core/class/toolbar.js +438 -430
- package/src/core/class/ui.js +424 -422
- package/src/core/class/viewer.js +750 -750
- package/src/core/editor.js +1810 -1708
- package/src/core/section/actives.js +268 -241
- package/src/core/section/constructor.js +1348 -1661
- package/src/core/section/context.js +102 -102
- package/src/core/section/documentType.js +582 -561
- package/src/core/section/options.js +367 -0
- package/src/core/util/instanceCheck.js +59 -0
- package/src/editorInjector/_classes.js +36 -36
- package/src/editorInjector/_core.js +92 -92
- package/src/editorInjector/index.js +75 -75
- package/src/events.js +634 -622
- package/src/helper/clipboard.js +59 -59
- package/src/helper/converter.js +586 -564
- package/src/helper/dom/domCheck.js +304 -304
- package/src/helper/dom/domQuery.js +677 -669
- package/src/helper/dom/domUtils.js +618 -557
- package/src/helper/dom/index.js +12 -12
- package/src/helper/env.js +249 -240
- package/src/helper/index.js +25 -25
- package/src/helper/keyCodeMap.js +183 -183
- package/src/helper/numbers.js +72 -72
- package/src/helper/unicode.js +47 -47
- package/src/langs/ckb.js +231 -231
- package/src/langs/cs.js +231 -231
- package/src/langs/da.js +231 -231
- package/src/langs/de.js +231 -231
- package/src/langs/en.js +230 -230
- package/src/langs/es.js +231 -231
- package/src/langs/fa.js +231 -231
- package/src/langs/fr.js +231 -231
- package/src/langs/he.js +231 -231
- package/src/langs/hu.js +230 -230
- package/src/langs/index.js +28 -28
- package/src/langs/it.js +231 -231
- package/src/langs/ja.js +230 -230
- package/src/langs/km.js +230 -230
- package/src/langs/ko.js +230 -230
- package/src/langs/lv.js +231 -231
- package/src/langs/nl.js +231 -231
- package/src/langs/pl.js +231 -231
- package/src/langs/pt_br.js +231 -231
- package/src/langs/ro.js +231 -231
- package/src/langs/ru.js +231 -231
- package/src/langs/se.js +231 -231
- package/src/langs/tr.js +231 -231
- package/src/langs/uk.js +231 -231
- package/src/langs/ur.js +231 -231
- package/src/langs/zh_cn.js +231 -231
- package/src/modules/ApiManager.js +191 -191
- package/src/modules/Browser.js +669 -667
- package/src/modules/ColorPicker.js +364 -362
- package/src/modules/Controller.js +474 -454
- package/src/modules/Figure.js +1620 -1617
- package/src/modules/FileManager.js +359 -359
- package/src/modules/HueSlider.js +577 -565
- package/src/modules/Modal.js +346 -346
- package/src/modules/ModalAnchorEditor.js +643 -643
- package/src/modules/SelectMenu.js +549 -549
- package/src/modules/_DragHandle.js +17 -17
- package/src/modules/index.js +14 -14
- package/src/plugins/browser/audioGallery.js +83 -83
- package/src/plugins/browser/fileBrowser.js +103 -103
- package/src/plugins/browser/fileGallery.js +83 -83
- package/src/plugins/browser/imageGallery.js +81 -81
- package/src/plugins/browser/videoGallery.js +103 -103
- package/src/plugins/command/blockquote.js +61 -60
- package/src/plugins/command/exportPDF.js +134 -134
- package/src/plugins/command/fileUpload.js +456 -456
- package/src/plugins/command/list_bulleted.js +149 -148
- package/src/plugins/command/list_numbered.js +152 -151
- package/src/plugins/dropdown/align.js +157 -155
- package/src/plugins/dropdown/backgroundColor.js +108 -104
- package/src/plugins/dropdown/font.js +141 -137
- package/src/plugins/dropdown/fontColor.js +109 -105
- package/src/plugins/dropdown/formatBlock.js +170 -178
- package/src/plugins/dropdown/hr.js +152 -152
- package/src/plugins/dropdown/layout.js +83 -83
- package/src/plugins/dropdown/lineHeight.js +131 -130
- package/src/plugins/dropdown/list.js +123 -122
- package/src/plugins/dropdown/paragraphStyle.js +138 -138
- package/src/plugins/dropdown/table.js +4110 -4000
- package/src/plugins/dropdown/template.js +83 -83
- package/src/plugins/dropdown/textStyle.js +149 -149
- package/src/plugins/field/mention.js +242 -242
- package/src/plugins/index.js +120 -120
- package/src/plugins/input/fontSize.js +414 -410
- package/src/plugins/input/pageNavigator.js +71 -70
- package/src/plugins/modal/audio.js +677 -677
- package/src/plugins/modal/drawing.js +537 -531
- package/src/plugins/modal/embed.js +886 -886
- package/src/plugins/modal/image.js +1377 -1376
- package/src/plugins/modal/link.js +248 -240
- package/src/plugins/modal/math.js +563 -563
- package/src/plugins/modal/video.js +1226 -1226
- package/src/plugins/popup/anchor.js +224 -222
- package/src/suneditor.js +114 -107
- package/src/themes/dark.css +132 -122
- package/src/typedef.js +132 -130
- package/types/assets/icons/defaultIcons.d.ts +8 -0
- package/types/core/base/eventManager.d.ts +29 -4
- package/types/core/class/char.d.ts +2 -1
- package/types/core/class/component.d.ts +1 -2
- package/types/core/class/format.d.ts +8 -1
- package/types/core/class/html.d.ts +8 -0
- package/types/core/class/menu.d.ts +8 -0
- package/types/core/class/offset.d.ts +24 -26
- package/types/core/class/selection.d.ts +2 -0
- package/types/core/class/toolbar.d.ts +6 -0
- package/types/core/class/ui.d.ts +1 -1
- package/types/core/editor.d.ts +34 -12
- package/types/core/section/constructor.d.ts +5 -638
- package/types/core/section/documentType.d.ts +12 -2
- package/types/core/section/options.d.ts +740 -0
- package/types/core/util/instanceCheck.d.ts +50 -0
- package/types/editorInjector/_core.d.ts +5 -5
- package/types/editorInjector/index.d.ts +2 -2
- package/types/events.d.ts +2 -0
- package/types/helper/converter.d.ts +9 -0
- package/types/helper/dom/domQuery.d.ts +5 -5
- package/types/helper/dom/domUtils.d.ts +8 -0
- package/types/helper/env.d.ts +6 -1
- package/types/helper/index.d.ts +4 -1
- package/types/index.d.ts +122 -120
- package/types/langs/_Lang.d.ts +194 -194
- package/types/modules/ColorPicker.d.ts +5 -1
- package/types/modules/Controller.d.ts +8 -4
- package/types/modules/Figure.d.ts +2 -1
- package/types/modules/HueSlider.d.ts +4 -1
- package/types/modules/SelectMenu.d.ts +1 -1
- package/types/plugins/command/blockquote.d.ts +1 -0
- package/types/plugins/command/list_bulleted.d.ts +1 -0
- package/types/plugins/command/list_numbered.d.ts +1 -0
- package/types/plugins/dropdown/align.d.ts +1 -0
- package/types/plugins/dropdown/backgroundColor.d.ts +1 -0
- package/types/plugins/dropdown/font.d.ts +1 -0
- package/types/plugins/dropdown/fontColor.d.ts +1 -0
- package/types/plugins/dropdown/formatBlock.d.ts +3 -2
- package/types/plugins/dropdown/lineHeight.d.ts +1 -0
- package/types/plugins/dropdown/list.d.ts +1 -0
- package/types/plugins/dropdown/table.d.ts +6 -0
- package/types/plugins/input/fontSize.d.ts +1 -0
- package/types/plugins/modal/drawing.d.ts +4 -0
- package/types/plugins/modal/link.d.ts +32 -15
- package/types/suneditor.d.ts +13 -9
- package/types/typedef.d.ts +8 -0
package/src/core/class/char.js
CHANGED
|
@@ -1,162 +1,163 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Char class
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import CoreInjector from '../../editorInjector/_core';
|
|
6
|
-
import { _w, isEdge } from '../../helper/env';
|
|
7
|
-
import { addClass, removeClass, hasClass } from '../../helper/dom/domUtils';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* @typedef {Omit<Char & Partial<__se__EditorInjector>, 'char'>} CharThis
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* @constructor
|
|
15
|
-
* @this {CharThis}
|
|
16
|
-
* @description character count, character limit, etc. management class
|
|
17
|
-
* @param {__se__EditorCore} editor - The root editor instance
|
|
18
|
-
*/
|
|
19
|
-
function Char(editor) {
|
|
20
|
-
CoreInjector.call(this, editor);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
Char.prototype = {
|
|
24
|
-
/**
|
|
25
|
-
* @this {CharThis}
|
|
26
|
-
* @description Returns false if char count is greater than "frameOptions.get('charCounter_max')" when "html" is added to the current editor.
|
|
27
|
-
* @param {Node|string} html Element node or String.
|
|
28
|
-
* @returns {boolean}
|
|
29
|
-
*/
|
|
30
|
-
check(html) {
|
|
31
|
-
const maxCharCount = this.editor.frameOptions.get('charCounter_max');
|
|
32
|
-
if (maxCharCount) {
|
|
33
|
-
const length = this.getLength(typeof html === 'string' ? html : this.editor.frameOptions.get('charCounter_type') === 'byte-html' && html.nodeType === 1 ? /** @type {HTMLElement} */ (html).outerHTML : html.textContent);
|
|
34
|
-
if (length > 0 && length + this.getLength() > maxCharCount) {
|
|
35
|
-
CounterBlink(this.editor.frameContext.get('charWrapper'));
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return true;
|
|
40
|
-
},
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* @this {CharThis}
|
|
44
|
-
* @description Get the [content]'s number of characters or binary data size. (frameOptions.get('charCounter_type'))
|
|
45
|
-
* - If [content] is undefined, get the current editor's number of characters or binary data size.
|
|
46
|
-
* @param {string=} content Content to count. (defalut: this.editor.frameContext.get('wysiwyg'))
|
|
47
|
-
* @returns {number}
|
|
48
|
-
*/
|
|
49
|
-
getLength(content) {
|
|
50
|
-
if (typeof content !== 'string') {
|
|
51
|
-
content = this.editor.frameOptions.get('charCounter_type') === 'byte-html' ? this.editor.frameContext.get('wysiwyg').innerHTML : this.editor.frameContext.get('wysiwyg').textContent;
|
|
52
|
-
}
|
|
53
|
-
return /byte/.test(this.editor.frameOptions.get('charCounter_type')) ? this.getByteLength(content) : content.length;
|
|
54
|
-
},
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* @this {CharThis}
|
|
58
|
-
* @descriptionGets Get the length in bytes of a string.
|
|
59
|
-
* @param {string} text String text
|
|
60
|
-
* @returns {number}
|
|
61
|
-
*/
|
|
62
|
-
getByteLength(text) {
|
|
63
|
-
if (!text || !text.toString) return 0;
|
|
64
|
-
text = text.toString();
|
|
65
|
-
|
|
66
|
-
let cr, cl;
|
|
67
|
-
if (isEdge) {
|
|
68
|
-
cl = decodeURIComponent(encodeURIComponent(text)).length;
|
|
69
|
-
cr = 0;
|
|
70
|
-
|
|
71
|
-
if (encodeURIComponent(text).match(/(%0A|%0D)/gi) !== null) {
|
|
72
|
-
cr = encodeURIComponent(text).match(/(%0A|%0D)/gi).length;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return cl + cr;
|
|
76
|
-
} else {
|
|
77
|
-
cl = new TextEncoder().encode(text).length;
|
|
78
|
-
cr = 0;
|
|
79
|
-
|
|
80
|
-
if (encodeURIComponent(text).match(/(%0A|%0D)/gi) !== null) {
|
|
81
|
-
cr = encodeURIComponent(text).match(/(%0A|%0D)/gi).length;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
return cl + cr;
|
|
85
|
-
}
|
|
86
|
-
},
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* @this {CharThis}
|
|
90
|
-
* @description Set the char count to charCounter element textContent.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
* @
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
* @
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
const
|
|
126
|
-
const
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
this.selection.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
* @
|
|
151
|
-
* @
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Char class
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import CoreInjector from '../../editorInjector/_core';
|
|
6
|
+
import { _w, isEdge } from '../../helper/env';
|
|
7
|
+
import { addClass, removeClass, hasClass } from '../../helper/dom/domUtils';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @typedef {Omit<Char & Partial<__se__EditorInjector>, 'char'>} CharThis
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @constructor
|
|
15
|
+
* @this {CharThis}
|
|
16
|
+
* @description character count, character limit, etc. management class
|
|
17
|
+
* @param {__se__EditorCore} editor - The root editor instance
|
|
18
|
+
*/
|
|
19
|
+
function Char(editor) {
|
|
20
|
+
CoreInjector.call(this, editor);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
Char.prototype = {
|
|
24
|
+
/**
|
|
25
|
+
* @this {CharThis}
|
|
26
|
+
* @description Returns false if char count is greater than "frameOptions.get('charCounter_max')" when "html" is added to the current editor.
|
|
27
|
+
* @param {Node|string} html Element node or String.
|
|
28
|
+
* @returns {boolean}
|
|
29
|
+
*/
|
|
30
|
+
check(html) {
|
|
31
|
+
const maxCharCount = this.editor.frameOptions.get('charCounter_max');
|
|
32
|
+
if (maxCharCount) {
|
|
33
|
+
const length = this.getLength(typeof html === 'string' ? html : this.editor.frameOptions.get('charCounter_type') === 'byte-html' && html.nodeType === 1 ? /** @type {HTMLElement} */ (html).outerHTML : html.textContent);
|
|
34
|
+
if (length > 0 && length + this.getLength() > maxCharCount) {
|
|
35
|
+
CounterBlink(this.editor.frameContext.get('charWrapper'));
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @this {CharThis}
|
|
44
|
+
* @description Get the [content]'s number of characters or binary data size. (frameOptions.get('charCounter_type'))
|
|
45
|
+
* - If [content] is undefined, get the current editor's number of characters or binary data size.
|
|
46
|
+
* @param {string=} content Content to count. (defalut: this.editor.frameContext.get('wysiwyg'))
|
|
47
|
+
* @returns {number}
|
|
48
|
+
*/
|
|
49
|
+
getLength(content) {
|
|
50
|
+
if (typeof content !== 'string') {
|
|
51
|
+
content = this.editor.frameOptions.get('charCounter_type') === 'byte-html' ? this.editor.frameContext.get('wysiwyg').innerHTML : this.editor.frameContext.get('wysiwyg').textContent;
|
|
52
|
+
}
|
|
53
|
+
return /byte/.test(this.editor.frameOptions.get('charCounter_type')) ? this.getByteLength(content) : content.length;
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @this {CharThis}
|
|
58
|
+
* @descriptionGets Get the length in bytes of a string.
|
|
59
|
+
* @param {string} text String text
|
|
60
|
+
* @returns {number}
|
|
61
|
+
*/
|
|
62
|
+
getByteLength(text) {
|
|
63
|
+
if (!text || !text.toString) return 0;
|
|
64
|
+
text = text.toString();
|
|
65
|
+
|
|
66
|
+
let cr, cl;
|
|
67
|
+
if (isEdge) {
|
|
68
|
+
cl = decodeURIComponent(encodeURIComponent(text)).length;
|
|
69
|
+
cr = 0;
|
|
70
|
+
|
|
71
|
+
if (encodeURIComponent(text).match(/(%0A|%0D)/gi) !== null) {
|
|
72
|
+
cr = encodeURIComponent(text).match(/(%0A|%0D)/gi).length;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return cl + cr;
|
|
76
|
+
} else {
|
|
77
|
+
cl = new TextEncoder().encode(text).length;
|
|
78
|
+
cr = 0;
|
|
79
|
+
|
|
80
|
+
if (encodeURIComponent(text).match(/(%0A|%0D)/gi) !== null) {
|
|
81
|
+
cr = encodeURIComponent(text).match(/(%0A|%0D)/gi).length;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return cl + cr;
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @this {CharThis}
|
|
90
|
+
* @description Set the char count to charCounter element textContent.
|
|
91
|
+
* @param {?__se__FrameContext=} fc Frame context
|
|
92
|
+
*/
|
|
93
|
+
display(fc) {
|
|
94
|
+
const charCounter = (fc || this.editor.frameContext).get('charCounter');
|
|
95
|
+
if (charCounter) {
|
|
96
|
+
_w.setTimeout(() => {
|
|
97
|
+
charCounter.textContent = this.getLength();
|
|
98
|
+
}, 0);
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* @this {CharThis}
|
|
104
|
+
* @description Returns false if char count is greater than "frameOptions.get('charCounter_max')" when "inputText" is added to the current editor.
|
|
105
|
+
* - If the current number of characters is greater than "charCounter_max", the excess characters are removed.
|
|
106
|
+
* And call the char.display()
|
|
107
|
+
* @param {string} inputText Text added.
|
|
108
|
+
* @returns {boolean}
|
|
109
|
+
*/
|
|
110
|
+
test(inputText, _fromInputEvent) {
|
|
111
|
+
let nextCharCount = 0;
|
|
112
|
+
if (inputText) nextCharCount = this.getLength(inputText);
|
|
113
|
+
|
|
114
|
+
this.display();
|
|
115
|
+
|
|
116
|
+
const maxCharCount = this.editor.frameOptions.get('charCounter_max');
|
|
117
|
+
if (maxCharCount > 0) {
|
|
118
|
+
let over = false;
|
|
119
|
+
const count = this.getLength();
|
|
120
|
+
|
|
121
|
+
if (count > maxCharCount) {
|
|
122
|
+
over = true;
|
|
123
|
+
if (nextCharCount > 0 && _fromInputEvent) {
|
|
124
|
+
this.selection._init();
|
|
125
|
+
const range = this.selection.getRange();
|
|
126
|
+
const endOff = range.endOffset - 1;
|
|
127
|
+
const text = this.selection.getNode().textContent;
|
|
128
|
+
const slicePosition = range.endOffset - 1; // (count - maxCharCount);
|
|
129
|
+
|
|
130
|
+
this.selection.getNode().textContent = text.slice(0, slicePosition < 0 ? 0 : slicePosition) + text.slice(range.endOffset, text.length);
|
|
131
|
+
this.selection.setRange(range.endContainer, endOff, range.endContainer, endOff);
|
|
132
|
+
}
|
|
133
|
+
} else if (count + nextCharCount > maxCharCount) {
|
|
134
|
+
over = true;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (over) {
|
|
138
|
+
CounterBlink(this.editor.frameContext.get('charWrapper'));
|
|
139
|
+
if (nextCharCount > 0) return false;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return true;
|
|
144
|
+
},
|
|
145
|
+
|
|
146
|
+
constructor: Char
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* @private
|
|
151
|
+
* @description The character counter blinks.
|
|
152
|
+
* @param {Element} charWrapper this.editor.frameContext.get('charWrapper')
|
|
153
|
+
*/
|
|
154
|
+
function CounterBlink(charWrapper) {
|
|
155
|
+
if (charWrapper && !hasClass(charWrapper, 'se-blink')) {
|
|
156
|
+
addClass(charWrapper, 'se-blink');
|
|
157
|
+
_w.setTimeout(() => {
|
|
158
|
+
removeClass(charWrapper, 'se-blink');
|
|
159
|
+
}, 600);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export default Char;
|