"@lexical/history": "^0.15.0",
"@lexical/html": "^0.15.0",
"@lexical/link": "^0.15.0",
+ "@lexical/list": "^0.15.0",
"@lexical/rich-text": "^0.15.0",
"@lexical/selection": "^0.15.0",
"@lexical/utils": "^0.15.0",
"@lexical/history": "^0.15.0",
"@lexical/html": "^0.15.0",
"@lexical/link": "^0.15.0",
+ "@lexical/list": "^0.15.0",
"@lexical/rich-text": "^0.15.0",
"@lexical/selection": "^0.15.0",
"@lexical/utils": "^0.15.0",
import {LinkNode} from "@lexical/link";
import {ImageNode} from "./image";
import {DetailsNode, SummaryNode} from "./details";
+import {ListItemNode, ListNode} from "@lexical/list";
/**
* Load the nodes for lexical.
CalloutNode, // Todo - Create custom
HeadingNode, // Todo - Create custom
QuoteNode, // Todo - Create custom
+ ListNode, // Todo - Create custom
+ ListItemNode,
ImageNode,
DetailsNode, SummaryNode,
CustomParagraphNode,
import {EditorBasicButtonDefinition, EditorButtonDefinition} from "../framework/buttons";
import {
$createNodeSelection,
- $createParagraphNode, $getRoot, $getSelection, $insertNodes,
+ $createParagraphNode, $getRoot, $getSelection,
$isParagraphNode, $isTextNode, $setSelection,
BaseSelection, ElementNode, FORMAT_TEXT_COMMAND,
LexicalNode,
- REDO_COMMAND, TextFormatType, TextNode,
+ REDO_COMMAND, TextFormatType,
UNDO_COMMAND
} from "lexical";
import {
HeadingNode,
HeadingTagType
} from "@lexical/rich-text";
-import {$isLinkNode, $toggleLink, LinkNode} from "@lexical/link";
+import {$isLinkNode, LinkNode} from "@lexical/link";
import {EditorUiContext} from "../framework/core";
import {$isImageNode, ImageNode} from "../../nodes/image";
import {$createDetailsNode, $isDetailsNode} from "../../nodes/details";
-import {$insertNodeToNearestRoot} from "@lexical/utils";
import {getEditorContentAsHtml} from "../../actions";
+import {$isListNode, insertList, ListNode, ListType, removeList} from "@lexical/list";
export const undo: EditorButtonDefinition = {
label: 'Undo',
}
};
+function buildListButton(label: string, type: ListType): EditorButtonDefinition {
+ return {
+ label,
+ action(context: EditorUiContext) {
+ context.editor.getEditorState().read(() => {
+ const selection = $getSelection();
+ if (this.isActive(selection)) {
+ removeList(context.editor);
+ } else {
+ insertList(context.editor, type);
+ }
+ });
+ },
+ isActive(selection: BaseSelection|null): boolean {
+ return selectionContainsNodeType(selection, (node: LexicalNode | null | undefined): boolean => {
+ return $isListNode(node) && (node as ListNode).getListType() === type;
+ });
+ }
+ };
+}
+
+export const bulletList: EditorButtonDefinition = buildListButton('Bullet list', 'bullet');
+export const numberList: EditorButtonDefinition = buildListButton('Numbered list', 'number');
+export const taskList: EditorButtonDefinition = buildListButton('Task list', 'check');
+
export const link: EditorButtonDefinition = {
label: 'Insert/edit link',
import {EditorButton} from "./framework/buttons";
import {
- blockquote, bold, clearFormating, code,
+ blockquote, bold, bulletList, clearFormating, code,
dangerCallout, details,
h2, h3, h4, h5, highlightColor, image,
- infoCallout, italic, link, paragraph,
+ infoCallout, italic, link, numberList, paragraph,
redo, source, strikethrough, subscript,
- successCallout, superscript, textColor, underline,
+ successCallout, superscript, taskList, textColor, underline,
undo,
warningCallout
} from "./defaults/button-definitions";
new EditorButton(code),
new EditorButton(clearFormating),
+ // Lists
+ new EditorButton(bulletList),
+ new EditorButton(numberList),
+ new EditorButton(taskList),
+
// Insert types
new EditorButton(link),
new EditorButton(image),
// Main UI elements
.editor-toolbar-main {
display: flex;
+ flex-wrap: wrap;
}
// Buttons