@uiw/react-md-editor 4.0.6 → 4.0.8
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 +83 -2
- package/commands.d.ts +14 -7
- package/dist/mdeditor.js +61 -17
- package/dist/mdeditor.min.js +1 -1
- package/esm/Context.d.ts +2 -0
- package/esm/Editor.js +5 -1
- package/esm/Editor.nohighlight.js +5 -1
- package/esm/Types.d.ts +6 -2
- package/esm/commands/index.cn.js +4 -4
- package/esm/commands/index.d.ts +8 -8
- package/esm/commands/index.js +8 -8
- package/esm/commands/title.d.ts +7 -1
- package/esm/commands/title.js +11 -4
- package/esm/commands/title1.d.ts +6 -0
- package/esm/commands/title1.js +16 -9
- package/esm/commands/title2.d.ts +6 -0
- package/esm/commands/title2.js +16 -9
- package/esm/commands/title3.d.ts +6 -0
- package/esm/commands/title3.js +16 -9
- package/esm/commands/title4.d.ts +6 -0
- package/esm/commands/title4.js +16 -9
- package/esm/commands/title5.d.ts +6 -0
- package/esm/commands/title5.js +16 -9
- package/esm/commands/title6.d.ts +6 -0
- package/esm/commands/title6.js +16 -9
- package/esm/components/TextArea/Textarea.js +18 -1
- package/esm/index.d.ts +1 -0
- package/esm/index.js +1 -0
- package/lib/Context.d.ts +2 -0
- package/lib/Editor.js +8 -1
- package/lib/Editor.nohighlight.js +8 -1
- package/lib/Types.d.ts +6 -2
- package/lib/commands/index.cn.js +4 -4
- package/lib/commands/index.d.ts +8 -8
- package/lib/commands/index.js +42 -0
- package/lib/commands/title.d.ts +7 -1
- package/lib/commands/title.js +12 -4
- package/lib/commands/title1.d.ts +6 -0
- package/lib/commands/title1.js +16 -9
- package/lib/commands/title2.d.ts +6 -0
- package/lib/commands/title2.js +16 -9
- package/lib/commands/title3.d.ts +6 -0
- package/lib/commands/title3.js +16 -9
- package/lib/commands/title4.d.ts +6 -0
- package/lib/commands/title4.js +16 -9
- package/lib/commands/title5.d.ts +6 -0
- package/lib/commands/title5.js +16 -9
- package/lib/commands/title6.d.ts +6 -0
- package/lib/commands/title6.js +16 -9
- package/lib/components/TextArea/Textarea.js +18 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +9 -1
- package/nohighlight.d.ts +2 -0
- package/package.json +1 -1
- package/src/Context.tsx +1 -0
- package/src/Editor.nohighlight.tsx +2 -0
- package/src/Editor.tsx +2 -0
- package/src/Types.ts +6 -2
- package/src/commands/index.cn.ts +3 -3
- package/src/commands/index.ts +14 -7
- package/src/commands/title.tsx +11 -4
- package/src/commands/title1.tsx +14 -7
- package/src/commands/title2.tsx +14 -7
- package/src/commands/title3.tsx +14 -7
- package/src/commands/title4.tsx +14 -7
- package/src/commands/title5.tsx +14 -7
- package/src/commands/title6.tsx +14 -7
- package/src/components/TextArea/Textarea.tsx +18 -0
- package/src/index.tsx +1 -0
package/lib/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import MDEditor from './Editor';
|
|
|
2
2
|
import * as commands from './commands/';
|
|
3
3
|
import * as MarkdownUtil from './utils/markdownUtils';
|
|
4
4
|
import './index.less';
|
|
5
|
+
export { headingExecute } from './commands/title';
|
|
5
6
|
export * from './commands/';
|
|
6
7
|
export * from './commands/group';
|
|
7
8
|
export * from './utils/markdownUtils';
|
package/lib/index.js
CHANGED
|
@@ -6,9 +6,16 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
var _exportNames = {
|
|
8
8
|
commands: true,
|
|
9
|
-
MarkdownUtil: true
|
|
9
|
+
MarkdownUtil: true,
|
|
10
|
+
headingExecute: true
|
|
10
11
|
};
|
|
11
12
|
exports["default"] = exports.commands = exports.MarkdownUtil = void 0;
|
|
13
|
+
Object.defineProperty(exports, "headingExecute", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function get() {
|
|
16
|
+
return _title.headingExecute;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
12
19
|
var _Editor = _interopRequireWildcard(require("./Editor"));
|
|
13
20
|
Object.keys(_Editor).forEach(function (key) {
|
|
14
21
|
if (key === "default" || key === "__esModule") return;
|
|
@@ -47,6 +54,7 @@ Object.keys(MarkdownUtil).forEach(function (key) {
|
|
|
47
54
|
}
|
|
48
55
|
});
|
|
49
56
|
});
|
|
57
|
+
var _title = require("./commands/title");
|
|
50
58
|
var _group = require("./commands/group");
|
|
51
59
|
Object.keys(_group).forEach(function (key) {
|
|
52
60
|
if (key === "default" || key === "__esModule") return;
|
package/nohighlight.d.ts
CHANGED
|
@@ -2,12 +2,14 @@ declare module '@uiw/react-md-editor/nohighlight' {
|
|
|
2
2
|
import MDEditor from '@uiw/react-md-editor/esm/Editor.nohighlight';
|
|
3
3
|
import * as commands from '@uiw/react-md-editor/esm/commands';
|
|
4
4
|
import * as MarkdownUtil from '@uiw/react-md-editor/esm/utils/markdownUtils';
|
|
5
|
+
export { headingExecute } from '@uiw/react-md-editor/esm/commands/title';
|
|
5
6
|
export * from '@uiw/react-md-editor/esm/commands';
|
|
6
7
|
export * from '@uiw/react-md-editor/esm/commands/group';
|
|
7
8
|
export * from '@uiw/react-md-editor/esm/utils/markdownUtils';
|
|
8
9
|
export * from '@uiw/react-md-editor/esm/utils/InsertTextAtPosition';
|
|
9
10
|
export * from '@uiw/react-md-editor/esm/Editor.nohighlight';
|
|
10
11
|
export * from '@uiw/react-md-editor/esm/Context';
|
|
12
|
+
export * from '@uiw/react-md-editor/esm/Types';
|
|
11
13
|
export { MarkdownUtil, commands };
|
|
12
14
|
export default MDEditor;
|
|
13
15
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uiw/react-md-editor",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.8",
|
|
4
4
|
"description": "A markdown editor with preview, implemented with React.js and TypeScript.",
|
|
5
5
|
"homepage": "https://uiwjs.github.io/react-md-editor/",
|
|
6
6
|
"funding": "https://jaywcjlove.github.io/#/sponsor",
|
package/src/Context.tsx
CHANGED
|
@@ -38,6 +38,7 @@ const InternalMDEditor = React.forwardRef<RefMDEditor, MDEditorProps>(
|
|
|
38
38
|
maxHeight = 1200,
|
|
39
39
|
minHeight = 100,
|
|
40
40
|
autoFocus,
|
|
41
|
+
autoFocusEnd = false,
|
|
41
42
|
tabSize = 2,
|
|
42
43
|
defaultTabEnable = false,
|
|
43
44
|
onChange,
|
|
@@ -117,6 +118,7 @@ const InternalMDEditor = React.forwardRef<RefMDEditor, MDEditorProps>(
|
|
|
117
118
|
);
|
|
118
119
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
119
120
|
useMemo(() => autoFocus !== state.autoFocus && dispatch({ autoFocus: autoFocus }), [autoFocus]);
|
|
121
|
+
useMemo(() => autoFocusEnd !== state.autoFocusEnd && dispatch({ autoFocusEnd: autoFocusEnd }), [autoFocusEnd]);
|
|
120
122
|
useMemo(
|
|
121
123
|
() => fullscreen !== state.fullscreen && dispatch({ fullscreen: fullscreen }),
|
|
122
124
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/src/Editor.tsx
CHANGED
|
@@ -38,6 +38,7 @@ const InternalMDEditor = React.forwardRef<RefMDEditor, MDEditorProps>(
|
|
|
38
38
|
maxHeight = 1200,
|
|
39
39
|
minHeight = 100,
|
|
40
40
|
autoFocus,
|
|
41
|
+
autoFocusEnd = false,
|
|
41
42
|
tabSize = 2,
|
|
42
43
|
defaultTabEnable = false,
|
|
43
44
|
onChange,
|
|
@@ -117,6 +118,7 @@ const InternalMDEditor = React.forwardRef<RefMDEditor, MDEditorProps>(
|
|
|
117
118
|
);
|
|
118
119
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
119
120
|
useMemo(() => autoFocus !== state.autoFocus && dispatch({ autoFocus: autoFocus }), [autoFocus]);
|
|
121
|
+
useMemo(() => autoFocusEnd !== state.autoFocusEnd && dispatch({ autoFocusEnd: autoFocusEnd }), [autoFocusEnd]);
|
|
120
122
|
useMemo(
|
|
121
123
|
() => fullscreen !== state.fullscreen && dispatch({ fullscreen: fullscreen }),
|
|
122
124
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
package/src/Types.ts
CHANGED
|
@@ -37,6 +37,10 @@ export interface MDEditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>
|
|
|
37
37
|
* or it has an `autofocus` attribute and no other element is focused.
|
|
38
38
|
*/
|
|
39
39
|
autoFocus?: ITextAreaProps['autoFocus'];
|
|
40
|
+
/**
|
|
41
|
+
* Can be used to make `Markdown Editor` focus on the end of text on initialization.
|
|
42
|
+
*/
|
|
43
|
+
autoFocusEnd?: boolean;
|
|
40
44
|
/**
|
|
41
45
|
* The height of the editor.
|
|
42
46
|
* ⚠️ `Dragbar` is invalid when **`height`** parameter percentage.
|
|
@@ -55,7 +59,7 @@ export interface MDEditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>
|
|
|
55
59
|
*/
|
|
56
60
|
visibleDragbar?: boolean;
|
|
57
61
|
/**
|
|
58
|
-
* @deprecated use
|
|
62
|
+
* @deprecated use {@link MDEditorProps.visibleDragbar}
|
|
59
63
|
*/
|
|
60
64
|
visiableDragbar?: boolean;
|
|
61
65
|
/**
|
|
@@ -88,7 +92,7 @@ export interface MDEditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>
|
|
|
88
92
|
textareaProps?: ITextAreaProps;
|
|
89
93
|
/**
|
|
90
94
|
* Use div to replace TextArea or re-render TextArea
|
|
91
|
-
* @deprecated Please use
|
|
95
|
+
* @deprecated Please use {@link components}
|
|
92
96
|
*/
|
|
93
97
|
renderTextarea?: ITextAreaProps['renderTextarea'];
|
|
94
98
|
/**
|
package/src/commands/index.cn.ts
CHANGED
|
@@ -46,7 +46,7 @@ let fullscreen: ICommand = {
|
|
|
46
46
|
...fullscreenInit,
|
|
47
47
|
buttonProps: { 'aria-label': '切换全屏(ctrl + 0)', title: '切换全屏(ctrl + 0)' },
|
|
48
48
|
};
|
|
49
|
-
let hr: ICommand = { ...hrInit, buttonProps: { 'aria-label': '
|
|
49
|
+
let hr: ICommand = { ...hrInit, buttonProps: { 'aria-label': '插入分割线 (ctrl + h)', title: '插入分割线 (ctrl + h)' } };
|
|
50
50
|
let image: ICommand = {
|
|
51
51
|
...imageInit,
|
|
52
52
|
buttonProps: { 'aria-label': '添加图像(ctrl + k)', title: '添加图像(ctrl + k)' },
|
|
@@ -91,8 +91,8 @@ let quote: ICommand = {
|
|
|
91
91
|
let strikethrough: ICommand = {
|
|
92
92
|
...strikethroughInit,
|
|
93
93
|
buttonProps: {
|
|
94
|
-
'aria-label': '
|
|
95
|
-
title: '
|
|
94
|
+
'aria-label': '添加删除线文本 (ctrl + shift + x)',
|
|
95
|
+
title: '添加删除线文本 (ctrl + shift + x)',
|
|
96
96
|
},
|
|
97
97
|
};
|
|
98
98
|
let issue: ICommand = { ...issueInit, buttonProps: { 'aria-label': '添加 issue', title: '添加 issue' } };
|
package/src/commands/index.ts
CHANGED
|
@@ -15,13 +15,13 @@ import { checkedListCommand, orderedListCommand, unorderedListCommand } from './
|
|
|
15
15
|
import { codeEdit, codeLive, codePreview } from './preview';
|
|
16
16
|
import { quote } from './quote';
|
|
17
17
|
import { strikethrough } from './strikeThrough';
|
|
18
|
-
import { title } from './title';
|
|
19
|
-
import { title1 } from './title1';
|
|
20
|
-
import { title2 } from './title2';
|
|
21
|
-
import { title3 } from './title3';
|
|
22
|
-
import { title4 } from './title4';
|
|
23
|
-
import { title5 } from './title5';
|
|
24
|
-
import { title6 } from './title6';
|
|
18
|
+
import { title, heading } from './title';
|
|
19
|
+
import { title1, heading1 } from './title1';
|
|
20
|
+
import { title2, heading2 } from './title2';
|
|
21
|
+
import { title3, heading3 } from './title3';
|
|
22
|
+
import { title4, heading4 } from './title4';
|
|
23
|
+
import { title5, heading5 } from './title5';
|
|
24
|
+
import { title6, heading6 } from './title6';
|
|
25
25
|
import { table } from './table';
|
|
26
26
|
import { issue } from './issue';
|
|
27
27
|
import { help } from './help';
|
|
@@ -188,6 +188,13 @@ export {
|
|
|
188
188
|
title4,
|
|
189
189
|
title5,
|
|
190
190
|
title6,
|
|
191
|
+
heading,
|
|
192
|
+
heading1,
|
|
193
|
+
heading2,
|
|
194
|
+
heading3,
|
|
195
|
+
heading4,
|
|
196
|
+
heading5,
|
|
197
|
+
heading6,
|
|
191
198
|
bold,
|
|
192
199
|
codeBlock,
|
|
193
200
|
comment,
|
package/src/commands/title.tsx
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { ICommand, ExecuteState, TextAreaTextApi } from './';
|
|
3
|
-
import {
|
|
3
|
+
import { heading1 } from './title1';
|
|
4
4
|
import { selectLine, executeCommand } from '../utils/markdownUtils';
|
|
5
5
|
|
|
6
|
-
export function
|
|
6
|
+
export function headingExecute({
|
|
7
7
|
state,
|
|
8
8
|
api,
|
|
9
9
|
prefix,
|
|
@@ -19,8 +19,8 @@ export function titleExecute({
|
|
|
19
19
|
executeCommand({ api, selectedText: state1.selectedText, selection: state.selection, prefix, suffix });
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
export const
|
|
23
|
-
...
|
|
22
|
+
export const heading: ICommand = {
|
|
23
|
+
...heading1,
|
|
24
24
|
icon: (
|
|
25
25
|
<svg width="12" height="12" viewBox="0 0 520 520">
|
|
26
26
|
<path
|
|
@@ -30,3 +30,10 @@ export const title: ICommand = {
|
|
|
30
30
|
</svg>
|
|
31
31
|
),
|
|
32
32
|
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @deprecated Use `heading` instead.
|
|
36
|
+
* This command is now deprecated and will be removed in future versions.
|
|
37
|
+
* Use `title` for inserting headings.
|
|
38
|
+
*/
|
|
39
|
+
export const title: ICommand = heading;
|
package/src/commands/title1.tsx
CHANGED
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { headingExecute } from '../commands/title';
|
|
3
3
|
import { ICommand, ExecuteState, TextAreaTextApi } from './';
|
|
4
4
|
|
|
5
|
-
export const
|
|
6
|
-
name: '
|
|
7
|
-
keyCommand: '
|
|
5
|
+
export const heading1: ICommand = {
|
|
6
|
+
name: 'heading1',
|
|
7
|
+
keyCommand: 'heading1',
|
|
8
8
|
shortcuts: 'ctrlcmd+1',
|
|
9
9
|
prefix: '# ',
|
|
10
10
|
suffix: '',
|
|
11
|
-
buttonProps: { 'aria-label': 'Insert
|
|
12
|
-
icon: <div style={{ fontSize: 18, textAlign: 'left' }}>
|
|
11
|
+
buttonProps: { 'aria-label': 'Insert Heading 1 (ctrl + 1)', title: 'Insert Heading 1 (ctrl + 1)' },
|
|
12
|
+
icon: <div style={{ fontSize: 18, textAlign: 'left' }}>Heading 1</div>,
|
|
13
13
|
execute: (state: ExecuteState, api: TextAreaTextApi) => {
|
|
14
|
-
|
|
14
|
+
headingExecute({ state, api, prefix: state.command.prefix!, suffix: state.command.suffix });
|
|
15
15
|
},
|
|
16
16
|
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @deprecated Use `heading1` instead.
|
|
20
|
+
* This command is now deprecated and will be removed in future versions.
|
|
21
|
+
* Use `title1` for inserting Heading 1.
|
|
22
|
+
*/
|
|
23
|
+
export const title1: ICommand = heading1;
|
package/src/commands/title2.tsx
CHANGED
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { headingExecute } from '../commands/title';
|
|
3
3
|
import { ICommand, ExecuteState, TextAreaTextApi } from './';
|
|
4
4
|
|
|
5
|
-
export const
|
|
6
|
-
name: '
|
|
7
|
-
keyCommand: '
|
|
5
|
+
export const heading2: ICommand = {
|
|
6
|
+
name: 'heading2',
|
|
7
|
+
keyCommand: 'heading2',
|
|
8
8
|
shortcuts: 'ctrlcmd+2',
|
|
9
9
|
prefix: '## ',
|
|
10
10
|
suffix: '',
|
|
11
|
-
buttonProps: { 'aria-label': 'Insert
|
|
12
|
-
icon: <div style={{ fontSize: 16, textAlign: 'left' }}>
|
|
11
|
+
buttonProps: { 'aria-label': 'Insert Heading 2 (ctrl + 2)', title: 'Insert Heading 2 (ctrl + 2)' },
|
|
12
|
+
icon: <div style={{ fontSize: 16, textAlign: 'left' }}>Heading 2</div>,
|
|
13
13
|
execute: (state: ExecuteState, api: TextAreaTextApi) => {
|
|
14
|
-
|
|
14
|
+
headingExecute({ state, api, prefix: state.command.prefix!, suffix: state.command.suffix });
|
|
15
15
|
},
|
|
16
16
|
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @deprecated Use `heading2` instead.
|
|
20
|
+
* This command is now deprecated and will be removed in future versions.
|
|
21
|
+
* Use `title2` for inserting Heading 2.
|
|
22
|
+
*/
|
|
23
|
+
export const title2: ICommand = heading2;
|
package/src/commands/title3.tsx
CHANGED
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { headingExecute } from '../commands/title';
|
|
3
3
|
import { ICommand, ExecuteState, TextAreaTextApi } from './';
|
|
4
4
|
|
|
5
|
-
export const
|
|
6
|
-
name: '
|
|
7
|
-
keyCommand: '
|
|
5
|
+
export const heading3: ICommand = {
|
|
6
|
+
name: 'heading3',
|
|
7
|
+
keyCommand: 'heading3',
|
|
8
8
|
shortcuts: 'ctrlcmd+3',
|
|
9
9
|
prefix: '### ',
|
|
10
10
|
suffix: '',
|
|
11
|
-
buttonProps: { 'aria-label': 'Insert
|
|
12
|
-
icon: <div style={{ fontSize: 15, textAlign: 'left' }}>
|
|
11
|
+
buttonProps: { 'aria-label': 'Insert Heading 3 (ctrl + 3)', title: 'Insert Heading 3 (ctrl + 3)' },
|
|
12
|
+
icon: <div style={{ fontSize: 15, textAlign: 'left' }}>Heading 3</div>,
|
|
13
13
|
execute: (state: ExecuteState, api: TextAreaTextApi) => {
|
|
14
|
-
|
|
14
|
+
headingExecute({ state, api, prefix: state.command.prefix!, suffix: state.command.suffix });
|
|
15
15
|
},
|
|
16
16
|
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @deprecated Use `heading3` instead.
|
|
20
|
+
* This command is now deprecated and will be removed in future versions.
|
|
21
|
+
* Use `title3` for inserting Heading 3.
|
|
22
|
+
*/
|
|
23
|
+
export const title3: ICommand = heading3;
|
package/src/commands/title4.tsx
CHANGED
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { headingExecute } from '../commands/title';
|
|
3
3
|
import { ICommand, ExecuteState, TextAreaTextApi } from './';
|
|
4
4
|
|
|
5
|
-
export const
|
|
6
|
-
name: '
|
|
7
|
-
keyCommand: '
|
|
5
|
+
export const heading4: ICommand = {
|
|
6
|
+
name: 'heading4',
|
|
7
|
+
keyCommand: 'heading4',
|
|
8
8
|
shortcuts: 'ctrlcmd+4',
|
|
9
9
|
prefix: '#### ',
|
|
10
10
|
suffix: '',
|
|
11
|
-
buttonProps: { 'aria-label': 'Insert
|
|
12
|
-
icon: <div style={{ fontSize: 14, textAlign: 'left' }}>
|
|
11
|
+
buttonProps: { 'aria-label': 'Insert Heading 4 (ctrl + 4)', title: 'Insert Heading 4 (ctrl + 4)' },
|
|
12
|
+
icon: <div style={{ fontSize: 14, textAlign: 'left' }}>Heading 4</div>,
|
|
13
13
|
execute: (state: ExecuteState, api: TextAreaTextApi) => {
|
|
14
|
-
|
|
14
|
+
headingExecute({ state, api, prefix: state.command.prefix!, suffix: state.command.suffix });
|
|
15
15
|
},
|
|
16
16
|
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @deprecated Use `heading4` instead.
|
|
20
|
+
* This command is now deprecated and will be removed in future versions.
|
|
21
|
+
* Use `title4` for inserting Heading 4.
|
|
22
|
+
*/
|
|
23
|
+
export const title4: ICommand = heading4;
|
package/src/commands/title5.tsx
CHANGED
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { headingExecute } from '../commands/title';
|
|
3
3
|
import { ICommand, ExecuteState, TextAreaTextApi } from './';
|
|
4
4
|
|
|
5
|
-
export const
|
|
6
|
-
name: '
|
|
7
|
-
keyCommand: '
|
|
5
|
+
export const heading5: ICommand = {
|
|
6
|
+
name: 'heading5',
|
|
7
|
+
keyCommand: 'heading5',
|
|
8
8
|
shortcuts: 'ctrlcmd+5',
|
|
9
9
|
prefix: '##### ',
|
|
10
10
|
suffix: '',
|
|
11
|
-
buttonProps: { 'aria-label': 'Insert
|
|
12
|
-
icon: <div style={{ fontSize: 12, textAlign: 'left' }}>
|
|
11
|
+
buttonProps: { 'aria-label': 'Insert Heading 5 (ctrl + 5)', title: 'Insert Heading 5 (ctrl + 5)' },
|
|
12
|
+
icon: <div style={{ fontSize: 12, textAlign: 'left' }}>Heading 5</div>,
|
|
13
13
|
execute: (state: ExecuteState, api: TextAreaTextApi) => {
|
|
14
|
-
|
|
14
|
+
headingExecute({ state, api, prefix: state.command.prefix!, suffix: state.command.suffix });
|
|
15
15
|
},
|
|
16
16
|
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @deprecated Use `heading5` instead.
|
|
20
|
+
* This command is now deprecated and will be removed in future versions.
|
|
21
|
+
* Use `title5` for inserting Heading 5.
|
|
22
|
+
*/
|
|
23
|
+
export const title5: ICommand = heading5;
|
package/src/commands/title6.tsx
CHANGED
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { headingExecute } from '../commands/title';
|
|
3
3
|
import { ICommand, ExecuteState, TextAreaTextApi } from './';
|
|
4
4
|
|
|
5
|
-
export const
|
|
6
|
-
name: '
|
|
7
|
-
keyCommand: '
|
|
5
|
+
export const heading6: ICommand = {
|
|
6
|
+
name: 'heading6',
|
|
7
|
+
keyCommand: 'heading6',
|
|
8
8
|
shortcuts: 'ctrlcmd+6',
|
|
9
9
|
prefix: '###### ',
|
|
10
10
|
suffix: '',
|
|
11
|
-
buttonProps: { 'aria-label': 'Insert
|
|
12
|
-
icon: <div style={{ fontSize: 12, textAlign: 'left' }}>
|
|
11
|
+
buttonProps: { 'aria-label': 'Insert Heading 6 (ctrl + 6)', title: 'Insert Heading 6 (ctrl + 6)' },
|
|
12
|
+
icon: <div style={{ fontSize: 12, textAlign: 'left' }}>Heading 6</div>,
|
|
13
13
|
execute: (state: ExecuteState, api: TextAreaTextApi) => {
|
|
14
|
-
|
|
14
|
+
headingExecute({ state, api, prefix: state.command.prefix!, suffix: state.command.suffix });
|
|
15
15
|
},
|
|
16
16
|
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @deprecated Use `heading6` instead.
|
|
20
|
+
* This command is now deprecated and will be removed in future versions.
|
|
21
|
+
* Use `title6` for inserting Heading 6.
|
|
22
|
+
*/
|
|
23
|
+
export const title6: ICommand = heading6;
|
|
@@ -19,6 +19,8 @@ export default function Textarea(props: TextAreaProps) {
|
|
|
19
19
|
extraCommands,
|
|
20
20
|
tabSize,
|
|
21
21
|
defaultTabEnable,
|
|
22
|
+
autoFocusEnd,
|
|
23
|
+
textareaWarp,
|
|
22
24
|
dispatch,
|
|
23
25
|
...otherStore
|
|
24
26
|
} = useContext(EditorContext);
|
|
@@ -39,6 +41,22 @@ export default function Textarea(props: TextAreaProps) {
|
|
|
39
41
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
40
42
|
}, []);
|
|
41
43
|
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
if (autoFocusEnd && textRef.current && textareaWarp) {
|
|
46
|
+
textRef.current.focus();
|
|
47
|
+
const length = textRef.current.value.length;
|
|
48
|
+
textRef.current.setSelectionRange(length, length);
|
|
49
|
+
setTimeout(() => {
|
|
50
|
+
if (textareaWarp) {
|
|
51
|
+
textareaWarp.scrollTop = textareaWarp.scrollHeight;
|
|
52
|
+
}
|
|
53
|
+
if (textRef.current) {
|
|
54
|
+
textRef.current.scrollTop = textRef.current.scrollHeight;
|
|
55
|
+
}
|
|
56
|
+
}, 0);
|
|
57
|
+
}
|
|
58
|
+
}, [textareaWarp]);
|
|
59
|
+
|
|
42
60
|
const onKeyDown = (e: KeyboardEvent | React.KeyboardEvent<HTMLTextAreaElement>) => {
|
|
43
61
|
handleKeyDown(e, tabSize, defaultTabEnable);
|
|
44
62
|
shortcuts(e, [...(commands || []), ...(extraCommands || [])], executeRef.current, dispatch, statesRef.current);
|
package/src/index.tsx
CHANGED
|
@@ -3,6 +3,7 @@ import * as commands from './commands/';
|
|
|
3
3
|
import * as MarkdownUtil from './utils/markdownUtils';
|
|
4
4
|
import './index.less';
|
|
5
5
|
|
|
6
|
+
export { headingExecute } from './commands/title';
|
|
6
7
|
export * from './commands/';
|
|
7
8
|
export * from './commands/group';
|
|
8
9
|
export * from './utils/markdownUtils';
|