@webiny/lexical-nodes 6.3.0 → 6.4.0-beta.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 (45) hide show
  1. package/FontColorNode.js +94 -119
  2. package/FontColorNode.js.map +1 -1
  3. package/HeadingNode.js +160 -183
  4. package/HeadingNode.js.map +1 -1
  5. package/ImageNode.js +101 -131
  6. package/ImageNode.js.map +1 -1
  7. package/LinkNode.js +228 -315
  8. package/LinkNode.js.map +1 -1
  9. package/ListItemNode.js +249 -320
  10. package/ListItemNode.js.map +1 -1
  11. package/ListNode.js +174 -223
  12. package/ListNode.js.map +1 -1
  13. package/ParagraphNode.js +119 -148
  14. package/ParagraphNode.js.map +1 -1
  15. package/QuoteNode.js +97 -102
  16. package/QuoteNode.js.map +1 -1
  17. package/components/ImageNode/ImageComponent.js +117 -147
  18. package/components/ImageNode/ImageComponent.js.map +1 -1
  19. package/components/ImageNode/ImageResizer.js +167 -194
  20. package/components/ImageNode/ImageResizer.js.map +1 -1
  21. package/generateInitialLexicalValue.js +20 -23
  22. package/generateInitialLexicalValue.js.map +1 -1
  23. package/index.js +38 -26
  24. package/index.js.map +1 -1
  25. package/package.json +4 -4
  26. package/prepareLexicalState.js +30 -43
  27. package/prepareLexicalState.js.map +1 -1
  28. package/types.js +0 -3
  29. package/utils/clearNodeFormating.js +14 -15
  30. package/utils/clearNodeFormating.js.map +1 -1
  31. package/utils/formatList.js +277 -368
  32. package/utils/formatList.js.map +1 -1
  33. package/utils/formatToHeading.js +6 -13
  34. package/utils/formatToHeading.js.map +1 -1
  35. package/utils/formatToParagraph.js +6 -7
  36. package/utils/formatToParagraph.js.map +1 -1
  37. package/utils/formatToQuote.js +6 -13
  38. package/utils/formatToQuote.js.map +1 -1
  39. package/utils/getStyleId.js +6 -11
  40. package/utils/getStyleId.js.map +1 -1
  41. package/utils/listNode.js +60 -84
  42. package/utils/listNode.js.map +1 -1
  43. package/utils/toggleLink.js +67 -118
  44. package/utils/toggleLink.js.map +1 -1
  45. package/types.js.map +0 -1
@@ -1 +1 @@
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":"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","ignoreList":[]}
1
+ {"version":3,"file":"HeadingNode.js","sources":["../src/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"],"names":["isGoogleDocsTitle","domNode","$convertHeadingElement","element","nodeName","node","$createHeadingNode","setNodeIndentFromDOM","HeadingNode","BaseHeadingNode","tag","options","styleId","key","className","config","theme","Theme","editor","base","firstChild","serializedNode","getStyleId","selection","restoreSelection","newElement","direction","children","child","addClassNamesToElement","typographyStyle","byStyleId","$applyNodeReplacement","$isHeadingNode"],"mappings":"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"}
package/ImageNode.js CHANGED
@@ -1,138 +1,108 @@
1
- /**
2
- * Copyright (c) Meta Platforms, Inc. and affiliates.
3
- *
4
- * This source code is licensed under the MIT license found in the
5
- * LICENSE file in the root directory of this source tree.
6
- *
7
- */
8
- import React, { Suspense } from "react";
1
+ import react, { Suspense } from "react";
9
2
  import { $applyNodeReplacement, DecoratorNode } from "lexical";
10
- const ImageComponent = /*#__PURE__*/React.lazy(() => {
11
- return import(/* webpackChunkName: "lexical-image" */"./components/ImageNode/ImageComponent.js");
12
- });
13
- export class ImageNode extends DecoratorNode {
14
- static getType() {
15
- return "wby-image";
16
- }
17
- static clone(node) {
18
- return new ImageNode({
19
- id: node.__id,
20
- src: node.__src,
21
- altText: node.__altText,
22
- maxWidth: node.__maxWidth,
23
- width: node.__width,
24
- height: node.__height
25
- }, node.__key);
26
- }
27
- static importJSON(serializedNode) {
28
- const {
29
- id,
30
- altText,
31
- height,
32
- width,
33
- maxWidth,
34
- src
35
- } = serializedNode;
36
- return $createImageNode({
37
- id,
38
- altText,
39
- height,
40
- maxWidth,
41
- src,
42
- width
43
- });
44
- }
45
- exportDOM() {
46
- const element = document.createElement("img");
47
- element.setAttribute("id", this.__id);
48
- element.setAttribute("src", this.__src);
49
- element.setAttribute("alt", this.__altText);
50
- element.setAttribute("width", this.__width.toString());
51
- element.setAttribute("height", this.__height.toString());
52
- return {
53
- element
54
- };
55
- }
56
-
57
- /**
58
- * Control how an HTMLElement is represented in Lexical.
59
- * DOM data comes from clipboard or parsing HTML to nodes with the available lexical functions.
60
- * (@see @lexical/html package: https://github.com/facebook/lexical/blob/main/packages/lexical-html/README.md).
61
- */
62
- static importDOM() {
63
- /**
64
- * By returning 'null' value, we are preventing image node to be created.
65
- * Example of how to implement and create the node:
66
- * https://github.com/facebook/lexical/blob/main/packages/lexical-playground/src/nodes/ImageNode.tsx#L94
67
- */
68
- return null;
69
- }
70
- constructor(props, key) {
71
- super(key);
72
- this.__id = props.id;
73
- this.__src = props.src;
74
- this.__altText = props.altText;
75
- this.__maxWidth = props.maxWidth;
76
- this.__width = props.width || "inherit";
77
- this.__height = props.height || "inherit";
78
- }
79
- exportJSON() {
80
- return {
81
- id: this.__id,
82
- src: this.getSrc(),
83
- altText: this.getAltText(),
84
- width: this.__width === "inherit" ? 0 : this.__width,
85
- height: this.__height === "inherit" ? 0 : this.__height,
86
- maxWidth: this.__maxWidth,
87
- type: this.getType(),
88
- version: 1
89
- };
90
- }
91
- setWidthAndHeight(width, height) {
92
- const writable = this.getWritable();
93
- writable.__width = width;
94
- writable.__height = height;
95
- }
96
-
97
- // View
98
- createDOM(config) {
99
- const span = document.createElement("span");
100
- const theme = config.theme;
101
- const className = theme.image;
102
- if (className !== undefined) {
103
- span.className = className;
3
+ const ImageComponent = /*#__PURE__*/ react.lazy(()=>import("./components/ImageNode/ImageComponent.js"));
4
+ class ImageNode extends DecoratorNode {
5
+ static getType() {
6
+ return "wby-image";
7
+ }
8
+ static clone(node) {
9
+ return new ImageNode({
10
+ id: node.__id,
11
+ src: node.__src,
12
+ altText: node.__altText,
13
+ maxWidth: node.__maxWidth,
14
+ width: node.__width,
15
+ height: node.__height
16
+ }, node.__key);
17
+ }
18
+ static importJSON(serializedNode) {
19
+ const { id, altText, height, width, maxWidth, src } = serializedNode;
20
+ return $createImageNode({
21
+ id,
22
+ altText,
23
+ height,
24
+ maxWidth,
25
+ src,
26
+ width
27
+ });
28
+ }
29
+ exportDOM() {
30
+ const element = document.createElement("img");
31
+ element.setAttribute("id", this.__id);
32
+ element.setAttribute("src", this.__src);
33
+ element.setAttribute("alt", this.__altText);
34
+ element.setAttribute("width", this.__width.toString());
35
+ element.setAttribute("height", this.__height.toString());
36
+ return {
37
+ element
38
+ };
39
+ }
40
+ static importDOM() {
41
+ return null;
42
+ }
43
+ constructor(props, key){
44
+ super(key);
45
+ this.__id = props.id;
46
+ this.__src = props.src;
47
+ this.__altText = props.altText;
48
+ this.__maxWidth = props.maxWidth;
49
+ this.__width = props.width || "inherit";
50
+ this.__height = props.height || "inherit";
51
+ }
52
+ exportJSON() {
53
+ return {
54
+ id: this.__id,
55
+ src: this.getSrc(),
56
+ altText: this.getAltText(),
57
+ width: "inherit" === this.__width ? 0 : this.__width,
58
+ height: "inherit" === this.__height ? 0 : this.__height,
59
+ maxWidth: this.__maxWidth,
60
+ type: this.getType(),
61
+ version: 1
62
+ };
63
+ }
64
+ setWidthAndHeight(width, height) {
65
+ const writable = this.getWritable();
66
+ writable.__width = width;
67
+ writable.__height = height;
68
+ }
69
+ createDOM(config) {
70
+ const span = document.createElement("span");
71
+ const theme = config.theme;
72
+ const className = theme.image;
73
+ if (void 0 !== className) span.className = className;
74
+ return span;
75
+ }
76
+ updateDOM() {
77
+ return false;
78
+ }
79
+ getSrc() {
80
+ return this.__src;
81
+ }
82
+ getAltText() {
83
+ return this.__altText;
84
+ }
85
+ decorate() {
86
+ return /*#__PURE__*/ react.createElement(Suspense, {
87
+ fallback: null
88
+ }, /*#__PURE__*/ react.createElement(ImageComponent, {
89
+ id: this.__id,
90
+ src: this.__src,
91
+ altText: this.__altText,
92
+ width: this.__width,
93
+ height: this.__height,
94
+ maxWidth: this.__maxWidth,
95
+ nodeKey: this.getKey(),
96
+ resizable: true
97
+ }));
104
98
  }
105
- return span;
106
- }
107
- updateDOM() {
108
- return false;
109
- }
110
- getSrc() {
111
- return this.__src;
112
- }
113
- getAltText() {
114
- return this.__altText;
115
- }
116
- decorate() {
117
- return /*#__PURE__*/React.createElement(Suspense, {
118
- fallback: null
119
- }, /*#__PURE__*/React.createElement(ImageComponent, {
120
- id: this.__id,
121
- src: this.__src,
122
- altText: this.__altText,
123
- width: this.__width,
124
- height: this.__height,
125
- maxWidth: this.__maxWidth,
126
- nodeKey: this.getKey(),
127
- resizable: true
128
- }));
129
- }
130
99
  }
131
- export function $createImageNode(props, key) {
132
- return $applyNodeReplacement(new ImageNode(props, key));
100
+ function $createImageNode(props, key) {
101
+ return $applyNodeReplacement(new ImageNode(props, key));
133
102
  }
134
- export function $isImageNode(node) {
135
- return node instanceof ImageNode;
103
+ function $isImageNode(node) {
104
+ return node instanceof ImageNode;
136
105
  }
106
+ export { $createImageNode, $isImageNode, ImageNode };
137
107
 
138
108
  //# sourceMappingURL=ImageNode.js.map
package/ImageNode.js.map CHANGED
@@ -1 +1 @@
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<React.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(): React.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":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAOA,KAAK,IAAIC,QAAQ,QAAQ,OAAO;AAUvC,SAASC,qBAAqB,EAAEC,aAAa,QAAQ,SAAS;AAE9D,MAAMC,cAAc,gBAAGJ,KAAK,CAACK,IAAI,CAAC,MAAM;EACpC,OAAO,MAAM,CACT,iFAEJ,CAAC;AACL,CAAC,CAAC;AAuBF,OAAO,MAAMC,SAAS,SAASH,aAAa,CAAoB;EAQ5D,OAAgBI,OAAOA,CAAA,EAAW;IAC9B,OAAO,WAAW;EACtB;EAEA,OAAgBC,KAAKA,CAACC,IAAe,EAAa;IAC9C,OAAO,IAAIH,SAAS,CAChB;MACII,EAAE,EAAED,IAAI,CAACE,IAAI;MACbC,GAAG,EAAEH,IAAI,CAACI,KAAK;MACfC,OAAO,EAAEL,IAAI,CAACM,SAAS;MACvBC,QAAQ,EAAEP,IAAI,CAACQ,UAAU;MACzBC,KAAK,EAAET,IAAI,CAACU,OAAO;MACnBC,MAAM,EAAEX,IAAI,CAACY;IACjB,CAAC,EACDZ,IAAI,CAACa,KACT,CAAC;EACL;EAEA,OAAgBC,UAAUA,CAACC,cAAmC,EAAa;IACvE,MAAM;MAAEd,EAAE;MAAEI,OAAO;MAAEM,MAAM;MAAEF,KAAK;MAAEF,QAAQ;MAAEJ;IAAI,CAAC,GAAGY,cAAc;IACpE,OAAOC,gBAAgB,CAAC;MACpBf,EAAE;MACFI,OAAO;MACPM,MAAM;MACNJ,QAAQ;MACRJ,GAAG;MACHM;IACJ,CAAC,CAAC;EACN;EAESQ,SAASA,CAAA,EAAoB;IAClC,MAAMC,OAAO,GAAGC,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;IAC7CF,OAAO,CAACG,YAAY,CAAC,IAAI,EAAE,IAAI,CAACnB,IAAI,CAAC;IACrCgB,OAAO,CAACG,YAAY,CAAC,KAAK,EAAE,IAAI,CAACjB,KAAK,CAAC;IACvCc,OAAO,CAACG,YAAY,CAAC,KAAK,EAAE,IAAI,CAACf,SAAS,CAAC;IAC3CY,OAAO,CAACG,YAAY,CAAC,OAAO,EAAE,IAAI,CAACX,OAAO,CAACY,QAAQ,CAAC,CAAC,CAAC;IACtDJ,OAAO,CAACG,YAAY,CAAC,QAAQ,EAAE,IAAI,CAACT,QAAQ,CAACU,QAAQ,CAAC,CAAC,CAAC;IACxD,OAAO;MAAEJ;IAAQ,CAAC;EACtB;;EAEA;AACJ;AACA;AACA;AACA;EACI,OAAgBK,SAASA,CAAA,EAA4B;IACjD;AACR;AACA;AACA;AACA;IACQ,OAAO,IAAI;EACf;EAEAC,WAAWA,CAACC,KAAqB,EAAEC,GAAa,EAAE;IAC9C,KAAK,CAACA,GAAG,CAAC;IACV,IAAI,CAACxB,IAAI,GAAGuB,KAAK,CAACxB,EAAE;IACpB,IAAI,CAACG,KAAK,GAAGqB,KAAK,CAACtB,GAAG;IACtB,IAAI,CAACG,SAAS,GAAGmB,KAAK,CAACpB,OAAO;IAC9B,IAAI,CAACG,UAAU,GAAGiB,KAAK,CAAClB,QAAQ;IAChC,IAAI,CAACG,OAAO,GAAGe,KAAK,CAAChB,KAAK,IAAI,SAAS;IACvC,IAAI,CAACG,QAAQ,GAAGa,KAAK,CAACd,MAAM,IAAI,SAAS;EAC7C;EAESgB,UAAUA,CAAA,EAAwB;IACvC,OAAO;MACH1B,EAAE,EAAE,IAAI,CAACC,IAAI;MACbC,GAAG,EAAE,IAAI,CAACyB,MAAM,CAAC,CAAC;MAClBvB,OAAO,EAAE,IAAI,CAACwB,UAAU,CAAC,CAAC;MAC1BpB,KAAK,EAAE,IAAI,CAACC,OAAO,KAAK,SAAS,GAAG,CAAC,GAAG,IAAI,CAACA,OAAO;MACpDC,MAAM,EAAE,IAAI,CAACC,QAAQ,KAAK,SAAS,GAAG,CAAC,GAAG,IAAI,CAACA,QAAQ;MACvDL,QAAQ,EAAE,IAAI,CAACC,UAAU;MACzBsB,IAAI,EAAE,IAAI,CAAChC,OAAO,CAAC,CAAC;MACpBiC,OAAO,EAAE;IACb,CAAC;EACL;EAEAC,iBAAiBA,CAACvB,KAAyB,EAAEE,MAA0B,EAAQ;IAC3E,MAAMsB,QAAQ,GAAG,IAAI,CAACC,WAAW,CAAC,CAAC;IACnCD,QAAQ,CAACvB,OAAO,GAAGD,KAAK;IACxBwB,QAAQ,CAACrB,QAAQ,GAAGD,MAAM;EAC9B;;EAEA;EACSwB,SAASA,CAACC,MAAoB,EAAe;IAClD,MAAMC,IAAI,GAAGlB,QAAQ,CAACC,aAAa,CAAC,MAAM,CAAC;IAC3C,MAAMkB,KAAK,GAAGF,MAAM,CAACE,KAAK;IAC1B,MAAMC,SAAS,GAAGD,KAAK,CAACE,KAAK;IAC7B,IAAID,SAAS,KAAKE,SAAS,EAAE;MACzBJ,IAAI,CAACE,SAAS,GAAGA,SAAS;IAC9B;IACA,OAAOF,IAAI;EACf;EAESK,SAASA,CAAA,EAAU;IACxB,OAAO,KAAK;EAChB;EAEAd,MAAMA,CAAA,EAAW;IACb,OAAO,IAAI,CAACxB,KAAK;EACrB;EAEAyB,UAAUA,CAAA,EAAW;IACjB,OAAO,IAAI,CAACvB,SAAS;EACzB;EAESqC,QAAQA,CAAA,EAAsB;IACnC,oBACIpD,KAAA,CAAA6B,aAAA,CAAC5B,QAAQ;MAACoD,QAAQ,EAAE;IAAK,gBACrBrD,KAAA,CAAA6B,aAAA,CAACzB,cAAc;MACXM,EAAE,EAAE,IAAI,CAACC,IAAK;MACdC,GAAG,EAAE,IAAI,CAACC,KAAM;MAChBC,OAAO,EAAE,IAAI,CAACC,SAAU;MACxBG,KAAK,EAAE,IAAI,CAACC,OAAQ;MACpBC,MAAM,EAAE,IAAI,CAACC,QAAS;MACtBL,QAAQ,EAAE,IAAI,CAACC,UAAW;MAC1BqC,OAAO,EAAE,IAAI,CAACC,MAAM,CAAC,CAAE;MACvBC,SAAS,EAAE;IAAK,CACnB,CACK,CAAC;EAEnB;AACJ;AAEA,OAAO,SAAS/B,gBAAgBA,CAACS,KAAqB,EAAEC,GAAY,EAAa;EAC7E,OAAOjC,qBAAqB,CAAC,IAAII,SAAS,CAAC4B,KAAK,EAAEC,GAAG,CAAC,CAAC;AAC3D;AAEA,OAAO,SAASsB,YAAYA,CAAChD,IAAoC,EAAqB;EAClF,OAAOA,IAAI,YAAYH,SAAS;AACpC","ignoreList":[]}
1
+ {"version":3,"file":"ImageNode.js","sources":["../src/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<React.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(): React.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"],"names":["ImageComponent","React","ImageNode","DecoratorNode","node","serializedNode","id","altText","height","width","maxWidth","src","$createImageNode","element","document","props","key","writable","config","span","theme","className","undefined","Suspense","$applyNodeReplacement","$isImageNode"],"mappings":"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"}