@webiny/lexical-nodes 6.0.0-alpha.0 → 6.0.0-alpha.2
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/FontColorNode.d.ts +4 -4
- package/FontColorNode.js +2 -3
- package/FontColorNode.js.map +1 -1
- package/HeadingNode.d.ts +29 -17
- package/HeadingNode.js +141 -60
- package/HeadingNode.js.map +1 -1
- package/ImageNode.js +7 -5
- package/ImageNode.js.map +1 -1
- package/LinkNode.d.ts +2 -2
- package/LinkNode.js +4 -6
- package/LinkNode.js.map +1 -1
- package/ListItemNode.d.ts +4 -3
- package/ListItemNode.js +4 -4
- package/ListItemNode.js.map +1 -1
- package/ListNode.d.ts +28 -14
- package/ListNode.js +75 -55
- package/ListNode.js.map +1 -1
- package/ParagraphNode.d.ts +28 -16
- package/ParagraphNode.js +87 -74
- package/ParagraphNode.js.map +1 -1
- package/QuoteNode.d.ts +26 -19
- package/QuoteNode.js +63 -91
- package/QuoteNode.js.map +1 -1
- package/components/ImageNode/Placeholder.d.ts +1 -1
- package/components/ImageNode/Placeholder.js.map +1 -1
- package/components/ImageNode/SharedHistoryContext.d.ts +2 -2
- package/components/ImageNode/SharedHistoryContext.js.map +1 -1
- package/generateInitialLexicalValue.d.ts +4 -0
- package/generateInitialLexicalValue.js +27 -0
- package/generateInitialLexicalValue.js.map +1 -0
- package/index.d.ts +4 -8
- package/index.js +5 -16
- package/index.js.map +1 -1
- package/package.json +4 -4
- package/prepareLexicalState.d.ts +2 -0
- package/prepareLexicalState.js +53 -0
- package/prepareLexicalState.js.map +1 -0
- package/types.d.ts +4 -5
- package/types.js.map +1 -1
- package/utils/clearNodeFormating.d.ts +1 -1
- package/utils/clearNodeFormating.js.map +1 -1
- package/utils/formatList.d.ts +3 -3
- package/utils/formatList.js.map +1 -1
- package/utils/formatToHeading.d.ts +2 -2
- package/utils/formatToHeading.js.map +1 -1
- package/utils/formatToParagraph.d.ts +1 -1
- package/utils/formatToParagraph.js.map +1 -1
- package/utils/formatToQuote.d.ts +1 -1
- package/utils/formatToQuote.js.map +1 -1
- package/utils/getStyleId.d.ts +11 -0
- package/utils/getStyleId.js +14 -0
- package/utils/getStyleId.js.map +1 -0
- package/utils/listNode.d.ts +2 -2
- package/utils/listNode.js.map +1 -1
- package/utils/toggleLink.d.ts +1 -1
- package/utils/toggleLink.js.map +1 -1
- package/TypographyNode.d.ts +0 -39
- package/TypographyNode.js +0 -109
- package/TypographyNode.js.map +0 -1
package/FontColorNode.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { EditorConfig, LexicalNode, SerializedTextNode, Spread
|
|
2
|
-
import {
|
|
1
|
+
import type { EditorConfig, LexicalNode, SerializedTextNode, Spread } from "lexical";
|
|
2
|
+
import { TextNode } from "lexical";
|
|
3
|
+
import type { EditorTheme } from "@webiny/lexical-theme";
|
|
3
4
|
export declare class ThemeColorValue {
|
|
4
5
|
private readonly name;
|
|
5
6
|
private value;
|
|
@@ -15,8 +16,7 @@ export interface FontColorPayload {
|
|
|
15
16
|
export type SerializedFontColorNode = Spread<{
|
|
16
17
|
themeColor: string;
|
|
17
18
|
color: string;
|
|
18
|
-
type: "font-color
|
|
19
|
-
version: 1;
|
|
19
|
+
type: "wby-font-color";
|
|
20
20
|
}, SerializedTextNode>;
|
|
21
21
|
/**
|
|
22
22
|
* Main responsibility of this node is to apply custom or Webiny theme color to selected text.
|
package/FontColorNode.js
CHANGED
|
@@ -32,7 +32,7 @@ export class FontColorNode extends TextNode {
|
|
|
32
32
|
this.__color = color;
|
|
33
33
|
}
|
|
34
34
|
static getType() {
|
|
35
|
-
return "font-color
|
|
35
|
+
return "wby-font-color";
|
|
36
36
|
}
|
|
37
37
|
static clone(node) {
|
|
38
38
|
return new FontColorNode(node.__text, node.__color, node.__key);
|
|
@@ -80,8 +80,7 @@ export class FontColorNode extends TextNode {
|
|
|
80
80
|
...super.exportJSON(),
|
|
81
81
|
themeColor: this.__color.getName(),
|
|
82
82
|
color: this.__color.getValue(),
|
|
83
|
-
type: "font-color
|
|
84
|
-
version: 1
|
|
83
|
+
type: "wby-font-color"
|
|
85
84
|
};
|
|
86
85
|
}
|
|
87
86
|
addColorValueToHTMLElement(element, theme) {
|
package/FontColorNode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["$getSelection","$isRangeSelection","createCommand","TextNode","ThemeColorValue","constructor","value","name","getValue","getName","updateFromTheme","theme","styles","colors","ADD_FONT_COLOR_COMMAND","FontColorNodeAttrName","FontColorNode","text","color","key","__color","getType","clone","node","__text","__key","importJSON","serializedNode","themeColor","setTextContent","setFormat","format","setDetail","detail","setMode","mode","setStyle","style","splitText","splitOffsets","newNodes","selection","fontColorNodes","map","fontColorNode","$createFontColorNode","getTextContent","$applyStylesToNode","newNode","replace","anchor","focus","getKey","exportJSON","type","version","addColorValueToHTMLElement","element","setAttribute","updateDOM","prevNode","dom","config","isUpdated","getColorStyle","createDOM","$isFontColorNode","source","getFormat","getStyle"],"sources":["FontColorNode.ts"],"sourcesContent":["import {\n $getSelection,\n $isRangeSelection,\n createCommand,\n EditorConfig,\n LexicalNode,\n SerializedTextNode,\n Spread,\n TextNode\n} from \"lexical\";\nimport { EditorTheme } from \"@webiny/lexical-theme\";\n\nexport class ThemeColorValue {\n // Webiny theme color variable, like color1, color2, etc.\n private readonly name: string;\n // This can be a HEX value or a CSS variable.\n private value: string;\n\n constructor(value: string, name?: string) {\n this.value = value;\n this.name = name ?? \"custom\";\n }\n\n getValue() {\n return this.value;\n }\n\n getName() {\n return this.name;\n }\n\n updateFromTheme(theme: EditorTheme) {\n if (theme?.styles?.colors && this.name !== \"custom\") {\n this.value = theme.styles?.colors[this.name];\n }\n }\n}\n\nexport const ADD_FONT_COLOR_COMMAND = createCommand<FontColorPayload>(\"ADD_FONT_COLOR_COMMAND\");\n\nconst FontColorNodeAttrName = \"data-theme-font-color-name\";\n\nexport interface FontColorPayload {\n color: ThemeColorValue;\n}\n\nexport type SerializedFontColorNode = Spread<\n {\n themeColor: string;\n color: string;\n type: \"font-color-node\";\n version: 1;\n },\n SerializedTextNode\n>;\n\n/**\n * Main responsibility of this node is to apply custom or Webiny theme color to selected text.\n * Extends the original TextNode node to add additional transformation and support for webiny theme font color.\n */\nexport class FontColorNode extends TextNode {\n private readonly __color: ThemeColorValue;\n\n constructor(text: string, color: ThemeColorValue, key?: string) {\n super(text, key);\n this.__color = color;\n }\n\n static override getType(): string {\n return \"font-color-node\";\n }\n\n static override clone(node: FontColorNode): FontColorNode {\n return new FontColorNode(node.__text, node.__color, node.__key);\n }\n\n static override importJSON(serializedNode: SerializedFontColorNode): TextNode {\n const node = new FontColorNode(\n serializedNode.text,\n new ThemeColorValue(serializedNode.color, serializedNode.themeColor)\n );\n node.setTextContent(serializedNode.text);\n node.setFormat(serializedNode.format);\n node.setDetail(serializedNode.detail);\n node.setMode(serializedNode.mode);\n node.setStyle(serializedNode.style);\n return node;\n }\n\n override splitText(...splitOffsets: Array<number>): Array<FontColorNode> {\n const newNodes = super.splitText(...splitOffsets);\n\n const selection = $getSelection();\n\n // After splitting, we need to re-apply styling to the new TextNodes.\n const fontColorNodes = newNodes.map(node => {\n if (node instanceof FontColorNode) {\n return node;\n }\n\n const fontColorNode = $createFontColorNode(node.getTextContent(), this.__color);\n $applyStylesToNode(fontColorNode, this);\n\n const newNode = node.replace(fontColorNode);\n\n // Since we're replacing the existing node, we need to update the selection keys.\n // This is very important to not break the editor functionality!\n if ($isRangeSelection(selection)) {\n const anchor = selection.anchor;\n const focus = selection.focus;\n\n if (anchor.key === node.getKey()) {\n anchor.key = newNode.getKey();\n }\n\n if (focus.key === node.getKey()) {\n focus.key = newNode.getKey();\n }\n }\n\n return newNode;\n });\n\n return fontColorNodes as Array<FontColorNode>;\n }\n\n override exportJSON(): SerializedFontColorNode {\n return {\n ...super.exportJSON(),\n themeColor: this.__color.getName(),\n color: this.__color.getValue(),\n type: \"font-color-node\",\n version: 1\n };\n }\n\n private addColorValueToHTMLElement(element: HTMLElement, theme: EditorTheme): HTMLElement {\n // Update color from webiny theme\n this.__color.updateFromTheme(theme);\n element.setAttribute(FontColorNodeAttrName, this.__color.getName());\n element.style.color = this.__color.getValue();\n return element;\n }\n\n override updateDOM(prevNode: this, dom: HTMLElement, config: EditorConfig): boolean {\n const isUpdated = super.updateDOM(prevNode, dom, config);\n this.__color.updateFromTheme(config.theme as EditorTheme);\n\n dom.setAttribute(FontColorNodeAttrName, this.__color.getName());\n dom.style.color = this.__color.getValue();\n return isUpdated;\n }\n\n getColorStyle() {\n return {\n color: this.__color.getValue(),\n themeColor: this.__color.getName()\n };\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = super.createDOM(config);\n return this.addColorValueToHTMLElement(element, config.theme as EditorTheme);\n }\n}\n\nexport const $createFontColorNode = (text: string, color: ThemeColorValue): FontColorNode => {\n return new FontColorNode(text, color);\n};\n\nexport const $isFontColorNode = (node: LexicalNode): node is FontColorNode => {\n return node instanceof FontColorNode;\n};\n\nexport function $applyStylesToNode(node: TextNode, source: TextNode) {\n node.setFormat(source.getFormat());\n node.setStyle(source.getStyle());\n}\n"],"mappings":"AAAA,SACIA,aAAa,EACbC,iBAAiB,EACjBC,aAAa,EAKbC,QAAQ,QACL,SAAS;AAGhB,OAAO,MAAMC,eAAe,CAAC;EACzB;;EAEA;;EAGAC,WAAWA,CAACC,KAAa,EAAEC,IAAa,EAAE;IACtC,IAAI,CAACD,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACC,IAAI,GAAGA,IAAI,IAAI,QAAQ;EAChC;EAEAC,QAAQA,CAAA,EAAG;IACP,OAAO,IAAI,CAACF,KAAK;EACrB;EAEAG,OAAOA,CAAA,EAAG;IACN,OAAO,IAAI,CAACF,IAAI;EACpB;EAEAG,eAAeA,CAACC,KAAkB,EAAE;IAChC,IAAIA,KAAK,EAAEC,MAAM,EAAEC,MAAM,IAAI,IAAI,CAACN,IAAI,KAAK,QAAQ,EAAE;MACjD,IAAI,CAACD,KAAK,GAAGK,KAAK,CAACC,MAAM,EAAEC,MAAM,CAAC,IAAI,CAACN,IAAI,CAAC;IAChD;EACJ;AACJ;AAEA,OAAO,MAAMO,sBAAsB,GAAGZ,aAAa,CAAmB,wBAAwB,CAAC;AAE/F,MAAMa,qBAAqB,GAAG,4BAA4B;AAgB1D;AACA;AACA;AACA;AACA,OAAO,MAAMC,aAAa,SAASb,QAAQ,CAAC;EAGxCE,WAAWA,CAACY,IAAY,EAAEC,KAAsB,EAAEC,GAAY,EAAE;IAC5D,KAAK,CAACF,IAAI,EAAEE,GAAG,CAAC;IAChB,IAAI,CAACC,OAAO,GAAGF,KAAK;EACxB;EAEA,OAAgBG,OAAOA,CAAA,EAAW;IAC9B,OAAO,iBAAiB;EAC5B;EAEA,OAAgBC,KAAKA,CAACC,IAAmB,EAAiB;IACtD,OAAO,IAAIP,aAAa,CAACO,IAAI,CAACC,MAAM,EAAED,IAAI,CAACH,OAAO,EAAEG,IAAI,CAACE,KAAK,CAAC;EACnE;EAEA,OAAgBC,UAAUA,CAACC,cAAuC,EAAY;IAC1E,MAAMJ,IAAI,GAAG,IAAIP,aAAa,CAC1BW,cAAc,CAACV,IAAI,EACnB,IAAIb,eAAe,CAACuB,cAAc,CAACT,KAAK,EAAES,cAAc,CAACC,UAAU,CACvE,CAAC;IACDL,IAAI,CAACM,cAAc,CAACF,cAAc,CAACV,IAAI,CAAC;IACxCM,IAAI,CAACO,SAAS,CAACH,cAAc,CAACI,MAAM,CAAC;IACrCR,IAAI,CAACS,SAAS,CAACL,cAAc,CAACM,MAAM,CAAC;IACrCV,IAAI,CAACW,OAAO,CAACP,cAAc,CAACQ,IAAI,CAAC;IACjCZ,IAAI,CAACa,QAAQ,CAACT,cAAc,CAACU,KAAK,CAAC;IACnC,OAAOd,IAAI;EACf;EAESe,SAASA,CAAC,GAAGC,YAA2B,EAAwB;IACrE,MAAMC,QAAQ,GAAG,KAAK,CAACF,SAAS,CAAC,GAAGC,YAAY,CAAC;IAEjD,MAAME,SAAS,GAAGzC,aAAa,CAAC,CAAC;;IAEjC;IACA,MAAM0C,cAAc,GAAGF,QAAQ,CAACG,GAAG,CAACpB,IAAI,IAAI;MACxC,IAAIA,IAAI,YAAYP,aAAa,EAAE;QAC/B,OAAOO,IAAI;MACf;MAEA,MAAMqB,aAAa,GAAGC,oBAAoB,CAACtB,IAAI,CAACuB,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC1B,OAAO,CAAC;MAC/E2B,kBAAkB,CAACH,aAAa,EAAE,IAAI,CAAC;MAEvC,MAAMI,OAAO,GAAGzB,IAAI,CAAC0B,OAAO,CAACL,aAAa,CAAC;;MAE3C;MACA;MACA,IAAI3C,iBAAiB,CAACwC,SAAS,CAAC,EAAE;QAC9B,MAAMS,MAAM,GAAGT,SAAS,CAACS,MAAM;QAC/B,MAAMC,KAAK,GAAGV,SAAS,CAACU,KAAK;QAE7B,IAAID,MAAM,CAAC/B,GAAG,KAAKI,IAAI,CAAC6B,MAAM,CAAC,CAAC,EAAE;UAC9BF,MAAM,CAAC/B,GAAG,GAAG6B,OAAO,CAACI,MAAM,CAAC,CAAC;QACjC;QAEA,IAAID,KAAK,CAAChC,GAAG,KAAKI,IAAI,CAAC6B,MAAM,CAAC,CAAC,EAAE;UAC7BD,KAAK,CAAChC,GAAG,GAAG6B,OAAO,CAACI,MAAM,CAAC,CAAC;QAChC;MACJ;MAEA,OAAOJ,OAAO;IAClB,CAAC,CAAC;IAEF,OAAON,cAAc;EACzB;EAESW,UAAUA,CAAA,EAA4B;IAC3C,OAAO;MACH,GAAG,KAAK,CAACA,UAAU,CAAC,CAAC;MACrBzB,UAAU,EAAE,IAAI,CAACR,OAAO,CAACX,OAAO,CAAC,CAAC;MAClCS,KAAK,EAAE,IAAI,CAACE,OAAO,CAACZ,QAAQ,CAAC,CAAC;MAC9B8C,IAAI,EAAE,iBAAiB;MACvBC,OAAO,EAAE;IACb,CAAC;EACL;EAEQC,0BAA0BA,CAACC,OAAoB,EAAE9C,KAAkB,EAAe;IACtF;IACA,IAAI,CAACS,OAAO,CAACV,eAAe,CAACC,KAAK,CAAC;IACnC8C,OAAO,CAACC,YAAY,CAAC3C,qBAAqB,EAAE,IAAI,CAACK,OAAO,CAACX,OAAO,CAAC,CAAC,CAAC;IACnEgD,OAAO,CAACpB,KAAK,CAACnB,KAAK,GAAG,IAAI,CAACE,OAAO,CAACZ,QAAQ,CAAC,CAAC;IAC7C,OAAOiD,OAAO;EAClB;EAESE,SAASA,CAACC,QAAc,EAAEC,GAAgB,EAAEC,MAAoB,EAAW;IAChF,MAAMC,SAAS,GAAG,KAAK,CAACJ,SAAS,CAACC,QAAQ,EAAEC,GAAG,EAAEC,MAAM,CAAC;IACxD,IAAI,CAAC1C,OAAO,CAACV,eAAe,CAACoD,MAAM,CAACnD,KAAoB,CAAC;IAEzDkD,GAAG,CAACH,YAAY,CAAC3C,qBAAqB,EAAE,IAAI,CAACK,OAAO,CAACX,OAAO,CAAC,CAAC,CAAC;IAC/DoD,GAAG,CAACxB,KAAK,CAACnB,KAAK,GAAG,IAAI,CAACE,OAAO,CAACZ,QAAQ,CAAC,CAAC;IACzC,OAAOuD,SAAS;EACpB;EAEAC,aAAaA,CAAA,EAAG;IACZ,OAAO;MACH9C,KAAK,EAAE,IAAI,CAACE,OAAO,CAACZ,QAAQ,CAAC,CAAC;MAC9BoB,UAAU,EAAE,IAAI,CAACR,OAAO,CAACX,OAAO,CAAC;IACrC,CAAC;EACL;EAESwD,SAASA,CAACH,MAAoB,EAAe;IAClD,MAAML,OAAO,GAAG,KAAK,CAACQ,SAAS,CAACH,MAAM,CAAC;IACvC,OAAO,IAAI,CAACN,0BAA0B,CAACC,OAAO,EAAEK,MAAM,CAACnD,KAAoB,CAAC;EAChF;AACJ;AAEA,OAAO,MAAMkC,oBAAoB,GAAGA,CAAC5B,IAAY,EAAEC,KAAsB,KAAoB;EACzF,OAAO,IAAIF,aAAa,CAACC,IAAI,EAAEC,KAAK,CAAC;AACzC,CAAC;AAED,OAAO,MAAMgD,gBAAgB,GAAI3C,IAAiB,IAA4B;EAC1E,OAAOA,IAAI,YAAYP,aAAa;AACxC,CAAC;AAED,OAAO,SAAS+B,kBAAkBA,CAACxB,IAAc,EAAE4C,MAAgB,EAAE;EACjE5C,IAAI,CAACO,SAAS,CAACqC,MAAM,CAACC,SAAS,CAAC,CAAC,CAAC;EAClC7C,IAAI,CAACa,QAAQ,CAAC+B,MAAM,CAACE,QAAQ,CAAC,CAAC,CAAC;AACpC","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["$getSelection","$isRangeSelection","createCommand","TextNode","ThemeColorValue","constructor","value","name","getValue","getName","updateFromTheme","theme","styles","colors","ADD_FONT_COLOR_COMMAND","FontColorNodeAttrName","FontColorNode","text","color","key","__color","getType","clone","node","__text","__key","importJSON","serializedNode","themeColor","setTextContent","setFormat","format","setDetail","detail","setMode","mode","setStyle","style","splitText","splitOffsets","newNodes","selection","fontColorNodes","map","fontColorNode","$createFontColorNode","getTextContent","$applyStylesToNode","newNode","replace","anchor","focus","getKey","exportJSON","type","addColorValueToHTMLElement","element","setAttribute","updateDOM","prevNode","dom","config","isUpdated","getColorStyle","createDOM","$isFontColorNode","source","getFormat","getStyle"],"sources":["FontColorNode.ts"],"sourcesContent":["import type { EditorConfig, LexicalNode, SerializedTextNode, Spread } from \"lexical\";\nimport { $getSelection, $isRangeSelection, createCommand, TextNode } from \"lexical\";\nimport type { EditorTheme } from \"@webiny/lexical-theme\";\n\nexport class ThemeColorValue {\n // Webiny theme color variable, like color1, color2, etc.\n private readonly name: string;\n // This can be a HEX value or a CSS variable.\n private value: string;\n\n constructor(value: string, name?: string) {\n this.value = value;\n this.name = name ?? \"custom\";\n }\n\n getValue() {\n return this.value;\n }\n\n getName() {\n return this.name;\n }\n\n updateFromTheme(theme: EditorTheme) {\n if (theme?.styles?.colors && this.name !== \"custom\") {\n this.value = theme.styles?.colors[this.name];\n }\n }\n}\n\nexport const ADD_FONT_COLOR_COMMAND = createCommand<FontColorPayload>(\"ADD_FONT_COLOR_COMMAND\");\n\nconst FontColorNodeAttrName = \"data-theme-font-color-name\";\n\nexport interface FontColorPayload {\n color: ThemeColorValue;\n}\n\nexport type SerializedFontColorNode = Spread<\n {\n themeColor: string;\n color: string;\n type: \"wby-font-color\";\n },\n SerializedTextNode\n>;\n\n/**\n * Main responsibility of this node is to apply custom or Webiny theme color to selected text.\n * Extends the original TextNode node to add additional transformation and support for webiny theme font color.\n */\nexport class FontColorNode extends TextNode {\n private readonly __color: ThemeColorValue;\n\n constructor(text: string, color: ThemeColorValue, key?: string) {\n super(text, key);\n this.__color = color;\n }\n\n static override getType(): string {\n return \"wby-font-color\";\n }\n\n static override clone(node: FontColorNode): FontColorNode {\n return new FontColorNode(node.__text, node.__color, node.__key);\n }\n\n static override importJSON(serializedNode: SerializedFontColorNode): TextNode {\n const node = new FontColorNode(\n serializedNode.text,\n new ThemeColorValue(serializedNode.color, serializedNode.themeColor)\n );\n node.setTextContent(serializedNode.text);\n node.setFormat(serializedNode.format);\n node.setDetail(serializedNode.detail);\n node.setMode(serializedNode.mode);\n node.setStyle(serializedNode.style);\n return node;\n }\n\n override splitText(...splitOffsets: Array<number>): Array<FontColorNode> {\n const newNodes = super.splitText(...splitOffsets);\n\n const selection = $getSelection();\n\n // After splitting, we need to re-apply styling to the new TextNodes.\n const fontColorNodes = newNodes.map(node => {\n if (node instanceof FontColorNode) {\n return node;\n }\n\n const fontColorNode = $createFontColorNode(node.getTextContent(), this.__color);\n $applyStylesToNode(fontColorNode, this);\n\n const newNode = node.replace(fontColorNode);\n\n // Since we're replacing the existing node, we need to update the selection keys.\n // This is very important to not break the editor functionality!\n if ($isRangeSelection(selection)) {\n const anchor = selection.anchor;\n const focus = selection.focus;\n\n if (anchor.key === node.getKey()) {\n anchor.key = newNode.getKey();\n }\n\n if (focus.key === node.getKey()) {\n focus.key = newNode.getKey();\n }\n }\n\n return newNode;\n });\n\n return fontColorNodes as Array<FontColorNode>;\n }\n\n override exportJSON(): SerializedFontColorNode {\n return {\n ...super.exportJSON(),\n themeColor: this.__color.getName(),\n color: this.__color.getValue(),\n type: \"wby-font-color\"\n };\n }\n\n private addColorValueToHTMLElement(element: HTMLElement, theme: EditorTheme): HTMLElement {\n // Update color from webiny theme\n this.__color.updateFromTheme(theme);\n element.setAttribute(FontColorNodeAttrName, this.__color.getName());\n element.style.color = this.__color.getValue();\n return element;\n }\n\n override updateDOM(prevNode: this, dom: HTMLElement, config: EditorConfig): boolean {\n const isUpdated = super.updateDOM(prevNode, dom, config);\n this.__color.updateFromTheme(config.theme as EditorTheme);\n\n dom.setAttribute(FontColorNodeAttrName, this.__color.getName());\n dom.style.color = this.__color.getValue();\n return isUpdated;\n }\n\n getColorStyle() {\n return {\n color: this.__color.getValue(),\n themeColor: this.__color.getName()\n };\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = super.createDOM(config);\n return this.addColorValueToHTMLElement(element, config.theme as EditorTheme);\n }\n}\n\nexport const $createFontColorNode = (text: string, color: ThemeColorValue): FontColorNode => {\n return new FontColorNode(text, color);\n};\n\nexport const $isFontColorNode = (node: LexicalNode): node is FontColorNode => {\n return node instanceof FontColorNode;\n};\n\nexport function $applyStylesToNode(node: TextNode, source: TextNode) {\n node.setFormat(source.getFormat());\n node.setStyle(source.getStyle());\n}\n"],"mappings":"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","ignoreList":[]}
|
package/HeadingNode.d.ts
CHANGED
|
@@ -1,28 +1,40 @@
|
|
|
1
|
-
import { EditorConfig, LexicalNode, NodeKey, RangeSelection, Spread } from "lexical";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import type { EditorConfig, LexicalNode, NodeKey, RangeSelection, Spread, LexicalEditor, DOMExportOutput, DOMConversionMap } from "lexical";
|
|
2
|
+
import type { HeadingTagType, SerializedHeadingNode as BaseSerializedHeadingNode } from "@lexical/rich-text";
|
|
3
|
+
import { HeadingNode as BaseHeadingNode } from "@lexical/rich-text";
|
|
4
|
+
import type { EditorTheme } from "@webiny/lexical-theme";
|
|
5
|
+
import type { ParagraphNode } from "./ParagraphNode";
|
|
6
|
+
import type { TypographyStylesNode, ThemeStyleValue } from "./types";
|
|
6
7
|
export type SerializeHeadingNode = Spread<{
|
|
7
|
-
styles
|
|
8
|
-
|
|
8
|
+
styles?: ThemeStyleValue[];
|
|
9
|
+
styleId?: string;
|
|
10
|
+
className?: string;
|
|
11
|
+
type: "wby-heading";
|
|
9
12
|
}, BaseSerializedHeadingNode>;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
interface HeadingNodeOptions {
|
|
14
|
+
className?: string;
|
|
15
|
+
styleId?: string;
|
|
16
|
+
key?: NodeKey;
|
|
17
|
+
}
|
|
18
|
+
export declare class HeadingNode extends BaseHeadingNode implements TypographyStylesNode {
|
|
19
|
+
private __styleId;
|
|
20
|
+
private __className;
|
|
21
|
+
constructor(tag: HeadingTagType, options?: HeadingNodeOptions);
|
|
22
|
+
getStyleId(): string | undefined;
|
|
23
|
+
setStyleId(styleId: string | undefined): void;
|
|
24
|
+
setClassName(className: string | undefined): void;
|
|
25
|
+
getClassName(): string | undefined;
|
|
18
26
|
static getType(): string;
|
|
19
27
|
static clone(node: HeadingNode): HeadingNode;
|
|
20
|
-
protected updateElementWithThemeClasses(element: HTMLElement, theme: EditorTheme): HTMLElement;
|
|
21
28
|
createDOM(config: EditorConfig): HTMLElement;
|
|
29
|
+
exportDOM(editor: LexicalEditor): DOMExportOutput;
|
|
30
|
+
static importDOM(): DOMConversionMap | null;
|
|
22
31
|
static importJSON(serializedNode: SerializeHeadingNode): BaseHeadingNode;
|
|
23
32
|
exportJSON(): SerializeHeadingNode;
|
|
24
33
|
insertNewAfter(selection?: RangeSelection, restoreSelection?: boolean): ParagraphNode | HeadingNode;
|
|
25
34
|
collapseAtStart(): true;
|
|
35
|
+
protected updateElementWithThemeClasses(element: HTMLElement, theme: EditorTheme): HTMLElement;
|
|
36
|
+
private setDefaultTypography;
|
|
26
37
|
}
|
|
27
|
-
export declare function $createHeadingNode(tag: HeadingTagType,
|
|
38
|
+
export declare function $createHeadingNode(tag: HeadingTagType, styleId?: string): HeadingNode;
|
|
28
39
|
export declare function $isHeadingNode(node: LexicalNode | null | undefined): node is HeadingNode;
|
|
40
|
+
export {};
|
package/HeadingNode.js
CHANGED
|
@@ -1,89 +1,149 @@
|
|
|
1
|
-
import { $applyNodeReplacement } from "lexical";
|
|
1
|
+
import { $applyNodeReplacement, setNodeIndentFromDOM } from "lexical";
|
|
2
2
|
import { addClassNamesToElement } from "@lexical/utils";
|
|
3
3
|
import { HeadingNode as BaseHeadingNode } from "@lexical/rich-text";
|
|
4
4
|
import { findTypographyStyleByHtmlTag } from "@webiny/lexical-theme";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
if (typographyStyleId) {
|
|
10
|
-
this.__styles.push({
|
|
11
|
-
styleId: typographyStyleId,
|
|
12
|
-
type: "typography"
|
|
13
|
-
});
|
|
14
|
-
}
|
|
5
|
+
import { getStyleId } from "./utils/getStyleId";
|
|
6
|
+
function isGoogleDocsTitle(domNode) {
|
|
7
|
+
if (domNode.nodeName.toLowerCase() === "span") {
|
|
8
|
+
return domNode.style.fontSize === "26pt";
|
|
15
9
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
function $convertHeadingElement(element) {
|
|
13
|
+
const nodeName = element.nodeName.toLowerCase();
|
|
14
|
+
let node = null;
|
|
15
|
+
if (nodeName === "h1" || nodeName === "h2" || nodeName === "h3" || nodeName === "h4" || nodeName === "h5" || nodeName === "h6") {
|
|
16
|
+
node = $createHeadingNode(nodeName);
|
|
17
|
+
if (element.style !== null) {
|
|
18
|
+
setNodeIndentFromDOM(element, node);
|
|
19
|
+
node.setFormat(element.style.textAlign);
|
|
23
20
|
}
|
|
24
21
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
return {
|
|
23
|
+
node
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export class HeadingNode extends BaseHeadingNode {
|
|
27
|
+
constructor(tag, options = {}) {
|
|
28
|
+
const {
|
|
29
|
+
styleId,
|
|
30
|
+
key,
|
|
31
|
+
className
|
|
32
|
+
} = options;
|
|
33
|
+
super(tag, key);
|
|
34
|
+
this.__styleId = styleId;
|
|
35
|
+
this.__className = className;
|
|
28
36
|
}
|
|
29
|
-
|
|
30
|
-
return
|
|
37
|
+
getStyleId() {
|
|
38
|
+
return this.__styleId;
|
|
31
39
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
return self.__styles;
|
|
40
|
+
setStyleId(styleId) {
|
|
41
|
+
this.__styleId = styleId;
|
|
35
42
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
43
|
+
setClassName(className) {
|
|
44
|
+
this.__className = className;
|
|
45
|
+
}
|
|
46
|
+
getClassName() {
|
|
47
|
+
return this.__className;
|
|
40
48
|
}
|
|
41
49
|
static getType() {
|
|
42
|
-
return "heading
|
|
50
|
+
return "wby-heading";
|
|
43
51
|
}
|
|
44
52
|
static clone(node) {
|
|
45
|
-
return new HeadingNode(node.getTag(),
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
if (!this.hasTypographyStyle()) {
|
|
52
|
-
this.setDefaultTypography(theme.emotionMap);
|
|
53
|
-
}
|
|
54
|
-
const typoStyleId = this.getTypographyStyleId();
|
|
55
|
-
let themeClasses;
|
|
56
|
-
|
|
57
|
-
// Typography css class
|
|
58
|
-
if (typoStyleId) {
|
|
59
|
-
const typographyStyle = theme.emotionMap[typoStyleId];
|
|
60
|
-
if (typographyStyle) {
|
|
61
|
-
themeClasses = typographyStyle.className;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
if (themeClasses) {
|
|
65
|
-
addClassNamesToElement(element, themeClasses);
|
|
66
|
-
}
|
|
67
|
-
return element;
|
|
53
|
+
return new HeadingNode(node.getTag(), {
|
|
54
|
+
key: node.getKey(),
|
|
55
|
+
styleId: node.getStyleId(),
|
|
56
|
+
className: node.getClassName()
|
|
57
|
+
});
|
|
68
58
|
}
|
|
69
59
|
createDOM(config) {
|
|
70
60
|
const element = super.createDOM(config);
|
|
71
61
|
return this.updateElementWithThemeClasses(element, config.theme);
|
|
72
62
|
}
|
|
63
|
+
exportDOM(editor) {
|
|
64
|
+
const base = super.exportDOM(editor);
|
|
65
|
+
const element = base.element;
|
|
66
|
+
if (element && this.__className) {
|
|
67
|
+
element.classList.add(this.__className);
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
...base,
|
|
71
|
+
element
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
static importDOM() {
|
|
75
|
+
return {
|
|
76
|
+
h1: () => ({
|
|
77
|
+
conversion: $convertHeadingElement,
|
|
78
|
+
priority: 0
|
|
79
|
+
}),
|
|
80
|
+
h2: () => ({
|
|
81
|
+
conversion: $convertHeadingElement,
|
|
82
|
+
priority: 0
|
|
83
|
+
}),
|
|
84
|
+
h3: () => ({
|
|
85
|
+
conversion: $convertHeadingElement,
|
|
86
|
+
priority: 0
|
|
87
|
+
}),
|
|
88
|
+
h4: () => ({
|
|
89
|
+
conversion: $convertHeadingElement,
|
|
90
|
+
priority: 0
|
|
91
|
+
}),
|
|
92
|
+
h5: () => ({
|
|
93
|
+
conversion: $convertHeadingElement,
|
|
94
|
+
priority: 0
|
|
95
|
+
}),
|
|
96
|
+
h6: () => ({
|
|
97
|
+
conversion: $convertHeadingElement,
|
|
98
|
+
priority: 0
|
|
99
|
+
}),
|
|
100
|
+
p: node => {
|
|
101
|
+
// domNode is a <p> since we matched it by nodeName
|
|
102
|
+
const firstChild = node.firstChild;
|
|
103
|
+
if (firstChild !== null && isGoogleDocsTitle(firstChild)) {
|
|
104
|
+
return {
|
|
105
|
+
conversion: () => ({
|
|
106
|
+
node: null
|
|
107
|
+
}),
|
|
108
|
+
priority: 3
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
},
|
|
113
|
+
span: node => {
|
|
114
|
+
if (isGoogleDocsTitle(node)) {
|
|
115
|
+
return {
|
|
116
|
+
conversion: () => {
|
|
117
|
+
return {
|
|
118
|
+
node: $createHeadingNode("h1")
|
|
119
|
+
};
|
|
120
|
+
},
|
|
121
|
+
priority: 3
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
}
|
|
73
128
|
static importJSON(serializedNode) {
|
|
74
129
|
const node = $createHeadingNode(serializedNode.tag);
|
|
75
130
|
node.setFormat(serializedNode.format);
|
|
76
131
|
node.setIndent(serializedNode.indent);
|
|
77
132
|
node.setDirection(serializedNode.direction);
|
|
78
|
-
|
|
133
|
+
const styleId = getStyleId({
|
|
134
|
+
styleId: serializedNode.styleId,
|
|
135
|
+
styles: serializedNode.styles
|
|
136
|
+
});
|
|
137
|
+
node.setStyleId(styleId);
|
|
138
|
+
node.setClassName(serializedNode.className);
|
|
79
139
|
return node;
|
|
80
140
|
}
|
|
81
141
|
exportJSON() {
|
|
82
142
|
return {
|
|
83
143
|
...super.exportJSON(),
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
144
|
+
type: "wby-heading",
|
|
145
|
+
styleId: this.__styleId,
|
|
146
|
+
className: this.__className
|
|
87
147
|
};
|
|
88
148
|
}
|
|
89
149
|
|
|
@@ -103,9 +163,30 @@ export class HeadingNode extends BaseHeadingNode {
|
|
|
103
163
|
this.replace(newElement);
|
|
104
164
|
return true;
|
|
105
165
|
}
|
|
166
|
+
updateElementWithThemeClasses(element, theme) {
|
|
167
|
+
if (!theme?.emotionMap) {
|
|
168
|
+
return element;
|
|
169
|
+
}
|
|
170
|
+
if (!this.__styleId || !this.__className) {
|
|
171
|
+
this.setDefaultTypography(theme.emotionMap);
|
|
172
|
+
}
|
|
173
|
+
if (this.__className) {
|
|
174
|
+
addClassNamesToElement(element, this.__className);
|
|
175
|
+
}
|
|
176
|
+
return element;
|
|
177
|
+
}
|
|
178
|
+
setDefaultTypography(themeEmotionMap) {
|
|
179
|
+
const typographyStyle = findTypographyStyleByHtmlTag(this.getTag(), themeEmotionMap);
|
|
180
|
+
if (typographyStyle) {
|
|
181
|
+
this.__styleId = typographyStyle.id;
|
|
182
|
+
this.__className = typographyStyle.className;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
106
185
|
}
|
|
107
|
-
export function $createHeadingNode(tag,
|
|
108
|
-
return $applyNodeReplacement(new HeadingNode(tag,
|
|
186
|
+
export function $createHeadingNode(tag, styleId) {
|
|
187
|
+
return $applyNodeReplacement(new HeadingNode(tag, {
|
|
188
|
+
styleId
|
|
189
|
+
}));
|
|
109
190
|
}
|
|
110
191
|
export function $isHeadingNode(node) {
|
|
111
192
|
return node instanceof HeadingNode;
|
package/HeadingNode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["$applyNodeReplacement","addClassNamesToElement","HeadingNode","BaseHeadingNode","findTypographyStyleByHtmlTag","__styles","constructor","tag","typographyStyleId","key","push","styleId","type","setDefaultTypography","themeEmotionMap","typographyStyle","__tag","id","getTypographyStyleId","style","find","x","undefined","hasTypographyStyle","getThemeStyles","self","getLatest","setThemeStyles","styles","getWritable","getType","clone","node","getTag","__key","updateElementWithThemeClasses","element","theme","emotionMap","typoStyleId","themeClasses","className","createDOM","config","importJSON","serializedNode","$createHeadingNode","setFormat","format","setIndent","indent","setDirection","direction","exportJSON","version","insertNewAfter","selection","restoreSelection","newElement","getDirection","insertAfter","collapseAtStart","children","getChildren","forEach","child","append","replace","$isHeadingNode"],"sources":["HeadingNode.ts"],"sourcesContent":["import {\n EditorConfig,\n $applyNodeReplacement,\n LexicalNode,\n NodeKey,\n RangeSelection,\n Spread\n} from \"lexical\";\nimport { addClassNamesToElement } from \"@lexical/utils\";\nimport {\n HeadingNode as BaseHeadingNode,\n HeadingTagType,\n SerializedHeadingNode as BaseSerializedHeadingNode\n} from \"@lexical/rich-text\";\nimport { EditorTheme, ThemeEmotionMap, findTypographyStyleByHtmlTag } from \"@webiny/lexical-theme\";\nimport { ParagraphNode } from \"~/ParagraphNode\";\nimport { TypographyStylesNode, ThemeStyleValue, TextNodeThemeStyles } from \"~/types\";\n\nexport type SerializeHeadingNode = Spread<\n {\n styles: ThemeStyleValue[];\n type: \"heading-element\";\n },\n BaseSerializedHeadingNode\n>;\n\nexport class HeadingNode\n extends BaseHeadingNode\n implements TextNodeThemeStyles, TypographyStylesNode\n{\n __styles: ThemeStyleValue[] = [];\n\n constructor(tag: HeadingTagType, typographyStyleId?: string, key?: NodeKey) {\n super(tag, key);\n\n if (typographyStyleId) {\n this.__styles.push({ styleId: typographyStyleId, type: \"typography\" });\n }\n }\n\n private setDefaultTypography(themeEmotionMap: ThemeEmotionMap) {\n const typographyStyle = findTypographyStyleByHtmlTag(this.__tag, themeEmotionMap);\n if (typographyStyle) {\n this.__styles.push({ styleId: typographyStyle.id, type: \"typography\" });\n }\n }\n\n getTypographyStyleId(): string | undefined {\n const style = this.__styles.find(x => x.type === \"typography\");\n return style?.styleId || undefined;\n }\n\n private hasTypographyStyle(): boolean {\n return !!this.getTypographyStyleId();\n }\n\n getThemeStyles(): ThemeStyleValue[] {\n const self = super.getLatest();\n return self.__styles;\n }\n\n setThemeStyles(styles: ThemeStyleValue[]) {\n const self = super.getWritable();\n self.__styles = [...styles];\n return self;\n }\n\n static override getType(): string {\n return \"heading-element\";\n }\n\n static override clone(node: HeadingNode): HeadingNode {\n return new HeadingNode(node.getTag(), node.getTypographyStyleId(), node.__key);\n }\n\n protected updateElementWithThemeClasses(element: HTMLElement, theme: EditorTheme): HTMLElement {\n if (!theme?.emotionMap) {\n return element;\n }\n\n if (!this.hasTypographyStyle()) {\n this.setDefaultTypography(theme.emotionMap);\n }\n\n const typoStyleId = this.getTypographyStyleId();\n\n let themeClasses;\n\n // Typography css class\n if (typoStyleId) {\n const typographyStyle = theme.emotionMap[typoStyleId];\n if (typographyStyle) {\n themeClasses = typographyStyle.className;\n }\n }\n\n if (themeClasses) {\n addClassNamesToElement(element, themeClasses);\n }\n\n return element;\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = super.createDOM(config);\n return this.updateElementWithThemeClasses(element, config.theme as EditorTheme);\n }\n\n static override importJSON(serializedNode: SerializeHeadingNode): BaseHeadingNode {\n const node = $createHeadingNode(serializedNode.tag);\n node.setFormat(serializedNode.format);\n node.setIndent(serializedNode.indent);\n node.setDirection(serializedNode.direction);\n node.setThemeStyles(serializedNode.styles);\n return node;\n }\n\n override exportJSON(): SerializeHeadingNode {\n return {\n ...super.exportJSON(),\n styles: this.__styles,\n type: \"heading-element\",\n version: 1\n };\n }\n\n // Mutation\n override insertNewAfter(\n selection?: RangeSelection,\n restoreSelection = true\n ): ParagraphNode | HeadingNode {\n // Next line for headings are always headings with the same tag\n const newElement = $createHeadingNode(this.getTag());\n const direction = this.getDirection();\n newElement.setDirection(direction);\n this.insertAfter(newElement, restoreSelection);\n return newElement;\n }\n\n override collapseAtStart(): true {\n const newElement = $createHeadingNode(this.getTag());\n const children = this.getChildren();\n children.forEach(child => newElement.append(child));\n this.replace(newElement);\n return true;\n }\n}\n\nexport function $createHeadingNode(tag: HeadingTagType, typographyStyleId?: string): HeadingNode {\n return $applyNodeReplacement(new HeadingNode(tag, typographyStyleId));\n}\n\nexport function $isHeadingNode(node: LexicalNode | null | undefined): node is HeadingNode {\n return node instanceof HeadingNode;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["$applyNodeReplacement","setNodeIndentFromDOM","addClassNamesToElement","HeadingNode","BaseHeadingNode","findTypographyStyleByHtmlTag","getStyleId","isGoogleDocsTitle","domNode","nodeName","toLowerCase","style","fontSize","$convertHeadingElement","element","node","$createHeadingNode","setFormat","textAlign","constructor","tag","options","styleId","key","className","__styleId","__className","setStyleId","setClassName","getClassName","getType","clone","getTag","getKey","createDOM","config","updateElementWithThemeClasses","theme","exportDOM","editor","base","classList","add","importDOM","h1","conversion","priority","h2","h3","h4","h5","h6","p","firstChild","span","importJSON","serializedNode","format","setIndent","indent","setDirection","direction","styles","exportJSON","type","insertNewAfter","selection","restoreSelection","newElement","getDirection","insertAfter","collapseAtStart","children","getChildren","forEach","child","append","replace","emotionMap","setDefaultTypography","themeEmotionMap","typographyStyle","id","$isHeadingNode"],"sources":["HeadingNode.ts"],"sourcesContent":["import type {\n EditorConfig,\n LexicalNode,\n NodeKey,\n RangeSelection,\n Spread,\n LexicalEditor,\n DOMExportOutput,\n DOMConversionMap\n} from \"lexical\";\nimport { $applyNodeReplacement, setNodeIndentFromDOM } from \"lexical\";\nimport { addClassNamesToElement } from \"@lexical/utils\";\nimport type {\n HeadingTagType,\n SerializedHeadingNode as BaseSerializedHeadingNode\n} from \"@lexical/rich-text\";\nimport { HeadingNode as BaseHeadingNode } from \"@lexical/rich-text\";\nimport type { EditorTheme, ThemeEmotionMap } from \"@webiny/lexical-theme\";\nimport { findTypographyStyleByHtmlTag } from \"@webiny/lexical-theme\";\nimport type { ParagraphNode } from \"~/ParagraphNode\";\nimport type { TypographyStylesNode, ThemeStyleValue } from \"~/types\";\nimport { getStyleId } from \"~/utils/getStyleId\";\n\nexport type SerializeHeadingNode = Spread<\n {\n styles?: ThemeStyleValue[];\n styleId?: string;\n className?: string;\n type: \"wby-heading\";\n },\n BaseSerializedHeadingNode\n>;\n\ninterface HeadingNodeOptions {\n className?: string;\n styleId?: string;\n key?: NodeKey;\n}\n\nfunction isGoogleDocsTitle(domNode: HTMLElement) {\n if (domNode.nodeName.toLowerCase() === \"span\") {\n return domNode.style.fontSize === \"26pt\";\n }\n return false;\n}\nfunction $convertHeadingElement(element: HTMLElement) {\n const nodeName = element.nodeName.toLowerCase();\n let node = null;\n if (\n nodeName === \"h1\" ||\n nodeName === \"h2\" ||\n nodeName === \"h3\" ||\n nodeName === \"h4\" ||\n nodeName === \"h5\" ||\n nodeName === \"h6\"\n ) {\n node = $createHeadingNode(nodeName);\n if (element.style !== null) {\n setNodeIndentFromDOM(element, node);\n node.setFormat(element.style.textAlign as any);\n }\n }\n return {\n node\n };\n}\n\nexport class HeadingNode extends BaseHeadingNode implements TypographyStylesNode {\n private __styleId: string | undefined;\n private __className: string | undefined;\n\n constructor(tag: HeadingTagType, options: HeadingNodeOptions = {}) {\n const { styleId, key, className } = options;\n\n super(tag, key);\n\n this.__styleId = styleId;\n this.__className = className;\n }\n\n getStyleId(): string | undefined {\n return this.__styleId;\n }\n\n setStyleId(styleId: string | undefined) {\n this.__styleId = styleId;\n }\n\n setClassName(className: string | undefined) {\n this.__className = className;\n }\n\n getClassName(): string | undefined {\n return this.__className;\n }\n\n static override getType(): string {\n return \"wby-heading\";\n }\n\n static override clone(node: HeadingNode): HeadingNode {\n return new HeadingNode(node.getTag(), {\n key: node.getKey(),\n styleId: node.getStyleId(),\n className: node.getClassName()\n });\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = super.createDOM(config);\n return this.updateElementWithThemeClasses(element, config.theme as EditorTheme);\n }\n\n override exportDOM(editor: LexicalEditor): DOMExportOutput {\n const base = super.exportDOM(editor);\n\n const element = base.element as HTMLElement;\n if (element && this.__className) {\n element.classList.add(this.__className);\n }\n\n return { ...base, element };\n }\n\n static override importDOM(): DOMConversionMap | null {\n return {\n h1: () => ({\n conversion: $convertHeadingElement,\n priority: 0\n }),\n h2: () => ({\n conversion: $convertHeadingElement,\n priority: 0\n }),\n h3: () => ({\n conversion: $convertHeadingElement,\n priority: 0\n }),\n h4: () => ({\n conversion: $convertHeadingElement,\n priority: 0\n }),\n h5: () => ({\n conversion: $convertHeadingElement,\n priority: 0\n }),\n h6: () => ({\n conversion: $convertHeadingElement,\n priority: 0\n }),\n p: node => {\n // domNode is a <p> since we matched it by nodeName\n const firstChild = node.firstChild as HTMLElement;\n if (firstChild !== null && isGoogleDocsTitle(firstChild)) {\n return {\n conversion: () => ({\n node: null\n }),\n priority: 3\n };\n }\n return null;\n },\n span: node => {\n if (isGoogleDocsTitle(node)) {\n return {\n conversion: () => {\n return {\n node: $createHeadingNode(\"h1\")\n };\n },\n priority: 3\n };\n }\n return null;\n }\n };\n }\n\n static override importJSON(serializedNode: SerializeHeadingNode): BaseHeadingNode {\n const node = $createHeadingNode(serializedNode.tag);\n node.setFormat(serializedNode.format);\n node.setIndent(serializedNode.indent);\n node.setDirection(serializedNode.direction);\n\n const styleId = getStyleId({\n styleId: serializedNode.styleId,\n styles: serializedNode.styles\n });\n\n node.setStyleId(styleId);\n node.setClassName(serializedNode.className);\n\n return node;\n }\n\n override exportJSON(): SerializeHeadingNode {\n return {\n ...super.exportJSON(),\n type: \"wby-heading\",\n styleId: this.__styleId,\n className: this.__className\n };\n }\n\n // Mutation\n override insertNewAfter(\n selection?: RangeSelection,\n restoreSelection = true\n ): ParagraphNode | HeadingNode {\n // Next line for headings are always headings with the same tag\n const newElement = $createHeadingNode(this.getTag());\n const direction = this.getDirection();\n newElement.setDirection(direction);\n this.insertAfter(newElement, restoreSelection);\n return newElement;\n }\n\n override collapseAtStart(): true {\n const newElement = $createHeadingNode(this.getTag());\n const children = this.getChildren();\n children.forEach(child => newElement.append(child));\n this.replace(newElement);\n return true;\n }\n\n protected updateElementWithThemeClasses(element: HTMLElement, theme: EditorTheme): HTMLElement {\n if (!theme?.emotionMap) {\n return element;\n }\n\n if (!this.__styleId || !this.__className) {\n this.setDefaultTypography(theme.emotionMap);\n }\n\n if (this.__className) {\n addClassNamesToElement(element, this.__className);\n }\n\n return element;\n }\n\n private setDefaultTypography(themeEmotionMap: ThemeEmotionMap) {\n const typographyStyle = findTypographyStyleByHtmlTag(this.getTag(), themeEmotionMap);\n if (typographyStyle) {\n this.__styleId = typographyStyle.id;\n this.__className = typographyStyle.className;\n }\n }\n}\n\nexport function $createHeadingNode(tag: HeadingTagType, styleId?: string): HeadingNode {\n return $applyNodeReplacement(new HeadingNode(tag, { styleId }));\n}\n\nexport function $isHeadingNode(node: LexicalNode | null | undefined): node is HeadingNode {\n return node instanceof HeadingNode;\n}\n"],"mappings":"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","ignoreList":[]}
|
package/ImageNode.js
CHANGED
|
@@ -7,12 +7,14 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import React, { Suspense } from "react";
|
|
9
9
|
import { $applyNodeReplacement, createEditor, DecoratorNode } from "lexical";
|
|
10
|
-
const ImageComponent = /*#__PURE__*/React.lazy(() =>
|
|
10
|
+
const ImageComponent = /*#__PURE__*/React.lazy(() => {
|
|
11
|
+
return import(/* webpackChunkName: "LexicalNodesComponentsImageNodeImageComponent" */"./components/ImageNode/ImageComponent");
|
|
12
|
+
});
|
|
11
13
|
export class ImageNode extends DecoratorNode {
|
|
12
14
|
// Captions cannot yet be used within editor cells
|
|
13
15
|
|
|
14
16
|
static getType() {
|
|
15
|
-
return "image";
|
|
17
|
+
return "wby-image";
|
|
16
18
|
}
|
|
17
19
|
static clone(node) {
|
|
18
20
|
return new ImageNode({
|
|
@@ -100,9 +102,9 @@ export class ImageNode extends DecoratorNode {
|
|
|
100
102
|
maxWidth: this.__maxWidth,
|
|
101
103
|
showCaption: this.__showCaption,
|
|
102
104
|
src: this.getSrc(),
|
|
103
|
-
type: "image",
|
|
104
|
-
|
|
105
|
-
|
|
105
|
+
type: "wby-image",
|
|
106
|
+
width: this.__width === "inherit" ? 0 : this.__width,
|
|
107
|
+
version: 1
|
|
106
108
|
};
|
|
107
109
|
}
|
|
108
110
|
setWidthAndHeight(width, height) {
|
package/ImageNode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","Suspense","$applyNodeReplacement","createEditor","DecoratorNode","ImageComponent","lazy","ImageNode","getType","clone","node","id","__id","src","__src","altText","__altText","maxWidth","__maxWidth","width","__width","height","__height","showCaption","__showCaption","caption","__caption","captionsEnabled","__captionsEnabled","__key","importJSON","serializedNode","$createImageNode","nestedEditor","editorState","parseEditorState","isEmpty","setEditorState","exportDOM","element","document","createElement","setAttribute","toString","importDOM","constructor","props","key","undefined","exportJSON","getAltText","toJSON","getSrc","type","version","setWidthAndHeight","writable","getWritable","setShowCaption","createDOM","config","span","theme","className","image","updateDOM","decorate","fallback","nodeKey","getKey","resizable","$isImageNode"],"sources":["ImageNode.tsx"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport React, { Suspense } from \"react\";\nimport type {\n DOMConversionMap,\n DOMExportOutput,\n EditorConfig,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n SerializedEditor,\n SerializedLexicalNode,\n Spread\n} from \"lexical\";\nimport { $applyNodeReplacement, createEditor, DecoratorNode } from \"lexical\";\n\nconst ImageComponent = React.lazy(\n () =>\n import(\n /* webpackChunkName: \"LexicalNodesComponentsImageNodeImageComponent\" */\n \"./components/ImageNode/ImageComponent\"\n )\n);\n\nexport type SerializedImageNode = Spread<\n {\n id: string;\n altText: string;\n caption: SerializedEditor;\n height?: number;\n maxWidth: number;\n showCaption: boolean;\n src: string;\n width?: number;\n },\n SerializedLexicalNode\n>;\n\nexport interface ImageNodeProps {\n id: string;\n src: string;\n altText: string;\n maxWidth: number;\n width?: \"inherit\" | number;\n height?: \"inherit\" | number;\n showCaption?: boolean;\n caption?: LexicalEditor;\n captionsEnabled?: boolean;\n}\n\nexport class ImageNode extends DecoratorNode<JSX.Element> {\n __id: string;\n __src: string;\n __altText: string;\n __width: \"inherit\" | number;\n __height: \"inherit\" | number;\n __maxWidth: number;\n __showCaption: boolean;\n __caption: LexicalEditor;\n // Captions cannot yet be used within editor cells\n __captionsEnabled: boolean;\n\n static override getType(): string {\n return \"image\";\n }\n\n static override clone(node: ImageNode): ImageNode {\n return new ImageNode(\n {\n id: node.__id,\n src: node.__src,\n altText: node.__altText,\n maxWidth: node.__maxWidth,\n width: node.__width,\n height: node.__height,\n showCaption: node.__showCaption,\n caption: node.__caption,\n captionsEnabled: node.__captionsEnabled\n },\n node.__key\n );\n }\n\n static override importJSON(serializedNode: SerializedImageNode): ImageNode {\n const { id, altText, height, width, maxWidth, caption, src, showCaption } = serializedNode;\n const node = $createImageNode({\n id,\n altText,\n height,\n maxWidth,\n showCaption,\n src,\n width\n });\n const nestedEditor = node.__caption;\n const editorState = nestedEditor.parseEditorState(caption.editorState);\n if (!editorState.isEmpty()) {\n nestedEditor.setEditorState(editorState);\n }\n return node;\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement(\"img\");\n element.setAttribute(\"id\", this.__id);\n element.setAttribute(\"src\", this.__src);\n element.setAttribute(\"alt\", this.__altText);\n element.setAttribute(\"width\", this.__width.toString());\n element.setAttribute(\"height\", this.__height.toString());\n return { element };\n }\n\n /**\n * Control how an HTMLElement is represented in Lexical.\n * DOM data comes from clipboard or parsing HTML to nodes with the available lexical functions.\n * (@see @lexical/html package: https://github.com/facebook/lexical/blob/main/packages/lexical-html/README.md).\n */\n static override importDOM(): DOMConversionMap | null {\n /**\n * By returning 'null' value, we are preventing image node to be created.\n * Example of how to implement and create the node:\n * https://github.com/facebook/lexical/blob/main/packages/lexical-playground/src/nodes/ImageNode.tsx#L94\n */\n return null;\n }\n\n constructor(props: ImageNodeProps, key?: NodeKey) {\n super(key);\n this.__id = props.id;\n this.__src = props.src;\n this.__altText = props.altText;\n this.__maxWidth = props.maxWidth;\n this.__width = props.width || \"inherit\";\n this.__height = props.height || \"inherit\";\n this.__showCaption = props.showCaption || false;\n this.__caption = props.caption || createEditor();\n this.__captionsEnabled = props.captionsEnabled || props.captionsEnabled === undefined;\n }\n\n override exportJSON(): SerializedImageNode {\n return {\n id: this.__id,\n altText: this.getAltText(),\n caption: this.__caption.toJSON(),\n height: this.__height === \"inherit\" ? 0 : this.__height,\n maxWidth: this.__maxWidth,\n showCaption: this.__showCaption,\n src: this.getSrc(),\n type: \"image\",\n version: 1,\n width: this.__width === \"inherit\" ? 0 : this.__width\n };\n }\n\n setWidthAndHeight(width: \"inherit\" | number, height: \"inherit\" | number): void {\n const writable = this.getWritable();\n writable.__width = width;\n writable.__height = height;\n }\n\n setShowCaption(showCaption: boolean): void {\n const writable = this.getWritable();\n writable.__showCaption = showCaption;\n }\n\n // View\n override createDOM(config: EditorConfig): HTMLElement {\n const span = document.createElement(\"span\");\n const theme = config.theme;\n const className = theme.image;\n if (className !== undefined) {\n span.className = className;\n }\n return span;\n }\n\n override updateDOM(): false {\n return false;\n }\n\n getSrc(): string {\n return this.__src;\n }\n\n getAltText(): string {\n return this.__altText;\n }\n\n override decorate(): JSX.Element {\n return (\n <Suspense fallback={null}>\n <ImageComponent\n id={this.__id}\n src={this.__src}\n altText={this.__altText}\n width={this.__width}\n height={this.__height}\n maxWidth={this.__maxWidth}\n nodeKey={this.getKey()}\n showCaption={this.__showCaption}\n caption={this.__caption}\n captionsEnabled={this.__captionsEnabled}\n resizable={true}\n />\n </Suspense>\n );\n }\n}\n\nexport function $createImageNode(props: ImageNodeProps, key?: string): ImageNode {\n return $applyNodeReplacement(new ImageNode(props, key));\n}\n\nexport function $isImageNode(node: LexicalNode | null | undefined): node is ImageNode {\n return node instanceof ImageNode;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","Suspense","$applyNodeReplacement","createEditor","DecoratorNode","ImageComponent","lazy","ImageNode","getType","clone","node","id","__id","src","__src","altText","__altText","maxWidth","__maxWidth","width","__width","height","__height","showCaption","__showCaption","caption","__caption","captionsEnabled","__captionsEnabled","__key","importJSON","serializedNode","$createImageNode","nestedEditor","editorState","parseEditorState","isEmpty","setEditorState","exportDOM","element","document","createElement","setAttribute","toString","importDOM","constructor","props","key","undefined","exportJSON","getAltText","toJSON","getSrc","type","version","setWidthAndHeight","writable","getWritable","setShowCaption","createDOM","config","span","theme","className","image","updateDOM","decorate","fallback","nodeKey","getKey","resizable","$isImageNode"],"sources":["ImageNode.tsx"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport React, { Suspense } from \"react\";\nimport type {\n DOMConversionMap,\n DOMExportOutput,\n EditorConfig,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n SerializedEditor,\n SerializedLexicalNode,\n Spread\n} from \"lexical\";\nimport { $applyNodeReplacement, createEditor, DecoratorNode } from \"lexical\";\n\nconst ImageComponent = React.lazy(() => {\n return import(\n /* webpackChunkName: \"LexicalNodesComponentsImageNodeImageComponent\" */\n \"./components/ImageNode/ImageComponent\"\n );\n});\n\nexport type SerializedImageNode = Spread<\n {\n id: string;\n altText: string;\n caption: SerializedEditor;\n height?: number;\n maxWidth: number;\n showCaption: boolean;\n src: string;\n width?: number;\n },\n SerializedLexicalNode\n>;\n\nexport interface ImageNodeProps {\n id: string;\n src: string;\n altText: string;\n maxWidth: number;\n width?: \"inherit\" | number;\n height?: \"inherit\" | number;\n showCaption?: boolean;\n caption?: LexicalEditor;\n captionsEnabled?: boolean;\n}\n\nexport class ImageNode extends DecoratorNode<JSX.Element> {\n __id: string;\n __src: string;\n __altText: string;\n __width: \"inherit\" | number;\n __height: \"inherit\" | number;\n __maxWidth: number;\n __showCaption: boolean;\n __caption: LexicalEditor;\n // Captions cannot yet be used within editor cells\n __captionsEnabled: boolean;\n\n static override getType(): string {\n return \"wby-image\";\n }\n\n static override clone(node: ImageNode): ImageNode {\n return new ImageNode(\n {\n id: node.__id,\n src: node.__src,\n altText: node.__altText,\n maxWidth: node.__maxWidth,\n width: node.__width,\n height: node.__height,\n showCaption: node.__showCaption,\n caption: node.__caption,\n captionsEnabled: node.__captionsEnabled\n },\n node.__key\n );\n }\n\n static override importJSON(serializedNode: SerializedImageNode): ImageNode {\n const { id, altText, height, width, maxWidth, caption, src, showCaption } = serializedNode;\n const node = $createImageNode({\n id,\n altText,\n height,\n maxWidth,\n showCaption,\n src,\n width\n });\n const nestedEditor = node.__caption;\n const editorState = nestedEditor.parseEditorState(caption.editorState);\n if (!editorState.isEmpty()) {\n nestedEditor.setEditorState(editorState);\n }\n return node;\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement(\"img\");\n element.setAttribute(\"id\", this.__id);\n element.setAttribute(\"src\", this.__src);\n element.setAttribute(\"alt\", this.__altText);\n element.setAttribute(\"width\", this.__width.toString());\n element.setAttribute(\"height\", this.__height.toString());\n return { element };\n }\n\n /**\n * Control how an HTMLElement is represented in Lexical.\n * DOM data comes from clipboard or parsing HTML to nodes with the available lexical functions.\n * (@see @lexical/html package: https://github.com/facebook/lexical/blob/main/packages/lexical-html/README.md).\n */\n static override importDOM(): DOMConversionMap | null {\n /**\n * By returning 'null' value, we are preventing image node to be created.\n * Example of how to implement and create the node:\n * https://github.com/facebook/lexical/blob/main/packages/lexical-playground/src/nodes/ImageNode.tsx#L94\n */\n return null;\n }\n\n constructor(props: ImageNodeProps, key?: NodeKey) {\n super(key);\n this.__id = props.id;\n this.__src = props.src;\n this.__altText = props.altText;\n this.__maxWidth = props.maxWidth;\n this.__width = props.width || \"inherit\";\n this.__height = props.height || \"inherit\";\n this.__showCaption = props.showCaption || false;\n this.__caption = props.caption || createEditor();\n this.__captionsEnabled = props.captionsEnabled || props.captionsEnabled === undefined;\n }\n\n override exportJSON(): SerializedImageNode {\n return {\n id: this.__id,\n altText: this.getAltText(),\n caption: this.__caption.toJSON(),\n height: this.__height === \"inherit\" ? 0 : this.__height,\n maxWidth: this.__maxWidth,\n showCaption: this.__showCaption,\n src: this.getSrc(),\n type: \"wby-image\",\n width: this.__width === \"inherit\" ? 0 : this.__width,\n version: 1\n };\n }\n\n setWidthAndHeight(width: \"inherit\" | number, height: \"inherit\" | number): void {\n const writable = this.getWritable();\n writable.__width = width;\n writable.__height = height;\n }\n\n setShowCaption(showCaption: boolean): void {\n const writable = this.getWritable();\n writable.__showCaption = showCaption;\n }\n\n // View\n override createDOM(config: EditorConfig): HTMLElement {\n const span = document.createElement(\"span\");\n const theme = config.theme;\n const className = theme.image;\n if (className !== undefined) {\n span.className = className;\n }\n return span;\n }\n\n override updateDOM(): false {\n return false;\n }\n\n getSrc(): string {\n return this.__src;\n }\n\n getAltText(): string {\n return this.__altText;\n }\n\n override decorate(): JSX.Element {\n return (\n <Suspense fallback={null}>\n <ImageComponent\n id={this.__id}\n src={this.__src}\n altText={this.__altText}\n width={this.__width}\n height={this.__height}\n maxWidth={this.__maxWidth}\n nodeKey={this.getKey()}\n showCaption={this.__showCaption}\n caption={this.__caption}\n captionsEnabled={this.__captionsEnabled}\n resizable={true}\n />\n </Suspense>\n );\n }\n}\n\nexport function $createImageNode(props: ImageNodeProps, key?: string): ImageNode {\n return $applyNodeReplacement(new ImageNode(props, key));\n}\n\nexport function $isImageNode(node: LexicalNode | null | undefined): node is ImageNode {\n return node instanceof ImageNode;\n}\n"],"mappings":"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","ignoreList":[]}
|
package/LinkNode.d.ts
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*
|
|
8
8
|
*/
|
|
9
|
-
import type { DOMConversionMap, EditorConfig, RangeSelection, LexicalCommand, LexicalNode, NodeKey, SerializedElementNode } from "lexical";
|
|
10
|
-
import { ElementNode
|
|
9
|
+
import type { DOMConversionMap, EditorConfig, RangeSelection, LexicalCommand, LexicalNode, NodeKey, SerializedElementNode, Spread } from "lexical";
|
|
10
|
+
import { ElementNode } from "lexical";
|
|
11
11
|
export type LinkAttributes = {
|
|
12
12
|
rel?: null | string;
|
|
13
13
|
target?: null | string;
|
package/LinkNode.js
CHANGED
|
@@ -24,7 +24,7 @@ export class LinkNode extends ElementNode {
|
|
|
24
24
|
/** @internal */
|
|
25
25
|
|
|
26
26
|
static getType() {
|
|
27
|
-
return "link";
|
|
27
|
+
return "wby-link";
|
|
28
28
|
}
|
|
29
29
|
static clone(node) {
|
|
30
30
|
return new LinkNode(node.__url, {
|
|
@@ -144,9 +144,8 @@ export class LinkNode extends ElementNode {
|
|
|
144
144
|
target: this.getTarget(),
|
|
145
145
|
title: this.getTitle(),
|
|
146
146
|
alt: this.getAlt(),
|
|
147
|
-
type: "link",
|
|
148
|
-
url: this.getURL()
|
|
149
|
-
version: 1
|
|
147
|
+
type: "wby-link",
|
|
148
|
+
url: this.getURL()
|
|
150
149
|
};
|
|
151
150
|
}
|
|
152
151
|
getURL() {
|
|
@@ -286,8 +285,7 @@ export class AutoLinkNode extends LinkNode {
|
|
|
286
285
|
exportJSON() {
|
|
287
286
|
return {
|
|
288
287
|
...super.exportJSON(),
|
|
289
|
-
type: "autolink"
|
|
290
|
-
version: 1
|
|
288
|
+
type: "autolink"
|
|
291
289
|
};
|
|
292
290
|
}
|
|
293
291
|
insertNewAfter(selection, restoreSelection = true) {
|