suneditor 3.0.0-beta.9 → 3.0.0-rc.2
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 +65 -57
- package/dist/suneditor-contents.min.css +1 -0
- package/dist/suneditor.min.css +1 -1
- package/dist/suneditor.min.js +1 -1
- package/package.json +110 -61
- package/src/assets/design/color.css +36 -17
- package/src/assets/design/size.css +2 -0
- package/src/assets/icons/defaultIcons.js +17 -2
- package/src/assets/suneditor-contents.css +51 -16
- package/src/assets/suneditor.css +116 -43
- package/src/core/config/contextProvider.js +288 -0
- package/src/core/config/eventManager.js +188 -0
- package/src/core/config/instanceCheck.js +59 -0
- package/src/core/config/optionProvider.js +452 -0
- package/src/core/editor.js +166 -1637
- package/src/core/event/actions/index.js +229 -0
- package/src/core/event/effects/common.registry.js +74 -0
- package/src/core/event/effects/keydown.registry.js +573 -0
- package/src/core/event/effects/ruleHelpers.js +148 -0
- package/src/core/event/eventOrchestrator.js +944 -0
- package/src/core/event/executor.js +27 -0
- package/src/core/{base/eventHandlers → event/handlers}/handler_toolbar.js +27 -28
- package/src/core/{base/eventHandlers → event/handlers}/handler_ww_clipboard.js +10 -8
- package/src/core/{base/eventHandlers → event/handlers}/handler_ww_dragDrop.js +22 -23
- package/src/core/event/handlers/handler_ww_input.js +75 -0
- package/src/core/event/handlers/handler_ww_key.js +228 -0
- package/src/core/event/handlers/handler_ww_mouse.js +166 -0
- package/src/core/event/ports.js +211 -0
- package/src/core/event/reducers/keydown.reducer.js +97 -0
- package/src/core/event/rules/keydown.rule.arrow.js +63 -0
- package/src/core/event/rules/keydown.rule.backspace.js +208 -0
- package/src/core/event/rules/keydown.rule.delete.js +132 -0
- package/src/core/event/rules/keydown.rule.enter.js +150 -0
- package/src/core/event/rules/keydown.rule.tab.js +35 -0
- package/src/core/event/support/defaultLineManager.js +136 -0
- package/src/core/event/support/selectionState.js +204 -0
- package/src/core/kernel/coreKernel.js +320 -0
- package/src/core/kernel/kernelInjector.js +19 -0
- package/src/core/kernel/store.js +173 -0
- package/src/core/{class → logic/dom}/char.js +42 -45
- package/src/core/logic/dom/format.js +1075 -0
- package/src/core/{class → logic/dom}/html.js +743 -624
- package/src/core/logic/dom/inline.js +1847 -0
- package/src/core/logic/dom/listFormat.js +601 -0
- package/src/core/{class → logic/dom}/nodeTransform.js +92 -72
- package/src/core/{class → logic/dom}/offset.js +254 -317
- package/src/core/logic/dom/selection.js +754 -0
- package/src/core/logic/panel/menu.js +389 -0
- package/src/core/logic/panel/toolbar.js +449 -0
- package/src/core/logic/panel/viewer.js +761 -0
- package/src/core/logic/shell/_commandExecutor.js +380 -0
- package/src/core/logic/shell/commandDispatcher.js +241 -0
- package/src/core/logic/shell/component.js +970 -0
- package/src/core/logic/shell/focusManager.js +110 -0
- package/src/core/{base → logic/shell}/history.js +110 -60
- package/src/core/logic/shell/pluginManager.js +363 -0
- package/src/core/logic/shell/shortcuts.js +130 -0
- package/src/core/logic/shell/ui.js +904 -0
- package/src/core/schema/context.js +66 -0
- package/src/core/schema/frameContext.js +160 -0
- package/src/core/schema/options.js +628 -0
- package/src/core/section/constructor.js +194 -500
- package/src/core/section/documentType.js +297 -222
- package/src/events.js +808 -543
- package/src/helper/clipboard.js +27 -16
- package/src/helper/converter.js +100 -78
- package/src/helper/dom/domCheck.js +56 -30
- package/src/helper/dom/domQuery.js +159 -89
- package/src/helper/dom/domUtils.js +114 -49
- package/src/helper/dom/index.js +5 -1
- package/src/helper/env.js +26 -26
- package/src/helper/index.js +1 -1
- package/src/helper/keyCodeMap.js +25 -28
- package/src/helper/numbers.js +4 -8
- package/src/helper/unicode.js +4 -8
- package/src/hooks/base.js +307 -0
- package/src/hooks/params.js +130 -0
- package/src/interfaces/contracts.js +227 -0
- package/src/interfaces/index.js +7 -0
- package/src/interfaces/plugins.js +239 -0
- package/src/langs/ckb.js +4 -4
- package/src/langs/cs.js +4 -4
- package/src/langs/da.js +4 -4
- package/src/langs/de.js +4 -4
- package/src/langs/en.js +4 -4
- package/src/langs/es.js +4 -4
- package/src/langs/fa.js +4 -4
- package/src/langs/fr.js +4 -4
- package/src/langs/he.js +4 -4
- package/src/langs/hu.js +4 -4
- package/src/langs/it.js +4 -4
- package/src/langs/ja.js +4 -4
- package/src/langs/km.js +4 -4
- package/src/langs/ko.js +4 -4
- package/src/langs/lv.js +4 -4
- package/src/langs/nl.js +4 -4
- package/src/langs/pl.js +4 -4
- package/src/langs/pt_br.js +13 -13
- package/src/langs/ro.js +4 -4
- package/src/langs/ru.js +4 -4
- package/src/langs/se.js +4 -4
- package/src/langs/tr.js +4 -4
- package/src/langs/uk.js +4 -4
- package/src/langs/ur.js +4 -4
- package/src/langs/zh_cn.js +4 -4
- package/src/modules/{Browser.js → contract/Browser.js} +119 -128
- package/src/modules/{ColorPicker.js → contract/ColorPicker.js} +132 -142
- package/src/modules/contract/Controller.js +589 -0
- package/src/modules/{Figure.js → contract/Figure.js} +591 -411
- package/src/modules/{HueSlider.js → contract/HueSlider.js} +125 -86
- package/src/modules/contract/Modal.js +357 -0
- package/src/modules/contract/index.js +9 -0
- package/src/modules/manager/ApiManager.js +197 -0
- package/src/modules/{FileManager.js → manager/FileManager.js} +128 -160
- package/src/modules/manager/index.js +5 -0
- package/src/modules/{ModalAnchorEditor.js → ui/ModalAnchorEditor.js} +108 -138
- package/src/modules/{SelectMenu.js → ui/SelectMenu.js} +119 -120
- package/src/modules/{_DragHandle.js → ui/_DragHandle.js} +1 -1
- package/src/modules/ui/index.js +6 -0
- package/src/plugins/browser/audioGallery.js +23 -26
- package/src/plugins/browser/fileBrowser.js +25 -28
- package/src/plugins/browser/fileGallery.js +20 -23
- package/src/plugins/browser/imageGallery.js +24 -23
- package/src/plugins/browser/videoGallery.js +27 -29
- package/src/plugins/command/blockquote.js +11 -17
- package/src/plugins/command/exportPDF.js +26 -26
- package/src/plugins/command/fileUpload.js +138 -133
- package/src/plugins/command/list_bulleted.js +48 -44
- package/src/plugins/command/list_numbered.js +48 -44
- package/src/plugins/dropdown/align.js +64 -50
- package/src/plugins/dropdown/backgroundColor.js +34 -35
- package/src/plugins/dropdown/{formatBlock.js → blockStyle.js} +43 -37
- package/src/plugins/dropdown/font.js +50 -36
- package/src/plugins/dropdown/fontColor.js +34 -35
- package/src/plugins/dropdown/hr.js +55 -50
- package/src/plugins/dropdown/layout.js +20 -15
- package/src/plugins/dropdown/lineHeight.js +46 -30
- package/src/plugins/dropdown/list.js +32 -33
- package/src/plugins/dropdown/paragraphStyle.js +40 -34
- package/src/plugins/dropdown/table/index.js +915 -0
- package/src/plugins/dropdown/table/render/table.html.js +308 -0
- package/src/plugins/dropdown/table/render/table.menu.js +121 -0
- package/src/plugins/dropdown/table/services/table.cell.js +465 -0
- package/src/plugins/dropdown/table/services/table.clipboard.js +414 -0
- package/src/plugins/dropdown/table/services/table.grid.js +504 -0
- package/src/plugins/dropdown/table/services/table.resize.js +463 -0
- package/src/plugins/dropdown/table/services/table.selection.js +466 -0
- package/src/plugins/dropdown/table/services/table.style.js +844 -0
- package/src/plugins/dropdown/table/shared/table.constants.js +109 -0
- package/src/plugins/dropdown/table/shared/table.utils.js +219 -0
- package/src/plugins/dropdown/template.js +20 -15
- package/src/plugins/dropdown/textStyle.js +28 -22
- package/src/plugins/field/mention.js +54 -49
- package/src/plugins/index.js +5 -5
- package/src/plugins/input/fontSize.js +100 -97
- package/src/plugins/input/pageNavigator.js +13 -10
- package/src/plugins/modal/audio.js +208 -219
- package/src/plugins/modal/drawing.js +99 -104
- package/src/plugins/modal/embed.js +323 -312
- package/src/plugins/modal/image/index.js +942 -0
- package/src/plugins/modal/image/render/image.html.js +150 -0
- package/src/plugins/modal/image/services/image.size.js +198 -0
- package/src/plugins/modal/image/services/image.upload.js +216 -0
- package/src/plugins/modal/image/shared/image.constants.js +20 -0
- package/src/plugins/modal/link.js +74 -54
- package/src/plugins/modal/math.js +126 -119
- package/src/plugins/modal/video/index.js +858 -0
- package/src/plugins/modal/video/render/video.html.js +131 -0
- package/src/plugins/modal/video/services/video.size.js +281 -0
- package/src/plugins/modal/video/services/video.upload.js +92 -0
- package/src/plugins/popup/anchor.js +57 -49
- package/src/suneditor.js +73 -61
- package/src/themes/cobalt.css +155 -0
- package/src/themes/dark.css +143 -120
- package/src/typedef.js +214 -63
- package/types/assets/icons/defaultIcons.d.ts +8 -0
- package/types/assets/suneditor-contents.css.d.ts +1 -0
- package/types/assets/suneditor.css.d.ts +1 -0
- package/types/core/config/contextProvider.d.ts +148 -0
- package/types/core/config/eventManager.d.ts +68 -0
- package/types/core/config/instanceCheck.d.ts +33 -0
- package/types/core/config/optionProvider.d.ts +147 -0
- package/types/core/editor.d.ts +27 -586
- package/types/core/event/actions/index.d.ts +50 -0
- package/types/core/event/effects/common.registry.d.ts +56 -0
- package/types/core/event/effects/keydown.registry.d.ts +80 -0
- package/types/core/event/effects/ruleHelpers.d.ts +36 -0
- package/types/core/event/eventOrchestrator.d.ts +191 -0
- package/types/core/event/executor.d.ts +13 -0
- package/types/core/event/handlers/handler_toolbar.d.ts +38 -0
- package/types/core/event/handlers/handler_ww_clipboard.d.ts +36 -0
- package/types/core/event/handlers/handler_ww_dragDrop.d.ts +26 -0
- package/types/core/event/handlers/handler_ww_input.d.ts +38 -0
- package/types/core/event/handlers/handler_ww_key.d.ts +40 -0
- package/types/core/event/handlers/handler_ww_mouse.d.ts +47 -0
- package/types/core/event/ports.d.ts +256 -0
- package/types/core/event/reducers/keydown.reducer.d.ts +84 -0
- package/types/core/event/rules/keydown.rule.arrow.d.ts +19 -0
- package/types/core/event/rules/keydown.rule.backspace.d.ts +18 -0
- package/types/core/event/rules/keydown.rule.delete.d.ts +18 -0
- package/types/core/event/rules/keydown.rule.enter.d.ts +18 -0
- package/types/core/event/rules/keydown.rule.tab.d.ts +18 -0
- package/types/core/event/support/defaultLineManager.d.ts +22 -0
- package/types/core/event/support/selectionState.d.ts +29 -0
- package/types/core/kernel/coreKernel.d.ts +219 -0
- package/types/core/kernel/kernelInjector.d.ts +16 -0
- package/types/core/kernel/store.d.ts +170 -0
- package/types/core/logic/dom/char.d.ts +46 -0
- package/types/core/logic/dom/format.d.ts +234 -0
- package/types/core/logic/dom/html.d.ts +290 -0
- package/types/core/logic/dom/inline.d.ts +93 -0
- package/types/core/logic/dom/listFormat.d.ts +101 -0
- package/types/core/logic/dom/nodeTransform.d.ts +110 -0
- package/types/core/logic/dom/offset.d.ts +335 -0
- package/types/core/logic/dom/selection.d.ts +165 -0
- package/types/core/logic/panel/menu.d.ts +93 -0
- package/types/core/logic/panel/toolbar.d.ts +128 -0
- package/types/core/logic/panel/viewer.d.ts +89 -0
- package/types/core/logic/shell/_commandExecutor.d.ts +18 -0
- package/types/core/logic/shell/commandDispatcher.d.ts +65 -0
- package/types/core/logic/shell/component.d.ts +182 -0
- package/types/core/logic/shell/focusManager.d.ts +31 -0
- package/types/core/{base → logic/shell}/history.d.ts +13 -12
- package/types/core/logic/shell/pluginManager.d.ts +115 -0
- package/types/core/logic/shell/shortcuts.d.ts +131 -0
- package/types/core/logic/shell/ui.d.ts +261 -0
- package/types/core/schema/context.d.ts +104 -0
- package/types/core/schema/frameContext.d.ts +320 -0
- package/types/core/schema/options.d.ts +1241 -0
- package/types/core/section/constructor.d.ts +117 -652
- package/types/core/section/documentType.d.ts +43 -61
- package/types/events.d.ts +796 -65
- package/types/helper/clipboard.d.ts +5 -4
- package/types/helper/converter.d.ts +55 -43
- package/types/helper/dom/domCheck.d.ts +27 -19
- package/types/helper/dom/domQuery.d.ts +76 -57
- package/types/helper/dom/domUtils.d.ts +62 -39
- package/types/helper/dom/index.d.ts +87 -1
- package/types/helper/env.d.ts +16 -13
- package/types/helper/index.d.ts +8 -2
- package/types/helper/keyCodeMap.d.ts +24 -23
- package/types/helper/numbers.d.ts +4 -6
- package/types/helper/unicode.d.ts +4 -3
- package/types/hooks/base.d.ts +239 -0
- package/types/hooks/params.d.ts +65 -0
- package/types/index.d.ts +20 -117
- package/types/interfaces/contracts.d.ts +183 -0
- package/types/interfaces/index.d.ts +3 -0
- package/types/interfaces/plugins.d.ts +168 -0
- package/types/langs/_Lang.d.ts +2 -2
- package/types/langs/index.d.ts +2 -2
- package/types/modules/contract/Browser.d.ts +262 -0
- package/types/modules/contract/ColorPicker.d.ts +99 -0
- package/types/modules/contract/Controller.d.ts +204 -0
- package/types/modules/contract/Figure.d.ts +529 -0
- package/types/modules/{HueSlider.d.ts → contract/HueSlider.d.ts} +39 -28
- package/types/modules/contract/Modal.d.ts +62 -0
- package/types/modules/contract/index.d.ts +7 -0
- package/types/modules/manager/ApiManager.d.ts +106 -0
- package/types/modules/manager/FileManager.d.ts +124 -0
- package/types/modules/manager/index.d.ts +3 -0
- package/types/modules/ui/ModalAnchorEditor.d.ts +152 -0
- package/types/modules/ui/SelectMenu.d.ts +107 -0
- package/types/modules/{_DragHandle.d.ts → ui/_DragHandle.d.ts} +1 -0
- package/types/modules/ui/index.d.ts +4 -0
- package/types/plugins/browser/audioGallery.d.ts +33 -41
- package/types/plugins/browser/fileBrowser.d.ts +42 -50
- package/types/plugins/browser/fileGallery.d.ts +33 -41
- package/types/plugins/browser/imageGallery.d.ts +30 -37
- package/types/plugins/browser/videoGallery.d.ts +33 -41
- package/types/plugins/command/blockquote.d.ts +4 -21
- package/types/plugins/command/exportPDF.d.ts +23 -33
- package/types/plugins/command/fileUpload.d.ts +80 -100
- package/types/plugins/command/list_bulleted.d.ts +9 -35
- package/types/plugins/command/list_numbered.d.ts +9 -35
- package/types/plugins/dropdown/align.d.ts +23 -46
- package/types/plugins/dropdown/backgroundColor.d.ts +35 -53
- package/types/plugins/dropdown/blockStyle.d.ts +45 -0
- package/types/plugins/dropdown/font.d.ts +18 -41
- package/types/plugins/dropdown/fontColor.d.ts +35 -53
- package/types/plugins/dropdown/hr.d.ts +26 -52
- package/types/plugins/dropdown/layout.d.ts +19 -25
- package/types/plugins/dropdown/lineHeight.d.ts +21 -39
- package/types/plugins/dropdown/list.d.ts +6 -34
- package/types/plugins/dropdown/paragraphStyle.d.ts +34 -45
- package/types/plugins/dropdown/table/index.d.ts +158 -0
- package/types/plugins/dropdown/table/render/table.html.d.ts +71 -0
- package/types/plugins/dropdown/table/render/table.menu.d.ts +59 -0
- package/types/plugins/dropdown/table/services/table.cell.d.ts +76 -0
- package/types/plugins/dropdown/table/services/table.clipboard.d.ts +26 -0
- package/types/plugins/dropdown/table/services/table.grid.d.ts +77 -0
- package/types/plugins/dropdown/table/services/table.resize.d.ts +72 -0
- package/types/plugins/dropdown/table/services/table.selection.d.ts +59 -0
- package/types/plugins/dropdown/table/services/table.style.d.ts +162 -0
- package/types/plugins/dropdown/table/shared/table.constants.d.ts +134 -0
- package/types/plugins/dropdown/table/shared/table.utils.d.ts +91 -0
- package/types/plugins/dropdown/template.d.ts +19 -25
- package/types/plugins/dropdown/textStyle.d.ts +23 -30
- package/types/plugins/field/mention.d.ts +66 -72
- package/types/plugins/index.d.ts +41 -40
- package/types/plugins/input/fontSize.d.ts +57 -96
- package/types/plugins/input/pageNavigator.d.ts +5 -8
- package/types/plugins/modal/audio.d.ts +60 -153
- package/types/plugins/modal/drawing.d.ts +16 -118
- package/types/plugins/modal/embed.d.ts +46 -166
- package/types/plugins/modal/image/index.d.ts +281 -0
- package/types/plugins/modal/image/render/image.html.d.ts +45 -0
- package/types/plugins/modal/image/services/image.size.d.ts +55 -0
- package/types/plugins/modal/image/services/image.upload.d.ts +24 -0
- package/types/plugins/modal/image/shared/image.constants.d.ts +17 -0
- package/types/plugins/modal/link.d.ts +46 -66
- package/types/plugins/modal/math.d.ts +17 -86
- package/types/plugins/modal/{video.d.ts → video/index.d.ts} +89 -221
- package/types/plugins/modal/video/render/video.html.d.ts +37 -0
- package/types/plugins/modal/video/services/video.size.d.ts +74 -0
- package/types/plugins/modal/video/services/video.upload.d.ts +19 -0
- package/types/plugins/popup/anchor.d.ts +8 -38
- package/types/suneditor.d.ts +55 -24
- package/types/typedef.d.ts +344 -228
- package/CONTRIBUTING.md +0 -186
- package/src/core/base/eventHandlers/handler_ww_key_input.js +0 -1200
- package/src/core/base/eventHandlers/handler_ww_mouse.js +0 -194
- package/src/core/base/eventManager.js +0 -1523
- package/src/core/class/component.js +0 -856
- package/src/core/class/format.js +0 -3433
- package/src/core/class/menu.js +0 -346
- package/src/core/class/selection.js +0 -610
- package/src/core/class/shortcuts.js +0 -98
- package/src/core/class/toolbar.js +0 -431
- package/src/core/class/ui.js +0 -424
- package/src/core/class/viewer.js +0 -750
- package/src/core/section/actives.js +0 -266
- package/src/core/section/context.js +0 -102
- package/src/editorInjector/_classes.js +0 -36
- package/src/editorInjector/_core.js +0 -87
- package/src/editorInjector/index.js +0 -73
- package/src/modules/ApiManager.js +0 -191
- package/src/modules/Controller.js +0 -474
- package/src/modules/Modal.js +0 -346
- package/src/modules/index.js +0 -14
- package/src/plugins/dropdown/table.js +0 -4034
- package/src/plugins/modal/image.js +0 -1376
- package/src/plugins/modal/video.js +0 -1226
- package/types/core/base/eventHandlers/handler_toolbar.d.ts +0 -41
- package/types/core/base/eventHandlers/handler_ww_clipboard.d.ts +0 -40
- package/types/core/base/eventHandlers/handler_ww_dragDrop.d.ts +0 -35
- package/types/core/base/eventHandlers/handler_ww_key_input.d.ts +0 -45
- package/types/core/base/eventHandlers/handler_ww_mouse.d.ts +0 -39
- package/types/core/base/eventManager.d.ts +0 -401
- package/types/core/class/char.d.ts +0 -61
- package/types/core/class/component.d.ts +0 -213
- package/types/core/class/format.d.ts +0 -623
- package/types/core/class/html.d.ts +0 -430
- package/types/core/class/menu.d.ts +0 -126
- package/types/core/class/nodeTransform.d.ts +0 -93
- package/types/core/class/offset.d.ts +0 -522
- package/types/core/class/selection.d.ts +0 -188
- package/types/core/class/shortcuts.d.ts +0 -142
- package/types/core/class/toolbar.d.ts +0 -189
- package/types/core/class/ui.d.ts +0 -164
- package/types/core/class/viewer.d.ts +0 -140
- package/types/core/section/actives.d.ts +0 -46
- package/types/core/section/context.d.ts +0 -45
- package/types/editorInjector/_classes.d.ts +0 -41
- package/types/editorInjector/_core.d.ts +0 -87
- package/types/editorInjector/index.d.ts +0 -69
- package/types/modules/ApiManager.d.ts +0 -125
- package/types/modules/Browser.d.ts +0 -326
- package/types/modules/ColorPicker.d.ts +0 -135
- package/types/modules/Controller.d.ts +0 -251
- package/types/modules/Figure.d.ts +0 -517
- package/types/modules/FileManager.d.ts +0 -202
- package/types/modules/Modal.d.ts +0 -111
- package/types/modules/ModalAnchorEditor.d.ts +0 -236
- package/types/modules/SelectMenu.d.ts +0 -194
- package/types/modules/index.d.ts +0 -26
- package/types/plugins/dropdown/formatBlock.d.ts +0 -55
- package/types/plugins/dropdown/table.d.ts +0 -627
- package/types/plugins/modal/image.d.ts +0 -451
- /package/{LICENSE → LICENSE.txt} +0 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { numbers } from '../../helper';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @typedef {Object} StoreState
|
|
5
|
+
* @property {*} rootKey - Current root frame key.
|
|
6
|
+
* @property {boolean} hasFocus - Whether the editor has focus.
|
|
7
|
+
* @property {number} tabSize - Tab character space count.
|
|
8
|
+
* @property {number} indentSize - `block` indent margin size (px).
|
|
9
|
+
* @property {number} codeIndentSize - Code view indent space count.
|
|
10
|
+
* @property {Array<string>} currentNodes - Selection path tag names (for navigation bar).
|
|
11
|
+
* @property {Array<string>} currentNodesMap - Active command/style names from selection path.
|
|
12
|
+
* @property {number} initViewportHeight - Viewport height at initialization.
|
|
13
|
+
* @property {number} currentViewportHeight - Current visual viewport height.
|
|
14
|
+
* @property {boolean} controlActive - Whether a controller or component is currently active, used to manage `blur`/`focus` behavior.
|
|
15
|
+
* @property {(fc: SunEditor.FrameContext) => boolean} isScrollable - Whether the frame content is scrollable (derived from `height`/`maxHeight` options).
|
|
16
|
+
* @property {?Node} _lastSelectionNode - Last selection node processed by `selectionState.update()` (cache for dedup).
|
|
17
|
+
* @property {?Range} _range - Cached selection range.
|
|
18
|
+
* @property {boolean} _mousedown - Whether `mousedown` is pressed.
|
|
19
|
+
* @property {boolean} _preventBlur - Suppress `blur` event handling.
|
|
20
|
+
* @property {boolean} _preventFocus - Suppress `focus` event handling.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @typedef {Object} StoreMode - Toolbar display mode flags (immutable after init).
|
|
25
|
+
* @property {boolean} isClassic - Whether the toolbar is in classic (top-fixed) mode.
|
|
26
|
+
* @property {boolean} isInline - Whether the toolbar is in `inline` mode (appears above the editor on focus).
|
|
27
|
+
* @property {boolean} isBalloon - Whether the toolbar is in `balloon` mode (appears on text selection).
|
|
28
|
+
* @property {boolean} isBalloonAlways - Whether the toolbar is in `balloon-always` mode (always visible as floating).
|
|
29
|
+
* @property {boolean} isSubBalloon - Whether the sub-toolbar is in `balloon` mode.
|
|
30
|
+
* @property {boolean} isSubBalloonAlways - Whether the sub-toolbar is in `balloon-always` mode.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @description Central runtime state management for the editor.
|
|
35
|
+
* - Does not store DOM references (kept in `frameContext`).
|
|
36
|
+
* - Does not store configuration values (kept in `options`).
|
|
37
|
+
* - Only manages runtime state.
|
|
38
|
+
*/
|
|
39
|
+
class Store {
|
|
40
|
+
/** @type {StoreState} */
|
|
41
|
+
#state;
|
|
42
|
+
#subscribers = new Map();
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @param {import('../section/constructor').ConstructorReturnType} product - Constructor product
|
|
46
|
+
*/
|
|
47
|
+
constructor(product) {
|
|
48
|
+
const options = product.options;
|
|
49
|
+
const mode = options.get('mode');
|
|
50
|
+
const subMode = options.get('_subMode');
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @internal
|
|
54
|
+
* @description If `true`, initialize all indexes of image, video information
|
|
55
|
+
* @type {boolean}
|
|
56
|
+
*/
|
|
57
|
+
this._editorInitFinished = false;
|
|
58
|
+
|
|
59
|
+
/** @type {StoreMode} */
|
|
60
|
+
this.mode = {
|
|
61
|
+
isClassic: /classic/i.test(mode),
|
|
62
|
+
isInline: /inline/i.test(mode),
|
|
63
|
+
isBalloon: /balloon/i.test(mode),
|
|
64
|
+
isBalloonAlways: /balloon-always/i.test(mode),
|
|
65
|
+
isSubBalloon: /balloon/i.test(subMode),
|
|
66
|
+
isSubBalloonAlways: /balloon-always/i.test(subMode),
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
this.#state = {
|
|
70
|
+
rootKey: product.rootId,
|
|
71
|
+
hasFocus: false,
|
|
72
|
+
tabSize: 4,
|
|
73
|
+
indentSize: 25,
|
|
74
|
+
codeIndentSize: 2,
|
|
75
|
+
currentNodes: [],
|
|
76
|
+
currentNodesMap: [],
|
|
77
|
+
initViewportHeight: 0,
|
|
78
|
+
currentViewportHeight: 0,
|
|
79
|
+
controlActive: false,
|
|
80
|
+
_lastSelectionNode: null,
|
|
81
|
+
isScrollable: (fc) => {
|
|
82
|
+
const fo = fc.get('options');
|
|
83
|
+
const height = fo.get('height');
|
|
84
|
+
const maxHeight = fo.get('maxHeight');
|
|
85
|
+
|
|
86
|
+
if (height !== 'auto') {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (!maxHeight) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// height === 'auto' && maxHeight
|
|
95
|
+
return fc.get('wysiwyg').offsetHeight >= numbers.get(maxHeight);
|
|
96
|
+
},
|
|
97
|
+
_range: null,
|
|
98
|
+
_mousedown: false,
|
|
99
|
+
_preventBlur: false,
|
|
100
|
+
_preventFocus: false,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @description Get state value (supports underscore notation)
|
|
106
|
+
* @template {keyof StoreState} K
|
|
107
|
+
* @param {K} key
|
|
108
|
+
* @returns {StoreState[K]}
|
|
109
|
+
*/
|
|
110
|
+
get(key) {
|
|
111
|
+
return this.#state[key];
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* @description Set state value and notify subscribers
|
|
116
|
+
* @template {keyof StoreState} K
|
|
117
|
+
* @param {K} key
|
|
118
|
+
* @param {StoreState[K]} value - Value to set
|
|
119
|
+
*/
|
|
120
|
+
set(key, value) {
|
|
121
|
+
const oldValue = this.#state[key];
|
|
122
|
+
this.#state[key] = value;
|
|
123
|
+
|
|
124
|
+
// Notify subscribers
|
|
125
|
+
this.#notify(key, value, oldValue);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* @description Subscribe to state changes
|
|
130
|
+
* @template {keyof StoreState} K
|
|
131
|
+
* @param {K} path - Path to subscribe
|
|
132
|
+
* @param {(newValue: StoreState[K], oldValue: StoreState[K]) => void} callback
|
|
133
|
+
* @returns {() => void} Unsubscribe function
|
|
134
|
+
*/
|
|
135
|
+
subscribe(path, callback) {
|
|
136
|
+
if (!this.#subscribers.has(path)) {
|
|
137
|
+
this.#subscribers.set(path, new Set());
|
|
138
|
+
}
|
|
139
|
+
this.#subscribers.get(path).add(callback);
|
|
140
|
+
|
|
141
|
+
return () => this.#subscribers.get(path).delete(callback);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* @param {keyof StoreState} path
|
|
146
|
+
* @param {*} newValue
|
|
147
|
+
* @param {*} oldValue
|
|
148
|
+
*/
|
|
149
|
+
#notify(path, newValue, oldValue) {
|
|
150
|
+
const subscribers = this.#subscribers.get(path);
|
|
151
|
+
if (!subscribers) return;
|
|
152
|
+
|
|
153
|
+
for (const cb of subscribers) {
|
|
154
|
+
try {
|
|
155
|
+
cb(newValue, oldValue);
|
|
156
|
+
} catch (e) {
|
|
157
|
+
console.error(`[Store] Subscriber error for "${path}":`, e);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Internal API
|
|
163
|
+
_reset() {
|
|
164
|
+
// Reset to initial state
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
_destroy() {
|
|
168
|
+
this.#subscribers.clear();
|
|
169
|
+
this.#state = null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export default Store;
|
|
@@ -2,59 +2,58 @@
|
|
|
2
2
|
* @fileoverview Char class
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import { addClass, removeClass, hasClass } from '../../helper/dom/domUtils';
|
|
5
|
+
import { _w, isEdge } from '../../../helper/env';
|
|
6
|
+
import { addClass, removeClass, hasClass } from '../../../helper/dom/domUtils';
|
|
8
7
|
|
|
9
8
|
/**
|
|
10
|
-
* @typedef {Omit<Char & Partial<__se__EditorInjector>, 'char'>} CharThis
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* @constructor
|
|
15
|
-
* @this {CharThis}
|
|
16
9
|
* @description character count, character limit, etc. management class
|
|
17
|
-
* @param {__se__EditorCore} editor - The root editor instance
|
|
18
10
|
*/
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
11
|
+
class Char {
|
|
12
|
+
#$;
|
|
13
|
+
#frameContext;
|
|
14
|
+
#frameOptions;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @constructor
|
|
18
|
+
* @param {SunEditor.Kernel} kernel
|
|
19
|
+
*/
|
|
20
|
+
constructor(kernel) {
|
|
21
|
+
this.#$ = kernel.$;
|
|
22
|
+
this.#frameContext = this.#$.frameContext;
|
|
23
|
+
this.#frameOptions = this.#$.frameOptions;
|
|
24
|
+
}
|
|
22
25
|
|
|
23
|
-
Char.prototype = {
|
|
24
26
|
/**
|
|
25
|
-
* @this {CharThis}
|
|
26
27
|
* @description Returns false if char count is greater than "frameOptions.get('charCounter_max')" when "html" is added to the current editor.
|
|
27
28
|
* @param {Node|string} html Element node or String.
|
|
28
29
|
* @returns {boolean}
|
|
29
30
|
*/
|
|
30
31
|
check(html) {
|
|
31
|
-
const maxCharCount = this
|
|
32
|
+
const maxCharCount = this.#frameOptions.get('charCounter_max');
|
|
32
33
|
if (maxCharCount) {
|
|
33
|
-
const length = this.getLength(typeof html === 'string' ? html : this
|
|
34
|
+
const length = this.getLength(typeof html === 'string' ? html : this.#frameOptions.get('charCounter_type') === 'byte-html' && html.nodeType === 1 ? /** @type {HTMLElement} */ (html).outerHTML : html.textContent);
|
|
34
35
|
if (length > 0 && length + this.getLength() > maxCharCount) {
|
|
35
|
-
CounterBlink(this
|
|
36
|
+
CounterBlink(this.#frameContext.get('charWrapper'));
|
|
36
37
|
return false;
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
40
|
return true;
|
|
40
|
-
}
|
|
41
|
+
}
|
|
41
42
|
|
|
42
43
|
/**
|
|
43
|
-
* @this {CharThis}
|
|
44
44
|
* @description Get the [content]'s number of characters or binary data size. (frameOptions.get('charCounter_type'))
|
|
45
45
|
* - If [content] is undefined, get the current editor's number of characters or binary data size.
|
|
46
|
-
* @param {string
|
|
46
|
+
* @param {string} [content] Content to count. (defalut: this.#frameContext.get('wysiwyg'))
|
|
47
47
|
* @returns {number}
|
|
48
48
|
*/
|
|
49
49
|
getLength(content) {
|
|
50
50
|
if (typeof content !== 'string') {
|
|
51
|
-
content = this
|
|
51
|
+
content = this.#frameOptions.get('charCounter_type') === 'byte-html' ? this.#frameContext.get('wysiwyg').innerHTML : this.#frameContext.get('wysiwyg').textContent;
|
|
52
52
|
}
|
|
53
|
-
return /byte/.test(this
|
|
54
|
-
}
|
|
53
|
+
return /byte/.test(this.#frameOptions.get('charCounter_type')) ? this.getByteLength(content) : content.length;
|
|
54
|
+
}
|
|
55
55
|
|
|
56
56
|
/**
|
|
57
|
-
* @this {CharThis}
|
|
58
57
|
* @descriptionGets Get the length in bytes of a string.
|
|
59
58
|
* @param {string} text String text
|
|
60
59
|
* @returns {number}
|
|
@@ -83,28 +82,28 @@ Char.prototype = {
|
|
|
83
82
|
|
|
84
83
|
return cl + cr;
|
|
85
84
|
}
|
|
86
|
-
}
|
|
85
|
+
}
|
|
87
86
|
|
|
88
87
|
/**
|
|
89
|
-
* @this {CharThis}
|
|
90
88
|
* @description Set the char count to charCounter element textContent.
|
|
91
|
-
* @param {?
|
|
89
|
+
* @param {?SunEditor.FrameContext} [fc] Frame context
|
|
92
90
|
*/
|
|
93
91
|
display(fc) {
|
|
94
|
-
const charCounter = (fc || this
|
|
92
|
+
const charCounter = (fc || this.#frameContext).get('charCounter');
|
|
95
93
|
if (charCounter) {
|
|
94
|
+
// Defer count update — DOM content may still be mutating from the current input/paste action
|
|
96
95
|
_w.setTimeout(() => {
|
|
97
|
-
charCounter.textContent = this.getLength();
|
|
96
|
+
charCounter.textContent = String(this.getLength());
|
|
98
97
|
}, 0);
|
|
99
98
|
}
|
|
100
|
-
}
|
|
99
|
+
}
|
|
101
100
|
|
|
102
101
|
/**
|
|
103
|
-
* @this {CharThis}
|
|
104
102
|
* @description Returns false if char count is greater than "frameOptions.get('charCounter_max')" when "inputText" is added to the current editor.
|
|
105
103
|
* - If the current number of characters is greater than "charCounter_max", the excess characters are removed.
|
|
106
104
|
* And call the char.display()
|
|
107
105
|
* @param {string} inputText Text added.
|
|
106
|
+
* @param {boolean} _fromInputEvent Whether the test is triggered from an input event.
|
|
108
107
|
* @returns {boolean}
|
|
109
108
|
*/
|
|
110
109
|
test(inputText, _fromInputEvent) {
|
|
@@ -113,7 +112,7 @@ Char.prototype = {
|
|
|
113
112
|
|
|
114
113
|
this.display();
|
|
115
114
|
|
|
116
|
-
const maxCharCount = this
|
|
115
|
+
const maxCharCount = this.#frameOptions.get('charCounter_max');
|
|
117
116
|
if (maxCharCount > 0) {
|
|
118
117
|
let over = false;
|
|
119
118
|
const count = this.getLength();
|
|
@@ -121,39 +120,37 @@ Char.prototype = {
|
|
|
121
120
|
if (count > maxCharCount) {
|
|
122
121
|
over = true;
|
|
123
122
|
if (nextCharCount > 0 && _fromInputEvent) {
|
|
124
|
-
this
|
|
125
|
-
const range = this
|
|
123
|
+
this.#$.selection.init();
|
|
124
|
+
const range = this.#$.selection.getRange();
|
|
126
125
|
const endOff = range.endOffset - 1;
|
|
127
|
-
const text = this
|
|
126
|
+
const text = this.#$.selection.getNode().textContent;
|
|
128
127
|
const slicePosition = range.endOffset - 1; // (count - maxCharCount);
|
|
129
128
|
|
|
130
|
-
this
|
|
131
|
-
this
|
|
129
|
+
this.#$.selection.getNode().textContent = text.slice(0, slicePosition < 0 ? 0 : slicePosition) + text.slice(range.endOffset, text.length);
|
|
130
|
+
this.#$.selection.setRange(range.endContainer, endOff, range.endContainer, endOff);
|
|
132
131
|
}
|
|
133
132
|
} else if (count + nextCharCount > maxCharCount) {
|
|
134
133
|
over = true;
|
|
135
134
|
}
|
|
136
135
|
|
|
137
136
|
if (over) {
|
|
138
|
-
CounterBlink(this
|
|
137
|
+
CounterBlink(this.#frameContext.get('charWrapper'));
|
|
139
138
|
if (nextCharCount > 0) return false;
|
|
140
139
|
}
|
|
141
140
|
}
|
|
142
141
|
|
|
143
142
|
return true;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
constructor: Char
|
|
147
|
-
};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
148
145
|
|
|
149
146
|
/**
|
|
150
|
-
* @private
|
|
151
147
|
* @description The character counter blinks.
|
|
152
|
-
* @param {Element} charWrapper this
|
|
148
|
+
* @param {Element} charWrapper this.#frameContext.get('charWrapper')
|
|
153
149
|
*/
|
|
154
150
|
function CounterBlink(charWrapper) {
|
|
155
151
|
if (charWrapper && !hasClass(charWrapper, 'se-blink')) {
|
|
156
152
|
addClass(charWrapper, 'se-blink');
|
|
153
|
+
// Remove blink CSS class after animation completes (600ms matches the CSS animation duration)
|
|
157
154
|
_w.setTimeout(() => {
|
|
158
155
|
removeClass(charWrapper, 'se-blink');
|
|
159
156
|
}, 600);
|