1 import {EditorButtonDefinition} from "./editor-button";
5 BaseSelection, FORMAT_TEXT_COMMAND,
8 REDO_COMMAND, TextFormatType,
11 import {selectionContainsNodeType, selectionContainsTextFormat, toggleSelectionBlockNodeType} from "../helpers";
12 import {$createCalloutNode, $isCalloutNodeOfCategory, CalloutCategory} from "../nodes/callout";
20 } from "@lexical/rich-text";
22 export const undoButton: EditorButtonDefinition = {
24 action(editor: LexicalEditor) {
25 editor.dispatchCommand(UNDO_COMMAND);
27 isActive(selection: BaseSelection|null): boolean {
32 export const redoButton: EditorButtonDefinition = {
34 action(editor: LexicalEditor) {
35 editor.dispatchCommand(REDO_COMMAND);
37 isActive(selection: BaseSelection|null): boolean {
42 function buildCalloutButton(category: CalloutCategory, name: string): EditorButtonDefinition {
44 label: `${name} Callout`,
45 action(editor: LexicalEditor) {
46 toggleSelectionBlockNodeType(
48 (node) => $isCalloutNodeOfCategory(node, category),
49 () => $createCalloutNode(category),
52 isActive(selection: BaseSelection|null): boolean {
53 return selectionContainsNodeType(selection, (node) => $isCalloutNodeOfCategory(node, category));
58 export const infoCalloutButton: EditorButtonDefinition = buildCalloutButton('info', 'Info');
59 export const dangerCalloutButton: EditorButtonDefinition = buildCalloutButton('danger', 'Danger');
60 export const warningCalloutButton: EditorButtonDefinition = buildCalloutButton('warning', 'Warning');
61 export const successCalloutButton: EditorButtonDefinition = buildCalloutButton('success', 'Success');
63 const isHeaderNodeOfTag = (node: LexicalNode | null | undefined, tag: HeadingTagType) => {
64 return $isHeadingNode(node) && (node as HeadingNode).getTag() === tag;
67 function buildHeaderButton(tag: HeadingTagType, name: string): EditorButtonDefinition {
70 action(editor: LexicalEditor) {
71 toggleSelectionBlockNodeType(
73 (node) => isHeaderNodeOfTag(node, tag),
74 () => $createHeadingNode(tag),
77 isActive(selection: BaseSelection|null): boolean {
78 return selectionContainsNodeType(selection, (node) => isHeaderNodeOfTag(node, tag));
83 export const h2Button: EditorButtonDefinition = buildHeaderButton('h2', 'Large Header');
84 export const h3Button: EditorButtonDefinition = buildHeaderButton('h3', 'Medium Header');
85 export const h4Button: EditorButtonDefinition = buildHeaderButton('h4', 'Small Header');
86 export const h5Button: EditorButtonDefinition = buildHeaderButton('h5', 'Tiny Header');
88 export const blockquoteButton: EditorButtonDefinition = {
90 action(editor: LexicalEditor) {
91 toggleSelectionBlockNodeType(editor, $isQuoteNode, $createQuoteNode);
93 isActive(selection: BaseSelection|null): boolean {
94 return selectionContainsNodeType(selection, $isQuoteNode);
98 export const paragraphButton: EditorButtonDefinition = {
100 action(editor: LexicalEditor) {
101 toggleSelectionBlockNodeType(editor, $isParagraphNode, $createParagraphNode);
103 isActive(selection: BaseSelection|null): boolean {
104 return selectionContainsNodeType(selection, $isParagraphNode);
108 function buildFormatButton(label: string, format: TextFormatType): EditorButtonDefinition {
111 action(editor: LexicalEditor) {
112 editor.dispatchCommand(FORMAT_TEXT_COMMAND, format);
114 isActive(selection: BaseSelection|null): boolean {
115 return selectionContainsTextFormat(selection, format);
120 export const boldButton: EditorButtonDefinition = buildFormatButton('Bold', 'bold');
121 export const italicButton: EditorButtonDefinition = buildFormatButton('Italic', 'italic');
122 export const underlineButton: EditorButtonDefinition = buildFormatButton('Underline', 'underline');
124 // Todo - Highlight color
125 export const strikethroughButton: EditorButtonDefinition = buildFormatButton('Strikethrough', 'strikethrough');
126 export const superscriptButton: EditorButtonDefinition = buildFormatButton('Superscript', 'superscript');
127 export const subscriptButton: EditorButtonDefinition = buildFormatButton('Subscript', 'subscript');
128 export const codeButton: EditorButtonDefinition = buildFormatButton('Inline Code', 'code');
129 // Todo - Clear formatting