@webiny/lexical-nodes 6.0.0-alpha.5 → 6.0.0-rc.0

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.
Files changed (64) hide show
  1. package/FontColorNode.d.ts +3 -3
  2. package/FontColorNode.js +12 -6
  3. package/FontColorNode.js.map +1 -1
  4. package/HeadingNode.d.ts +4 -4
  5. package/HeadingNode.js +14 -11
  6. package/HeadingNode.js.map +1 -1
  7. package/ImageNode.d.ts +1 -11
  8. package/ImageNode.js +8 -34
  9. package/ImageNode.js.map +1 -1
  10. package/LinkNode.js +1 -3
  11. package/LinkNode.js.map +1 -1
  12. package/ListItemNode.js +5 -6
  13. package/ListItemNode.js.map +1 -1
  14. package/ListNode.d.ts +4 -4
  15. package/ListNode.js +14 -19
  16. package/ListNode.js.map +1 -1
  17. package/ParagraphNode.d.ts +3 -3
  18. package/ParagraphNode.js +15 -13
  19. package/ParagraphNode.js.map +1 -1
  20. package/QuoteNode.d.ts +3 -3
  21. package/QuoteNode.js +7 -11
  22. package/QuoteNode.js.map +1 -1
  23. package/README.md +9 -4
  24. package/components/ImageNode/ImageComponent.d.ts +2 -7
  25. package/components/ImageNode/ImageComponent.js +10 -84
  26. package/components/ImageNode/ImageComponent.js.map +1 -1
  27. package/components/ImageNode/ImageResizer.d.ts +1 -8
  28. package/components/ImageNode/ImageResizer.js +2 -12
  29. package/components/ImageNode/ImageResizer.js.map +1 -1
  30. package/index.d.ts +17 -17
  31. package/index.js +31 -28
  32. package/index.js.map +1 -1
  33. package/package.json +16 -20
  34. package/prepareLexicalState.js +2 -2
  35. package/prepareLexicalState.js.map +1 -1
  36. package/utils/formatList.d.ts +2 -2
  37. package/utils/formatList.js +4 -4
  38. package/utils/formatList.js.map +1 -1
  39. package/utils/formatToHeading.js +1 -1
  40. package/utils/formatToHeading.js.map +1 -1
  41. package/utils/formatToParagraph.js +1 -1
  42. package/utils/formatToParagraph.js.map +1 -1
  43. package/utils/formatToQuote.js +1 -1
  44. package/utils/formatToQuote.js.map +1 -1
  45. package/utils/getStyleId.d.ts +1 -1
  46. package/utils/getStyleId.js.map +1 -1
  47. package/utils/listNode.d.ts +2 -2
  48. package/utils/listNode.js +2 -2
  49. package/utils/listNode.js.map +1 -1
  50. package/utils/toggleLink.d.ts +1 -1
  51. package/utils/toggleLink.js +1 -1
  52. package/utils/toggleLink.js.map +1 -1
  53. package/components/ImageNode/ContentEditable.css +0 -22
  54. package/components/ImageNode/ContentEditable.d.ts +0 -12
  55. package/components/ImageNode/ContentEditable.js +0 -19
  56. package/components/ImageNode/ContentEditable.js.map +0 -1
  57. package/components/ImageNode/ImageComponent.css +0 -43
  58. package/components/ImageNode/Placeholder.css +0 -20
  59. package/components/ImageNode/Placeholder.d.ts +0 -15
  60. package/components/ImageNode/Placeholder.js +0 -24
  61. package/components/ImageNode/Placeholder.js.map +0 -1
  62. package/components/ImageNode/SharedHistoryContext.d.ts +0 -10
  63. package/components/ImageNode/SharedHistoryContext.js +0 -19
  64. package/components/ImageNode/SharedHistoryContext.js.map +0 -1
@@ -1,13 +1,13 @@
1
1
  import type { EditorConfig, LexicalNode, SerializedTextNode, Spread } from "lexical";
2
2
  import { TextNode } from "lexical";
3
- import type { EditorTheme } from "@webiny/lexical-theme";
3
+ import { Theme } from "@webiny/lexical-theme";
4
4
  export declare class ThemeColorValue {
5
- private readonly name;
5
+ private readonly id;
6
6
  private value;
7
7
  constructor(value: string, name?: string);
8
8
  getValue(): string;
9
9
  getName(): string;
10
- updateFromTheme(theme: EditorTheme): void;
10
+ updateFromTheme(theme: Theme): void;
11
11
  }
12
12
  export declare const ADD_FONT_COLOR_COMMAND: import("lexical").LexicalCommand<FontColorPayload>;
13
13
  export interface FontColorPayload {
package/FontColorNode.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { $getSelection, $isRangeSelection, createCommand, TextNode } from "lexical";
2
+ import { Theme } from "@webiny/lexical-theme";
2
3
  export class ThemeColorValue {
3
4
  // Webiny theme color variable, like color1, color2, etc.
4
5
 
@@ -6,17 +7,20 @@ export class ThemeColorValue {
6
7
 
7
8
  constructor(value, name) {
8
9
  this.value = value;
9
- this.name = name ?? "custom";
10
+ this.id = name ?? "custom";
10
11
  }
11
12
  getValue() {
12
13
  return this.value;
13
14
  }
14
15
  getName() {
15
- return this.name;
16
+ return this.id;
16
17
  }
17
18
  updateFromTheme(theme) {
18
- if (theme?.styles?.colors && this.name !== "custom") {
19
- this.value = theme.styles?.colors[this.name];
19
+ if (theme.colors && this.id !== "custom") {
20
+ const color = theme.colors.find(color => color.id === this.id);
21
+ if (color) {
22
+ this.value = color.value;
23
+ }
20
24
  }
21
25
  }
22
26
  }
@@ -92,7 +96,8 @@ export class FontColorNode extends TextNode {
92
96
  }
93
97
  updateDOM(prevNode, dom, config) {
94
98
  const isUpdated = super.updateDOM(prevNode, dom, config);
95
- this.__color.updateFromTheme(config.theme);
99
+ const theme = Theme.from(config.theme);
100
+ this.__color.updateFromTheme(theme);
96
101
  dom.setAttribute(FontColorNodeAttrName, this.__color.getName());
97
102
  dom.style.color = this.__color.getValue();
98
103
  return isUpdated;
@@ -105,7 +110,8 @@ export class FontColorNode extends TextNode {
105
110
  }
106
111
  createDOM(config) {
107
112
  const element = super.createDOM(config);
108
- return this.addColorValueToHTMLElement(element, config.theme);
113
+ const theme = Theme.from(config.theme);
114
+ return this.addColorValueToHTMLElement(element, theme);
109
115
  }
110
116
  }
111
117
  export const $createFontColorNode = (text, color) => {
@@ -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","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":[]}
1
+ {"version":3,"names":["$getSelection","$isRangeSelection","createCommand","TextNode","Theme","ThemeColorValue","constructor","value","name","id","getValue","getName","updateFromTheme","theme","colors","color","find","ADD_FONT_COLOR_COMMAND","FontColorNodeAttrName","FontColorNode","text","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","from","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 { Theme } from \"@webiny/lexical-theme\";\n\nexport class ThemeColorValue {\n // Webiny theme color variable, like color1, color2, etc.\n private readonly id: 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.id = name ?? \"custom\";\n }\n\n getValue() {\n return this.value;\n }\n\n getName() {\n return this.id;\n }\n\n updateFromTheme(theme: Theme) {\n if (theme.colors && this.id !== \"custom\") {\n const color = theme.colors.find(color => color.id === this.id);\n if (color) {\n this.value = color.value;\n }\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: Theme): 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 const theme = Theme.from(config.theme);\n this.__color.updateFromTheme(theme);\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 const theme = Theme.from(config.theme);\n return this.addColorValueToHTMLElement(element, theme);\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":"AACA,SAASA,aAAa,EAAEC,iBAAiB,EAAEC,aAAa,EAAEC,QAAQ,QAAQ,SAAS;AACnF,SAASC,KAAK,QAAQ,uBAAuB;AAE7C,OAAO,MAAMC,eAAe,CAAC;EACzB;;EAEA;;EAGAC,WAAWA,CAACC,KAAa,EAAEC,IAAa,EAAE;IACtC,IAAI,CAACD,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACE,EAAE,GAAGD,IAAI,IAAI,QAAQ;EAC9B;EAEAE,QAAQA,CAAA,EAAG;IACP,OAAO,IAAI,CAACH,KAAK;EACrB;EAEAI,OAAOA,CAAA,EAAG;IACN,OAAO,IAAI,CAACF,EAAE;EAClB;EAEAG,eAAeA,CAACC,KAAY,EAAE;IAC1B,IAAIA,KAAK,CAACC,MAAM,IAAI,IAAI,CAACL,EAAE,KAAK,QAAQ,EAAE;MACtC,MAAMM,KAAK,GAAGF,KAAK,CAACC,MAAM,CAACE,IAAI,CAACD,KAAK,IAAIA,KAAK,CAACN,EAAE,KAAK,IAAI,CAACA,EAAE,CAAC;MAC9D,IAAIM,KAAK,EAAE;QACP,IAAI,CAACR,KAAK,GAAGQ,KAAK,CAACR,KAAK;MAC5B;IACJ;EACJ;AACJ;AAEA,OAAO,MAAMU,sBAAsB,GAAGf,aAAa,CAAmB,wBAAwB,CAAC;AAE/F,MAAMgB,qBAAqB,GAAG,4BAA4B;AAe1D;AACA;AACA;AACA;AACA,OAAO,MAAMC,aAAa,SAAShB,QAAQ,CAAC;EAGxCG,WAAWA,CAACc,IAAY,EAAEL,KAAsB,EAAEM,GAAY,EAAE;IAC5D,KAAK,CAACD,IAAI,EAAEC,GAAG,CAAC;IAChB,IAAI,CAACC,OAAO,GAAGP,KAAK;EACxB;EAEA,OAAgBQ,OAAOA,CAAA,EAAW;IAC9B,OAAO,gBAAgB;EAC3B;EAEA,OAAgBC,KAAKA,CAACC,IAAmB,EAAiB;IACtD,OAAO,IAAIN,aAAa,CAACM,IAAI,CAACC,MAAM,EAAED,IAAI,CAACH,OAAO,EAAEG,IAAI,CAACE,KAAK,CAAC;EACnE;EAEA,OAAgBC,UAAUA,CAACC,cAAuC,EAAY;IAC1E,MAAMJ,IAAI,GAAG,IAAIN,aAAa,CAC1BU,cAAc,CAACT,IAAI,EACnB,IAAIf,eAAe,CAACwB,cAAc,CAACd,KAAK,EAAEc,cAAc,CAACC,UAAU,CACvE,CAAC;IACDL,IAAI,CAACM,cAAc,CAACF,cAAc,CAACT,IAAI,CAAC;IACxCK,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,GAAG3C,aAAa,CAAC,CAAC;;IAEjC;IACA,MAAM4C,cAAc,GAAGF,QAAQ,CAACG,GAAG,CAACpB,IAAI,IAAI;MACxC,IAAIA,IAAI,YAAYN,aAAa,EAAE;QAC/B,OAAOM,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,IAAI7C,iBAAiB,CAAC0C,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;MAClCI,KAAK,EAAE,IAAI,CAACO,OAAO,CAACZ,QAAQ,CAAC,CAAC;MAC9B8C,IAAI,EAAE;IACV,CAAC;EACL;EAEQC,0BAA0BA,CAACC,OAAoB,EAAE7C,KAAY,EAAe;IAChF;IACA,IAAI,CAACS,OAAO,CAACV,eAAe,CAACC,KAAK,CAAC;IACnC6C,OAAO,CAACC,YAAY,CAACzC,qBAAqB,EAAE,IAAI,CAACI,OAAO,CAACX,OAAO,CAAC,CAAC,CAAC;IACnE+C,OAAO,CAACnB,KAAK,CAACxB,KAAK,GAAG,IAAI,CAACO,OAAO,CAACZ,QAAQ,CAAC,CAAC;IAC7C,OAAOgD,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,MAAMlD,KAAK,GAAGT,KAAK,CAAC6D,IAAI,CAACF,MAAM,CAAClD,KAAK,CAAC;IACtC,IAAI,CAACS,OAAO,CAACV,eAAe,CAACC,KAAK,CAAC;IAEnCiD,GAAG,CAACH,YAAY,CAACzC,qBAAqB,EAAE,IAAI,CAACI,OAAO,CAACX,OAAO,CAAC,CAAC,CAAC;IAC/DmD,GAAG,CAACvB,KAAK,CAACxB,KAAK,GAAG,IAAI,CAACO,OAAO,CAACZ,QAAQ,CAAC,CAAC;IACzC,OAAOsD,SAAS;EACpB;EAEAE,aAAaA,CAAA,EAAG;IACZ,OAAO;MACHnD,KAAK,EAAE,IAAI,CAACO,OAAO,CAACZ,QAAQ,CAAC,CAAC;MAC9BoB,UAAU,EAAE,IAAI,CAACR,OAAO,CAACX,OAAO,CAAC;IACrC,CAAC;EACL;EAESwD,SAASA,CAACJ,MAAoB,EAAe;IAClD,MAAML,OAAO,GAAG,KAAK,CAACS,SAAS,CAACJ,MAAM,CAAC;IACvC,MAAMlD,KAAK,GAAGT,KAAK,CAAC6D,IAAI,CAACF,MAAM,CAAClD,KAAK,CAAC;IACtC,OAAO,IAAI,CAAC4C,0BAA0B,CAACC,OAAO,EAAE7C,KAAK,CAAC;EAC1D;AACJ;AAEA,OAAO,MAAMkC,oBAAoB,GAAGA,CAAC3B,IAAY,EAAEL,KAAsB,KAAoB;EACzF,OAAO,IAAII,aAAa,CAACC,IAAI,EAAEL,KAAK,CAAC;AACzC,CAAC;AAED,OAAO,MAAMqD,gBAAgB,GAAI3C,IAAiB,IAA4B;EAC1E,OAAOA,IAAI,YAAYN,aAAa;AACxC,CAAC;AAED,OAAO,SAAS8B,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":[]}
package/HeadingNode.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import type { EditorConfig, LexicalNode, NodeKey, RangeSelection, Spread, LexicalEditor, DOMExportOutput, DOMConversionMap } from "lexical";
2
2
  import type { HeadingTagType, SerializedHeadingNode as BaseSerializedHeadingNode } from "@lexical/rich-text";
3
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";
4
+ import { Theme } from "@webiny/lexical-theme";
5
+ import type { ParagraphNode } from "./ParagraphNode.js";
6
+ import type { TypographyStylesNode, ThemeStyleValue } from "./types.js";
7
7
  export type SerializeHeadingNode = Spread<{
8
8
  styles?: ThemeStyleValue[];
9
9
  styleId?: string;
@@ -32,7 +32,7 @@ export declare class HeadingNode extends BaseHeadingNode implements TypographySt
32
32
  exportJSON(): SerializeHeadingNode;
33
33
  insertNewAfter(selection?: RangeSelection, restoreSelection?: boolean): ParagraphNode | HeadingNode;
34
34
  collapseAtStart(): true;
35
- protected updateElementWithThemeClasses(element: HTMLElement, theme: EditorTheme): HTMLElement;
35
+ protected updateElementWithThemeClasses(element: HTMLElement, theme: Theme): HTMLElement;
36
36
  private setDefaultTypography;
37
37
  }
38
38
  export declare function $createHeadingNode(tag: HeadingTagType, styleId?: string): HeadingNode;
package/HeadingNode.js CHANGED
@@ -1,8 +1,7 @@
1
- import { $applyNodeReplacement, setNodeIndentFromDOM } from "lexical";
2
- import { addClassNamesToElement } from "@lexical/utils";
1
+ import { $applyNodeReplacement, setNodeIndentFromDOM, addClassNamesToElement } from "lexical";
3
2
  import { HeadingNode as BaseHeadingNode } from "@lexical/rich-text";
4
- import { findTypographyStyleByHtmlTag } from "@webiny/lexical-theme";
5
- import { getStyleId } from "./utils/getStyleId";
3
+ import { Theme } from "@webiny/lexical-theme";
4
+ import { getStyleId } from "./utils/getStyleId.js";
6
5
  function isGoogleDocsTitle(domNode) {
7
6
  if (domNode.nodeName.toLowerCase() === "span") {
8
7
  return domNode.style.fontSize === "26pt";
@@ -58,7 +57,8 @@ export class HeadingNode extends BaseHeadingNode {
58
57
  }
59
58
  createDOM(config) {
60
59
  const element = super.createDOM(config);
61
- return this.updateElementWithThemeClasses(element, config.theme);
60
+ const theme = Theme.from(config.theme);
61
+ return this.updateElementWithThemeClasses(element, theme);
62
62
  }
63
63
  exportDOM(editor) {
64
64
  const base = super.exportDOM(editor);
@@ -164,19 +164,22 @@ export class HeadingNode extends BaseHeadingNode {
164
164
  return true;
165
165
  }
166
166
  updateElementWithThemeClasses(element, theme) {
167
- if (!theme?.emotionMap) {
168
- return element;
169
- }
170
167
  if (!this.__styleId || !this.__className) {
171
- this.setDefaultTypography(theme.emotionMap);
168
+ this.setDefaultTypography(theme, this.__styleId);
172
169
  }
173
170
  if (this.__className) {
174
171
  addClassNamesToElement(element, this.__className);
175
172
  }
176
173
  return element;
177
174
  }
178
- setDefaultTypography(themeEmotionMap) {
179
- const typographyStyle = findTypographyStyleByHtmlTag(this.getTag(), themeEmotionMap);
175
+ setDefaultTypography(theme, styleId) {
176
+ let typographyStyle = theme.getTypographyByTag(this.getTag());
177
+ if (styleId) {
178
+ const byStyleId = theme.getTypographyById(styleId);
179
+ if (byStyleId) {
180
+ typographyStyle = byStyleId;
181
+ }
182
+ }
180
183
  if (typographyStyle) {
181
184
  this.__styleId = typographyStyle.id;
182
185
  this.__className = typographyStyle.className;
@@ -1 +1 @@
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":[]}
1
+ {"version":3,"names":["$applyNodeReplacement","setNodeIndentFromDOM","addClassNamesToElement","HeadingNode","BaseHeadingNode","Theme","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","theme","from","updateElementWithThemeClasses","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","setDefaultTypography","typographyStyle","getTypographyByTag","byStyleId","getTypographyById","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, addClassNamesToElement } from \"lexical\";\nimport type {\n HeadingTagType,\n SerializedHeadingNode as BaseSerializedHeadingNode\n} from \"@lexical/rich-text\";\nimport { HeadingNode as BaseHeadingNode } from \"@lexical/rich-text\";\nimport { Theme } from \"@webiny/lexical-theme\";\nimport type { ParagraphNode } from \"~/ParagraphNode.js\";\nimport type { TypographyStylesNode, ThemeStyleValue } from \"~/types.js\";\nimport { getStyleId } from \"~/utils/getStyleId.js\";\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\n const theme = Theme.from(config.theme);\n\n return this.updateElementWithThemeClasses(element, theme);\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: Theme): HTMLElement {\n if (!this.__styleId || !this.__className) {\n this.setDefaultTypography(theme, this.__styleId);\n }\n\n if (this.__className) {\n addClassNamesToElement(element, this.__className);\n }\n\n return element;\n }\n\n private setDefaultTypography(theme: Theme, styleId?: string) {\n let typographyStyle = theme.getTypographyByTag(this.getTag());\n if (styleId) {\n const byStyleId = theme.getTypographyById(styleId);\n if (byStyleId) {\n typographyStyle = byStyleId;\n }\n }\n\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":"AAUA,SAASA,qBAAqB,EAAEC,oBAAoB,EAAEC,sBAAsB,QAAQ,SAAS;AAK7F,SAASC,WAAW,IAAIC,eAAe,QAAQ,oBAAoB;AACnE,SAASC,KAAK,QAAQ,uBAAuB;AAG7C,SAASC,UAAU;AAkBnB,SAASC,iBAAiBA,CAACC,OAAoB,EAAE;EAC7C,IAAIA,OAAO,CAACC,QAAQ,CAACC,WAAW,CAAC,CAAC,KAAK,MAAM,EAAE;IAC3C,OAAOF,OAAO,CAACG,KAAK,CAACC,QAAQ,KAAK,MAAM;EAC5C;EACA,OAAO,KAAK;AAChB;AACA,SAASC,sBAAsBA,CAACC,OAAoB,EAAE;EAClD,MAAML,QAAQ,GAAGK,OAAO,CAACL,QAAQ,CAACC,WAAW,CAAC,CAAC;EAC/C,IAAIK,IAAI,GAAG,IAAI;EACf,IACIN,QAAQ,KAAK,IAAI,IACjBA,QAAQ,KAAK,IAAI,IACjBA,QAAQ,KAAK,IAAI,IACjBA,QAAQ,KAAK,IAAI,IACjBA,QAAQ,KAAK,IAAI,IACjBA,QAAQ,KAAK,IAAI,EACnB;IACEM,IAAI,GAAGC,kBAAkB,CAACP,QAAQ,CAAC;IACnC,IAAIK,OAAO,CAACH,KAAK,KAAK,IAAI,EAAE;MACxBV,oBAAoB,CAACa,OAAO,EAAEC,IAAI,CAAC;MACnCA,IAAI,CAACE,SAAS,CAACH,OAAO,CAACH,KAAK,CAACO,SAAgB,CAAC;IAClD;EACJ;EACA,OAAO;IACHH;EACJ,CAAC;AACL;AAEA,OAAO,MAAMZ,WAAW,SAASC,eAAe,CAAiC;EAI7Ee,WAAWA,CAACC,GAAmB,EAAEC,OAA2B,GAAG,CAAC,CAAC,EAAE;IAC/D,MAAM;MAAEC,OAAO;MAAEC,GAAG;MAAEC;IAAU,CAAC,GAAGH,OAAO;IAE3C,KAAK,CAACD,GAAG,EAAEG,GAAG,CAAC;IAEf,IAAI,CAACE,SAAS,GAAGH,OAAO;IACxB,IAAI,CAACI,WAAW,GAAGF,SAAS;EAChC;EAEAlB,UAAUA,CAAA,EAAuB;IAC7B,OAAO,IAAI,CAACmB,SAAS;EACzB;EAEAE,UAAUA,CAACL,OAA2B,EAAE;IACpC,IAAI,CAACG,SAAS,GAAGH,OAAO;EAC5B;EAEAM,YAAYA,CAACJ,SAA6B,EAAE;IACxC,IAAI,CAACE,WAAW,GAAGF,SAAS;EAChC;EAEAK,YAAYA,CAAA,EAAuB;IAC/B,OAAO,IAAI,CAACH,WAAW;EAC3B;EAEA,OAAgBI,OAAOA,CAAA,EAAW;IAC9B,OAAO,aAAa;EACxB;EAEA,OAAgBC,KAAKA,CAAChB,IAAiB,EAAe;IAClD,OAAO,IAAIZ,WAAW,CAACY,IAAI,CAACiB,MAAM,CAAC,CAAC,EAAE;MAClCT,GAAG,EAAER,IAAI,CAACkB,MAAM,CAAC,CAAC;MAClBX,OAAO,EAAEP,IAAI,CAACT,UAAU,CAAC,CAAC;MAC1BkB,SAAS,EAAET,IAAI,CAACc,YAAY,CAAC;IACjC,CAAC,CAAC;EACN;EAESK,SAASA,CAACC,MAAoB,EAAe;IAClD,MAAMrB,OAAO,GAAG,KAAK,CAACoB,SAAS,CAACC,MAAM,CAAC;IAEvC,MAAMC,KAAK,GAAG/B,KAAK,CAACgC,IAAI,CAACF,MAAM,CAACC,KAAK,CAAC;IAEtC,OAAO,IAAI,CAACE,6BAA6B,CAACxB,OAAO,EAAEsB,KAAK,CAAC;EAC7D;EAESG,SAASA,CAACC,MAAqB,EAAmB;IACvD,MAAMC,IAAI,GAAG,KAAK,CAACF,SAAS,CAACC,MAAM,CAAC;IAEpC,MAAM1B,OAAO,GAAG2B,IAAI,CAAC3B,OAAsB;IAC3C,IAAIA,OAAO,IAAI,IAAI,CAACY,WAAW,EAAE;MAC7BZ,OAAO,CAAC4B,SAAS,CAACC,GAAG,CAAC,IAAI,CAACjB,WAAW,CAAC;IAC3C;IAEA,OAAO;MAAE,GAAGe,IAAI;MAAE3B;IAAQ,CAAC;EAC/B;EAEA,OAAgB8B,SAASA,CAAA,EAA4B;IACjD,OAAO;MACHC,EAAE,EAAEA,CAAA,MAAO;QACPC,UAAU,EAAEjC,sBAAsB;QAClCkC,QAAQ,EAAE;MACd,CAAC,CAAC;MACFC,EAAE,EAAEA,CAAA,MAAO;QACPF,UAAU,EAAEjC,sBAAsB;QAClCkC,QAAQ,EAAE;MACd,CAAC,CAAC;MACFE,EAAE,EAAEA,CAAA,MAAO;QACPH,UAAU,EAAEjC,sBAAsB;QAClCkC,QAAQ,EAAE;MACd,CAAC,CAAC;MACFG,EAAE,EAAEA,CAAA,MAAO;QACPJ,UAAU,EAAEjC,sBAAsB;QAClCkC,QAAQ,EAAE;MACd,CAAC,CAAC;MACFI,EAAE,EAAEA,CAAA,MAAO;QACPL,UAAU,EAAEjC,sBAAsB;QAClCkC,QAAQ,EAAE;MACd,CAAC,CAAC;MACFK,EAAE,EAAEA,CAAA,MAAO;QACPN,UAAU,EAAEjC,sBAAsB;QAClCkC,QAAQ,EAAE;MACd,CAAC,CAAC;MACFM,CAAC,EAAEtC,IAAI,IAAI;QACP;QACA,MAAMuC,UAAU,GAAGvC,IAAI,CAACuC,UAAyB;QACjD,IAAIA,UAAU,KAAK,IAAI,IAAI/C,iBAAiB,CAAC+C,UAAU,CAAC,EAAE;UACtD,OAAO;YACHR,UAAU,EAAEA,CAAA,MAAO;cACf/B,IAAI,EAAE;YACV,CAAC,CAAC;YACFgC,QAAQ,EAAE;UACd,CAAC;QACL;QACA,OAAO,IAAI;MACf,CAAC;MACDQ,IAAI,EAAExC,IAAI,IAAI;QACV,IAAIR,iBAAiB,CAACQ,IAAI,CAAC,EAAE;UACzB,OAAO;YACH+B,UAAU,EAAEA,CAAA,KAAM;cACd,OAAO;gBACH/B,IAAI,EAAEC,kBAAkB,CAAC,IAAI;cACjC,CAAC;YACL,CAAC;YACD+B,QAAQ,EAAE;UACd,CAAC;QACL;QACA,OAAO,IAAI;MACf;IACJ,CAAC;EACL;EAEA,OAAgBS,UAAUA,CAACC,cAAoC,EAAmB;IAC9E,MAAM1C,IAAI,GAAGC,kBAAkB,CAACyC,cAAc,CAACrC,GAAG,CAAC;IACnDL,IAAI,CAACE,SAAS,CAACwC,cAAc,CAACC,MAAM,CAAC;IACrC3C,IAAI,CAAC4C,SAAS,CAACF,cAAc,CAACG,MAAM,CAAC;IACrC7C,IAAI,CAAC8C,YAAY,CAACJ,cAAc,CAACK,SAAS,CAAC;IAE3C,MAAMxC,OAAO,GAAGhB,UAAU,CAAC;MACvBgB,OAAO,EAAEmC,cAAc,CAACnC,OAAO;MAC/ByC,MAAM,EAAEN,cAAc,CAACM;IAC3B,CAAC,CAAC;IAEFhD,IAAI,CAACY,UAAU,CAACL,OAAO,CAAC;IACxBP,IAAI,CAACa,YAAY,CAAC6B,cAAc,CAACjC,SAAS,CAAC;IAE3C,OAAOT,IAAI;EACf;EAESiD,UAAUA,CAAA,EAAyB;IACxC,OAAO;MACH,GAAG,KAAK,CAACA,UAAU,CAAC,CAAC;MACrBC,IAAI,EAAE,aAAa;MACnB3C,OAAO,EAAE,IAAI,CAACG,SAAS;MACvBD,SAAS,EAAE,IAAI,CAACE;IACpB,CAAC;EACL;;EAEA;EACSwC,cAAcA,CACnBC,SAA0B,EAC1BC,gBAAgB,GAAG,IAAI,EACI;IAC3B;IACA,MAAMC,UAAU,GAAGrD,kBAAkB,CAAC,IAAI,CAACgB,MAAM,CAAC,CAAC,CAAC;IACpD,MAAM8B,SAAS,GAAG,IAAI,CAACQ,YAAY,CAAC,CAAC;IACrCD,UAAU,CAACR,YAAY,CAACC,SAAS,CAAC;IAClC,IAAI,CAACS,WAAW,CAACF,UAAU,EAAED,gBAAgB,CAAC;IAC9C,OAAOC,UAAU;EACrB;EAESG,eAAeA,CAAA,EAAS;IAC7B,MAAMH,UAAU,GAAGrD,kBAAkB,CAAC,IAAI,CAACgB,MAAM,CAAC,CAAC,CAAC;IACpD,MAAMyC,QAAQ,GAAG,IAAI,CAACC,WAAW,CAAC,CAAC;IACnCD,QAAQ,CAACE,OAAO,CAACC,KAAK,IAAIP,UAAU,CAACQ,MAAM,CAACD,KAAK,CAAC,CAAC;IACnD,IAAI,CAACE,OAAO,CAACT,UAAU,CAAC;IACxB,OAAO,IAAI;EACf;EAEU/B,6BAA6BA,CAACxB,OAAoB,EAAEsB,KAAY,EAAe;IACrF,IAAI,CAAC,IAAI,CAACX,SAAS,IAAI,CAAC,IAAI,CAACC,WAAW,EAAE;MACtC,IAAI,CAACqD,oBAAoB,CAAC3C,KAAK,EAAE,IAAI,CAACX,SAAS,CAAC;IACpD;IAEA,IAAI,IAAI,CAACC,WAAW,EAAE;MAClBxB,sBAAsB,CAACY,OAAO,EAAE,IAAI,CAACY,WAAW,CAAC;IACrD;IAEA,OAAOZ,OAAO;EAClB;EAEQiE,oBAAoBA,CAAC3C,KAAY,EAAEd,OAAgB,EAAE;IACzD,IAAI0D,eAAe,GAAG5C,KAAK,CAAC6C,kBAAkB,CAAC,IAAI,CAACjD,MAAM,CAAC,CAAC,CAAC;IAC7D,IAAIV,OAAO,EAAE;MACT,MAAM4D,SAAS,GAAG9C,KAAK,CAAC+C,iBAAiB,CAAC7D,OAAO,CAAC;MAClD,IAAI4D,SAAS,EAAE;QACXF,eAAe,GAAGE,SAAS;MAC/B;IACJ;IAEA,IAAIF,eAAe,EAAE;MACjB,IAAI,CAACvD,SAAS,GAAGuD,eAAe,CAACI,EAAE;MACnC,IAAI,CAAC1D,WAAW,GAAGsD,eAAe,CAACxD,SAAS;IAChD;EACJ;AACJ;AAEA,OAAO,SAASR,kBAAkBA,CAACI,GAAmB,EAAEE,OAAgB,EAAe;EACnF,OAAOtB,qBAAqB,CAAC,IAAIG,WAAW,CAACiB,GAAG,EAAE;IAAEE;EAAQ,CAAC,CAAC,CAAC;AACnE;AAEA,OAAO,SAAS+D,cAAcA,CAACtE,IAAoC,EAAuB;EACtF,OAAOA,IAAI,YAAYZ,WAAW;AACtC","ignoreList":[]}
package/ImageNode.d.ts CHANGED
@@ -1,13 +1,10 @@
1
- /// <reference types="react" />
2
- import type { DOMConversionMap, DOMExportOutput, EditorConfig, LexicalEditor, LexicalNode, NodeKey, SerializedEditor, SerializedLexicalNode, Spread } from "lexical";
1
+ import type { DOMConversionMap, DOMExportOutput, EditorConfig, LexicalNode, NodeKey, SerializedLexicalNode, Spread } from "lexical";
3
2
  import { DecoratorNode } from "lexical";
4
3
  export type SerializedImageNode = Spread<{
5
4
  id: string;
6
5
  altText: string;
7
- caption: SerializedEditor;
8
6
  height?: number;
9
7
  maxWidth: number;
10
- showCaption: boolean;
11
8
  src: string;
12
9
  width?: number;
13
10
  }, SerializedLexicalNode>;
@@ -18,9 +15,6 @@ export interface ImageNodeProps {
18
15
  maxWidth: number;
19
16
  width?: "inherit" | number;
20
17
  height?: "inherit" | number;
21
- showCaption?: boolean;
22
- caption?: LexicalEditor;
23
- captionsEnabled?: boolean;
24
18
  }
25
19
  export declare class ImageNode extends DecoratorNode<JSX.Element> {
26
20
  __id: string;
@@ -29,9 +23,6 @@ export declare class ImageNode extends DecoratorNode<JSX.Element> {
29
23
  __width: "inherit" | number;
30
24
  __height: "inherit" | number;
31
25
  __maxWidth: number;
32
- __showCaption: boolean;
33
- __caption: LexicalEditor;
34
- __captionsEnabled: boolean;
35
26
  static getType(): string;
36
27
  static clone(node: ImageNode): ImageNode;
37
28
  static importJSON(serializedNode: SerializedImageNode): ImageNode;
@@ -45,7 +36,6 @@ export declare class ImageNode extends DecoratorNode<JSX.Element> {
45
36
  constructor(props: ImageNodeProps, key?: NodeKey);
46
37
  exportJSON(): SerializedImageNode;
47
38
  setWidthAndHeight(width: "inherit" | number, height: "inherit" | number): void;
48
- setShowCaption(showCaption: boolean): void;
49
39
  createDOM(config: EditorConfig): HTMLElement;
50
40
  updateDOM(): false;
51
41
  getSrc(): string;
package/ImageNode.js CHANGED
@@ -6,13 +6,11 @@
6
6
  *
7
7
  */
8
8
  import React, { Suspense } from "react";
9
- import { $applyNodeReplacement, createEditor, DecoratorNode } from "lexical";
9
+ import { $applyNodeReplacement, DecoratorNode } from "lexical";
10
10
  const ImageComponent = /*#__PURE__*/React.lazy(() => {
11
- return import(/* webpackChunkName: "LexicalNodesComponentsImageNodeImageComponent" */"./components/ImageNode/ImageComponent");
11
+ return import(/* webpackChunkName: "lexical-image" */"./components/ImageNode/ImageComponent.js");
12
12
  });
13
13
  export class ImageNode extends DecoratorNode {
14
- // Captions cannot yet be used within editor cells
15
-
16
14
  static getType() {
17
15
  return "wby-image";
18
16
  }
@@ -23,10 +21,7 @@ export class ImageNode extends DecoratorNode {
23
21
  altText: node.__altText,
24
22
  maxWidth: node.__maxWidth,
25
23
  width: node.__width,
26
- height: node.__height,
27
- showCaption: node.__showCaption,
28
- caption: node.__caption,
29
- captionsEnabled: node.__captionsEnabled
24
+ height: node.__height
30
25
  }, node.__key);
31
26
  }
32
27
  static importJSON(serializedNode) {
@@ -36,25 +31,16 @@ export class ImageNode extends DecoratorNode {
36
31
  height,
37
32
  width,
38
33
  maxWidth,
39
- caption,
40
- src,
41
- showCaption
34
+ src
42
35
  } = serializedNode;
43
- const node = $createImageNode({
36
+ return $createImageNode({
44
37
  id,
45
38
  altText,
46
39
  height,
47
40
  maxWidth,
48
- showCaption,
49
41
  src,
50
42
  width
51
43
  });
52
- const nestedEditor = node.__caption;
53
- const editorState = nestedEditor.parseEditorState(caption.editorState);
54
- if (!editorState.isEmpty()) {
55
- nestedEditor.setEditorState(editorState);
56
- }
57
- return node;
58
44
  }
59
45
  exportDOM() {
60
46
  const element = document.createElement("img");
@@ -89,21 +75,16 @@ export class ImageNode extends DecoratorNode {
89
75
  this.__maxWidth = props.maxWidth;
90
76
  this.__width = props.width || "inherit";
91
77
  this.__height = props.height || "inherit";
92
- this.__showCaption = props.showCaption || false;
93
- this.__caption = props.caption || createEditor();
94
- this.__captionsEnabled = props.captionsEnabled || props.captionsEnabled === undefined;
95
78
  }
96
79
  exportJSON() {
97
80
  return {
98
81
  id: this.__id,
82
+ src: this.getSrc(),
99
83
  altText: this.getAltText(),
100
- caption: this.__caption.toJSON(),
84
+ width: this.__width === "inherit" ? 0 : this.__width,
101
85
  height: this.__height === "inherit" ? 0 : this.__height,
102
86
  maxWidth: this.__maxWidth,
103
- showCaption: this.__showCaption,
104
- src: this.getSrc(),
105
- type: "wby-image",
106
- width: this.__width === "inherit" ? 0 : this.__width,
87
+ type: this.getType(),
107
88
  version: 1
108
89
  };
109
90
  }
@@ -112,10 +93,6 @@ export class ImageNode extends DecoratorNode {
112
93
  writable.__width = width;
113
94
  writable.__height = height;
114
95
  }
115
- setShowCaption(showCaption) {
116
- const writable = this.getWritable();
117
- writable.__showCaption = showCaption;
118
- }
119
96
 
120
97
  // View
121
98
  createDOM(config) {
@@ -147,9 +124,6 @@ export class ImageNode extends DecoratorNode {
147
124
  height: this.__height,
148
125
  maxWidth: this.__maxWidth,
149
126
  nodeKey: this.getKey(),
150
- showCaption: this.__showCaption,
151
- caption: this.__caption,
152
- captionsEnabled: this.__captionsEnabled,
153
127
  resizable: true
154
128
  }));
155
129
  }
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 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":[]}
1
+ {"version":3,"names":["React","Suspense","$applyNodeReplacement","DecoratorNode","ImageComponent","lazy","ImageNode","getType","clone","node","id","__id","src","__src","altText","__altText","maxWidth","__maxWidth","width","__width","height","__height","__key","importJSON","serializedNode","$createImageNode","exportDOM","element","document","createElement","setAttribute","toString","importDOM","constructor","props","key","exportJSON","getSrc","getAltText","type","version","setWidthAndHeight","writable","getWritable","createDOM","config","span","theme","className","image","undefined","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 LexicalNode,\n NodeKey,\n SerializedLexicalNode,\n Spread\n} from \"lexical\";\nimport { $applyNodeReplacement, DecoratorNode } from \"lexical\";\n\nconst ImageComponent = React.lazy(() => {\n return import(\n /* webpackChunkName: \"lexical-image\" */\n \"./components/ImageNode/ImageComponent.js\"\n );\n});\n\nexport type SerializedImageNode = Spread<\n {\n id: string;\n altText: string;\n height?: number;\n maxWidth: number;\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}\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\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 },\n node.__key\n );\n }\n\n static override importJSON(serializedNode: SerializedImageNode): ImageNode {\n const { id, altText, height, width, maxWidth, src } = serializedNode;\n return $createImageNode({\n id,\n altText,\n height,\n maxWidth,\n src,\n width\n });\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 }\n\n override exportJSON(): SerializedImageNode {\n return {\n id: this.__id,\n src: this.getSrc(),\n altText: this.getAltText(),\n width: this.__width === \"inherit\" ? 0 : this.__width,\n height: this.__height === \"inherit\" ? 0 : this.__height,\n maxWidth: this.__maxWidth,\n type: this.getType(),\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 // 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 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.js CHANGED
@@ -7,8 +7,7 @@
7
7
  *
8
8
  */
9
9
 
10
- import { addClassNamesToElement, isHTMLAnchorElement } from "@lexical/utils";
11
- import { $applyNodeReplacement, $isElementNode, $isRangeSelection, createCommand, ElementNode } from "lexical";
10
+ import { $applyNodeReplacement, $isElementNode, $isRangeSelection, createCommand, ElementNode, addClassNamesToElement, isHTMLAnchorElement } from "lexical";
12
11
  const SUPPORTED_URL_PROTOCOLS = new Set(["http:", "https:", "mailto:", "sms:", "tel:"]);
13
12
 
14
13
  /** @noInheritDoc */
@@ -128,7 +127,6 @@ export class LinkNode extends ElementNode {
128
127
  sanitizeUrl(url) {
129
128
  try {
130
129
  const parsedUrl = new URL(url);
131
- // eslint-disable-next-line no-script-url
132
130
  if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {
133
131
  return "about:blank";
134
132
  }
package/LinkNode.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["addClassNamesToElement","isHTMLAnchorElement","$applyNodeReplacement","$isElementNode","$isRangeSelection","createCommand","ElementNode","SUPPORTED_URL_PROTOCOLS","Set","LinkNode","getType","clone","node","__url","rel","__rel","target","__target","title","__title","alt","__alt","__key","constructor","url","attributes","key","createDOM","config","element","document","createElement","href","sanitizeUrl","setAttribute","theme","link","updateDOM","prevNode","anchor","removeAttribute","importDOM","a","conversion","convertAnchorElement","priority","importJSON","serializedNode","$createLinkNode","setFormat","format","setIndent","indent","setDirection","direction","parsedUrl","URL","has","protocol","exportJSON","getRel","getTarget","getTitle","getAlt","type","getURL","getLatest","setURL","writable","getWritable","setTarget","setRel","setTitle","setAlt","text","insertNewAfter","selection","restoreSelection","getParentOrThrow","linkNode","append","canInsertTextBefore","canInsertTextAfter","canBeEmpty","isInline","extractWithChild","_","anchorNode","getNode","focusNode","focus","isParentOf","getTextContent","length","domNode","content","textContent","children","getAttribute","$isLinkNode","AutoLinkNode","$createAutoLinkNode","$isAutoLinkNode","TOGGLE_LINK_COMMAND"],"sources":["LinkNode.ts"],"sourcesContent":["/** @module @lexical/link */\n/**\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 */\n\nimport type {\n DOMConversionMap,\n DOMConversionOutput,\n EditorConfig,\n RangeSelection,\n LexicalCommand,\n LexicalNode,\n NodeKey,\n SerializedElementNode,\n Spread\n} from \"lexical\";\n\nimport { addClassNamesToElement, isHTMLAnchorElement } from \"@lexical/utils\";\nimport {\n $applyNodeReplacement,\n $isElementNode,\n $isRangeSelection,\n createCommand,\n ElementNode\n} from \"lexical\";\n\nexport type LinkAttributes = {\n rel?: null | string;\n target?: null | string;\n title?: null | string;\n alt?: null | string;\n};\n\ndeclare global {\n interface HTMLAnchorElement {\n alt?: string;\n }\n}\n\nexport type SerializedLinkNode = Spread<\n {\n url: string;\n },\n Spread<LinkAttributes, SerializedElementNode>\n>;\n\nconst SUPPORTED_URL_PROTOCOLS = new Set([\"http:\", \"https:\", \"mailto:\", \"sms:\", \"tel:\"]);\n\n/** @noInheritDoc */\nexport class LinkNode extends ElementNode {\n /** @internal */\n __url: string;\n /** @internal */\n __target: null | string;\n /** @internal */\n __rel: null | string;\n /** @internal */\n __title: null | string;\n /** @internal */\n __alt: null | string;\n\n static override getType(): string {\n return \"wby-link\";\n }\n\n static override clone(node: LinkNode): LinkNode {\n return new LinkNode(\n node.__url,\n { rel: node.__rel, target: node.__target, title: node.__title, alt: node.__alt },\n node.__key\n );\n }\n\n constructor(url: string, attributes: LinkAttributes = {}, key?: NodeKey) {\n super(key);\n const { target = null, rel = null, title = null, alt = null } = attributes;\n this.__url = url;\n this.__target = target;\n this.__rel = rel;\n this.__title = title;\n this.__alt = alt;\n }\n\n override createDOM(config: EditorConfig): HTMLAnchorElement {\n const element = document.createElement(\"a\") as HTMLAnchorElement;\n element.href = this.sanitizeUrl(this.__url);\n if (this.__target !== null) {\n element.target = this.__target;\n }\n if (this.__rel !== null) {\n element.rel = this.__rel;\n }\n if (this.__title !== null) {\n element.title = this.__title;\n }\n if (this.__alt) {\n element.setAttribute(\"alt\", this.__alt);\n }\n addClassNamesToElement(element, config.theme.link);\n return element;\n }\n\n override updateDOM(prevNode: LinkNode, anchor: HTMLAnchorElement): boolean {\n const url = this.__url;\n const target = this.__target;\n const rel = this.__rel;\n const title = this.__title;\n const alt = this.__alt;\n\n if (url !== prevNode.__url) {\n anchor.href = url;\n }\n\n if (target !== prevNode.__target) {\n if (target) {\n anchor.target = target;\n } else {\n anchor.removeAttribute(\"target\");\n }\n }\n\n if (rel !== prevNode.__rel) {\n if (rel) {\n anchor.rel = rel;\n } else {\n anchor.removeAttribute(\"rel\");\n }\n }\n\n if (title !== prevNode.__title) {\n if (title) {\n anchor.title = title;\n } else {\n anchor.removeAttribute(\"title\");\n }\n }\n\n if (alt !== prevNode.__alt) {\n if (alt) {\n anchor.setAttribute(\"alt\", alt);\n } else {\n anchor.removeAttribute(\"alt\");\n }\n }\n\n return false;\n }\n\n static override importDOM(): DOMConversionMap | null {\n return {\n a: () => ({\n conversion: convertAnchorElement,\n priority: 1\n })\n };\n }\n\n static override importJSON(\n serializedNode: SerializedLinkNode | SerializedAutoLinkNode\n ): LinkNode {\n const node = $createLinkNode(serializedNode.url, {\n rel: serializedNode.rel,\n target: serializedNode.target,\n title: serializedNode.title,\n alt: serializedNode.alt\n });\n node.setFormat(serializedNode.format);\n node.setIndent(serializedNode.indent);\n node.setDirection(serializedNode.direction);\n return node;\n }\n\n sanitizeUrl(url: string): string {\n try {\n const parsedUrl = new URL(url);\n // eslint-disable-next-line no-script-url\n if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {\n return \"about:blank\";\n }\n } catch {\n return url;\n }\n return url;\n }\n\n override exportJSON(): SerializedLinkNode | SerializedAutoLinkNode {\n return {\n ...super.exportJSON(),\n rel: this.getRel(),\n target: this.getTarget(),\n title: this.getTitle(),\n alt: this.getAlt(),\n type: \"wby-link\",\n url: this.getURL()\n };\n }\n\n getURL(): string {\n return this.getLatest().__url;\n }\n\n setURL(url: string): void {\n const writable = this.getWritable();\n writable.__url = url;\n }\n\n getTarget(): null | string {\n return this.getLatest().__target;\n }\n\n setTarget(target: null | string): void {\n const writable = this.getWritable();\n writable.__target = target;\n }\n\n getRel(): null | string {\n return this.getLatest().__rel;\n }\n\n setRel(rel: null | string): void {\n const writable = this.getWritable();\n writable.__rel = rel;\n }\n\n getTitle(): null | string {\n return this.getLatest().__title;\n }\n\n setTitle(title: null | string): void {\n const writable = this.getWritable();\n writable.__title = title;\n }\n\n getAlt(): string | null {\n return this.__alt;\n }\n\n setAlt(text: string | null): void {\n const writable = super.getWritable();\n writable.__alt = text;\n }\n\n override insertNewAfter(\n selection: RangeSelection,\n restoreSelection = true\n ): null | ElementNode {\n const element = this.getParentOrThrow().insertNewAfter(selection, restoreSelection);\n if ($isElementNode(element)) {\n const linkNode = $createLinkNode(this.__url, {\n rel: this.__rel,\n target: this.__target,\n title: this.__title,\n alt: this.__alt\n });\n element.append(linkNode);\n return linkNode;\n }\n return null;\n }\n\n override canInsertTextBefore(): false {\n return false;\n }\n\n override canInsertTextAfter(): false {\n return false;\n }\n\n override canBeEmpty(): false {\n return false;\n }\n\n override isInline(): true {\n return true;\n }\n\n override extractWithChild(_: LexicalNode, selection: RangeSelection): boolean {\n if (!$isRangeSelection(selection)) {\n return false;\n }\n\n const anchorNode = selection.anchor.getNode();\n const focusNode = selection.focus.getNode();\n\n return (\n this.isParentOf(anchorNode) &&\n this.isParentOf(focusNode) &&\n selection.getTextContent().length > 0\n );\n }\n}\n\nfunction convertAnchorElement(domNode: Node): DOMConversionOutput {\n let node = null;\n if (isHTMLAnchorElement(domNode)) {\n const content = domNode.textContent;\n if ((content !== null && content !== \"\") || domNode.children.length > 0) {\n node = $createLinkNode(domNode.getAttribute(\"href\") || \"\", {\n rel: domNode.getAttribute(\"rel\"),\n target: domNode.getAttribute(\"target\"),\n title: domNode.getAttribute(\"title\"),\n alt: domNode.getAttribute(\"alt\")\n });\n }\n }\n return { node };\n}\n\n/**\n * Takes a URL and creates a LinkNode.\n * @param url - The URL the LinkNode should direct to.\n * @param attributes - Optional HTML a tag attributes { target, rel, title }\n * @returns The LinkNode.\n */\nexport function $createLinkNode(url: string, attributes?: LinkAttributes): LinkNode {\n return $applyNodeReplacement(new LinkNode(url, attributes));\n}\n\n/**\n * Determines if node is a LinkNode.\n * @param node - The node to be checked.\n * @returns true if node is a LinkNode, false otherwise.\n */\nexport function $isLinkNode(node: LexicalNode | null | undefined): node is LinkNode {\n return node instanceof LinkNode;\n}\n\nexport type SerializedAutoLinkNode = SerializedLinkNode;\n\n// Custom node type to override `canInsertTextAfter` that will\n// allow typing within the link\nexport class AutoLinkNode extends LinkNode {\n static override getType(): string {\n return \"autolink\";\n }\n\n static override clone(node: AutoLinkNode): AutoLinkNode {\n return new AutoLinkNode(\n node.__url,\n { rel: node.__rel, target: node.__target, title: node.__title },\n node.__key\n );\n }\n\n static override importJSON(serializedNode: SerializedAutoLinkNode): AutoLinkNode {\n const node = $createAutoLinkNode(serializedNode.url, {\n rel: serializedNode.rel,\n target: serializedNode.target,\n title: serializedNode.title\n });\n node.setFormat(serializedNode.format);\n node.setIndent(serializedNode.indent);\n node.setDirection(serializedNode.direction);\n return node;\n }\n\n static override importDOM(): null {\n // TODO: Should link node should handle the import over autolink?\n return null;\n }\n\n override exportJSON(): SerializedAutoLinkNode {\n return {\n ...super.exportJSON(),\n type: \"autolink\"\n };\n }\n\n override insertNewAfter(\n selection: RangeSelection,\n restoreSelection = true\n ): null | ElementNode {\n const element = this.getParentOrThrow().insertNewAfter(selection, restoreSelection);\n if ($isElementNode(element)) {\n const linkNode = $createAutoLinkNode(this.__url, {\n rel: this.__rel,\n target: this.__target,\n title: this.__title\n });\n element.append(linkNode);\n return linkNode;\n }\n return null;\n }\n}\n\n/**\n * Takes a URL and creates an AutoLinkNode. AutoLinkNodes are generally automatically generated\n * during typing, which is especially useful when a button to generate a LinkNode is not practical.\n * @param url - The URL the LinkNode should direct to.\n * @param attributes - Optional HTML a tag attributes. { target, rel, title }\n * @returns The LinkNode.\n */\nexport function $createAutoLinkNode(url: string, attributes?: LinkAttributes): AutoLinkNode {\n return $applyNodeReplacement(new AutoLinkNode(url, attributes));\n}\n\n/**\n * Determines if node is an AutoLinkNode.\n * @param node - The node to be checked.\n * @returns true if node is an AutoLinkNode, false otherwise.\n */\nexport function $isAutoLinkNode(node: LexicalNode | null | undefined): node is AutoLinkNode {\n return node instanceof AutoLinkNode;\n}\n\nexport const TOGGLE_LINK_COMMAND: LexicalCommand<\n string | ({ url: string } & LinkAttributes) | null\n> = createCommand(\"TOGGLE_LINK_COMMAND\");\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["$applyNodeReplacement","$isElementNode","$isRangeSelection","createCommand","ElementNode","addClassNamesToElement","isHTMLAnchorElement","SUPPORTED_URL_PROTOCOLS","Set","LinkNode","getType","clone","node","__url","rel","__rel","target","__target","title","__title","alt","__alt","__key","constructor","url","attributes","key","createDOM","config","element","document","createElement","href","sanitizeUrl","setAttribute","theme","link","updateDOM","prevNode","anchor","removeAttribute","importDOM","a","conversion","convertAnchorElement","priority","importJSON","serializedNode","$createLinkNode","setFormat","format","setIndent","indent","setDirection","direction","parsedUrl","URL","has","protocol","exportJSON","getRel","getTarget","getTitle","getAlt","type","getURL","getLatest","setURL","writable","getWritable","setTarget","setRel","setTitle","setAlt","text","insertNewAfter","selection","restoreSelection","getParentOrThrow","linkNode","append","canInsertTextBefore","canInsertTextAfter","canBeEmpty","isInline","extractWithChild","_","anchorNode","getNode","focusNode","focus","isParentOf","getTextContent","length","domNode","content","textContent","children","getAttribute","$isLinkNode","AutoLinkNode","$createAutoLinkNode","$isAutoLinkNode","TOGGLE_LINK_COMMAND"],"sources":["LinkNode.ts"],"sourcesContent":["/** @module @lexical/link */\n/**\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 */\n\nimport type {\n DOMConversionMap,\n DOMConversionOutput,\n EditorConfig,\n RangeSelection,\n LexicalCommand,\n LexicalNode,\n NodeKey,\n SerializedElementNode,\n Spread\n} from \"lexical\";\n\nimport {\n $applyNodeReplacement,\n $isElementNode,\n $isRangeSelection,\n createCommand,\n ElementNode,\n addClassNamesToElement,\n isHTMLAnchorElement\n} from \"lexical\";\n\nexport type LinkAttributes = {\n rel?: null | string;\n target?: null | string;\n title?: null | string;\n alt?: null | string;\n};\n\ndeclare global {\n interface HTMLAnchorElement {\n alt?: string;\n }\n}\n\nexport type SerializedLinkNode = Spread<\n {\n url: string;\n },\n Spread<LinkAttributes, SerializedElementNode>\n>;\n\nconst SUPPORTED_URL_PROTOCOLS = new Set([\"http:\", \"https:\", \"mailto:\", \"sms:\", \"tel:\"]);\n\n/** @noInheritDoc */\nexport class LinkNode extends ElementNode {\n /** @internal */\n __url: string;\n /** @internal */\n __target: null | string;\n /** @internal */\n __rel: null | string;\n /** @internal */\n __title: null | string;\n /** @internal */\n __alt: null | string;\n\n static override getType(): string {\n return \"wby-link\";\n }\n\n static override clone(node: LinkNode): LinkNode {\n return new LinkNode(\n node.__url,\n { rel: node.__rel, target: node.__target, title: node.__title, alt: node.__alt },\n node.__key\n );\n }\n\n constructor(url: string, attributes: LinkAttributes = {}, key?: NodeKey) {\n super(key);\n const { target = null, rel = null, title = null, alt = null } = attributes;\n this.__url = url;\n this.__target = target;\n this.__rel = rel;\n this.__title = title;\n this.__alt = alt;\n }\n\n override createDOM(config: EditorConfig): HTMLAnchorElement {\n const element = document.createElement(\"a\") as HTMLAnchorElement;\n element.href = this.sanitizeUrl(this.__url);\n if (this.__target !== null) {\n element.target = this.__target;\n }\n if (this.__rel !== null) {\n element.rel = this.__rel;\n }\n if (this.__title !== null) {\n element.title = this.__title;\n }\n if (this.__alt) {\n element.setAttribute(\"alt\", this.__alt);\n }\n addClassNamesToElement(element, config.theme.link);\n return element;\n }\n\n override updateDOM(prevNode: LinkNode, anchor: HTMLAnchorElement): boolean {\n const url = this.__url;\n const target = this.__target;\n const rel = this.__rel;\n const title = this.__title;\n const alt = this.__alt;\n\n if (url !== prevNode.__url) {\n anchor.href = url;\n }\n\n if (target !== prevNode.__target) {\n if (target) {\n anchor.target = target;\n } else {\n anchor.removeAttribute(\"target\");\n }\n }\n\n if (rel !== prevNode.__rel) {\n if (rel) {\n anchor.rel = rel;\n } else {\n anchor.removeAttribute(\"rel\");\n }\n }\n\n if (title !== prevNode.__title) {\n if (title) {\n anchor.title = title;\n } else {\n anchor.removeAttribute(\"title\");\n }\n }\n\n if (alt !== prevNode.__alt) {\n if (alt) {\n anchor.setAttribute(\"alt\", alt);\n } else {\n anchor.removeAttribute(\"alt\");\n }\n }\n\n return false;\n }\n\n static override importDOM(): DOMConversionMap | null {\n return {\n a: () => ({\n conversion: convertAnchorElement,\n priority: 1\n })\n };\n }\n\n static override importJSON(\n serializedNode: SerializedLinkNode | SerializedAutoLinkNode\n ): LinkNode {\n const node = $createLinkNode(serializedNode.url, {\n rel: serializedNode.rel,\n target: serializedNode.target,\n title: serializedNode.title,\n alt: serializedNode.alt\n });\n node.setFormat(serializedNode.format);\n node.setIndent(serializedNode.indent);\n node.setDirection(serializedNode.direction);\n return node;\n }\n\n sanitizeUrl(url: string): string {\n try {\n const parsedUrl = new URL(url);\n\n if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {\n return \"about:blank\";\n }\n } catch {\n return url;\n }\n return url;\n }\n\n override exportJSON(): SerializedLinkNode | SerializedAutoLinkNode {\n return {\n ...super.exportJSON(),\n rel: this.getRel(),\n target: this.getTarget(),\n title: this.getTitle(),\n alt: this.getAlt(),\n type: \"wby-link\",\n url: this.getURL()\n };\n }\n\n getURL(): string {\n return this.getLatest().__url;\n }\n\n setURL(url: string): void {\n const writable = this.getWritable();\n writable.__url = url;\n }\n\n getTarget(): null | string {\n return this.getLatest().__target;\n }\n\n setTarget(target: null | string): void {\n const writable = this.getWritable();\n writable.__target = target;\n }\n\n getRel(): null | string {\n return this.getLatest().__rel;\n }\n\n setRel(rel: null | string): void {\n const writable = this.getWritable();\n writable.__rel = rel;\n }\n\n getTitle(): null | string {\n return this.getLatest().__title;\n }\n\n setTitle(title: null | string): void {\n const writable = this.getWritable();\n writable.__title = title;\n }\n\n getAlt(): string | null {\n return this.__alt;\n }\n\n setAlt(text: string | null): void {\n const writable = super.getWritable();\n writable.__alt = text;\n }\n\n override insertNewAfter(\n selection: RangeSelection,\n restoreSelection = true\n ): null | ElementNode {\n const element = this.getParentOrThrow().insertNewAfter(selection, restoreSelection);\n if ($isElementNode(element)) {\n const linkNode = $createLinkNode(this.__url, {\n rel: this.__rel,\n target: this.__target,\n title: this.__title,\n alt: this.__alt\n });\n element.append(linkNode);\n return linkNode;\n }\n return null;\n }\n\n override canInsertTextBefore(): false {\n return false;\n }\n\n override canInsertTextAfter(): false {\n return false;\n }\n\n override canBeEmpty(): false {\n return false;\n }\n\n override isInline(): true {\n return true;\n }\n\n override extractWithChild(_: LexicalNode, selection: RangeSelection): boolean {\n if (!$isRangeSelection(selection)) {\n return false;\n }\n\n const anchorNode = selection.anchor.getNode();\n const focusNode = selection.focus.getNode();\n\n return (\n this.isParentOf(anchorNode) &&\n this.isParentOf(focusNode) &&\n selection.getTextContent().length > 0\n );\n }\n}\n\nfunction convertAnchorElement(domNode: Node): DOMConversionOutput {\n let node = null;\n if (isHTMLAnchorElement(domNode)) {\n const content = domNode.textContent;\n if ((content !== null && content !== \"\") || domNode.children.length > 0) {\n node = $createLinkNode(domNode.getAttribute(\"href\") || \"\", {\n rel: domNode.getAttribute(\"rel\"),\n target: domNode.getAttribute(\"target\"),\n title: domNode.getAttribute(\"title\"),\n alt: domNode.getAttribute(\"alt\")\n });\n }\n }\n return { node };\n}\n\n/**\n * Takes a URL and creates a LinkNode.\n * @param url - The URL the LinkNode should direct to.\n * @param attributes - Optional HTML a tag attributes { target, rel, title }\n * @returns The LinkNode.\n */\nexport function $createLinkNode(url: string, attributes?: LinkAttributes): LinkNode {\n return $applyNodeReplacement(new LinkNode(url, attributes));\n}\n\n/**\n * Determines if node is a LinkNode.\n * @param node - The node to be checked.\n * @returns true if node is a LinkNode, false otherwise.\n */\nexport function $isLinkNode(node: LexicalNode | null | undefined): node is LinkNode {\n return node instanceof LinkNode;\n}\n\nexport type SerializedAutoLinkNode = SerializedLinkNode;\n\n// Custom node type to override `canInsertTextAfter` that will\n// allow typing within the link\nexport class AutoLinkNode extends LinkNode {\n static override getType(): string {\n return \"autolink\";\n }\n\n static override clone(node: AutoLinkNode): AutoLinkNode {\n return new AutoLinkNode(\n node.__url,\n { rel: node.__rel, target: node.__target, title: node.__title },\n node.__key\n );\n }\n\n static override importJSON(serializedNode: SerializedAutoLinkNode): AutoLinkNode {\n const node = $createAutoLinkNode(serializedNode.url, {\n rel: serializedNode.rel,\n target: serializedNode.target,\n title: serializedNode.title\n });\n node.setFormat(serializedNode.format);\n node.setIndent(serializedNode.indent);\n node.setDirection(serializedNode.direction);\n return node;\n }\n\n static override importDOM(): null {\n // TODO: Should link node should handle the import over autolink?\n return null;\n }\n\n override exportJSON(): SerializedAutoLinkNode {\n return {\n ...super.exportJSON(),\n type: \"autolink\"\n };\n }\n\n override insertNewAfter(\n selection: RangeSelection,\n restoreSelection = true\n ): null | ElementNode {\n const element = this.getParentOrThrow().insertNewAfter(selection, restoreSelection);\n if ($isElementNode(element)) {\n const linkNode = $createAutoLinkNode(this.__url, {\n rel: this.__rel,\n target: this.__target,\n title: this.__title\n });\n element.append(linkNode);\n return linkNode;\n }\n return null;\n }\n}\n\n/**\n * Takes a URL and creates an AutoLinkNode. AutoLinkNodes are generally automatically generated\n * during typing, which is especially useful when a button to generate a LinkNode is not practical.\n * @param url - The URL the LinkNode should direct to.\n * @param attributes - Optional HTML a tag attributes. { target, rel, title }\n * @returns The LinkNode.\n */\nexport function $createAutoLinkNode(url: string, attributes?: LinkAttributes): AutoLinkNode {\n return $applyNodeReplacement(new AutoLinkNode(url, attributes));\n}\n\n/**\n * Determines if node is an AutoLinkNode.\n * @param node - The node to be checked.\n * @returns true if node is an AutoLinkNode, false otherwise.\n */\nexport function $isAutoLinkNode(node: LexicalNode | null | undefined): node is AutoLinkNode {\n return node instanceof AutoLinkNode;\n}\n\nexport const TOGGLE_LINK_COMMAND: LexicalCommand<\n string | ({ url: string } & LinkAttributes) | null\n> = createCommand(\"TOGGLE_LINK_COMMAND\");\n"],"mappings":"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","ignoreList":[]}
package/ListItemNode.js CHANGED
@@ -1,9 +1,8 @@
1
- import { $isElementNode, $isRangeSelection, ElementNode } from "lexical";
2
- import { $createListNode, $isListNode } from "./ListNode";
3
- import { addClassNamesToElement, removeClassNamesFromElement } from "@lexical/utils";
4
- import { $handleIndent, $handleOutdent, mergeLists, updateChildrenListItemValue } from "./utils/formatList";
5
- import { $createParagraphNode, $isParagraphNode } from "./ParagraphNode";
6
- import { isNestedListNode } from "./utils/listNode";
1
+ import { $isElementNode, $isRangeSelection, ElementNode, addClassNamesToElement, removeClassNamesFromElement } from "lexical";
2
+ import { $createListNode, $isListNode } from "./ListNode.js";
3
+ import { $handleIndent, $handleOutdent, mergeLists, updateChildrenListItemValue } from "./utils/formatList.js";
4
+ import { $createParagraphNode, $isParagraphNode } from "./ParagraphNode.js";
5
+ import { isNestedListNode } from "./utils/listNode.js";
7
6
  export const LIST_ITEM_TYPE = "wby-list-item";
8
7
  /** @noInheritDoc */
9
8
  export class ListItemNode extends ElementNode {