@uiw/react-md-editor 4.0.11 → 4.1.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 (69) hide show
  1. package/README.md +91 -35
  2. package/common.d.ts +17 -0
  3. package/dist/mdeditor.css +105 -110
  4. package/dist/mdeditor.js +3280 -4534
  5. package/dist/mdeditor.min.css +1 -1
  6. package/dist/mdeditor.min.js +1 -1
  7. package/dist/mdeditor.min.js.LICENSE.txt +2 -2
  8. package/esm/Editor.common.d.ts +5 -0
  9. package/esm/Editor.common.js +7 -0
  10. package/esm/Editor.d.ts +4 -11
  11. package/esm/Editor.factory.d.ts +14 -0
  12. package/esm/Editor.factory.js +285 -0
  13. package/esm/Editor.js +5 -261
  14. package/esm/Editor.nohighlight.d.ts +4 -11
  15. package/esm/Editor.nohighlight.js +5 -261
  16. package/esm/commands/list.js +3 -4
  17. package/esm/commands/title.js +5 -6
  18. package/esm/components/DragBar/index.js +3 -4
  19. package/esm/components/TextArea/Markdown.common.d.ts +5 -0
  20. package/esm/components/TextArea/Markdown.common.js +57 -0
  21. package/esm/components/TextArea/Markdown.js +6 -8
  22. package/esm/components/TextArea/Textarea.js +13 -17
  23. package/esm/components/TextArea/factory.d.ts +33 -0
  24. package/esm/components/TextArea/factory.js +102 -0
  25. package/esm/components/TextArea/index.common.d.ts +3 -0
  26. package/esm/components/TextArea/index.common.js +6 -0
  27. package/esm/components/TextArea/index.d.ts +3 -27
  28. package/esm/components/TextArea/index.js +5 -100
  29. package/esm/components/TextArea/index.nohighlight.d.ts +3 -27
  30. package/esm/components/TextArea/index.nohighlight.js +2 -93
  31. package/esm/components/Toolbar/Child.js +8 -9
  32. package/esm/components/Toolbar/index.js +22 -28
  33. package/esm/index.common.d.ts +16 -0
  34. package/esm/index.common.js +16 -0
  35. package/esm/react-markdown-preview.common.d.ts +4 -0
  36. package/esm/utils/markdownUtils.js +13 -17
  37. package/lib/Editor.common.d.ts +5 -0
  38. package/lib/Editor.common.js +15 -0
  39. package/lib/Editor.d.ts +4 -11
  40. package/lib/Editor.factory.d.ts +14 -0
  41. package/lib/Editor.factory.js +333 -0
  42. package/lib/Editor.js +4 -318
  43. package/lib/Editor.nohighlight.d.ts +4 -11
  44. package/lib/Editor.nohighlight.js +4 -318
  45. package/lib/components/TextArea/Markdown.common.d.ts +5 -0
  46. package/lib/components/TextArea/Markdown.common.js +68 -0
  47. package/lib/components/TextArea/factory.d.ts +33 -0
  48. package/lib/components/TextArea/factory.js +109 -0
  49. package/lib/components/TextArea/index.common.d.ts +3 -0
  50. package/lib/components/TextArea/index.common.js +14 -0
  51. package/lib/components/TextArea/index.d.ts +3 -27
  52. package/lib/components/TextArea/index.js +6 -98
  53. package/lib/components/TextArea/index.nohighlight.d.ts +3 -27
  54. package/lib/components/TextArea/index.nohighlight.js +3 -92
  55. package/lib/index.common.d.ts +16 -0
  56. package/lib/index.common.js +123 -0
  57. package/lib/react-markdown-preview.common.d.ts +4 -0
  58. package/package.json +8 -2
  59. package/src/Editor.common.tsx +7 -0
  60. package/src/Editor.factory.tsx +286 -0
  61. package/src/Editor.nohighlight.tsx +3 -271
  62. package/src/Editor.tsx +3 -271
  63. package/src/components/TextArea/Markdown.common.tsx +49 -0
  64. package/src/components/TextArea/factory.tsx +120 -0
  65. package/src/components/TextArea/index.common.tsx +6 -0
  66. package/src/components/TextArea/index.nohighlight.tsx +3 -108
  67. package/src/components/TextArea/index.tsx +3 -110
  68. package/src/index.common.tsx +19 -0
  69. package/src/react-markdown-preview.common.d.ts +4 -0
@@ -9,10 +9,10 @@
9
9
  */
10
10
 
11
11
  /**!
12
- * @uiw/copy-to-clipboard v1.0.17
12
+ * @uiw/copy-to-clipboard v1.0.20
13
13
  * Copy to clipboard.
14
14
  *
15
- * Copyright (c) 2024 Kenny Wang
15
+ * Copyright (c) 2026 Kenny Wang
16
16
  * https://github.com/uiwjs/copy-to-clipboard.git
17
17
  *
18
18
  * @website: https://uiwjs.github.io/copy-to-clipboard
@@ -0,0 +1,5 @@
1
+ export type { RefMDEditor } from './Editor.factory';
2
+ declare const _default: import("react").ForwardRefExoticComponent<import("./Types").MDEditorProps & import("react").RefAttributes<import("./Editor.factory").RefMDEditor>> & {
3
+ Markdown: import("react").ForwardRefExoticComponent<import("@uiw/react-markdown-preview/common").MarkdownPreviewProps & import("react").RefAttributes<import("@uiw/react-markdown-preview/common").MarkdownPreviewRef>>;
4
+ };
5
+ export default _default;
@@ -0,0 +1,7 @@
1
+ import MarkdownPreview from '@uiw/react-markdown-preview/common';
2
+ import TextArea from './components/TextArea/index.common';
3
+ import { createMDEditor } from './Editor.factory';
4
+ export default createMDEditor({
5
+ MarkdownPreview,
6
+ TextArea
7
+ });
package/esm/Editor.d.ts CHANGED
@@ -1,12 +1,5 @@
1
- import React from 'react';
2
- import MarkdownPreview from '@uiw/react-markdown-preview';
3
- import { type ContextStore } from './Context';
4
- import type { MDEditorProps } from './Types';
5
- export interface RefMDEditor extends ContextStore {
6
- }
7
- declare const InternalMDEditor: React.ForwardRefExoticComponent<MDEditorProps & React.RefAttributes<RefMDEditor>>;
8
- type EditorComponent = typeof InternalMDEditor & {
9
- Markdown: typeof MarkdownPreview;
1
+ export type { RefMDEditor } from './Editor.factory';
2
+ declare const _default: import("react").ForwardRefExoticComponent<import("./Types").MDEditorProps & import("react").RefAttributes<import("./Editor.factory").RefMDEditor>> & {
3
+ Markdown: import("react").ForwardRefExoticComponent<import("@uiw/react-markdown-preview").MarkdownPreviewProps & import("react").RefAttributes<import("@uiw/react-markdown-preview").MarkdownPreviewRef>>;
10
4
  };
11
- declare const Editor: EditorComponent;
12
- export default Editor;
5
+ export default _default;
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import { type ContextStore } from './Context';
3
+ import type { MDEditorProps } from './Types';
4
+ export interface RefMDEditor extends ContextStore {
5
+ }
6
+ type PreviewComponent = React.ComponentType<any>;
7
+ type TextAreaComponent = React.ComponentType<any>;
8
+ export declare function createMDEditor<TMarkdownPreview extends PreviewComponent, TTextArea extends TextAreaComponent>(options: {
9
+ MarkdownPreview: TMarkdownPreview;
10
+ TextArea: TTextArea;
11
+ }): React.ForwardRefExoticComponent<MDEditorProps & React.RefAttributes<RefMDEditor>> & {
12
+ Markdown: TMarkdownPreview;
13
+ };
14
+ export {};
@@ -0,0 +1,285 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/objectWithoutPropertiesLoose";
3
+ var _excluded = ["prefixCls", "className", "value", "commands", "commandsFilter", "direction", "extraCommands", "height", "enableScroll", "visibleDragbar", "highlightEnable", "preview", "fullscreen", "overflow", "previewOptions", "textareaProps", "maxHeight", "minHeight", "autoFocus", "autoFocusEnd", "tabSize", "defaultTabEnable", "onChange", "onStatistics", "onHeightChange", "hideToolbar", "toolbarBottom", "components", "renderTextarea"];
4
+ import React, { useEffect, useReducer, useMemo, useRef, useImperativeHandle } from 'react';
5
+ import { ToolbarVisibility } from "./components/Toolbar/index.js";
6
+ import DragBar from "./components/DragBar/index.js";
7
+ import { getCommands, getExtraCommands, TextAreaCommandOrchestrator } from "./commands/index.js";
8
+ import { reducer, EditorContext } from "./Context.js";
9
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
+ function setGroupPopFalse(data) {
11
+ if (data === void 0) {
12
+ data = {};
13
+ }
14
+ Object.keys(data).forEach(keyname => {
15
+ data[keyname] = false;
16
+ });
17
+ return data;
18
+ }
19
+ export function createMDEditor(options) {
20
+ var MarkdownPreview = options.MarkdownPreview,
21
+ TextArea = options.TextArea;
22
+ var PreviewComponent = MarkdownPreview;
23
+ var TextAreaComponent = TextArea;
24
+ var InternalMDEditor = /*#__PURE__*/React.forwardRef((props, ref) => {
25
+ var _ref = props || {},
26
+ _ref$prefixCls = _ref.prefixCls,
27
+ prefixCls = _ref$prefixCls === void 0 ? 'w-md-editor' : _ref$prefixCls,
28
+ className = _ref.className,
29
+ propsValue = _ref.value,
30
+ _ref$commands = _ref.commands,
31
+ commands = _ref$commands === void 0 ? getCommands() : _ref$commands,
32
+ commandsFilter = _ref.commandsFilter,
33
+ direction = _ref.direction,
34
+ _ref$extraCommands = _ref.extraCommands,
35
+ extraCommands = _ref$extraCommands === void 0 ? getExtraCommands() : _ref$extraCommands,
36
+ _ref$height = _ref.height,
37
+ height = _ref$height === void 0 ? 200 : _ref$height,
38
+ _ref$enableScroll = _ref.enableScroll,
39
+ enableScroll = _ref$enableScroll === void 0 ? true : _ref$enableScroll,
40
+ _ref$visibleDragbar = _ref.visibleDragbar,
41
+ visibleDragbar = _ref$visibleDragbar === void 0 ? typeof props.visiableDragbar === 'boolean' ? props.visiableDragbar : true : _ref$visibleDragbar,
42
+ _ref$highlightEnable = _ref.highlightEnable,
43
+ highlightEnable = _ref$highlightEnable === void 0 ? true : _ref$highlightEnable,
44
+ _ref$preview = _ref.preview,
45
+ previewType = _ref$preview === void 0 ? 'live' : _ref$preview,
46
+ _ref$fullscreen = _ref.fullscreen,
47
+ fullscreen = _ref$fullscreen === void 0 ? false : _ref$fullscreen,
48
+ _ref$overflow = _ref.overflow,
49
+ overflow = _ref$overflow === void 0 ? true : _ref$overflow,
50
+ _ref$previewOptions = _ref.previewOptions,
51
+ previewOptions = _ref$previewOptions === void 0 ? {} : _ref$previewOptions,
52
+ textareaProps = _ref.textareaProps,
53
+ _ref$maxHeight = _ref.maxHeight,
54
+ maxHeight = _ref$maxHeight === void 0 ? 1200 : _ref$maxHeight,
55
+ _ref$minHeight = _ref.minHeight,
56
+ minHeight = _ref$minHeight === void 0 ? 100 : _ref$minHeight,
57
+ autoFocus = _ref.autoFocus,
58
+ _ref$autoFocusEnd = _ref.autoFocusEnd,
59
+ autoFocusEnd = _ref$autoFocusEnd === void 0 ? false : _ref$autoFocusEnd,
60
+ _ref$tabSize = _ref.tabSize,
61
+ tabSize = _ref$tabSize === void 0 ? 2 : _ref$tabSize,
62
+ _ref$defaultTabEnable = _ref.defaultTabEnable,
63
+ defaultTabEnable = _ref$defaultTabEnable === void 0 ? false : _ref$defaultTabEnable,
64
+ onChange = _ref.onChange,
65
+ onStatistics = _ref.onStatistics,
66
+ onHeightChange = _ref.onHeightChange,
67
+ hideToolbar = _ref.hideToolbar,
68
+ _ref$toolbarBottom = _ref.toolbarBottom,
69
+ toolbarBottom = _ref$toolbarBottom === void 0 ? false : _ref$toolbarBottom,
70
+ components = _ref.components,
71
+ renderTextarea = _ref.renderTextarea,
72
+ other = _objectWithoutPropertiesLoose(_ref, _excluded);
73
+ var cmds = commands.map(item => commandsFilter ? commandsFilter(item, false) : item).filter(Boolean);
74
+ var extraCmds = extraCommands.map(item => commandsFilter ? commandsFilter(item, true) : item).filter(Boolean);
75
+ var _useReducer = useReducer(reducer, {
76
+ markdown: propsValue,
77
+ preview: previewType,
78
+ components,
79
+ height,
80
+ minHeight,
81
+ highlightEnable,
82
+ tabSize,
83
+ defaultTabEnable,
84
+ scrollTop: 0,
85
+ scrollTopPreview: 0,
86
+ commands: cmds,
87
+ extraCommands: extraCmds,
88
+ fullscreen,
89
+ barPopup: {}
90
+ }),
91
+ state = _useReducer[0],
92
+ dispatch = _useReducer[1];
93
+ var container = useRef(null);
94
+ var previewRef = useRef(null);
95
+ var enableScrollRef = useRef(enableScroll);
96
+ useImperativeHandle(ref, () => _extends({}, state, {
97
+ container: container.current,
98
+ dispatch
99
+ }));
100
+ useMemo(() => enableScrollRef.current = enableScroll, [enableScroll]);
101
+ useEffect(() => {
102
+ var stateInit = {};
103
+ if (container.current) {
104
+ stateInit.container = container.current || undefined;
105
+ }
106
+ stateInit.markdown = propsValue || '';
107
+ stateInit.barPopup = {};
108
+ if (dispatch) {
109
+ dispatch(_extends({}, state, stateInit));
110
+ }
111
+ // eslint-disable-next-line react-hooks/exhaustive-deps
112
+ }, []);
113
+ var cls = [className, 'wmde-markdown-var', direction ? prefixCls + "-" + direction : null, prefixCls, state.preview ? prefixCls + "-show-" + state.preview : null, state.fullscreen ? prefixCls + "-fullscreen" : null].filter(Boolean).join(' ').trim();
114
+ useMemo(() => propsValue !== state.markdown && dispatch({
115
+ markdown: propsValue || ''
116
+ }), [propsValue, state.markdown]);
117
+ // eslint-disable-next-line react-hooks/exhaustive-deps
118
+ useMemo(() => previewType !== state.preview && dispatch({
119
+ preview: previewType
120
+ }), [previewType]);
121
+ // eslint-disable-next-line react-hooks/exhaustive-deps
122
+ useMemo(() => tabSize !== state.tabSize && dispatch({
123
+ tabSize
124
+ }), [tabSize]);
125
+ useMemo(() => highlightEnable !== state.highlightEnable && dispatch({
126
+ highlightEnable
127
+ }),
128
+ // eslint-disable-next-line react-hooks/exhaustive-deps
129
+ [highlightEnable]);
130
+ // eslint-disable-next-line react-hooks/exhaustive-deps
131
+ useMemo(() => autoFocus !== state.autoFocus && dispatch({
132
+ autoFocus: autoFocus
133
+ }), [autoFocus]);
134
+ useMemo(() => autoFocusEnd !== state.autoFocusEnd && dispatch({
135
+ autoFocusEnd: autoFocusEnd
136
+ }), [autoFocusEnd]);
137
+ useMemo(() => fullscreen !== state.fullscreen && dispatch({
138
+ fullscreen: fullscreen
139
+ }),
140
+ // eslint-disable-next-line react-hooks/exhaustive-deps
141
+ [fullscreen]);
142
+ // eslint-disable-next-line react-hooks/exhaustive-deps
143
+ useMemo(() => height !== state.height && dispatch({
144
+ height: height
145
+ }), [height]);
146
+ useMemo(() => height !== state.height && onHeightChange && onHeightChange(state.height, height, state), [height, onHeightChange, state]);
147
+ // eslint-disable-next-line react-hooks/exhaustive-deps
148
+ useMemo(() => commands !== state.commands && dispatch({
149
+ commands: cmds
150
+ }), [props.commands]);
151
+ // eslint-disable-next-line react-hooks/exhaustive-deps
152
+ useMemo(() => extraCommands !== state.extraCommands && dispatch({
153
+ extraCommands: extraCmds
154
+ }), [props.extraCommands]);
155
+ var textareaDomRef = useRef();
156
+ var active = useRef('preview');
157
+ var initScroll = useRef(false);
158
+ useMemo(() => {
159
+ textareaDomRef.current = state.textareaWarp;
160
+ if (state.textareaWarp) {
161
+ state.textareaWarp.addEventListener('mouseover', () => {
162
+ active.current = 'text';
163
+ });
164
+ state.textareaWarp.addEventListener('mouseleave', () => {
165
+ active.current = 'preview';
166
+ });
167
+ }
168
+ }, [state.textareaWarp]);
169
+ var handleScroll = (e, type) => {
170
+ if (!enableScrollRef.current) return;
171
+ var textareaDom = textareaDomRef.current;
172
+ var previewDom = previewRef.current ? previewRef.current : undefined;
173
+ if (!initScroll.current) {
174
+ active.current = type;
175
+ initScroll.current = true;
176
+ }
177
+ if (textareaDom && previewDom) {
178
+ var scale = (textareaDom.scrollHeight - textareaDom.offsetHeight) / (previewDom.scrollHeight - previewDom.offsetHeight);
179
+ if (e.target === textareaDom && active.current === 'text') {
180
+ previewDom.scrollTop = textareaDom.scrollTop / scale;
181
+ }
182
+ if (e.target === previewDom && active.current === 'preview') {
183
+ textareaDom.scrollTop = previewDom.scrollTop * scale;
184
+ }
185
+ var scrollTop = 0;
186
+ if (active.current === 'text') {
187
+ scrollTop = textareaDom.scrollTop || 0;
188
+ } else if (active.current === 'preview') {
189
+ scrollTop = previewDom.scrollTop || 0;
190
+ }
191
+ dispatch({
192
+ scrollTop
193
+ });
194
+ }
195
+ };
196
+ var previewClassName = prefixCls + "-preview " + (previewOptions.className || '');
197
+ var handlePreviewScroll = e => handleScroll(e, 'preview');
198
+ var mdPreview = useMemo(() => /*#__PURE__*/_jsx("div", {
199
+ ref: previewRef,
200
+ className: previewClassName,
201
+ children: /*#__PURE__*/_jsx(PreviewComponent, _extends({}, previewOptions, {
202
+ onScroll: handlePreviewScroll,
203
+ source: state.markdown || ''
204
+ }))
205
+ }), [previewClassName, previewOptions, state.markdown]);
206
+ var preview = (components == null ? void 0 : components.preview) && (components == null ? void 0 : components.preview(state.markdown || '', state, dispatch));
207
+ if (preview && /*#__PURE__*/React.isValidElement(preview)) {
208
+ mdPreview = /*#__PURE__*/_jsx("div", {
209
+ className: previewClassName,
210
+ ref: previewRef,
211
+ onScroll: handlePreviewScroll,
212
+ children: preview
213
+ });
214
+ }
215
+ var containerStyle = _extends({}, other.style, {
216
+ height: state.height || '100%'
217
+ });
218
+ var containerClick = () => dispatch({
219
+ barPopup: _extends({}, setGroupPopFalse(state.barPopup))
220
+ });
221
+ var dragBarChange = newHeight => dispatch({
222
+ height: newHeight
223
+ });
224
+ var changeHandle = evn => {
225
+ onChange && onChange(evn.target.value, evn, state);
226
+ if (textareaProps && textareaProps.onChange) {
227
+ textareaProps.onChange(evn);
228
+ }
229
+ if (state.textarea && state.textarea instanceof HTMLTextAreaElement && onStatistics) {
230
+ var obj = new TextAreaCommandOrchestrator(state.textarea);
231
+ var objState = obj.getState() || {};
232
+ onStatistics(_extends({}, objState, {
233
+ lineCount: evn.target.value.split('\n').length,
234
+ length: evn.target.value.length
235
+ }));
236
+ }
237
+ };
238
+ return /*#__PURE__*/_jsx(EditorContext.Provider, {
239
+ value: _extends({}, state, {
240
+ dispatch
241
+ }),
242
+ children: /*#__PURE__*/_jsxs("div", _extends({
243
+ ref: container,
244
+ className: cls
245
+ }, other, {
246
+ onClick: containerClick,
247
+ style: containerStyle,
248
+ children: [/*#__PURE__*/_jsx(ToolbarVisibility, {
249
+ hideToolbar: hideToolbar,
250
+ toolbarBottom: toolbarBottom,
251
+ prefixCls: prefixCls,
252
+ overflow: overflow,
253
+ placement: "top"
254
+ }), /*#__PURE__*/_jsxs("div", {
255
+ className: prefixCls + "-content",
256
+ children: [/(edit|live)/.test(state.preview || '') && /*#__PURE__*/_jsx(TextAreaComponent, _extends({
257
+ className: prefixCls + "-input",
258
+ prefixCls: prefixCls,
259
+ autoFocus: autoFocus
260
+ }, textareaProps, {
261
+ onChange: changeHandle,
262
+ renderTextarea: (components == null ? void 0 : components.textarea) || renderTextarea,
263
+ onScroll: e => handleScroll(e, 'text')
264
+ })), /(live|preview)/.test(state.preview || '') && mdPreview]
265
+ }), visibleDragbar && !state.fullscreen && /*#__PURE__*/_jsx(DragBar, {
266
+ prefixCls: prefixCls,
267
+ height: state.height,
268
+ maxHeight: maxHeight,
269
+ minHeight: minHeight,
270
+ onChange: dragBarChange
271
+ }), /*#__PURE__*/_jsx(ToolbarVisibility, {
272
+ hideToolbar: hideToolbar,
273
+ toolbarBottom: toolbarBottom,
274
+ prefixCls: prefixCls,
275
+ overflow: overflow,
276
+ placement: "bottom"
277
+ })]
278
+ }))
279
+ });
280
+ });
281
+ var Editor = InternalMDEditor;
282
+ Editor.Markdown = MarkdownPreview;
283
+ Editor.displayName = 'MDEditor';
284
+ return Editor;
285
+ }
package/esm/Editor.js CHANGED
@@ -1,263 +1,7 @@
1
- import _extends from "@babel/runtime/helpers/extends";
2
- import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/objectWithoutPropertiesLoose";
3
- var _excluded = ["prefixCls", "className", "value", "commands", "commandsFilter", "direction", "extraCommands", "height", "enableScroll", "visibleDragbar", "highlightEnable", "preview", "fullscreen", "overflow", "previewOptions", "textareaProps", "maxHeight", "minHeight", "autoFocus", "autoFocusEnd", "tabSize", "defaultTabEnable", "onChange", "onStatistics", "onHeightChange", "hideToolbar", "toolbarBottom", "components", "renderTextarea"];
4
- import React, { useEffect, useReducer, useMemo, useRef, useImperativeHandle } from 'react';
5
1
  import MarkdownPreview from '@uiw/react-markdown-preview';
6
- import { ToolbarVisibility } from "./components/Toolbar/index.js";
7
2
  import TextArea from "./components/TextArea/index.js";
8
- import DragBar from "./components/DragBar/index.js";
9
- import { getCommands, getExtraCommands, TextAreaCommandOrchestrator } from "./commands/index.js";
10
- import { reducer, EditorContext } from "./Context.js";
11
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
- function setGroupPopFalse(data) {
13
- if (data === void 0) {
14
- data = {};
15
- }
16
- Object.keys(data).forEach(keyname => {
17
- data[keyname] = false;
18
- });
19
- return data;
20
- }
21
- var InternalMDEditor = /*#__PURE__*/React.forwardRef((props, ref) => {
22
- var _ref = props || {},
23
- {
24
- prefixCls = 'w-md-editor',
25
- className,
26
- value: propsValue,
27
- commands = getCommands(),
28
- commandsFilter,
29
- direction,
30
- extraCommands = getExtraCommands(),
31
- height = 200,
32
- enableScroll = true,
33
- visibleDragbar = typeof props.visiableDragbar === 'boolean' ? props.visiableDragbar : true,
34
- highlightEnable = true,
35
- preview: previewType = 'live',
36
- fullscreen = false,
37
- overflow = true,
38
- previewOptions = {},
39
- textareaProps,
40
- maxHeight = 1200,
41
- minHeight = 100,
42
- autoFocus,
43
- autoFocusEnd = false,
44
- tabSize = 2,
45
- defaultTabEnable = false,
46
- onChange,
47
- onStatistics,
48
- onHeightChange,
49
- hideToolbar,
50
- toolbarBottom = false,
51
- components,
52
- renderTextarea
53
- } = _ref,
54
- other = _objectWithoutPropertiesLoose(_ref, _excluded);
55
- var cmds = commands.map(item => commandsFilter ? commandsFilter(item, false) : item).filter(Boolean);
56
- var extraCmds = extraCommands.map(item => commandsFilter ? commandsFilter(item, true) : item).filter(Boolean);
57
- var [state, dispatch] = useReducer(reducer, {
58
- markdown: propsValue,
59
- preview: previewType,
60
- components,
61
- height,
62
- minHeight,
63
- highlightEnable,
64
- tabSize,
65
- defaultTabEnable,
66
- scrollTop: 0,
67
- scrollTopPreview: 0,
68
- commands: cmds,
69
- extraCommands: extraCmds,
70
- fullscreen,
71
- barPopup: {}
72
- });
73
- var container = useRef(null);
74
- var previewRef = useRef(null);
75
- var enableScrollRef = useRef(enableScroll);
76
- useImperativeHandle(ref, () => _extends({}, state, {
77
- container: container.current,
78
- dispatch
79
- }));
80
- useMemo(() => enableScrollRef.current = enableScroll, [enableScroll]);
81
- useEffect(() => {
82
- var stateInit = {};
83
- if (container.current) {
84
- stateInit.container = container.current || undefined;
85
- }
86
- stateInit.markdown = propsValue || '';
87
- stateInit.barPopup = {};
88
- if (dispatch) {
89
- dispatch(_extends({}, state, stateInit));
90
- }
91
- // eslint-disable-next-line react-hooks/exhaustive-deps
92
- }, []);
93
- var cls = [className, 'wmde-markdown-var', direction ? prefixCls + "-" + direction : null, prefixCls, state.preview ? prefixCls + "-show-" + state.preview : null, state.fullscreen ? prefixCls + "-fullscreen" : null].filter(Boolean).join(' ').trim();
94
- useMemo(() => propsValue !== state.markdown && dispatch({
95
- markdown: propsValue || ''
96
- }), [propsValue, state.markdown]);
97
- // eslint-disable-next-line react-hooks/exhaustive-deps
98
- useMemo(() => previewType !== state.preview && dispatch({
99
- preview: previewType
100
- }), [previewType]);
101
- // eslint-disable-next-line react-hooks/exhaustive-deps
102
- useMemo(() => tabSize !== state.tabSize && dispatch({
103
- tabSize
104
- }), [tabSize]);
105
- useMemo(() => highlightEnable !== state.highlightEnable && dispatch({
106
- highlightEnable
107
- }),
108
- // eslint-disable-next-line react-hooks/exhaustive-deps
109
- [highlightEnable]);
110
- // eslint-disable-next-line react-hooks/exhaustive-deps
111
- useMemo(() => autoFocus !== state.autoFocus && dispatch({
112
- autoFocus: autoFocus
113
- }), [autoFocus]);
114
- useMemo(() => autoFocusEnd !== state.autoFocusEnd && dispatch({
115
- autoFocusEnd: autoFocusEnd
116
- }), [autoFocusEnd]);
117
- useMemo(() => fullscreen !== state.fullscreen && dispatch({
118
- fullscreen: fullscreen
119
- }),
120
- // eslint-disable-next-line react-hooks/exhaustive-deps
121
- [fullscreen]);
122
- // eslint-disable-next-line react-hooks/exhaustive-deps
123
- useMemo(() => height !== state.height && dispatch({
124
- height: height
125
- }), [height]);
126
- useMemo(() => height !== state.height && onHeightChange && onHeightChange(state.height, height, state), [height, onHeightChange, state]);
127
- // eslint-disable-next-line react-hooks/exhaustive-deps
128
- useMemo(() => commands !== state.commands && dispatch({
129
- commands: cmds
130
- }), [props.commands]);
131
- // eslint-disable-next-line react-hooks/exhaustive-deps
132
- useMemo(() => extraCommands !== state.extraCommands && dispatch({
133
- extraCommands: extraCmds
134
- }), [props.extraCommands]);
135
- var textareaDomRef = useRef();
136
- var active = useRef('preview');
137
- var initScroll = useRef(false);
138
- useMemo(() => {
139
- textareaDomRef.current = state.textareaWarp;
140
- if (state.textareaWarp) {
141
- state.textareaWarp.addEventListener('mouseover', () => {
142
- active.current = 'text';
143
- });
144
- state.textareaWarp.addEventListener('mouseleave', () => {
145
- active.current = 'preview';
146
- });
147
- }
148
- }, [state.textareaWarp]);
149
- var handleScroll = (e, type) => {
150
- if (!enableScrollRef.current) return;
151
- var textareaDom = textareaDomRef.current;
152
- var previewDom = previewRef.current ? previewRef.current : undefined;
153
- if (!initScroll.current) {
154
- active.current = type;
155
- initScroll.current = true;
156
- }
157
- if (textareaDom && previewDom) {
158
- var scale = (textareaDom.scrollHeight - textareaDom.offsetHeight) / (previewDom.scrollHeight - previewDom.offsetHeight);
159
- if (e.target === textareaDom && active.current === 'text') {
160
- previewDom.scrollTop = textareaDom.scrollTop / scale;
161
- }
162
- if (e.target === previewDom && active.current === 'preview') {
163
- textareaDom.scrollTop = previewDom.scrollTop * scale;
164
- }
165
- var scrollTop = 0;
166
- if (active.current === 'text') {
167
- scrollTop = textareaDom.scrollTop || 0;
168
- } else if (active.current === 'preview') {
169
- scrollTop = previewDom.scrollTop || 0;
170
- }
171
- dispatch({
172
- scrollTop
173
- });
174
- }
175
- };
176
- var previewClassName = prefixCls + "-preview " + (previewOptions.className || '');
177
- var handlePreviewScroll = e => handleScroll(e, 'preview');
178
- var mdPreview = useMemo(() => /*#__PURE__*/_jsx("div", {
179
- ref: previewRef,
180
- className: previewClassName,
181
- children: /*#__PURE__*/_jsx(MarkdownPreview, _extends({}, previewOptions, {
182
- onScroll: handlePreviewScroll,
183
- source: state.markdown || ''
184
- }))
185
- }), [previewClassName, previewOptions, state.markdown]);
186
- var preview = (components == null ? void 0 : components.preview) && (components == null ? void 0 : components.preview(state.markdown || '', state, dispatch));
187
- if (preview && /*#__PURE__*/React.isValidElement(preview)) {
188
- mdPreview = /*#__PURE__*/_jsx("div", {
189
- className: previewClassName,
190
- ref: previewRef,
191
- onScroll: handlePreviewScroll,
192
- children: preview
193
- });
194
- }
195
- var containerStyle = _extends({}, other.style, {
196
- height: state.height || '100%'
197
- });
198
- var containerClick = () => dispatch({
199
- barPopup: _extends({}, setGroupPopFalse(state.barPopup))
200
- });
201
- var dragBarChange = newHeight => dispatch({
202
- height: newHeight
203
- });
204
- var changeHandle = evn => {
205
- onChange && onChange(evn.target.value, evn, state);
206
- if (textareaProps && textareaProps.onChange) {
207
- textareaProps.onChange(evn);
208
- }
209
- if (state.textarea && state.textarea instanceof HTMLTextAreaElement && onStatistics) {
210
- var obj = new TextAreaCommandOrchestrator(state.textarea);
211
- var objState = obj.getState() || {};
212
- onStatistics(_extends({}, objState, {
213
- lineCount: evn.target.value.split('\n').length,
214
- length: evn.target.value.length
215
- }));
216
- }
217
- };
218
- return /*#__PURE__*/_jsx(EditorContext.Provider, {
219
- value: _extends({}, state, {
220
- dispatch
221
- }),
222
- children: /*#__PURE__*/_jsxs("div", _extends({
223
- ref: container,
224
- className: cls
225
- }, other, {
226
- onClick: containerClick,
227
- style: containerStyle,
228
- children: [/*#__PURE__*/_jsx(ToolbarVisibility, {
229
- hideToolbar: hideToolbar,
230
- toolbarBottom: toolbarBottom,
231
- prefixCls: prefixCls,
232
- overflow: overflow,
233
- placement: "top"
234
- }), /*#__PURE__*/_jsxs("div", {
235
- className: prefixCls + "-content",
236
- children: [/(edit|live)/.test(state.preview || '') && /*#__PURE__*/_jsx(TextArea, _extends({
237
- className: prefixCls + "-input",
238
- prefixCls: prefixCls,
239
- autoFocus: autoFocus
240
- }, textareaProps, {
241
- onChange: changeHandle,
242
- renderTextarea: (components == null ? void 0 : components.textarea) || renderTextarea,
243
- onScroll: e => handleScroll(e, 'text')
244
- })), /(live|preview)/.test(state.preview || '') && mdPreview]
245
- }), visibleDragbar && !state.fullscreen && /*#__PURE__*/_jsx(DragBar, {
246
- prefixCls: prefixCls,
247
- height: state.height,
248
- maxHeight: maxHeight,
249
- minHeight: minHeight,
250
- onChange: dragBarChange
251
- }), /*#__PURE__*/_jsx(ToolbarVisibility, {
252
- hideToolbar: hideToolbar,
253
- toolbarBottom: toolbarBottom,
254
- prefixCls: prefixCls,
255
- overflow: overflow,
256
- placement: "bottom"
257
- })]
258
- }))
259
- });
260
- });
261
- var Editor = InternalMDEditor;
262
- Editor.Markdown = MarkdownPreview;
263
- export default Editor;
3
+ import { createMDEditor } from './Editor.factory';
4
+ export default createMDEditor({
5
+ MarkdownPreview,
6
+ TextArea
7
+ });
@@ -1,12 +1,5 @@
1
- import React from 'react';
2
- import MarkdownPreview from '@uiw/react-markdown-preview/nohighlight';
3
- import { type ContextStore } from './Context';
4
- import type { MDEditorProps } from './Types';
5
- export interface RefMDEditor extends ContextStore {
6
- }
7
- declare const InternalMDEditor: React.ForwardRefExoticComponent<MDEditorProps & React.RefAttributes<RefMDEditor>>;
8
- type EditorComponent = typeof InternalMDEditor & {
9
- Markdown: typeof MarkdownPreview;
1
+ export type { RefMDEditor } from './Editor.factory';
2
+ declare const _default: import("react").ForwardRefExoticComponent<import("./Types").MDEditorProps & import("react").RefAttributes<import("./Editor.factory").RefMDEditor>> & {
3
+ Markdown: import("react").ForwardRefExoticComponent<import("@uiw/react-markdown-preview/nohighlight").MarkdownPreviewProps & import("react").RefAttributes<import("@uiw/react-markdown-preview/nohighlight").MarkdownPreviewRef>>;
10
4
  };
11
- declare const Editor: EditorComponent;
12
- export default Editor;
5
+ export default _default;