mirror of
https://github.com/drawdb-io/drawdb.git
synced 2025-07-14 00:30:23 +00:00
138 lines
4.3 KiB
JavaScript
138 lines
4.3 KiB
JavaScript
import { LexicalComposer } from "@lexical/react/LexicalComposer";
|
|
import { RichTextPlugin } from "@lexical/react/LexicalRichTextPlugin";
|
|
import { ContentEditable } from "@lexical/react/LexicalContentEditable";
|
|
import { HistoryPlugin } from "@lexical/react/LexicalHistoryPlugin";
|
|
import { AutoFocusPlugin } from "@lexical/react/LexicalAutoFocusPlugin";
|
|
import LexicalErrorBoundary from "@lexical/react/LexicalErrorBoundary";
|
|
import { HeadingNode, QuoteNode } from "@lexical/rich-text";
|
|
import { TableCellNode, TableNode, TableRowNode } from "@lexical/table";
|
|
import { ListItemNode, ListNode } from "@lexical/list";
|
|
import { CodeHighlightNode, CodeNode } from "@lexical/code";
|
|
import { AutoLinkNode, LinkNode } from "@lexical/link";
|
|
import { LinkPlugin } from "@lexical/react/LexicalLinkPlugin";
|
|
import { ListPlugin } from "@lexical/react/LexicalListPlugin";
|
|
import { MarkdownShortcutPlugin } from "@lexical/react/LexicalMarkdownShortcutPlugin";
|
|
import { TRANSFORMERS } from "@lexical/markdown";
|
|
|
|
import ToolbarPlugin from "../plugins/ToolbarPlugin";
|
|
import ListMaxIndentLevelPlugin from "../plugins/ListMaxIndentLevelPlugin";
|
|
import CodeHighlightPlugin from "../plugins/CodeHighlightPlugin";
|
|
import AutoLinkPlugin from "../plugins/AutoLinkPlugin";
|
|
|
|
const exampleTheme = {
|
|
ltr: "ltr",
|
|
rtl: "rtl",
|
|
placeholder: "editor-placeholder",
|
|
paragraph: "editor-paragraph",
|
|
quote: "editor-quote",
|
|
heading: {
|
|
h1: "editor-heading-h1",
|
|
h2: "editor-heading-h2",
|
|
h3: "editor-heading-h3",
|
|
h4: "editor-heading-h4",
|
|
h5: "editor-heading-h5",
|
|
},
|
|
list: {
|
|
nested: {
|
|
listitem: "editor-nested-listitem",
|
|
},
|
|
ol: "editor-list-ol",
|
|
ul: "editor-list-ul",
|
|
listitem: "editor-listitem",
|
|
},
|
|
image: "editor-image",
|
|
link: "editor-link",
|
|
text: {
|
|
bold: "editor-text-bold",
|
|
italic: "editor-text-italic",
|
|
overflowed: "editor-text-overflowed",
|
|
hashtag: "editor-text-hashtag",
|
|
underline: "editor-text-underline",
|
|
strikethrough: "editor-text-strikethrough",
|
|
underlineStrikethrough: "editor-text-underlineStrikethrough",
|
|
code: "editor-text-code",
|
|
},
|
|
code: "editor-code",
|
|
codeHighlight: {
|
|
atrule: "editor-tokenAttr",
|
|
attr: "editor-tokenAttr",
|
|
boolean: "editor-tokenProperty",
|
|
builtin: "editor-tokenSelector",
|
|
cdata: "editor-tokenComment",
|
|
char: "editor-tokenSelector",
|
|
class: "editor-tokenFunction",
|
|
"class-name": "editor-tokenFunction",
|
|
comment: "editor-tokenComment",
|
|
constant: "editor-tokenProperty",
|
|
deleted: "editor-tokenProperty",
|
|
doctype: "editor-tokenComment",
|
|
entity: "editor-tokenOperator",
|
|
function: "editor-tokenFunction",
|
|
important: "editor-tokenVariable",
|
|
inserted: "editor-tokenSelector",
|
|
keyword: "editor-tokenAttr",
|
|
namespace: "editor-tokenVariable",
|
|
number: "editor-tokenProperty",
|
|
operator: "editor-tokenOperator",
|
|
prolog: "editor-tokenComment",
|
|
property: "editor-tokenProperty",
|
|
punctuation: "editor-tokenPunctuation",
|
|
regex: "editor-tokenVariable",
|
|
selector: "editor-tokenSelector",
|
|
string: "editor-tokenSelector",
|
|
symbol: "editor-tokenProperty",
|
|
tag: "editor-tokenProperty",
|
|
url: "editor-tokenOperator",
|
|
variable: "editor-tokenVariable",
|
|
},
|
|
};
|
|
|
|
function Placeholder() {
|
|
return <div className="editor-placeholder">Describe the bug</div>;
|
|
}
|
|
|
|
const editorConfig = {
|
|
theme: exampleTheme,
|
|
onError(error) {
|
|
throw error;
|
|
},
|
|
nodes: [
|
|
HeadingNode,
|
|
ListNode,
|
|
ListItemNode,
|
|
QuoteNode,
|
|
CodeNode,
|
|
CodeHighlightNode,
|
|
TableNode,
|
|
TableCellNode,
|
|
TableRowNode,
|
|
AutoLinkNode,
|
|
LinkNode,
|
|
],
|
|
};
|
|
|
|
export default function RichEditor(props) {
|
|
return (
|
|
<LexicalComposer initialConfig={editorConfig}>
|
|
<div className="editor-container">
|
|
<ToolbarPlugin theme={props.theme} />
|
|
<div className="editor-inner">
|
|
<RichTextPlugin
|
|
contentEditable={<ContentEditable className="editor-input" />}
|
|
placeholder={<Placeholder />}
|
|
ErrorBoundary={LexicalErrorBoundary}
|
|
/>
|
|
<HistoryPlugin />
|
|
<AutoFocusPlugin />
|
|
<CodeHighlightPlugin />
|
|
<ListPlugin />
|
|
<LinkPlugin />
|
|
<AutoLinkPlugin />
|
|
<ListMaxIndentLevelPlugin maxDepth={7} />
|
|
<MarkdownShortcutPlugin transformers={TRANSFORMERS} />
|
|
</div>
|
|
</div>
|
|
</LexicalComposer>
|
|
);
|
|
}
|