@webiny/lexical-nodes 0.0.0-unstable.df7a8bb475 → 0.0.0-unstable.e2758ee1cf

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/HeadingNode.js CHANGED
@@ -1,5 +1,4 @@
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
3
  import { Theme } from "@webiny/lexical-theme";
5
4
  import { getStyleId } from "./utils/getStyleId.js";
@@ -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 } 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 { 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,"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":[]}
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 */
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\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,6 +1,5 @@
1
- import { $isElementNode, $isRangeSelection, ElementNode } from "lexical";
1
+ import { $isElementNode, $isRangeSelection, ElementNode, addClassNamesToElement, removeClassNamesFromElement } from "lexical";
2
2
  import { $createListNode, $isListNode } from "./ListNode.js";
3
- import { addClassNamesToElement, removeClassNamesFromElement } from "@lexical/utils";
4
3
  import { $handleIndent, $handleOutdent, mergeLists, updateChildrenListItemValue } from "./utils/formatList.js";
5
4
  import { $createParagraphNode, $isParagraphNode } from "./ParagraphNode.js";
6
5
  import { isNestedListNode } from "./utils/listNode.js";
@@ -1 +1 @@
1
- {"version":3,"names":["$isElementNode","$isRangeSelection","ElementNode","$createListNode","$isListNode","addClassNamesToElement","removeClassNamesFromElement","$handleIndent","$handleOutdent","mergeLists","updateChildrenListItemValue","$createParagraphNode","$isParagraphNode","isNestedListNode","LIST_ITEM_TYPE","ListItemNode","getType","clone","node","__value","__checked","__key","constructor","value","checked","key","undefined","createDOM","config","element","document","createElement","parent","getParent","getListType","updateListItemChecked","$setListItemThemeClassNames","theme","updateDOM","prevNode","dom","importDOM","li","conversion","convertListItemElement","priority","importJSON","serializedNode","setFormat","format","setIndent","indent","setDirection","direction","exportJSON","getChecked","type","getValue","append","nodes","i","length","canMergeWith","children","getChildren","remove","replace","replaceWithNode","includeChildren","$isListItemNode","list","getParentOrThrow","__first","getKey","insertBefore","__last","insertAfter","newList","nextSibling","getNextSibling","nodeToAppend","Error","forEach","child","getChildrenSize","listNode","console","log","siblings","getNextSiblings","after","afterListNode","newListNode","sibling","preserveEmptyParent","prevSibling","getPreviousSibling","getFirstChild","insertNewAfter","newElement","$createListItemNode","collapseAtStart","selection","paragraph","listNodeParent","isIndented","select","anchor","focus","getNode","is","set","offset","self","getLatest","setValue","getWritable","setChecked","getIndent","__indent","indentLevel","currentIndent","canIndent","nodeToInsert","canInsertAfter","canReplaceWith","replacement","extractWithChild","anchorNode","focusNode","isParentOf","getTextContent","editorThemeClasses","classesToAdd","classesToRemove","listTheme","listItemClassName","listitem","nestedListItemClassName","nested","listItemClasses","split","push","parentNode","isCheckList","listitemUnchecked","listitemChecked","nestedListItemClasses","some","listItemNode","prevListItemNode","removeAttribute","setAttribute"],"sources":["ListItemNode.ts"],"sourcesContent":["import type {\n DOMConversionMap,\n DOMConversionOutput,\n EditorConfig,\n EditorThemeClasses,\n LexicalNode,\n NodeKey,\n ParagraphNode,\n RangeSelection,\n SerializedElementNode,\n Spread\n} from \"lexical\";\nimport { $isElementNode, $isRangeSelection, ElementNode } from \"lexical\";\nimport type { ListNode } from \"~/ListNode.js\";\nimport { $createListNode, $isListNode } from \"~/ListNode.js\";\nimport { addClassNamesToElement, removeClassNamesFromElement } from \"@lexical/utils\";\nimport {\n $handleIndent,\n $handleOutdent,\n mergeLists,\n updateChildrenListItemValue\n} from \"~/utils/formatList.js\";\nimport { $createParagraphNode, $isParagraphNode } from \"~/ParagraphNode.js\";\nimport { isNestedListNode } from \"~/utils/listNode.js\";\n\nexport const LIST_ITEM_TYPE = \"wby-list-item\";\n\nexport type SerializedWebinyListItemNode = Spread<\n {\n checked: boolean | undefined;\n type: typeof LIST_ITEM_TYPE;\n value: number;\n },\n SerializedElementNode\n>;\n\n/** @noInheritDoc */\nexport class ListItemNode extends ElementNode {\n /** @internal */\n __value: number;\n /** @internal */\n __checked?: boolean;\n\n static override getType(): string {\n return LIST_ITEM_TYPE;\n }\n\n static override clone(node: ListItemNode): ListItemNode {\n return new ListItemNode(node.__value, node.__checked, node.__key);\n }\n\n constructor(value?: number, checked?: boolean, key?: NodeKey) {\n super(key);\n this.__value = value === undefined ? 1 : value;\n this.__checked = checked;\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = document.createElement(\"li\");\n const parent = this.getParent();\n if ($isListNode(parent) && parent.getListType() === \"check\") {\n updateListItemChecked(element, this, null, parent);\n }\n element.value = this.__value;\n $setListItemThemeClassNames(element, config.theme, this);\n\n return element;\n }\n\n override updateDOM(prevNode: ListItemNode, dom: HTMLElement, config: EditorConfig): boolean {\n const parent = this.getParent();\n if ($isListNode(parent) && parent.getListType() === \"check\") {\n updateListItemChecked(dom, this, prevNode, parent);\n }\n // @ts-expect-error - this is always HTMLListItemElement\n dom.value = this.__value;\n $setListItemThemeClassNames(dom, config.theme, this);\n\n return false;\n }\n\n static override importDOM(): DOMConversionMap | null {\n return {\n li: () => ({\n conversion: convertListItemElement,\n priority: 0\n })\n };\n }\n\n static override importJSON(serializedNode: SerializedWebinyListItemNode): ListItemNode {\n const node = new ListItemNode(serializedNode.value, serializedNode.checked);\n node.setFormat(serializedNode.format);\n node.setIndent(serializedNode.indent);\n node.setDirection(serializedNode.direction);\n return node;\n }\n\n override exportJSON(): SerializedWebinyListItemNode {\n return {\n ...super.exportJSON(),\n checked: this.getChecked(),\n type: LIST_ITEM_TYPE,\n value: this.getValue()\n };\n }\n\n override append(...nodes: LexicalNode[]): this {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if ($isElementNode(node) && this.canMergeWith(node)) {\n const children = node.getChildren();\n this.append(...children);\n node.remove();\n } else {\n super.append(node);\n }\n }\n\n return this;\n }\n\n override replace<N extends LexicalNode>(replaceWithNode: N, includeChildren?: boolean): N {\n if ($isListItemNode(replaceWithNode)) {\n return super.replace(replaceWithNode);\n }\n this.setIndent(0);\n const list = this.getParentOrThrow();\n if (!$isListNode(list)) {\n return replaceWithNode;\n }\n if (list.__first === this.getKey()) {\n list.insertBefore(replaceWithNode);\n } else if (list.__last === this.getKey()) {\n list.insertAfter(replaceWithNode);\n } else {\n // Split the list\n const newList = $createListNode(list.getListType());\n let nextSibling = this.getNextSibling();\n while (nextSibling) {\n const nodeToAppend = nextSibling;\n nextSibling = nextSibling.getNextSibling();\n newList.append(nodeToAppend);\n }\n list.insertAfter(replaceWithNode);\n replaceWithNode.insertAfter(newList);\n }\n if (includeChildren) {\n if (!$isElementNode(replaceWithNode)) {\n throw Error(\"includeChildren should only be true for ElementNodes\");\n }\n\n this.getChildren().forEach((child: LexicalNode) => {\n replaceWithNode.append(child);\n });\n }\n this.remove();\n if (list.getChildrenSize() === 0) {\n list.remove();\n }\n return replaceWithNode;\n }\n\n override insertAfter(node: LexicalNode): LexicalNode {\n const listNode = this.getParentOrThrow();\n\n if (!$isListNode(listNode)) {\n console.log(\"insertAfter: webiny list node is not parent of list item node\");\n return listNode;\n }\n\n const siblings = this.getNextSiblings();\n\n if ($isListItemNode(node)) {\n const after = super.insertAfter(node);\n const afterListNode = node.getParentOrThrow();\n\n if ($isListNode(afterListNode)) {\n updateChildrenListItemValue(afterListNode);\n }\n\n return after;\n }\n\n // Attempt to merge if the list is of the same type.\n\n if ($isListNode(node) && node.getListType() === listNode.getListType()) {\n let child = node;\n const children = node.getChildren<ListNode>();\n\n for (let i = children.length - 1; i >= 0; i--) {\n child = children[i];\n\n this.insertAfter(child);\n }\n\n return child;\n }\n\n // Otherwise, split the list\n // Split the lists and insert the node in between them\n listNode.insertAfter(node);\n\n if (siblings.length !== 0) {\n const newListNode = $createListNode(listNode.getListType());\n\n siblings.forEach(sibling => newListNode.append(sibling));\n\n node.insertAfter(newListNode);\n }\n\n return node;\n }\n\n override remove(preserveEmptyParent?: boolean): void {\n const prevSibling = this.getPreviousSibling();\n const nextSibling = this.getNextSibling();\n super.remove(preserveEmptyParent);\n\n if (\n prevSibling &&\n nextSibling &&\n isNestedListNode(prevSibling) &&\n isNestedListNode(nextSibling)\n ) {\n mergeLists(prevSibling.getFirstChild(), nextSibling.getFirstChild());\n nextSibling.remove();\n } else if (nextSibling) {\n const parent = nextSibling.getParent();\n\n if ($isListNode(parent)) {\n updateChildrenListItemValue(parent);\n }\n }\n }\n\n override insertNewAfter(): ListItemNode | ParagraphNode {\n const newElement = $createListItemNode(this.__checked == null ? undefined : false);\n this.insertAfter(newElement);\n\n return newElement;\n }\n\n override collapseAtStart(selection: RangeSelection): true {\n const paragraph = $createParagraphNode();\n const children = this.getChildren();\n children.forEach(child => paragraph.append(child));\n const listNode = this.getParentOrThrow();\n const listNodeParent = listNode.getParentOrThrow();\n const isIndented = $isListItemNode(listNodeParent);\n\n if (listNode.getChildrenSize() === 1) {\n if (isIndented) {\n // if the list node is nested, we just want to remove it,\n // effectively unindenting it.\n listNode.remove();\n listNodeParent.select();\n } else {\n listNode.replace(paragraph);\n // If we have selection on the list item, we'll need to move it\n // to the paragraph\n const anchor = selection.anchor;\n const focus = selection.focus;\n const key = paragraph.getKey();\n\n if (anchor.type === \"element\" && anchor.getNode().is(this)) {\n anchor.set(key, anchor.offset, \"element\");\n }\n\n if (focus.type === \"element\" && focus.getNode().is(this)) {\n focus.set(key, focus.offset, \"element\");\n }\n }\n } else {\n listNode.insertBefore(paragraph);\n this.remove();\n }\n\n return true;\n }\n\n getValue(): number {\n const self = this.getLatest();\n\n return self.__value;\n }\n\n setValue(value: number): void {\n const self = this.getWritable();\n self.__value = value;\n }\n\n getChecked(): boolean | undefined {\n const self = this.getLatest();\n\n return self.__checked;\n }\n\n setChecked(checked?: boolean): void {\n const self = this.getWritable();\n self.__checked = checked;\n }\n\n override getIndent(): number {\n // If we don't have a parent, we are likely serializing\n const parent = this.getParent();\n if (parent === null) {\n return this.getLatest().__indent;\n }\n // ListItemNode should always have a ListNode for a parent.\n let listNodeParent = parent.getParentOrThrow();\n let indentLevel = 0;\n while ($isListItemNode(listNodeParent)) {\n listNodeParent = listNodeParent.getParentOrThrow().getParentOrThrow();\n indentLevel++;\n }\n\n return indentLevel;\n }\n\n override setIndent(indent: number): this {\n let currentIndent = this.getIndent();\n while (currentIndent !== indent) {\n if (currentIndent < indent) {\n $handleIndent([this]);\n currentIndent++;\n } else {\n $handleOutdent([this]);\n currentIndent--;\n }\n }\n\n return this;\n }\n\n override canIndent(): false {\n // Indent/outdent is handled specifically in the RichText logic.\n\n return false;\n }\n\n override insertBefore(nodeToInsert: LexicalNode): LexicalNode {\n if ($isListItemNode(nodeToInsert)) {\n const parent = this.getParentOrThrow();\n\n if ($isListNode(parent)) {\n const siblings = this.getNextSiblings();\n updateChildrenListItemValue(parent, siblings);\n }\n }\n\n return super.insertBefore(nodeToInsert);\n }\n\n override canInsertAfter(node: LexicalNode): boolean {\n return $isListNode(node);\n }\n\n override canReplaceWith(replacement: LexicalNode): boolean {\n return $isListItemNode(replacement);\n }\n\n override canMergeWith(node: LexicalNode): boolean {\n return $isParagraphNode(node) || $isListItemNode(node);\n }\n\n override extractWithChild(child: 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 this.getTextContent().length === selection.getTextContent().length\n );\n }\n}\n\nfunction $setListItemThemeClassNames(\n dom: HTMLElement,\n editorThemeClasses: EditorThemeClasses,\n node: ListItemNode\n): void {\n const classesToAdd = [];\n const classesToRemove = [];\n const listTheme = editorThemeClasses.list;\n const listItemClassName = listTheme ? listTheme.listitem : undefined;\n let nestedListItemClassName;\n\n if (listTheme && listTheme.nested) {\n nestedListItemClassName = listTheme.nested.listitem;\n }\n\n if (listItemClassName !== undefined) {\n const listItemClasses = listItemClassName.split(\" \");\n classesToAdd.push(...listItemClasses);\n }\n\n if (listTheme) {\n const parentNode = node.getParent();\n const isCheckList = $isListNode(parentNode) && parentNode?.getListType() === \"check\";\n const checked = node.getChecked();\n\n if (!isCheckList || checked) {\n classesToRemove.push(listTheme.listitemUnchecked);\n }\n\n if (!isCheckList || !checked) {\n classesToRemove.push(listTheme.listitemChecked);\n }\n\n if (isCheckList) {\n classesToAdd.push(checked ? listTheme.listitemChecked : listTheme.listitemUnchecked);\n }\n }\n\n if (nestedListItemClassName !== undefined) {\n const nestedListItemClasses = nestedListItemClassName.split(\" \");\n\n if (node.getChildren().some(child => $isListNode(child))) {\n classesToAdd.push(...nestedListItemClasses);\n } else {\n classesToRemove.push(...nestedListItemClasses);\n }\n }\n\n if (classesToRemove.length > 0) {\n removeClassNamesFromElement(dom, ...classesToRemove);\n }\n\n if (classesToAdd.length > 0) {\n addClassNamesToElement(dom, ...classesToAdd);\n }\n}\n\nfunction updateListItemChecked(\n dom: HTMLElement,\n listItemNode: ListItemNode,\n prevListItemNode: ListItemNode | null,\n listNode: ListNode\n): void {\n const isCheckList = listNode.getListType() === \"check\";\n\n if (isCheckList) {\n // Only add attributes for leaf list items\n if ($isListNode(listItemNode.getFirstChild())) {\n dom.removeAttribute(\"role\");\n dom.removeAttribute(\"tabIndex\");\n dom.removeAttribute(\"aria-checked\");\n } else {\n dom.setAttribute(\"role\", \"checkbox\");\n dom.setAttribute(\"tabIndex\", \"-1\");\n\n if (!prevListItemNode || listItemNode.__checked !== prevListItemNode.__checked) {\n dom.setAttribute(\"aria-checked\", listItemNode.getChecked() ? \"true\" : \"false\");\n }\n }\n } else {\n // Clean up checked state\n if (listItemNode.getChecked() != null) {\n listItemNode.setChecked(undefined);\n }\n }\n}\n\nfunction convertListItemElement(): DOMConversionOutput {\n return { node: $createListItemNode() };\n}\n\nexport function $createListItemNode(checked?: boolean): ListItemNode {\n return new ListItemNode(undefined, checked);\n}\n\nexport function $isListItemNode(node: LexicalNode | null | undefined): node is ListItemNode {\n return node instanceof ListItemNode;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["$isElementNode","$isRangeSelection","ElementNode","addClassNamesToElement","removeClassNamesFromElement","$createListNode","$isListNode","$handleIndent","$handleOutdent","mergeLists","updateChildrenListItemValue","$createParagraphNode","$isParagraphNode","isNestedListNode","LIST_ITEM_TYPE","ListItemNode","getType","clone","node","__value","__checked","__key","constructor","value","checked","key","undefined","createDOM","config","element","document","createElement","parent","getParent","getListType","updateListItemChecked","$setListItemThemeClassNames","theme","updateDOM","prevNode","dom","importDOM","li","conversion","convertListItemElement","priority","importJSON","serializedNode","setFormat","format","setIndent","indent","setDirection","direction","exportJSON","getChecked","type","getValue","append","nodes","i","length","canMergeWith","children","getChildren","remove","replace","replaceWithNode","includeChildren","$isListItemNode","list","getParentOrThrow","__first","getKey","insertBefore","__last","insertAfter","newList","nextSibling","getNextSibling","nodeToAppend","Error","forEach","child","getChildrenSize","listNode","console","log","siblings","getNextSiblings","after","afterListNode","newListNode","sibling","preserveEmptyParent","prevSibling","getPreviousSibling","getFirstChild","insertNewAfter","newElement","$createListItemNode","collapseAtStart","selection","paragraph","listNodeParent","isIndented","select","anchor","focus","getNode","is","set","offset","self","getLatest","setValue","getWritable","setChecked","getIndent","__indent","indentLevel","currentIndent","canIndent","nodeToInsert","canInsertAfter","canReplaceWith","replacement","extractWithChild","anchorNode","focusNode","isParentOf","getTextContent","editorThemeClasses","classesToAdd","classesToRemove","listTheme","listItemClassName","listitem","nestedListItemClassName","nested","listItemClasses","split","push","parentNode","isCheckList","listitemUnchecked","listitemChecked","nestedListItemClasses","some","listItemNode","prevListItemNode","removeAttribute","setAttribute"],"sources":["ListItemNode.ts"],"sourcesContent":["import type {\n DOMConversionMap,\n DOMConversionOutput,\n EditorConfig,\n EditorThemeClasses,\n LexicalNode,\n NodeKey,\n ParagraphNode,\n RangeSelection,\n SerializedElementNode,\n Spread\n} from \"lexical\";\nimport {\n $isElementNode,\n $isRangeSelection,\n ElementNode,\n addClassNamesToElement,\n removeClassNamesFromElement\n} from \"lexical\";\nimport type { ListNode } from \"~/ListNode.js\";\nimport { $createListNode, $isListNode } from \"~/ListNode.js\";\nimport {\n $handleIndent,\n $handleOutdent,\n mergeLists,\n updateChildrenListItemValue\n} from \"~/utils/formatList.js\";\nimport { $createParagraphNode, $isParagraphNode } from \"~/ParagraphNode.js\";\nimport { isNestedListNode } from \"~/utils/listNode.js\";\n\nexport const LIST_ITEM_TYPE = \"wby-list-item\";\n\nexport type SerializedWebinyListItemNode = Spread<\n {\n checked: boolean | undefined;\n type: typeof LIST_ITEM_TYPE;\n value: number;\n },\n SerializedElementNode\n>;\n\n/** @noInheritDoc */\nexport class ListItemNode extends ElementNode {\n /** @internal */\n __value: number;\n /** @internal */\n __checked?: boolean;\n\n static override getType(): string {\n return LIST_ITEM_TYPE;\n }\n\n static override clone(node: ListItemNode): ListItemNode {\n return new ListItemNode(node.__value, node.__checked, node.__key);\n }\n\n constructor(value?: number, checked?: boolean, key?: NodeKey) {\n super(key);\n this.__value = value === undefined ? 1 : value;\n this.__checked = checked;\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = document.createElement(\"li\");\n const parent = this.getParent();\n if ($isListNode(parent) && parent.getListType() === \"check\") {\n updateListItemChecked(element, this, null, parent);\n }\n element.value = this.__value;\n $setListItemThemeClassNames(element, config.theme, this);\n\n return element;\n }\n\n override updateDOM(prevNode: ListItemNode, dom: HTMLElement, config: EditorConfig): boolean {\n const parent = this.getParent();\n if ($isListNode(parent) && parent.getListType() === \"check\") {\n updateListItemChecked(dom, this, prevNode, parent);\n }\n // @ts-expect-error - this is always HTMLListItemElement\n dom.value = this.__value;\n $setListItemThemeClassNames(dom, config.theme, this);\n\n return false;\n }\n\n static override importDOM(): DOMConversionMap | null {\n return {\n li: () => ({\n conversion: convertListItemElement,\n priority: 0\n })\n };\n }\n\n static override importJSON(serializedNode: SerializedWebinyListItemNode): ListItemNode {\n const node = new ListItemNode(serializedNode.value, serializedNode.checked);\n node.setFormat(serializedNode.format);\n node.setIndent(serializedNode.indent);\n node.setDirection(serializedNode.direction);\n return node;\n }\n\n override exportJSON(): SerializedWebinyListItemNode {\n return {\n ...super.exportJSON(),\n checked: this.getChecked(),\n type: LIST_ITEM_TYPE,\n value: this.getValue()\n };\n }\n\n override append(...nodes: LexicalNode[]): this {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if ($isElementNode(node) && this.canMergeWith(node)) {\n const children = node.getChildren();\n this.append(...children);\n node.remove();\n } else {\n super.append(node);\n }\n }\n\n return this;\n }\n\n override replace<N extends LexicalNode>(replaceWithNode: N, includeChildren?: boolean): N {\n if ($isListItemNode(replaceWithNode)) {\n return super.replace(replaceWithNode);\n }\n this.setIndent(0);\n const list = this.getParentOrThrow();\n if (!$isListNode(list)) {\n return replaceWithNode;\n }\n if (list.__first === this.getKey()) {\n list.insertBefore(replaceWithNode);\n } else if (list.__last === this.getKey()) {\n list.insertAfter(replaceWithNode);\n } else {\n // Split the list\n const newList = $createListNode(list.getListType());\n let nextSibling = this.getNextSibling();\n while (nextSibling) {\n const nodeToAppend = nextSibling;\n nextSibling = nextSibling.getNextSibling();\n newList.append(nodeToAppend);\n }\n list.insertAfter(replaceWithNode);\n replaceWithNode.insertAfter(newList);\n }\n if (includeChildren) {\n if (!$isElementNode(replaceWithNode)) {\n throw Error(\"includeChildren should only be true for ElementNodes\");\n }\n\n this.getChildren().forEach((child: LexicalNode) => {\n replaceWithNode.append(child);\n });\n }\n this.remove();\n if (list.getChildrenSize() === 0) {\n list.remove();\n }\n return replaceWithNode;\n }\n\n override insertAfter(node: LexicalNode): LexicalNode {\n const listNode = this.getParentOrThrow();\n\n if (!$isListNode(listNode)) {\n console.log(\"insertAfter: webiny list node is not parent of list item node\");\n return listNode;\n }\n\n const siblings = this.getNextSiblings();\n\n if ($isListItemNode(node)) {\n const after = super.insertAfter(node);\n const afterListNode = node.getParentOrThrow();\n\n if ($isListNode(afterListNode)) {\n updateChildrenListItemValue(afterListNode);\n }\n\n return after;\n }\n\n // Attempt to merge if the list is of the same type.\n\n if ($isListNode(node) && node.getListType() === listNode.getListType()) {\n let child = node;\n const children = node.getChildren<ListNode>();\n\n for (let i = children.length - 1; i >= 0; i--) {\n child = children[i];\n\n this.insertAfter(child);\n }\n\n return child;\n }\n\n // Otherwise, split the list\n // Split the lists and insert the node in between them\n listNode.insertAfter(node);\n\n if (siblings.length !== 0) {\n const newListNode = $createListNode(listNode.getListType());\n\n siblings.forEach(sibling => newListNode.append(sibling));\n\n node.insertAfter(newListNode);\n }\n\n return node;\n }\n\n override remove(preserveEmptyParent?: boolean): void {\n const prevSibling = this.getPreviousSibling();\n const nextSibling = this.getNextSibling();\n super.remove(preserveEmptyParent);\n\n if (\n prevSibling &&\n nextSibling &&\n isNestedListNode(prevSibling) &&\n isNestedListNode(nextSibling)\n ) {\n mergeLists(prevSibling.getFirstChild(), nextSibling.getFirstChild());\n nextSibling.remove();\n } else if (nextSibling) {\n const parent = nextSibling.getParent();\n\n if ($isListNode(parent)) {\n updateChildrenListItemValue(parent);\n }\n }\n }\n\n override insertNewAfter(): ListItemNode | ParagraphNode {\n const newElement = $createListItemNode(this.__checked == null ? undefined : false);\n this.insertAfter(newElement);\n\n return newElement;\n }\n\n override collapseAtStart(selection: RangeSelection): true {\n const paragraph = $createParagraphNode();\n const children = this.getChildren();\n children.forEach(child => paragraph.append(child));\n const listNode = this.getParentOrThrow();\n const listNodeParent = listNode.getParentOrThrow();\n const isIndented = $isListItemNode(listNodeParent);\n\n if (listNode.getChildrenSize() === 1) {\n if (isIndented) {\n // if the list node is nested, we just want to remove it,\n // effectively unindenting it.\n listNode.remove();\n listNodeParent.select();\n } else {\n listNode.replace(paragraph);\n // If we have selection on the list item, we'll need to move it\n // to the paragraph\n const anchor = selection.anchor;\n const focus = selection.focus;\n const key = paragraph.getKey();\n\n if (anchor.type === \"element\" && anchor.getNode().is(this)) {\n anchor.set(key, anchor.offset, \"element\");\n }\n\n if (focus.type === \"element\" && focus.getNode().is(this)) {\n focus.set(key, focus.offset, \"element\");\n }\n }\n } else {\n listNode.insertBefore(paragraph);\n this.remove();\n }\n\n return true;\n }\n\n getValue(): number {\n const self = this.getLatest();\n\n return self.__value;\n }\n\n setValue(value: number): void {\n const self = this.getWritable();\n self.__value = value;\n }\n\n getChecked(): boolean | undefined {\n const self = this.getLatest();\n\n return self.__checked;\n }\n\n setChecked(checked?: boolean): void {\n const self = this.getWritable();\n self.__checked = checked;\n }\n\n override getIndent(): number {\n // If we don't have a parent, we are likely serializing\n const parent = this.getParent();\n if (parent === null) {\n return this.getLatest().__indent;\n }\n // ListItemNode should always have a ListNode for a parent.\n let listNodeParent = parent.getParentOrThrow();\n let indentLevel = 0;\n while ($isListItemNode(listNodeParent)) {\n listNodeParent = listNodeParent.getParentOrThrow().getParentOrThrow();\n indentLevel++;\n }\n\n return indentLevel;\n }\n\n override setIndent(indent: number): this {\n let currentIndent = this.getIndent();\n while (currentIndent !== indent) {\n if (currentIndent < indent) {\n $handleIndent([this]);\n currentIndent++;\n } else {\n $handleOutdent([this]);\n currentIndent--;\n }\n }\n\n return this;\n }\n\n override canIndent(): false {\n // Indent/outdent is handled specifically in the RichText logic.\n\n return false;\n }\n\n override insertBefore(nodeToInsert: LexicalNode): LexicalNode {\n if ($isListItemNode(nodeToInsert)) {\n const parent = this.getParentOrThrow();\n\n if ($isListNode(parent)) {\n const siblings = this.getNextSiblings();\n updateChildrenListItemValue(parent, siblings);\n }\n }\n\n return super.insertBefore(nodeToInsert);\n }\n\n override canInsertAfter(node: LexicalNode): boolean {\n return $isListNode(node);\n }\n\n override canReplaceWith(replacement: LexicalNode): boolean {\n return $isListItemNode(replacement);\n }\n\n override canMergeWith(node: LexicalNode): boolean {\n return $isParagraphNode(node) || $isListItemNode(node);\n }\n\n override extractWithChild(child: 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 this.getTextContent().length === selection.getTextContent().length\n );\n }\n}\n\nfunction $setListItemThemeClassNames(\n dom: HTMLElement,\n editorThemeClasses: EditorThemeClasses,\n node: ListItemNode\n): void {\n const classesToAdd = [];\n const classesToRemove = [];\n const listTheme = editorThemeClasses.list;\n const listItemClassName = listTheme ? listTheme.listitem : undefined;\n let nestedListItemClassName;\n\n if (listTheme && listTheme.nested) {\n nestedListItemClassName = listTheme.nested.listitem;\n }\n\n if (listItemClassName !== undefined) {\n const listItemClasses = listItemClassName.split(\" \");\n classesToAdd.push(...listItemClasses);\n }\n\n if (listTheme) {\n const parentNode = node.getParent();\n const isCheckList = $isListNode(parentNode) && parentNode?.getListType() === \"check\";\n const checked = node.getChecked();\n\n if (!isCheckList || checked) {\n classesToRemove.push(listTheme.listitemUnchecked);\n }\n\n if (!isCheckList || !checked) {\n classesToRemove.push(listTheme.listitemChecked);\n }\n\n if (isCheckList) {\n classesToAdd.push(checked ? listTheme.listitemChecked : listTheme.listitemUnchecked);\n }\n }\n\n if (nestedListItemClassName !== undefined) {\n const nestedListItemClasses = nestedListItemClassName.split(\" \");\n\n if (node.getChildren().some(child => $isListNode(child))) {\n classesToAdd.push(...nestedListItemClasses);\n } else {\n classesToRemove.push(...nestedListItemClasses);\n }\n }\n\n if (classesToRemove.length > 0) {\n removeClassNamesFromElement(dom, ...classesToRemove);\n }\n\n if (classesToAdd.length > 0) {\n addClassNamesToElement(dom, ...classesToAdd);\n }\n}\n\nfunction updateListItemChecked(\n dom: HTMLElement,\n listItemNode: ListItemNode,\n prevListItemNode: ListItemNode | null,\n listNode: ListNode\n): void {\n const isCheckList = listNode.getListType() === \"check\";\n\n if (isCheckList) {\n // Only add attributes for leaf list items\n if ($isListNode(listItemNode.getFirstChild())) {\n dom.removeAttribute(\"role\");\n dom.removeAttribute(\"tabIndex\");\n dom.removeAttribute(\"aria-checked\");\n } else {\n dom.setAttribute(\"role\", \"checkbox\");\n dom.setAttribute(\"tabIndex\", \"-1\");\n\n if (!prevListItemNode || listItemNode.__checked !== prevListItemNode.__checked) {\n dom.setAttribute(\"aria-checked\", listItemNode.getChecked() ? \"true\" : \"false\");\n }\n }\n } else {\n // Clean up checked state\n if (listItemNode.getChecked() != null) {\n listItemNode.setChecked(undefined);\n }\n }\n}\n\nfunction convertListItemElement(): DOMConversionOutput {\n return { node: $createListItemNode() };\n}\n\nexport function $createListItemNode(checked?: boolean): ListItemNode {\n return new ListItemNode(undefined, checked);\n}\n\nexport function $isListItemNode(node: LexicalNode | null | undefined): node is ListItemNode {\n return node instanceof ListItemNode;\n}\n"],"mappings":"AAYA,SACIA,cAAc,EACdC,iBAAiB,EACjBC,WAAW,EACXC,sBAAsB,EACtBC,2BAA2B,QACxB,SAAS;AAEhB,SAASC,eAAe,EAAEC,WAAW;AACrC,SACIC,aAAa,EACbC,cAAc,EACdC,UAAU,EACVC,2BAA2B;AAE/B,SAASC,oBAAoB,EAAEC,gBAAgB;AAC/C,SAASC,gBAAgB;AAEzB,OAAO,MAAMC,cAAc,GAAG,eAAe;AAW7C;AACA,OAAO,MAAMC,YAAY,SAASb,WAAW,CAAC;EAC1C;;EAEA;;EAGA,OAAgBc,OAAOA,CAAA,EAAW;IAC9B,OAAOF,cAAc;EACzB;EAEA,OAAgBG,KAAKA,CAACC,IAAkB,EAAgB;IACpD,OAAO,IAAIH,YAAY,CAACG,IAAI,CAACC,OAAO,EAAED,IAAI,CAACE,SAAS,EAAEF,IAAI,CAACG,KAAK,CAAC;EACrE;EAEAC,WAAWA,CAACC,KAAc,EAAEC,OAAiB,EAAEC,GAAa,EAAE;IAC1D,KAAK,CAACA,GAAG,CAAC;IACV,IAAI,CAACN,OAAO,GAAGI,KAAK,KAAKG,SAAS,GAAG,CAAC,GAAGH,KAAK;IAC9C,IAAI,CAACH,SAAS,GAAGI,OAAO;EAC5B;EAESG,SAASA,CAACC,MAAoB,EAAe;IAClD,MAAMC,OAAO,GAAGC,QAAQ,CAACC,aAAa,CAAC,IAAI,CAAC;IAC5C,MAAMC,MAAM,GAAG,IAAI,CAACC,SAAS,CAAC,CAAC;IAC/B,IAAI3B,WAAW,CAAC0B,MAAM,CAAC,IAAIA,MAAM,CAACE,WAAW,CAAC,CAAC,KAAK,OAAO,EAAE;MACzDC,qBAAqB,CAACN,OAAO,EAAE,IAAI,EAAE,IAAI,EAAEG,MAAM,CAAC;IACtD;IACAH,OAAO,CAACN,KAAK,GAAG,IAAI,CAACJ,OAAO;IAC5BiB,2BAA2B,CAACP,OAAO,EAAED,MAAM,CAACS,KAAK,EAAE,IAAI,CAAC;IAExD,OAAOR,OAAO;EAClB;EAESS,SAASA,CAACC,QAAsB,EAAEC,GAAgB,EAAEZ,MAAoB,EAAW;IACxF,MAAMI,MAAM,GAAG,IAAI,CAACC,SAAS,CAAC,CAAC;IAC/B,IAAI3B,WAAW,CAAC0B,MAAM,CAAC,IAAIA,MAAM,CAACE,WAAW,CAAC,CAAC,KAAK,OAAO,EAAE;MACzDC,qBAAqB,CAACK,GAAG,EAAE,IAAI,EAAED,QAAQ,EAAEP,MAAM,CAAC;IACtD;IACA;IACAQ,GAAG,CAACjB,KAAK,GAAG,IAAI,CAACJ,OAAO;IACxBiB,2BAA2B,CAACI,GAAG,EAAEZ,MAAM,CAACS,KAAK,EAAE,IAAI,CAAC;IAEpD,OAAO,KAAK;EAChB;EAEA,OAAgBI,SAASA,CAAA,EAA4B;IACjD,OAAO;MACHC,EAAE,EAAEA,CAAA,MAAO;QACPC,UAAU,EAAEC,sBAAsB;QAClCC,QAAQ,EAAE;MACd,CAAC;IACL,CAAC;EACL;EAEA,OAAgBC,UAAUA,CAACC,cAA4C,EAAgB;IACnF,MAAM7B,IAAI,GAAG,IAAIH,YAAY,CAACgC,cAAc,CAACxB,KAAK,EAAEwB,cAAc,CAACvB,OAAO,CAAC;IAC3EN,IAAI,CAAC8B,SAAS,CAACD,cAAc,CAACE,MAAM,CAAC;IACrC/B,IAAI,CAACgC,SAAS,CAACH,cAAc,CAACI,MAAM,CAAC;IACrCjC,IAAI,CAACkC,YAAY,CAACL,cAAc,CAACM,SAAS,CAAC;IAC3C,OAAOnC,IAAI;EACf;EAESoC,UAAUA,CAAA,EAAiC;IAChD,OAAO;MACH,GAAG,KAAK,CAACA,UAAU,CAAC,CAAC;MACrB9B,OAAO,EAAE,IAAI,CAAC+B,UAAU,CAAC,CAAC;MAC1BC,IAAI,EAAE1C,cAAc;MACpBS,KAAK,EAAE,IAAI,CAACkC,QAAQ,CAAC;IACzB,CAAC;EACL;EAESC,MAAMA,CAAC,GAAGC,KAAoB,EAAQ;IAC3C,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGD,KAAK,CAACE,MAAM,EAAED,CAAC,EAAE,EAAE;MACnC,MAAM1C,IAAI,GAAGyC,KAAK,CAACC,CAAC,CAAC;MAErB,IAAI5D,cAAc,CAACkB,IAAI,CAAC,IAAI,IAAI,CAAC4C,YAAY,CAAC5C,IAAI,CAAC,EAAE;QACjD,MAAM6C,QAAQ,GAAG7C,IAAI,CAAC8C,WAAW,CAAC,CAAC;QACnC,IAAI,CAACN,MAAM,CAAC,GAAGK,QAAQ,CAAC;QACxB7C,IAAI,CAAC+C,MAAM,CAAC,CAAC;MACjB,CAAC,MAAM;QACH,KAAK,CAACP,MAAM,CAACxC,IAAI,CAAC;MACtB;IACJ;IAEA,OAAO,IAAI;EACf;EAESgD,OAAOA,CAAwBC,eAAkB,EAAEC,eAAyB,EAAK;IACtF,IAAIC,eAAe,CAACF,eAAe,CAAC,EAAE;MAClC,OAAO,KAAK,CAACD,OAAO,CAACC,eAAe,CAAC;IACzC;IACA,IAAI,CAACjB,SAAS,CAAC,CAAC,CAAC;IACjB,MAAMoB,IAAI,GAAG,IAAI,CAACC,gBAAgB,CAAC,CAAC;IACpC,IAAI,CAACjE,WAAW,CAACgE,IAAI,CAAC,EAAE;MACpB,OAAOH,eAAe;IAC1B;IACA,IAAIG,IAAI,CAACE,OAAO,KAAK,IAAI,CAACC,MAAM,CAAC,CAAC,EAAE;MAChCH,IAAI,CAACI,YAAY,CAACP,eAAe,CAAC;IACtC,CAAC,MAAM,IAAIG,IAAI,CAACK,MAAM,KAAK,IAAI,CAACF,MAAM,CAAC,CAAC,EAAE;MACtCH,IAAI,CAACM,WAAW,CAACT,eAAe,CAAC;IACrC,CAAC,MAAM;MACH;MACA,MAAMU,OAAO,GAAGxE,eAAe,CAACiE,IAAI,CAACpC,WAAW,CAAC,CAAC,CAAC;MACnD,IAAI4C,WAAW,GAAG,IAAI,CAACC,cAAc,CAAC,CAAC;MACvC,OAAOD,WAAW,EAAE;QAChB,MAAME,YAAY,GAAGF,WAAW;QAChCA,WAAW,GAAGA,WAAW,CAACC,cAAc,CAAC,CAAC;QAC1CF,OAAO,CAACnB,MAAM,CAACsB,YAAY,CAAC;MAChC;MACAV,IAAI,CAACM,WAAW,CAACT,eAAe,CAAC;MACjCA,eAAe,CAACS,WAAW,CAACC,OAAO,CAAC;IACxC;IACA,IAAIT,eAAe,EAAE;MACjB,IAAI,CAACpE,cAAc,CAACmE,eAAe,CAAC,EAAE;QAClC,MAAMc,KAAK,CAAC,sDAAsD,CAAC;MACvE;MAEA,IAAI,CAACjB,WAAW,CAAC,CAAC,CAACkB,OAAO,CAAEC,KAAkB,IAAK;QAC/ChB,eAAe,CAACT,MAAM,CAACyB,KAAK,CAAC;MACjC,CAAC,CAAC;IACN;IACA,IAAI,CAAClB,MAAM,CAAC,CAAC;IACb,IAAIK,IAAI,CAACc,eAAe,CAAC,CAAC,KAAK,CAAC,EAAE;MAC9Bd,IAAI,CAACL,MAAM,CAAC,CAAC;IACjB;IACA,OAAOE,eAAe;EAC1B;EAESS,WAAWA,CAAC1D,IAAiB,EAAe;IACjD,MAAMmE,QAAQ,GAAG,IAAI,CAACd,gBAAgB,CAAC,CAAC;IAExC,IAAI,CAACjE,WAAW,CAAC+E,QAAQ,CAAC,EAAE;MACxBC,OAAO,CAACC,GAAG,CAAC,+DAA+D,CAAC;MAC5E,OAAOF,QAAQ;IACnB;IAEA,MAAMG,QAAQ,GAAG,IAAI,CAACC,eAAe,CAAC,CAAC;IAEvC,IAAIpB,eAAe,CAACnD,IAAI,CAAC,EAAE;MACvB,MAAMwE,KAAK,GAAG,KAAK,CAACd,WAAW,CAAC1D,IAAI,CAAC;MACrC,MAAMyE,aAAa,GAAGzE,IAAI,CAACqD,gBAAgB,CAAC,CAAC;MAE7C,IAAIjE,WAAW,CAACqF,aAAa,CAAC,EAAE;QAC5BjF,2BAA2B,CAACiF,aAAa,CAAC;MAC9C;MAEA,OAAOD,KAAK;IAChB;;IAEA;;IAEA,IAAIpF,WAAW,CAACY,IAAI,CAAC,IAAIA,IAAI,CAACgB,WAAW,CAAC,CAAC,KAAKmD,QAAQ,CAACnD,WAAW,CAAC,CAAC,EAAE;MACpE,IAAIiD,KAAK,GAAGjE,IAAI;MAChB,MAAM6C,QAAQ,GAAG7C,IAAI,CAAC8C,WAAW,CAAW,CAAC;MAE7C,KAAK,IAAIJ,CAAC,GAAGG,QAAQ,CAACF,MAAM,GAAG,CAAC,EAAED,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;QAC3CuB,KAAK,GAAGpB,QAAQ,CAACH,CAAC,CAAC;QAEnB,IAAI,CAACgB,WAAW,CAACO,KAAK,CAAC;MAC3B;MAEA,OAAOA,KAAK;IAChB;;IAEA;IACA;IACAE,QAAQ,CAACT,WAAW,CAAC1D,IAAI,CAAC;IAE1B,IAAIsE,QAAQ,CAAC3B,MAAM,KAAK,CAAC,EAAE;MACvB,MAAM+B,WAAW,GAAGvF,eAAe,CAACgF,QAAQ,CAACnD,WAAW,CAAC,CAAC,CAAC;MAE3DsD,QAAQ,CAACN,OAAO,CAACW,OAAO,IAAID,WAAW,CAAClC,MAAM,CAACmC,OAAO,CAAC,CAAC;MAExD3E,IAAI,CAAC0D,WAAW,CAACgB,WAAW,CAAC;IACjC;IAEA,OAAO1E,IAAI;EACf;EAES+C,MAAMA,CAAC6B,mBAA6B,EAAQ;IACjD,MAAMC,WAAW,GAAG,IAAI,CAACC,kBAAkB,CAAC,CAAC;IAC7C,MAAMlB,WAAW,GAAG,IAAI,CAACC,cAAc,CAAC,CAAC;IACzC,KAAK,CAACd,MAAM,CAAC6B,mBAAmB,CAAC;IAEjC,IACIC,WAAW,IACXjB,WAAW,IACXjE,gBAAgB,CAACkF,WAAW,CAAC,IAC7BlF,gBAAgB,CAACiE,WAAW,CAAC,EAC/B;MACErE,UAAU,CAACsF,WAAW,CAACE,aAAa,CAAC,CAAC,EAAEnB,WAAW,CAACmB,aAAa,CAAC,CAAC,CAAC;MACpEnB,WAAW,CAACb,MAAM,CAAC,CAAC;IACxB,CAAC,MAAM,IAAIa,WAAW,EAAE;MACpB,MAAM9C,MAAM,GAAG8C,WAAW,CAAC7C,SAAS,CAAC,CAAC;MAEtC,IAAI3B,WAAW,CAAC0B,MAAM,CAAC,EAAE;QACrBtB,2BAA2B,CAACsB,MAAM,CAAC;MACvC;IACJ;EACJ;EAESkE,cAAcA,CAAA,EAAiC;IACpD,MAAMC,UAAU,GAAGC,mBAAmB,CAAC,IAAI,CAAChF,SAAS,IAAI,IAAI,GAAGM,SAAS,GAAG,KAAK,CAAC;IAClF,IAAI,CAACkD,WAAW,CAACuB,UAAU,CAAC;IAE5B,OAAOA,UAAU;EACrB;EAESE,eAAeA,CAACC,SAAyB,EAAQ;IACtD,MAAMC,SAAS,GAAG5F,oBAAoB,CAAC,CAAC;IACxC,MAAMoD,QAAQ,GAAG,IAAI,CAACC,WAAW,CAAC,CAAC;IACnCD,QAAQ,CAACmB,OAAO,CAACC,KAAK,IAAIoB,SAAS,CAAC7C,MAAM,CAACyB,KAAK,CAAC,CAAC;IAClD,MAAME,QAAQ,GAAG,IAAI,CAACd,gBAAgB,CAAC,CAAC;IACxC,MAAMiC,cAAc,GAAGnB,QAAQ,CAACd,gBAAgB,CAAC,CAAC;IAClD,MAAMkC,UAAU,GAAGpC,eAAe,CAACmC,cAAc,CAAC;IAElD,IAAInB,QAAQ,CAACD,eAAe,CAAC,CAAC,KAAK,CAAC,EAAE;MAClC,IAAIqB,UAAU,EAAE;QACZ;QACA;QACApB,QAAQ,CAACpB,MAAM,CAAC,CAAC;QACjBuC,cAAc,CAACE,MAAM,CAAC,CAAC;MAC3B,CAAC,MAAM;QACHrB,QAAQ,CAACnB,OAAO,CAACqC,SAAS,CAAC;QAC3B;QACA;QACA,MAAMI,MAAM,GAAGL,SAAS,CAACK,MAAM;QAC/B,MAAMC,KAAK,GAAGN,SAAS,CAACM,KAAK;QAC7B,MAAMnF,GAAG,GAAG8E,SAAS,CAAC9B,MAAM,CAAC,CAAC;QAE9B,IAAIkC,MAAM,CAACnD,IAAI,KAAK,SAAS,IAAImD,MAAM,CAACE,OAAO,CAAC,CAAC,CAACC,EAAE,CAAC,IAAI,CAAC,EAAE;UACxDH,MAAM,CAACI,GAAG,CAACtF,GAAG,EAAEkF,MAAM,CAACK,MAAM,EAAE,SAAS,CAAC;QAC7C;QAEA,IAAIJ,KAAK,CAACpD,IAAI,KAAK,SAAS,IAAIoD,KAAK,CAACC,OAAO,CAAC,CAAC,CAACC,EAAE,CAAC,IAAI,CAAC,EAAE;UACtDF,KAAK,CAACG,GAAG,CAACtF,GAAG,EAAEmF,KAAK,CAACI,MAAM,EAAE,SAAS,CAAC;QAC3C;MACJ;IACJ,CAAC,MAAM;MACH3B,QAAQ,CAACX,YAAY,CAAC6B,SAAS,CAAC;MAChC,IAAI,CAACtC,MAAM,CAAC,CAAC;IACjB;IAEA,OAAO,IAAI;EACf;EAEAR,QAAQA,CAAA,EAAW;IACf,MAAMwD,IAAI,GAAG,IAAI,CAACC,SAAS,CAAC,CAAC;IAE7B,OAAOD,IAAI,CAAC9F,OAAO;EACvB;EAEAgG,QAAQA,CAAC5F,KAAa,EAAQ;IAC1B,MAAM0F,IAAI,GAAG,IAAI,CAACG,WAAW,CAAC,CAAC;IAC/BH,IAAI,CAAC9F,OAAO,GAAGI,KAAK;EACxB;EAEAgC,UAAUA,CAAA,EAAwB;IAC9B,MAAM0D,IAAI,GAAG,IAAI,CAACC,SAAS,CAAC,CAAC;IAE7B,OAAOD,IAAI,CAAC7F,SAAS;EACzB;EAEAiG,UAAUA,CAAC7F,OAAiB,EAAQ;IAChC,MAAMyF,IAAI,GAAG,IAAI,CAACG,WAAW,CAAC,CAAC;IAC/BH,IAAI,CAAC7F,SAAS,GAAGI,OAAO;EAC5B;EAES8F,SAASA,CAAA,EAAW;IACzB;IACA,MAAMtF,MAAM,GAAG,IAAI,CAACC,SAAS,CAAC,CAAC;IAC/B,IAAID,MAAM,KAAK,IAAI,EAAE;MACjB,OAAO,IAAI,CAACkF,SAAS,CAAC,CAAC,CAACK,QAAQ;IACpC;IACA;IACA,IAAIf,cAAc,GAAGxE,MAAM,CAACuC,gBAAgB,CAAC,CAAC;IAC9C,IAAIiD,WAAW,GAAG,CAAC;IACnB,OAAOnD,eAAe,CAACmC,cAAc,CAAC,EAAE;MACpCA,cAAc,GAAGA,cAAc,CAACjC,gBAAgB,CAAC,CAAC,CAACA,gBAAgB,CAAC,CAAC;MACrEiD,WAAW,EAAE;IACjB;IAEA,OAAOA,WAAW;EACtB;EAEStE,SAASA,CAACC,MAAc,EAAQ;IACrC,IAAIsE,aAAa,GAAG,IAAI,CAACH,SAAS,CAAC,CAAC;IACpC,OAAOG,aAAa,KAAKtE,MAAM,EAAE;MAC7B,IAAIsE,aAAa,GAAGtE,MAAM,EAAE;QACxB5C,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC;QACrBkH,aAAa,EAAE;MACnB,CAAC,MAAM;QACHjH,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC;QACtBiH,aAAa,EAAE;MACnB;IACJ;IAEA,OAAO,IAAI;EACf;EAESC,SAASA,CAAA,EAAU;IACxB;;IAEA,OAAO,KAAK;EAChB;EAEShD,YAAYA,CAACiD,YAAyB,EAAe;IAC1D,IAAItD,eAAe,CAACsD,YAAY,CAAC,EAAE;MAC/B,MAAM3F,MAAM,GAAG,IAAI,CAACuC,gBAAgB,CAAC,CAAC;MAEtC,IAAIjE,WAAW,CAAC0B,MAAM,CAAC,EAAE;QACrB,MAAMwD,QAAQ,GAAG,IAAI,CAACC,eAAe,CAAC,CAAC;QACvC/E,2BAA2B,CAACsB,MAAM,EAAEwD,QAAQ,CAAC;MACjD;IACJ;IAEA,OAAO,KAAK,CAACd,YAAY,CAACiD,YAAY,CAAC;EAC3C;EAESC,cAAcA,CAAC1G,IAAiB,EAAW;IAChD,OAAOZ,WAAW,CAACY,IAAI,CAAC;EAC5B;EAES2G,cAAcA,CAACC,WAAwB,EAAW;IACvD,OAAOzD,eAAe,CAACyD,WAAW,CAAC;EACvC;EAEShE,YAAYA,CAAC5C,IAAiB,EAAW;IAC9C,OAAON,gBAAgB,CAACM,IAAI,CAAC,IAAImD,eAAe,CAACnD,IAAI,CAAC;EAC1D;EAES6G,gBAAgBA,CAAC5C,KAAkB,EAAEmB,SAAyB,EAAW;IAC9E,IAAI,CAACrG,iBAAiB,CAACqG,SAAS,CAAC,EAAE;MAC/B,OAAO,KAAK;IAChB;IAEA,MAAM0B,UAAU,GAAG1B,SAAS,CAACK,MAAM,CAACE,OAAO,CAAC,CAAC;IAC7C,MAAMoB,SAAS,GAAG3B,SAAS,CAACM,KAAK,CAACC,OAAO,CAAC,CAAC;IAE3C,OACI,IAAI,CAACqB,UAAU,CAACF,UAAU,CAAC,IAC3B,IAAI,CAACE,UAAU,CAACD,SAAS,CAAC,IAC1B,IAAI,CAACE,cAAc,CAAC,CAAC,CAACtE,MAAM,KAAKyC,SAAS,CAAC6B,cAAc,CAAC,CAAC,CAACtE,MAAM;EAE1E;AACJ;AAEA,SAASzB,2BAA2BA,CAChCI,GAAgB,EAChB4F,kBAAsC,EACtClH,IAAkB,EACd;EACJ,MAAMmH,YAAY,GAAG,EAAE;EACvB,MAAMC,eAAe,GAAG,EAAE;EAC1B,MAAMC,SAAS,GAAGH,kBAAkB,CAAC9D,IAAI;EACzC,MAAMkE,iBAAiB,GAAGD,SAAS,GAAGA,SAAS,CAACE,QAAQ,GAAG/G,SAAS;EACpE,IAAIgH,uBAAuB;EAE3B,IAAIH,SAAS,IAAIA,SAAS,CAACI,MAAM,EAAE;IAC/BD,uBAAuB,GAAGH,SAAS,CAACI,MAAM,CAACF,QAAQ;EACvD;EAEA,IAAID,iBAAiB,KAAK9G,SAAS,EAAE;IACjC,MAAMkH,eAAe,GAAGJ,iBAAiB,CAACK,KAAK,CAAC,GAAG,CAAC;IACpDR,YAAY,CAACS,IAAI,CAAC,GAAGF,eAAe,CAAC;EACzC;EAEA,IAAIL,SAAS,EAAE;IACX,MAAMQ,UAAU,GAAG7H,IAAI,CAACe,SAAS,CAAC,CAAC;IACnC,MAAM+G,WAAW,GAAG1I,WAAW,CAACyI,UAAU,CAAC,IAAIA,UAAU,EAAE7G,WAAW,CAAC,CAAC,KAAK,OAAO;IACpF,MAAMV,OAAO,GAAGN,IAAI,CAACqC,UAAU,CAAC,CAAC;IAEjC,IAAI,CAACyF,WAAW,IAAIxH,OAAO,EAAE;MACzB8G,eAAe,CAACQ,IAAI,CAACP,SAAS,CAACU,iBAAiB,CAAC;IACrD;IAEA,IAAI,CAACD,WAAW,IAAI,CAACxH,OAAO,EAAE;MAC1B8G,eAAe,CAACQ,IAAI,CAACP,SAAS,CAACW,eAAe,CAAC;IACnD;IAEA,IAAIF,WAAW,EAAE;MACbX,YAAY,CAACS,IAAI,CAACtH,OAAO,GAAG+G,SAAS,CAACW,eAAe,GAAGX,SAAS,CAACU,iBAAiB,CAAC;IACxF;EACJ;EAEA,IAAIP,uBAAuB,KAAKhH,SAAS,EAAE;IACvC,MAAMyH,qBAAqB,GAAGT,uBAAuB,CAACG,KAAK,CAAC,GAAG,CAAC;IAEhE,IAAI3H,IAAI,CAAC8C,WAAW,CAAC,CAAC,CAACoF,IAAI,CAACjE,KAAK,IAAI7E,WAAW,CAAC6E,KAAK,CAAC,CAAC,EAAE;MACtDkD,YAAY,CAACS,IAAI,CAAC,GAAGK,qBAAqB,CAAC;IAC/C,CAAC,MAAM;MACHb,eAAe,CAACQ,IAAI,CAAC,GAAGK,qBAAqB,CAAC;IAClD;EACJ;EAEA,IAAIb,eAAe,CAACzE,MAAM,GAAG,CAAC,EAAE;IAC5BzD,2BAA2B,CAACoC,GAAG,EAAE,GAAG8F,eAAe,CAAC;EACxD;EAEA,IAAID,YAAY,CAACxE,MAAM,GAAG,CAAC,EAAE;IACzB1D,sBAAsB,CAACqC,GAAG,EAAE,GAAG6F,YAAY,CAAC;EAChD;AACJ;AAEA,SAASlG,qBAAqBA,CAC1BK,GAAgB,EAChB6G,YAA0B,EAC1BC,gBAAqC,EACrCjE,QAAkB,EACd;EACJ,MAAM2D,WAAW,GAAG3D,QAAQ,CAACnD,WAAW,CAAC,CAAC,KAAK,OAAO;EAEtD,IAAI8G,WAAW,EAAE;IACb;IACA,IAAI1I,WAAW,CAAC+I,YAAY,CAACpD,aAAa,CAAC,CAAC,CAAC,EAAE;MAC3CzD,GAAG,CAAC+G,eAAe,CAAC,MAAM,CAAC;MAC3B/G,GAAG,CAAC+G,eAAe,CAAC,UAAU,CAAC;MAC/B/G,GAAG,CAAC+G,eAAe,CAAC,cAAc,CAAC;IACvC,CAAC,MAAM;MACH/G,GAAG,CAACgH,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC;MACpChH,GAAG,CAACgH,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC;MAElC,IAAI,CAACF,gBAAgB,IAAID,YAAY,CAACjI,SAAS,KAAKkI,gBAAgB,CAAClI,SAAS,EAAE;QAC5EoB,GAAG,CAACgH,YAAY,CAAC,cAAc,EAAEH,YAAY,CAAC9F,UAAU,CAAC,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC;MAClF;IACJ;EACJ,CAAC,MAAM;IACH;IACA,IAAI8F,YAAY,CAAC9F,UAAU,CAAC,CAAC,IAAI,IAAI,EAAE;MACnC8F,YAAY,CAAChC,UAAU,CAAC3F,SAAS,CAAC;IACtC;EACJ;AACJ;AAEA,SAASkB,sBAAsBA,CAAA,EAAwB;EACnD,OAAO;IAAE1B,IAAI,EAAEkF,mBAAmB,CAAC;EAAE,CAAC;AAC1C;AAEA,OAAO,SAASA,mBAAmBA,CAAC5E,OAAiB,EAAgB;EACjE,OAAO,IAAIT,YAAY,CAACW,SAAS,EAAEF,OAAO,CAAC;AAC/C;AAEA,OAAO,SAAS6C,eAAeA,CAACnD,IAAoC,EAAwB;EACxF,OAAOA,IAAI,YAAYH,YAAY;AACvC","ignoreList":[]}
package/ListNode.js CHANGED
@@ -1,6 +1,5 @@
1
- import { ElementNode } from "lexical";
1
+ import { ElementNode, addClassNamesToElement, removeClassNamesFromElement } from "lexical";
2
2
  import { Theme } from "@webiny/lexical-theme";
3
- import { addClassNamesToElement, removeClassNamesFromElement } from "@lexical/utils";
4
3
  import { $getListDepth, wrapInListItem } from "./utils/listNode.js";
5
4
  import { $isListItemNode } from "./ListItemNode.js";
6
5
  export class ListNode extends ElementNode {
package/ListNode.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["ElementNode","Theme","addClassNamesToElement","removeClassNamesFromElement","$getListDepth","wrapInListItem","$isListItemNode","ListNode","constructor","listType","options","styleId","key","className","start","__styleId","__className","_listType","TAG_TO_WEBINY_LIST_TYPE","__listType","__tag","__start","getType","createDOM","config","tag","element","document","createElement","setAttribute","String","updateElementWithThemeClasses","from","theme","__lexicalListType","setListThemeClassNames","exportDOM","editor","base","classList","add","clone","node","getListType","getClassName","getStyleId","getStart","getKey","setStyleId","setClassName","importJSON","serializedNode","$createListNode","setFormat","format","setIndent","indent","setDirection","direction","exportJSON","getTag","type","importDomConversionMap","conversion","convertListNode","priority","importDOM","ol","ul","updateDOM","prevNode","dom","extractWithChild","child","setDefaultTypography","typographyStyle","getTypographyByTag","id","classesToAdd","classesToRemove","listTheme","tokens","list","undefined","listTypography","getTypographyById","listLevelsClassNames","listDepth","normalizedListDepth","length","listLevelClassName","listClassName","nestedListClassName","nestedListTheme","nested","push","listItemClasses","split","i","nestedListItemClasses","normalizeChildren","nodes","normalizedListItems","getChildren","forEach","$isListNode","domNode","nodeName","toLowerCase","after"],"sources":["ListNode.ts"],"sourcesContent":["import type {\n DOMConversion,\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n EditorConfig,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n SerializedElementNode,\n Spread\n} from \"lexical\";\nimport { ElementNode } from \"lexical\";\nimport { Theme } from \"@webiny/lexical-theme\";\nimport { addClassNamesToElement, removeClassNamesFromElement } from \"@lexical/utils\";\nimport type { ListNodeTagType } from \"@lexical/list\";\nimport { $getListDepth, wrapInListItem } from \"~/utils/listNode.js\";\nimport type { ListItemNode } from \"./ListItemNode.js\";\nimport { $isListItemNode } from \"./ListItemNode.js\";\nimport type { ListType } from \"@lexical/list\";\nimport type { TypographyStylesNode } from \"~/types.js\";\n\nexport type SerializedWebinyListNode = Spread<\n {\n styleId?: string;\n className?: string;\n listType: ListType;\n start: number;\n tag: ListNodeTagType;\n type: \"wby-list\";\n },\n SerializedElementNode\n>;\n\ntype ListNodeOptions = {\n styleId?: string;\n className?: string;\n start?: number;\n key?: NodeKey;\n};\n\nexport class ListNode extends ElementNode implements TypographyStylesNode {\n /** @internal */\n __tag: ListNodeTagType;\n /** @internal */\n __start: number;\n /** @internal */\n __listType: ListType;\n\n private __styleId: string;\n private __className: string | undefined;\n\n constructor(listType: ListType, options: ListNodeOptions = {}) {\n const { styleId, key, className, start } = options;\n super(key);\n this.__styleId = styleId ?? \"\";\n this.__className = className;\n const _listType = TAG_TO_WEBINY_LIST_TYPE[listType] || listType;\n this.__listType = _listType;\n this.__tag = _listType === \"number\" ? \"ol\" : \"ul\";\n this.__start = start || 1;\n }\n\n static override getType() {\n return \"wby-list\";\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const tag = this.__tag;\n const element = document.createElement(tag);\n\n if (this.__start !== 1) {\n element.setAttribute(\"start\", String(this.__start));\n }\n\n this.updateElementWithThemeClasses(element, Theme.from(config.theme));\n\n // @ts-expect-error Internal field.\n element.__lexicalListType = this.__listType;\n const theme = Theme.from(config.theme);\n setListThemeClassNames(element, theme, this, this.__styleId);\n return element;\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 clone(node: ListNode): ListNode {\n return new ListNode(node.getListType(), {\n className: node.getClassName(),\n styleId: node.getStyleId(),\n start: node.getStart(),\n key: node.getKey()\n });\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 importJSON(serializedNode: SerializedWebinyListNode): ListNode {\n const node = $createListNode(\n serializedNode.listType,\n // `styleId` is for backwards compatibility\n serializedNode.styleId ?? serializedNode.styleId,\n serializedNode.start\n );\n node.setFormat(serializedNode.format);\n node.setIndent(serializedNode.indent);\n node.setDirection(serializedNode.direction);\n\n node.setClassName(serializedNode.className);\n\n return node;\n }\n\n override exportJSON(): SerializedWebinyListNode {\n return {\n ...super.exportJSON(),\n styleId: this.__styleId,\n className: this.__className,\n listType: this.getListType(),\n start: this.getStart(),\n tag: this.getTag(),\n type: \"wby-list\"\n };\n }\n\n static importDomConversionMap(): DOMConversion<HTMLElement> | null {\n return {\n conversion: convertListNode,\n priority: 0\n };\n }\n\n static override importDOM(): DOMConversionMap | null {\n return {\n ol: () => {\n return this.importDomConversionMap();\n },\n ul: () => {\n return this.importDomConversionMap();\n }\n };\n }\n\n override updateDOM(prevNode: ListNode, dom: HTMLElement, config: EditorConfig): boolean {\n if (prevNode.__tag !== this.__tag) {\n return true;\n }\n\n setListThemeClassNames(dom, Theme.from(config.theme), this, this.__styleId);\n return false;\n }\n\n override extractWithChild(child: LexicalNode): boolean {\n return $isListItemNode(child);\n }\n\n public getListType(): ListType {\n return this.__listType;\n }\n\n public getStart(): number {\n return this.__start;\n }\n\n private getTag(): ListNodeTagType {\n return this.__tag;\n }\n\n protected updateElementWithThemeClasses(element: HTMLElement, theme: Theme): HTMLElement {\n if (!this.__styleId || !this.__className) {\n this.setDefaultTypography(theme);\n }\n\n if (this.__className) {\n addClassNamesToElement(element, this.__className);\n }\n\n return element;\n }\n\n private setDefaultTypography(theme: Theme) {\n const typographyStyle = theme.getTypographyByTag(this.getTag());\n if (typographyStyle) {\n this.__styleId = typographyStyle.id;\n this.__className = typographyStyle.className;\n }\n }\n}\n\nfunction setListThemeClassNames(\n dom: HTMLElement,\n theme: Theme,\n node: ListNode,\n styleId: string\n): void {\n const classesToAdd = [];\n const classesToRemove = [];\n const listTheme = theme.tokens.list;\n if (listTheme !== undefined) {\n const listTypography = theme.getTypographyById(styleId);\n const listLevelsClassNames = listTheme[`${node.__tag}Depth`] || [];\n const listDepth = $getListDepth(node) - 1;\n const normalizedListDepth = listDepth % listLevelsClassNames.length;\n const listLevelClassName = listLevelsClassNames[normalizedListDepth];\n const listClassName = `${listTheme[node.__tag]} ${listTypography?.className ?? \"\"}`;\n let nestedListClassName;\n const nestedListTheme = listTheme.nested;\n\n if (nestedListTheme !== undefined && nestedListTheme.list) {\n nestedListClassName = nestedListTheme.list;\n }\n\n if (listClassName) {\n classesToAdd.push(listClassName);\n }\n\n if (listLevelClassName !== undefined) {\n const listItemClasses = listLevelClassName.split(\" \");\n classesToAdd.push(...listItemClasses);\n for (let i = 0; i < listLevelsClassNames.length; i++) {\n if (i !== normalizedListDepth) {\n classesToRemove.push(node.__tag + i);\n }\n }\n }\n\n if (nestedListClassName !== undefined) {\n const nestedListItemClasses = nestedListClassName.split(\" \");\n\n if (listDepth > 1) {\n classesToAdd.push(...nestedListItemClasses);\n } else {\n classesToRemove.push(...nestedListItemClasses);\n }\n }\n }\n\n if (classesToRemove.length > 0) {\n removeClassNamesFromElement(dom, ...classesToRemove);\n }\n\n if (classesToAdd.length > 0) {\n addClassNamesToElement(dom, ...classesToAdd);\n }\n}\n\n/*\n * This function normalizes the children of a ListNode after the conversion from HTML,\n * ensuring that they are all ListItemNodes and contain either a single nested ListNode\n * or some other inline content.\n */\nfunction normalizeChildren(nodes: Array<ListNode>): Array<ListItemNode> {\n const normalizedListItems: Array<ListItemNode> = [];\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if ($isListItemNode(node)) {\n normalizedListItems.push(node);\n node.getChildren().forEach(child => {\n if ($isListNode(child)) {\n normalizedListItems.push(wrapInListItem(child));\n }\n });\n } else {\n normalizedListItems.push(wrapInListItem(node));\n }\n }\n return normalizedListItems;\n}\n\nfunction convertListNode(domNode: Node): DOMConversionOutput {\n const nodeName = domNode.nodeName.toLowerCase();\n let node = null;\n\n if (nodeName === \"ol\") {\n node = $createListNode(\"number\");\n } else if (nodeName === \"ul\") {\n node = $createListNode(\"bullet\");\n }\n\n return {\n // @ts-expect-error\n after: normalizeChildren,\n node\n };\n}\n\nconst TAG_TO_WEBINY_LIST_TYPE: Record<string, ListType> = {\n ol: \"number\",\n ul: \"bullet\"\n};\n\nexport function $createListNode(listType: ListType, styleId?: string, start = 1): ListNode {\n return new ListNode(listType, {\n start,\n styleId\n });\n}\n\nexport function $isListNode(node: LexicalNode | null | undefined): node is ListNode {\n return node instanceof ListNode;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["ElementNode","addClassNamesToElement","removeClassNamesFromElement","Theme","$getListDepth","wrapInListItem","$isListItemNode","ListNode","constructor","listType","options","styleId","key","className","start","__styleId","__className","_listType","TAG_TO_WEBINY_LIST_TYPE","__listType","__tag","__start","getType","createDOM","config","tag","element","document","createElement","setAttribute","String","updateElementWithThemeClasses","from","theme","__lexicalListType","setListThemeClassNames","exportDOM","editor","base","classList","add","clone","node","getListType","getClassName","getStyleId","getStart","getKey","setStyleId","setClassName","importJSON","serializedNode","$createListNode","setFormat","format","setIndent","indent","setDirection","direction","exportJSON","getTag","type","importDomConversionMap","conversion","convertListNode","priority","importDOM","ol","ul","updateDOM","prevNode","dom","extractWithChild","child","setDefaultTypography","typographyStyle","getTypographyByTag","id","classesToAdd","classesToRemove","listTheme","tokens","list","undefined","listTypography","getTypographyById","listLevelsClassNames","listDepth","normalizedListDepth","length","listLevelClassName","listClassName","nestedListClassName","nestedListTheme","nested","push","listItemClasses","split","i","nestedListItemClasses","normalizeChildren","nodes","normalizedListItems","getChildren","forEach","$isListNode","domNode","nodeName","toLowerCase","after"],"sources":["ListNode.ts"],"sourcesContent":["import type {\n DOMConversion,\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n EditorConfig,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n SerializedElementNode,\n Spread\n} from \"lexical\";\nimport { ElementNode, addClassNamesToElement, removeClassNamesFromElement } from \"lexical\";\nimport { Theme } from \"@webiny/lexical-theme\";\nimport type { ListNodeTagType } from \"@lexical/list\";\nimport { $getListDepth, wrapInListItem } from \"~/utils/listNode.js\";\nimport type { ListItemNode } from \"./ListItemNode.js\";\nimport { $isListItemNode } from \"./ListItemNode.js\";\nimport type { ListType } from \"@lexical/list\";\nimport type { TypographyStylesNode } from \"~/types.js\";\n\nexport type SerializedWebinyListNode = Spread<\n {\n styleId?: string;\n className?: string;\n listType: ListType;\n start: number;\n tag: ListNodeTagType;\n type: \"wby-list\";\n },\n SerializedElementNode\n>;\n\ntype ListNodeOptions = {\n styleId?: string;\n className?: string;\n start?: number;\n key?: NodeKey;\n};\n\nexport class ListNode extends ElementNode implements TypographyStylesNode {\n /** @internal */\n __tag: ListNodeTagType;\n /** @internal */\n __start: number;\n /** @internal */\n __listType: ListType;\n\n private __styleId: string;\n private __className: string | undefined;\n\n constructor(listType: ListType, options: ListNodeOptions = {}) {\n const { styleId, key, className, start } = options;\n super(key);\n this.__styleId = styleId ?? \"\";\n this.__className = className;\n const _listType = TAG_TO_WEBINY_LIST_TYPE[listType] || listType;\n this.__listType = _listType;\n this.__tag = _listType === \"number\" ? \"ol\" : \"ul\";\n this.__start = start || 1;\n }\n\n static override getType() {\n return \"wby-list\";\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const tag = this.__tag;\n const element = document.createElement(tag);\n\n if (this.__start !== 1) {\n element.setAttribute(\"start\", String(this.__start));\n }\n\n this.updateElementWithThemeClasses(element, Theme.from(config.theme));\n\n // @ts-expect-error Internal field.\n element.__lexicalListType = this.__listType;\n const theme = Theme.from(config.theme);\n setListThemeClassNames(element, theme, this, this.__styleId);\n return element;\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 clone(node: ListNode): ListNode {\n return new ListNode(node.getListType(), {\n className: node.getClassName(),\n styleId: node.getStyleId(),\n start: node.getStart(),\n key: node.getKey()\n });\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 importJSON(serializedNode: SerializedWebinyListNode): ListNode {\n const node = $createListNode(\n serializedNode.listType,\n // `styleId` is for backwards compatibility\n serializedNode.styleId ?? serializedNode.styleId,\n serializedNode.start\n );\n node.setFormat(serializedNode.format);\n node.setIndent(serializedNode.indent);\n node.setDirection(serializedNode.direction);\n\n node.setClassName(serializedNode.className);\n\n return node;\n }\n\n override exportJSON(): SerializedWebinyListNode {\n return {\n ...super.exportJSON(),\n styleId: this.__styleId,\n className: this.__className,\n listType: this.getListType(),\n start: this.getStart(),\n tag: this.getTag(),\n type: \"wby-list\"\n };\n }\n\n static importDomConversionMap(): DOMConversion<HTMLElement> | null {\n return {\n conversion: convertListNode,\n priority: 0\n };\n }\n\n static override importDOM(): DOMConversionMap | null {\n return {\n ol: () => {\n return this.importDomConversionMap();\n },\n ul: () => {\n return this.importDomConversionMap();\n }\n };\n }\n\n override updateDOM(prevNode: ListNode, dom: HTMLElement, config: EditorConfig): boolean {\n if (prevNode.__tag !== this.__tag) {\n return true;\n }\n\n setListThemeClassNames(dom, Theme.from(config.theme), this, this.__styleId);\n return false;\n }\n\n override extractWithChild(child: LexicalNode): boolean {\n return $isListItemNode(child);\n }\n\n public getListType(): ListType {\n return this.__listType;\n }\n\n public getStart(): number {\n return this.__start;\n }\n\n private getTag(): ListNodeTagType {\n return this.__tag;\n }\n\n protected updateElementWithThemeClasses(element: HTMLElement, theme: Theme): HTMLElement {\n if (!this.__styleId || !this.__className) {\n this.setDefaultTypography(theme);\n }\n\n if (this.__className) {\n addClassNamesToElement(element, this.__className);\n }\n\n return element;\n }\n\n private setDefaultTypography(theme: Theme) {\n const typographyStyle = theme.getTypographyByTag(this.getTag());\n if (typographyStyle) {\n this.__styleId = typographyStyle.id;\n this.__className = typographyStyle.className;\n }\n }\n}\n\nfunction setListThemeClassNames(\n dom: HTMLElement,\n theme: Theme,\n node: ListNode,\n styleId: string\n): void {\n const classesToAdd = [];\n const classesToRemove = [];\n const listTheme = theme.tokens.list;\n if (listTheme !== undefined) {\n const listTypography = theme.getTypographyById(styleId);\n const listLevelsClassNames = listTheme[`${node.__tag}Depth`] || [];\n const listDepth = $getListDepth(node) - 1;\n const normalizedListDepth = listDepth % listLevelsClassNames.length;\n const listLevelClassName = listLevelsClassNames[normalizedListDepth];\n const listClassName = `${listTheme[node.__tag]} ${listTypography?.className ?? \"\"}`;\n let nestedListClassName;\n const nestedListTheme = listTheme.nested;\n\n if (nestedListTheme !== undefined && nestedListTheme.list) {\n nestedListClassName = nestedListTheme.list;\n }\n\n if (listClassName) {\n classesToAdd.push(listClassName);\n }\n\n if (listLevelClassName !== undefined) {\n const listItemClasses = listLevelClassName.split(\" \");\n classesToAdd.push(...listItemClasses);\n for (let i = 0; i < listLevelsClassNames.length; i++) {\n if (i !== normalizedListDepth) {\n classesToRemove.push(node.__tag + i);\n }\n }\n }\n\n if (nestedListClassName !== undefined) {\n const nestedListItemClasses = nestedListClassName.split(\" \");\n\n if (listDepth > 1) {\n classesToAdd.push(...nestedListItemClasses);\n } else {\n classesToRemove.push(...nestedListItemClasses);\n }\n }\n }\n\n if (classesToRemove.length > 0) {\n removeClassNamesFromElement(dom, ...classesToRemove);\n }\n\n if (classesToAdd.length > 0) {\n addClassNamesToElement(dom, ...classesToAdd);\n }\n}\n\n/*\n * This function normalizes the children of a ListNode after the conversion from HTML,\n * ensuring that they are all ListItemNodes and contain either a single nested ListNode\n * or some other inline content.\n */\nfunction normalizeChildren(nodes: Array<ListNode>): Array<ListItemNode> {\n const normalizedListItems: Array<ListItemNode> = [];\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if ($isListItemNode(node)) {\n normalizedListItems.push(node);\n node.getChildren().forEach(child => {\n if ($isListNode(child)) {\n normalizedListItems.push(wrapInListItem(child));\n }\n });\n } else {\n normalizedListItems.push(wrapInListItem(node));\n }\n }\n return normalizedListItems;\n}\n\nfunction convertListNode(domNode: Node): DOMConversionOutput {\n const nodeName = domNode.nodeName.toLowerCase();\n let node = null;\n\n if (nodeName === \"ol\") {\n node = $createListNode(\"number\");\n } else if (nodeName === \"ul\") {\n node = $createListNode(\"bullet\");\n }\n\n return {\n // @ts-expect-error\n after: normalizeChildren,\n node\n };\n}\n\nconst TAG_TO_WEBINY_LIST_TYPE: Record<string, ListType> = {\n ol: \"number\",\n ul: \"bullet\"\n};\n\nexport function $createListNode(listType: ListType, styleId?: string, start = 1): ListNode {\n return new ListNode(listType, {\n start,\n styleId\n });\n}\n\nexport function $isListNode(node: LexicalNode | null | undefined): node is ListNode {\n return node instanceof ListNode;\n}\n"],"mappings":"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","ignoreList":[]}
package/ParagraphNode.js CHANGED
@@ -1,6 +1,5 @@
1
- import { ParagraphNode as BaseParagraphNode } from "lexical";
1
+ import { ParagraphNode as BaseParagraphNode, addClassNamesToElement } from "lexical";
2
2
  import { Theme } from "@webiny/lexical-theme";
3
- import { addClassNamesToElement } from "@lexical/utils";
4
3
  import { getStyleId } from "./utils/getStyleId.js";
5
4
  function convertParagraphElement(element) {
6
5
  const node = $createParagraphNode();
@@ -1 +1 @@
1
- {"version":3,"names":["ParagraphNode","BaseParagraphNode","Theme","addClassNamesToElement","getStyleId","convertParagraphElement","element","node","$createParagraphNode","style","setFormat","textAlign","constructor","options","styleId","key","className","__styleId","__className","setStyleId","setClassName","getClassName","getType","clone","__key","insertNewAfter","rangeSelection","restoreSelection","newElement","setTextFormat","format","setTextStyle","direction","getDirection","setDirection","getFormatType","setStyle","getStyle","insertAfter","createDOM","config","updateElementWithThemeClasses","from","theme","exportDOM","editor","base","classList","add","updateDOM","prevNode","dom","prevTypoStyleId","nextTypoStyleId","importDOM","p","conversion","priority","importJSON","serializedNode","setIndent","indent","styles","exportJSON","type","setDefaultTypography","typographyStyle","getTypographyByTag","byStyleId","getTypographyById","id","$isParagraphNode"],"sources":["ParagraphNode.ts"],"sourcesContent":["import type {\n DOMConversionMap,\n DOMConversionOutput,\n ElementFormatType,\n LexicalNode,\n NodeKey,\n SerializedParagraphNode as SerializedBaseParagraphNode,\n Spread,\n LexicalEditor,\n DOMExportOutput,\n RangeSelection\n} from \"lexical\";\nimport { ParagraphNode as BaseParagraphNode } from \"lexical\";\nimport type { EditorConfig } from \"lexical\";\nimport { Theme } from \"@webiny/lexical-theme\";\nimport { addClassNamesToElement } from \"@lexical/utils\";\nimport type { TypographyStylesNode, ThemeStyleValue } from \"~/types.js\";\nimport { getStyleId } from \"./utils/getStyleId.js\";\n\nfunction convertParagraphElement(element: HTMLElement): DOMConversionOutput {\n const node = $createParagraphNode();\n if (element.style) {\n node.setFormat(element.style.textAlign as ElementFormatType);\n }\n\n return { node };\n}\n\nexport type SerializeParagraphNode = Spread<\n {\n styles?: ThemeStyleValue[];\n styleId?: string;\n className?: string;\n type: \"wby-paragraph\";\n },\n SerializedBaseParagraphNode\n>;\n\ninterface ParagraphNodeOptions {\n className?: string;\n styleId?: string;\n key?: NodeKey;\n}\n\nexport class ParagraphNode extends BaseParagraphNode implements TypographyStylesNode {\n private __styleId: string | undefined;\n private __className: string | undefined;\n\n constructor(options: ParagraphNodeOptions = {}) {\n const { styleId, key, className } = options;\n super(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-paragraph\";\n }\n\n static override clone(node: ParagraphNode): ParagraphNode {\n return new ParagraphNode({\n styleId: node.getStyleId(),\n className: node.getClassName(),\n key: node.__key\n });\n }\n\n override insertNewAfter(\n rangeSelection: RangeSelection,\n restoreSelection: boolean\n ): ParagraphNode {\n const newElement = $createParagraphNode();\n newElement.setTextFormat(rangeSelection.format);\n newElement.setTextStyle(rangeSelection.style);\n const direction = this.getDirection();\n newElement.setDirection(direction);\n newElement.setFormat(this.getFormatType());\n newElement.setStyle(this.getStyle());\n this.insertAfter(newElement, restoreSelection);\n return newElement;\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = super.createDOM(config);\n return this.updateElementWithThemeClasses(element, Theme.from(config.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 override updateDOM(prevNode: ParagraphNode, dom: HTMLElement, config: EditorConfig): boolean {\n const prevTypoStyleId = prevNode.getStyleId();\n const nextTypoStyleId = this.getStyleId();\n\n if (!nextTypoStyleId) {\n this.updateElementWithThemeClasses(dom, Theme.from(config.theme));\n return false;\n }\n\n if (prevTypoStyleId !== nextTypoStyleId && nextTypoStyleId) {\n this.updateElementWithThemeClasses(dom, Theme.from(config.theme));\n }\n // Returning false tells Lexical that this node does not need its\n // DOM element replacing with a new copy from createDOM.\n return false;\n }\n\n /*\n * On copy/paste event this method will be executed in and create a node\n * */\n static override importDOM(): DOMConversionMap | null {\n return {\n p: () => ({\n conversion: convertParagraphElement,\n priority: 0\n })\n };\n }\n\n /*\n * Serialize the JSON data back into a node\n */\n static override importJSON(serializedNode: SerializeParagraphNode): BaseParagraphNode {\n const node = $createParagraphNode();\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 return node;\n }\n\n /*\n * Serialize the node to JSON data representation.\n * */\n override exportJSON(): SerializeParagraphNode {\n return {\n ...super.exportJSON(),\n styleId: this.__styleId,\n className: this.__className,\n type: \"wby-paragraph\"\n };\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(\"p\");\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 $createParagraphNode(styleId?: string): ParagraphNode {\n return new ParagraphNode({ styleId });\n}\n\nexport function $isParagraphNode(node: LexicalNode | null | undefined): node is ParagraphNode {\n return node instanceof ParagraphNode;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["ParagraphNode","BaseParagraphNode","addClassNamesToElement","Theme","getStyleId","convertParagraphElement","element","node","$createParagraphNode","style","setFormat","textAlign","constructor","options","styleId","key","className","__styleId","__className","setStyleId","setClassName","getClassName","getType","clone","__key","insertNewAfter","rangeSelection","restoreSelection","newElement","setTextFormat","format","setTextStyle","direction","getDirection","setDirection","getFormatType","setStyle","getStyle","insertAfter","createDOM","config","updateElementWithThemeClasses","from","theme","exportDOM","editor","base","classList","add","updateDOM","prevNode","dom","prevTypoStyleId","nextTypoStyleId","importDOM","p","conversion","priority","importJSON","serializedNode","setIndent","indent","styles","exportJSON","type","setDefaultTypography","typographyStyle","getTypographyByTag","byStyleId","getTypographyById","id","$isParagraphNode"],"sources":["ParagraphNode.ts"],"sourcesContent":["import type {\n DOMConversionMap,\n DOMConversionOutput,\n ElementFormatType,\n LexicalNode,\n NodeKey,\n SerializedParagraphNode as SerializedBaseParagraphNode,\n Spread,\n LexicalEditor,\n DOMExportOutput,\n RangeSelection\n} from \"lexical\";\nimport { ParagraphNode as BaseParagraphNode, addClassNamesToElement } from \"lexical\";\nimport type { EditorConfig } from \"lexical\";\nimport { Theme } from \"@webiny/lexical-theme\";\nimport type { TypographyStylesNode, ThemeStyleValue } from \"~/types.js\";\nimport { getStyleId } from \"./utils/getStyleId.js\";\n\nfunction convertParagraphElement(element: HTMLElement): DOMConversionOutput {\n const node = $createParagraphNode();\n if (element.style) {\n node.setFormat(element.style.textAlign as ElementFormatType);\n }\n\n return { node };\n}\n\nexport type SerializeParagraphNode = Spread<\n {\n styles?: ThemeStyleValue[];\n styleId?: string;\n className?: string;\n type: \"wby-paragraph\";\n },\n SerializedBaseParagraphNode\n>;\n\ninterface ParagraphNodeOptions {\n className?: string;\n styleId?: string;\n key?: NodeKey;\n}\n\nexport class ParagraphNode extends BaseParagraphNode implements TypographyStylesNode {\n private __styleId: string | undefined;\n private __className: string | undefined;\n\n constructor(options: ParagraphNodeOptions = {}) {\n const { styleId, key, className } = options;\n super(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-paragraph\";\n }\n\n static override clone(node: ParagraphNode): ParagraphNode {\n return new ParagraphNode({\n styleId: node.getStyleId(),\n className: node.getClassName(),\n key: node.__key\n });\n }\n\n override insertNewAfter(\n rangeSelection: RangeSelection,\n restoreSelection: boolean\n ): ParagraphNode {\n const newElement = $createParagraphNode();\n newElement.setTextFormat(rangeSelection.format);\n newElement.setTextStyle(rangeSelection.style);\n const direction = this.getDirection();\n newElement.setDirection(direction);\n newElement.setFormat(this.getFormatType());\n newElement.setStyle(this.getStyle());\n this.insertAfter(newElement, restoreSelection);\n return newElement;\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = super.createDOM(config);\n return this.updateElementWithThemeClasses(element, Theme.from(config.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 override updateDOM(prevNode: ParagraphNode, dom: HTMLElement, config: EditorConfig): boolean {\n const prevTypoStyleId = prevNode.getStyleId();\n const nextTypoStyleId = this.getStyleId();\n\n if (!nextTypoStyleId) {\n this.updateElementWithThemeClasses(dom, Theme.from(config.theme));\n return false;\n }\n\n if (prevTypoStyleId !== nextTypoStyleId && nextTypoStyleId) {\n this.updateElementWithThemeClasses(dom, Theme.from(config.theme));\n }\n // Returning false tells Lexical that this node does not need its\n // DOM element replacing with a new copy from createDOM.\n return false;\n }\n\n /*\n * On copy/paste event this method will be executed in and create a node\n * */\n static override importDOM(): DOMConversionMap | null {\n return {\n p: () => ({\n conversion: convertParagraphElement,\n priority: 0\n })\n };\n }\n\n /*\n * Serialize the JSON data back into a node\n */\n static override importJSON(serializedNode: SerializeParagraphNode): BaseParagraphNode {\n const node = $createParagraphNode();\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 return node;\n }\n\n /*\n * Serialize the node to JSON data representation.\n * */\n override exportJSON(): SerializeParagraphNode {\n return {\n ...super.exportJSON(),\n styleId: this.__styleId,\n className: this.__className,\n type: \"wby-paragraph\"\n };\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(\"p\");\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 $createParagraphNode(styleId?: string): ParagraphNode {\n return new ParagraphNode({ styleId });\n}\n\nexport function $isParagraphNode(node: LexicalNode | null | undefined): node is ParagraphNode {\n return node instanceof ParagraphNode;\n}\n"],"mappings":"AAYA,SAASA,aAAa,IAAIC,iBAAiB,EAAEC,sBAAsB,QAAQ,SAAS;AAEpF,SAASC,KAAK,QAAQ,uBAAuB;AAE7C,SAASC,UAAU;AAEnB,SAASC,uBAAuBA,CAACC,OAAoB,EAAuB;EACxE,MAAMC,IAAI,GAAGC,oBAAoB,CAAC,CAAC;EACnC,IAAIF,OAAO,CAACG,KAAK,EAAE;IACfF,IAAI,CAACG,SAAS,CAACJ,OAAO,CAACG,KAAK,CAACE,SAA8B,CAAC;EAChE;EAEA,OAAO;IAAEJ;EAAK,CAAC;AACnB;AAkBA,OAAO,MAAMP,aAAa,SAASC,iBAAiB,CAAiC;EAIjFW,WAAWA,CAACC,OAA6B,GAAG,CAAC,CAAC,EAAE;IAC5C,MAAM;MAAEC,OAAO;MAAEC,GAAG;MAAEC;IAAU,CAAC,GAAGH,OAAO;IAC3C,KAAK,CAACE,GAAG,CAAC;IAEV,IAAI,CAACE,SAAS,GAAGH,OAAO;IACxB,IAAI,CAACI,WAAW,GAAGF,SAAS;EAChC;EAEAZ,UAAUA,CAAA,EAAuB;IAC7B,OAAO,IAAI,CAACa,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,eAAe;EAC1B;EAEA,OAAgBC,KAAKA,CAAChB,IAAmB,EAAiB;IACtD,OAAO,IAAIP,aAAa,CAAC;MACrBc,OAAO,EAAEP,IAAI,CAACH,UAAU,CAAC,CAAC;MAC1BY,SAAS,EAAET,IAAI,CAACc,YAAY,CAAC,CAAC;MAC9BN,GAAG,EAAER,IAAI,CAACiB;IACd,CAAC,CAAC;EACN;EAESC,cAAcA,CACnBC,cAA8B,EAC9BC,gBAAyB,EACZ;IACb,MAAMC,UAAU,GAAGpB,oBAAoB,CAAC,CAAC;IACzCoB,UAAU,CAACC,aAAa,CAACH,cAAc,CAACI,MAAM,CAAC;IAC/CF,UAAU,CAACG,YAAY,CAACL,cAAc,CAACjB,KAAK,CAAC;IAC7C,MAAMuB,SAAS,GAAG,IAAI,CAACC,YAAY,CAAC,CAAC;IACrCL,UAAU,CAACM,YAAY,CAACF,SAAS,CAAC;IAClCJ,UAAU,CAAClB,SAAS,CAAC,IAAI,CAACyB,aAAa,CAAC,CAAC,CAAC;IAC1CP,UAAU,CAACQ,QAAQ,CAAC,IAAI,CAACC,QAAQ,CAAC,CAAC,CAAC;IACpC,IAAI,CAACC,WAAW,CAACV,UAAU,EAAED,gBAAgB,CAAC;IAC9C,OAAOC,UAAU;EACrB;EAESW,SAASA,CAACC,MAAoB,EAAe;IAClD,MAAMlC,OAAO,GAAG,KAAK,CAACiC,SAAS,CAACC,MAAM,CAAC;IACvC,OAAO,IAAI,CAACC,6BAA6B,CAACnC,OAAO,EAAEH,KAAK,CAACuC,IAAI,CAACF,MAAM,CAACG,KAAK,CAAC,CAAC;EAChF;EAESC,SAASA,CAACC,MAAqB,EAAmB;IACvD,MAAMC,IAAI,GAAG,KAAK,CAACF,SAAS,CAACC,MAAM,CAAC;IAEpC,MAAMvC,OAAO,GAAGwC,IAAI,CAACxC,OAAsB;IAC3C,IAAIA,OAAO,IAAI,IAAI,CAACY,WAAW,EAAE;MAC7BZ,OAAO,CAACyC,SAAS,CAACC,GAAG,CAAC,IAAI,CAAC9B,WAAW,CAAC;IAC3C;IAEA,OAAO;MAAE,GAAG4B,IAAI;MAAExC;IAAQ,CAAC;EAC/B;EAES2C,SAASA,CAACC,QAAuB,EAAEC,GAAgB,EAAEX,MAAoB,EAAW;IACzF,MAAMY,eAAe,GAAGF,QAAQ,CAAC9C,UAAU,CAAC,CAAC;IAC7C,MAAMiD,eAAe,GAAG,IAAI,CAACjD,UAAU,CAAC,CAAC;IAEzC,IAAI,CAACiD,eAAe,EAAE;MAClB,IAAI,CAACZ,6BAA6B,CAACU,GAAG,EAAEhD,KAAK,CAACuC,IAAI,CAACF,MAAM,CAACG,KAAK,CAAC,CAAC;MACjE,OAAO,KAAK;IAChB;IAEA,IAAIS,eAAe,KAAKC,eAAe,IAAIA,eAAe,EAAE;MACxD,IAAI,CAACZ,6BAA6B,CAACU,GAAG,EAAEhD,KAAK,CAACuC,IAAI,CAACF,MAAM,CAACG,KAAK,CAAC,CAAC;IACrE;IACA;IACA;IACA,OAAO,KAAK;EAChB;;EAEA;AACJ;AACA;EACI,OAAgBW,SAASA,CAAA,EAA4B;IACjD,OAAO;MACHC,CAAC,EAAEA,CAAA,MAAO;QACNC,UAAU,EAAEnD,uBAAuB;QACnCoD,QAAQ,EAAE;MACd,CAAC;IACL,CAAC;EACL;;EAEA;AACJ;AACA;EACI,OAAgBC,UAAUA,CAACC,cAAsC,EAAqB;IAClF,MAAMpD,IAAI,GAAGC,oBAAoB,CAAC,CAAC;IACnCD,IAAI,CAACG,SAAS,CAACiD,cAAc,CAAC7B,MAAM,CAAC;IACrCvB,IAAI,CAACqD,SAAS,CAACD,cAAc,CAACE,MAAM,CAAC;IACrCtD,IAAI,CAAC2B,YAAY,CAACyB,cAAc,CAAC3B,SAAS,CAAC;IAE3C,MAAMlB,OAAO,GAAGV,UAAU,CAAC;MACvBU,OAAO,EAAE6C,cAAc,CAAC7C,OAAO;MAC/BgD,MAAM,EAAEH,cAAc,CAACG;IAC3B,CAAC,CAAC;IAEFvD,IAAI,CAACY,UAAU,CAACL,OAAO,CAAC;IACxBP,IAAI,CAACa,YAAY,CAACuC,cAAc,CAAC3C,SAAS,CAAC;IAC3C,OAAOT,IAAI;EACf;;EAEA;AACJ;AACA;EACawD,UAAUA,CAAA,EAA2B;IAC1C,OAAO;MACH,GAAG,KAAK,CAACA,UAAU,CAAC,CAAC;MACrBjD,OAAO,EAAE,IAAI,CAACG,SAAS;MACvBD,SAAS,EAAE,IAAI,CAACE,WAAW;MAC3B8C,IAAI,EAAE;IACV,CAAC;EACL;EAEUvB,6BAA6BA,CAACnC,OAAoB,EAAEqC,KAAY,EAAe;IACrF,IAAI,CAAC,IAAI,CAAC1B,SAAS,IAAI,CAAC,IAAI,CAACC,WAAW,EAAE;MACtC,IAAI,CAAC+C,oBAAoB,CAACtB,KAAK,EAAE,IAAI,CAAC1B,SAAS,CAAC;IACpD;IAEA,IAAI,IAAI,CAACC,WAAW,EAAE;MAClBhB,sBAAsB,CAACI,OAAO,EAAE,IAAI,CAACY,WAAW,CAAC;IACrD;IAEA,OAAOZ,OAAO;EAClB;EAEQ2D,oBAAoBA,CAACtB,KAAY,EAAE7B,OAAgB,EAAE;IACzD,IAAIoD,eAAe,GAAGvB,KAAK,CAACwB,kBAAkB,CAAC,GAAG,CAAC;IACnD,IAAIrD,OAAO,EAAE;MACT,MAAMsD,SAAS,GAAGzB,KAAK,CAAC0B,iBAAiB,CAACvD,OAAO,CAAC;MAClD,IAAIsD,SAAS,EAAE;QACXF,eAAe,GAAGE,SAAS;MAC/B;IACJ;IAEA,IAAIF,eAAe,EAAE;MACjB,IAAI,CAACjD,SAAS,GAAGiD,eAAe,CAACI,EAAE;MACnC,IAAI,CAACpD,WAAW,GAAGgD,eAAe,CAAClD,SAAS;IAChD;EACJ;AACJ;AAEA,OAAO,SAASR,oBAAoBA,CAACM,OAAgB,EAAiB;EAClE,OAAO,IAAId,aAAa,CAAC;IAAEc;EAAQ,CAAC,CAAC;AACzC;AAEA,OAAO,SAASyD,gBAAgBA,CAAChE,IAAoC,EAAyB;EAC1F,OAAOA,IAAI,YAAYP,aAAa;AACxC","ignoreList":[]}
package/QuoteNode.js CHANGED
@@ -1,6 +1,5 @@
1
- import { $applyNodeReplacement } from "lexical";
1
+ import { $applyNodeReplacement, addClassNamesToElement } from "lexical";
2
2
  import { Theme } from "@webiny/lexical-theme";
3
- import { addClassNamesToElement } from "@lexical/utils";
4
3
  import { QuoteNode as BaseQuoteNode } from "@lexical/rich-text";
5
4
  import { getStyleId } from "./utils/getStyleId.js";
6
5
  export class QuoteNode extends BaseQuoteNode {
package/QuoteNode.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["$applyNodeReplacement","Theme","addClassNamesToElement","QuoteNode","BaseQuoteNode","getStyleId","constructor","options","key","__styleId","styleId","__className","className","setStyleId","setClassName","getClassName","setDefaultTypography","theme","typographyStyle","getTypographyByTag","id","getType","clone","node","getKey","createDOM","config","element","updateElementWithThemeClasses","from","exportDOM","editor","base","classList","add","importDomConversionMap","conversion","convertBlockquoteElement","priority","importDOM","blockquote","importJSON","serializedNode","$createQuoteNode","setFormat","format","setIndent","indent","setDirection","direction","styles","exportJSON","type","$isQuoteNode"],"sources":["QuoteNode.ts"],"sourcesContent":["import type {\n DOMConversion,\n DOMConversionMap,\n DOMExportOutput,\n EditorConfig,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n Spread\n} from \"lexical\";\nimport { $applyNodeReplacement } from \"lexical\";\nimport { Theme } from \"@webiny/lexical-theme\";\nimport { addClassNamesToElement } from \"@lexical/utils\";\nimport type { SerializedQuoteNode as BaseSerializedQuoteNode } from \"@lexical/rich-text\";\nimport { QuoteNode as BaseQuoteNode } from \"@lexical/rich-text\";\nimport type { ThemeStyleValue, TypographyStylesNode } from \"~/types.js\";\nimport { getStyleId } from \"~/utils/getStyleId.js\";\n\nexport type SerializedQuoteNode = Spread<\n {\n styleId?: string;\n styles?: ThemeStyleValue[];\n className?: string;\n type: \"wby-quote\";\n },\n BaseSerializedQuoteNode\n>;\n\ninterface QuoteNodeOptions {\n className?: string;\n styleId?: string;\n key?: NodeKey;\n}\n\nexport class QuoteNode extends BaseQuoteNode implements TypographyStylesNode {\n private __styleId: string | undefined;\n private __className: string | undefined;\n\n constructor(options: QuoteNodeOptions = {}) {\n super(options.key);\n this.__styleId = options?.styleId;\n this.__className = options?.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 private setDefaultTypography(theme: Theme) {\n // For some time in v5 we had `quoteblock` as tag name :facepalm: We must not break it.\n const typographyStyle = theme.getTypographyByTag([\"blockquote\", \"quoteblock\"]);\n\n if (typographyStyle) {\n this.__styleId = typographyStyle.id;\n this.__className = typographyStyle.className;\n }\n }\n\n static override getType(): string {\n return \"wby-quote\";\n }\n\n static override clone(node: QuoteNode): QuoteNode {\n return new QuoteNode({\n styleId: node.getStyleId(),\n className: node.getClassName(),\n key: node.getKey()\n });\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = super.createDOM(config);\n return this.updateElementWithThemeClasses(element, Theme.from(config.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 importDomConversionMap(): DOMConversion<HTMLElement> | null {\n return {\n conversion: convertBlockquoteElement,\n priority: 0\n };\n }\n\n static override importDOM(): DOMConversionMap | null {\n return {\n blockquote: () => {\n return this.importDomConversionMap();\n }\n };\n }\n\n static override importJSON(serializedNode: SerializedQuoteNode): QuoteNode {\n const node = $createQuoteNode();\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(): SerializedQuoteNode {\n return {\n ...super.exportJSON(),\n type: \"wby-quote\",\n className: this.__className,\n styleId: this.__styleId\n };\n }\n\n protected updateElementWithThemeClasses(element: HTMLElement, theme: Theme): HTMLElement {\n if (!this.__styleId || !this.__className) {\n this.setDefaultTypography(theme);\n }\n\n if (this.__className) {\n addClassNamesToElement(element, this.__className);\n }\n\n return element;\n }\n}\n\nfunction convertBlockquoteElement() {\n const node = $createQuoteNode();\n return {\n node\n };\n}\n\nexport function $createQuoteNode(styleId?: string, key?: NodeKey): QuoteNode {\n return $applyNodeReplacement(new QuoteNode({ styleId, key }));\n}\n\nexport function $isQuoteNode(node: LexicalNode | null | undefined): node is QuoteNode {\n return node instanceof QuoteNode;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["$applyNodeReplacement","addClassNamesToElement","Theme","QuoteNode","BaseQuoteNode","getStyleId","constructor","options","key","__styleId","styleId","__className","className","setStyleId","setClassName","getClassName","setDefaultTypography","theme","typographyStyle","getTypographyByTag","id","getType","clone","node","getKey","createDOM","config","element","updateElementWithThemeClasses","from","exportDOM","editor","base","classList","add","importDomConversionMap","conversion","convertBlockquoteElement","priority","importDOM","blockquote","importJSON","serializedNode","$createQuoteNode","setFormat","format","setIndent","indent","setDirection","direction","styles","exportJSON","type","$isQuoteNode"],"sources":["QuoteNode.ts"],"sourcesContent":["import type {\n DOMConversion,\n DOMConversionMap,\n DOMExportOutput,\n EditorConfig,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n Spread\n} from \"lexical\";\nimport { $applyNodeReplacement, addClassNamesToElement } from \"lexical\";\nimport { Theme } from \"@webiny/lexical-theme\";\nimport type { SerializedQuoteNode as BaseSerializedQuoteNode } from \"@lexical/rich-text\";\nimport { QuoteNode as BaseQuoteNode } from \"@lexical/rich-text\";\nimport type { ThemeStyleValue, TypographyStylesNode } from \"~/types.js\";\nimport { getStyleId } from \"~/utils/getStyleId.js\";\n\nexport type SerializedQuoteNode = Spread<\n {\n styleId?: string;\n styles?: ThemeStyleValue[];\n className?: string;\n type: \"wby-quote\";\n },\n BaseSerializedQuoteNode\n>;\n\ninterface QuoteNodeOptions {\n className?: string;\n styleId?: string;\n key?: NodeKey;\n}\n\nexport class QuoteNode extends BaseQuoteNode implements TypographyStylesNode {\n private __styleId: string | undefined;\n private __className: string | undefined;\n\n constructor(options: QuoteNodeOptions = {}) {\n super(options.key);\n this.__styleId = options?.styleId;\n this.__className = options?.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 private setDefaultTypography(theme: Theme) {\n // For some time in v5 we had `quoteblock` as tag name :facepalm: We must not break it.\n const typographyStyle = theme.getTypographyByTag([\"blockquote\", \"quoteblock\"]);\n\n if (typographyStyle) {\n this.__styleId = typographyStyle.id;\n this.__className = typographyStyle.className;\n }\n }\n\n static override getType(): string {\n return \"wby-quote\";\n }\n\n static override clone(node: QuoteNode): QuoteNode {\n return new QuoteNode({\n styleId: node.getStyleId(),\n className: node.getClassName(),\n key: node.getKey()\n });\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = super.createDOM(config);\n return this.updateElementWithThemeClasses(element, Theme.from(config.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 importDomConversionMap(): DOMConversion<HTMLElement> | null {\n return {\n conversion: convertBlockquoteElement,\n priority: 0\n };\n }\n\n static override importDOM(): DOMConversionMap | null {\n return {\n blockquote: () => {\n return this.importDomConversionMap();\n }\n };\n }\n\n static override importJSON(serializedNode: SerializedQuoteNode): QuoteNode {\n const node = $createQuoteNode();\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(): SerializedQuoteNode {\n return {\n ...super.exportJSON(),\n type: \"wby-quote\",\n className: this.__className,\n styleId: this.__styleId\n };\n }\n\n protected updateElementWithThemeClasses(element: HTMLElement, theme: Theme): HTMLElement {\n if (!this.__styleId || !this.__className) {\n this.setDefaultTypography(theme);\n }\n\n if (this.__className) {\n addClassNamesToElement(element, this.__className);\n }\n\n return element;\n }\n}\n\nfunction convertBlockquoteElement() {\n const node = $createQuoteNode();\n return {\n node\n };\n}\n\nexport function $createQuoteNode(styleId?: string, key?: NodeKey): QuoteNode {\n return $applyNodeReplacement(new QuoteNode({ styleId, key }));\n}\n\nexport function $isQuoteNode(node: LexicalNode | null | undefined): node is QuoteNode {\n return node instanceof QuoteNode;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -7,9 +7,9 @@
7
7
  */
8
8
  import * as React from "react";
9
9
  import { Suspense, useCallback, useEffect, useRef, useState } from "react";
10
+ import { mergeRegister } from "lexical";
10
11
  import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
11
12
  import { useLexicalNodeSelection } from "@lexical/react/useLexicalNodeSelection";
12
- import { mergeRegister } from "@lexical/utils";
13
13
  import { $getNodeByKey, $getSelection, $isNodeSelection, CLICK_COMMAND, COMMAND_PRIORITY_LOW, DRAGSTART_COMMAND, KEY_BACKSPACE_COMMAND, KEY_DELETE_COMMAND, SELECTION_CHANGE_COMMAND } from "lexical";
14
14
  import { ImageResizer } from "./ImageResizer.js";
15
15
  import { $isImageNode } from "../../ImageNode.js";
@@ -149,13 +149,13 @@ export default function ImageComponent({
149
149
  width: width,
150
150
  height: height,
151
151
  maxWidth: maxWidth
152
- })), resizable && $isNodeSelection(selection) && isFocused && /*#__PURE__*/React.createElement(ImageResizer, {
152
+ })), resizable && $isNodeSelection(selection) && isFocused ? /*#__PURE__*/React.createElement(ImageResizer, {
153
153
  editor: editor,
154
154
  imageRef: imageRef,
155
155
  maxWidth: maxWidth,
156
156
  onResizeStart: onResizeStart,
157
157
  onResizeEnd: onResizeEnd
158
- })));
158
+ }) : null));
159
159
  }
160
160
 
161
161
  //# sourceMappingURL=ImageComponent.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","Suspense","useCallback","useEffect","useRef","useState","useLexicalComposerContext","useLexicalNodeSelection","mergeRegister","$getNodeByKey","$getSelection","$isNodeSelection","CLICK_COMMAND","COMMAND_PRIORITY_LOW","DRAGSTART_COMMAND","KEY_BACKSPACE_COMMAND","KEY_DELETE_COMMAND","SELECTION_CHANGE_COMMAND","ImageResizer","$isImageNode","imageCache","Set","useSuspenseImage","src","has","Promise","resolve","img","Image","onload","add","LazyImage","id","altText","className","imageRef","width","height","maxWidth","createElement","undefined","alt","ref","style","draggable","ImageComponent","nodeKey","resizable","isSelected","setSelected","clearSelection","isResizing","setIsResizing","editor","selection","setSelection","activeEditorRef","onDelete","payload","event","preventDefault","node","remove","isMounted","unregister","registerUpdateListener","editorState","read","registerCommand","_","activeEditor","current","target","shiftKey","onResizeEnd","nextWidth","nextHeight","setTimeout","update","setWidthAndHeight","onResizeStart","isFocused","fallback","Fragment"],"sources":["ImageComponent.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 * as React from \"react\";\nimport { Suspense, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport type { LexicalEditor, NodeKey, BaseSelection } from \"lexical\";\n\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useLexicalNodeSelection } from \"@lexical/react/useLexicalNodeSelection\";\nimport { mergeRegister } from \"@lexical/utils\";\nimport {\n $getNodeByKey,\n $getSelection,\n $isNodeSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_LOW,\n DRAGSTART_COMMAND,\n KEY_BACKSPACE_COMMAND,\n KEY_DELETE_COMMAND,\n SELECTION_CHANGE_COMMAND\n} from \"lexical\";\nimport { ImageResizer } from \"./ImageResizer.js\";\nimport { $isImageNode } from \"~/ImageNode.js\";\n\nconst imageCache = new Set();\n\nfunction useSuspenseImage(src: string) {\n if (!imageCache.has(src)) {\n throw new Promise(resolve => {\n const img = new Image();\n img.src = src;\n img.onload = () => {\n imageCache.add(src);\n resolve(null);\n };\n });\n }\n}\n\nfunction LazyImage({\n id,\n altText,\n className,\n imageRef,\n src,\n width,\n height,\n maxWidth\n}: {\n id: string;\n altText: string;\n className: string | null;\n height: \"inherit\" | number;\n imageRef: { current: null | HTMLImageElement };\n maxWidth: number;\n src: string;\n width: \"inherit\" | number;\n}): JSX.Element {\n useSuspenseImage(src);\n return (\n <img\n id={id}\n className={className || undefined}\n src={src}\n alt={altText}\n ref={imageRef}\n style={{\n height,\n maxWidth,\n width\n }}\n draggable=\"false\"\n />\n );\n}\n\ninterface ImageComponentProps {\n id: string;\n altText: string;\n height: \"inherit\" | number;\n maxWidth: number;\n nodeKey: NodeKey;\n resizable: boolean;\n src: string;\n width: \"inherit\" | number;\n}\n\nexport default function ImageComponent({\n id,\n src,\n altText,\n nodeKey,\n width,\n height,\n maxWidth,\n resizable\n}: ImageComponentProps): JSX.Element {\n const imageRef = useRef<null | HTMLImageElement>(null);\n const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey);\n const [isResizing, setIsResizing] = useState<boolean>(false);\n const [editor] = useLexicalComposerContext();\n const [selection, setSelection] = useState<BaseSelection | null>(null);\n const activeEditorRef = useRef<LexicalEditor | null>(null);\n\n const onDelete = useCallback(\n (payload: KeyboardEvent) => {\n if (isSelected && $isNodeSelection($getSelection())) {\n const event: KeyboardEvent = payload;\n event.preventDefault();\n const node = $getNodeByKey(nodeKey);\n if ($isImageNode(node)) {\n node.remove();\n }\n setSelected(false);\n }\n return false;\n },\n [isSelected, nodeKey, setSelected]\n );\n\n useEffect(() => {\n let isMounted = true;\n const unregister = mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n if (isMounted) {\n setSelection(editorState.read(() => $getSelection()));\n }\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n (_, activeEditor) => {\n activeEditorRef.current = activeEditor;\n return false;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand<MouseEvent>(\n CLICK_COMMAND,\n payload => {\n const event = payload;\n if (isResizing) {\n return true;\n }\n if (event.target === imageRef.current) {\n if (event.shiftKey) {\n setSelected(!isSelected);\n } else {\n clearSelection();\n setSelected(true);\n }\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(\n DRAGSTART_COMMAND,\n event => {\n if (event.target === imageRef.current) {\n // TODO This is just a temporary workaround for FF to behave like other browsers.\n // Ideally, this handles drag & drop too (and all browsers).\n event.preventDefault();\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(KEY_DELETE_COMMAND, onDelete, COMMAND_PRIORITY_LOW),\n editor.registerCommand(KEY_BACKSPACE_COMMAND, onDelete, COMMAND_PRIORITY_LOW)\n );\n return () => {\n isMounted = false;\n unregister();\n };\n }, [clearSelection, editor, isResizing, isSelected, nodeKey, onDelete, setSelected]);\n\n const onResizeEnd = (nextWidth: \"inherit\" | number, nextHeight: \"inherit\" | number) => {\n // Delay hiding the resize bars for click case\n setTimeout(() => {\n setIsResizing(false);\n }, 200);\n\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isImageNode(node)) {\n node.setWidthAndHeight(nextWidth, nextHeight);\n }\n });\n };\n\n const onResizeStart = () => {\n setIsResizing(true);\n };\n\n const draggable = isSelected && $isNodeSelection(selection) && !isResizing;\n const isFocused = isSelected || isResizing;\n return (\n <Suspense fallback={null}>\n <>\n <div draggable={draggable}>\n <LazyImage\n id={id}\n className={\n isFocused\n ? `focused ${$isNodeSelection(selection) ? \"draggable\" : \"\"}`\n : null\n }\n src={src}\n altText={altText}\n imageRef={imageRef}\n width={width}\n height={height}\n maxWidth={maxWidth}\n />\n </div>\n {resizable && $isNodeSelection(selection) && isFocused && (\n <ImageResizer\n editor={editor}\n imageRef={imageRef}\n maxWidth={maxWidth}\n onResizeStart={onResizeStart}\n onResizeEnd={onResizeEnd}\n />\n )}\n </>\n </Suspense>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SAASC,QAAQ,EAAEC,WAAW,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AAI1E,SAASC,yBAAyB,QAAQ,uCAAuC;AACjF,SAASC,uBAAuB,QAAQ,wCAAwC;AAChF,SAASC,aAAa,QAAQ,gBAAgB;AAC9C,SACIC,aAAa,EACbC,aAAa,EACbC,gBAAgB,EAChBC,aAAa,EACbC,oBAAoB,EACpBC,iBAAiB,EACjBC,qBAAqB,EACrBC,kBAAkB,EAClBC,wBAAwB,QACrB,SAAS;AAChB,SAASC,YAAY;AACrB,SAASC,YAAY;AAErB,MAAMC,UAAU,GAAG,IAAIC,GAAG,CAAC,CAAC;AAE5B,SAASC,gBAAgBA,CAACC,GAAW,EAAE;EACnC,IAAI,CAACH,UAAU,CAACI,GAAG,CAACD,GAAG,CAAC,EAAE;IACtB,MAAM,IAAIE,OAAO,CAACC,OAAO,IAAI;MACzB,MAAMC,GAAG,GAAG,IAAIC,KAAK,CAAC,CAAC;MACvBD,GAAG,CAACJ,GAAG,GAAGA,GAAG;MACbI,GAAG,CAACE,MAAM,GAAG,MAAM;QACfT,UAAU,CAACU,GAAG,CAACP,GAAG,CAAC;QACnBG,OAAO,CAAC,IAAI,CAAC;MACjB,CAAC;IACL,CAAC,CAAC;EACN;AACJ;AAEA,SAASK,SAASA,CAAC;EACfC,EAAE;EACFC,OAAO;EACPC,SAAS;EACTC,QAAQ;EACRZ,GAAG;EACHa,KAAK;EACLC,MAAM;EACNC;AAUJ,CAAC,EAAe;EACZhB,gBAAgB,CAACC,GAAG,CAAC;EACrB,oBACIvB,KAAA,CAAAuC,aAAA;IACIP,EAAE,EAAEA,EAAG;IACPE,SAAS,EAAEA,SAAS,IAAIM,SAAU;IAClCjB,GAAG,EAAEA,GAAI;IACTkB,GAAG,EAAER,OAAQ;IACbS,GAAG,EAAEP,QAAS;IACdQ,KAAK,EAAE;MACHN,MAAM;MACNC,QAAQ;MACRF;IACJ,CAAE;IACFQ,SAAS,EAAC;EAAO,CACpB,CAAC;AAEV;AAaA,eAAe,SAASC,cAAcA,CAAC;EACnCb,EAAE;EACFT,GAAG;EACHU,OAAO;EACPa,OAAO;EACPV,KAAK;EACLC,MAAM;EACNC,QAAQ;EACRS;AACiB,CAAC,EAAe;EACjC,MAAMZ,QAAQ,GAAG/B,MAAM,CAA0B,IAAI,CAAC;EACtD,MAAM,CAAC4C,UAAU,EAAEC,WAAW,EAAEC,cAAc,CAAC,GAAG3C,uBAAuB,CAACuC,OAAO,CAAC;EAClF,MAAM,CAACK,UAAU,EAAEC,aAAa,CAAC,GAAG/C,QAAQ,CAAU,KAAK,CAAC;EAC5D,MAAM,CAACgD,MAAM,CAAC,GAAG/C,yBAAyB,CAAC,CAAC;EAC5C,MAAM,CAACgD,SAAS,EAAEC,YAAY,CAAC,GAAGlD,QAAQ,CAAuB,IAAI,CAAC;EACtE,MAAMmD,eAAe,GAAGpD,MAAM,CAAuB,IAAI,CAAC;EAE1D,MAAMqD,QAAQ,GAAGvD,WAAW,CACvBwD,OAAsB,IAAK;IACxB,IAAIV,UAAU,IAAIrC,gBAAgB,CAACD,aAAa,CAAC,CAAC,CAAC,EAAE;MACjD,MAAMiD,KAAoB,GAAGD,OAAO;MACpCC,KAAK,CAACC,cAAc,CAAC,CAAC;MACtB,MAAMC,IAAI,GAAGpD,aAAa,CAACqC,OAAO,CAAC;MACnC,IAAI3B,YAAY,CAAC0C,IAAI,CAAC,EAAE;QACpBA,IAAI,CAACC,MAAM,CAAC,CAAC;MACjB;MACAb,WAAW,CAAC,KAAK,CAAC;IACtB;IACA,OAAO,KAAK;EAChB,CAAC,EACD,CAACD,UAAU,EAAEF,OAAO,EAAEG,WAAW,CACrC,CAAC;EAED9C,SAAS,CAAC,MAAM;IACZ,IAAI4D,SAAS,GAAG,IAAI;IACpB,MAAMC,UAAU,GAAGxD,aAAa,CAC5B6C,MAAM,CAACY,sBAAsB,CAAC,CAAC;MAAEC;IAAY,CAAC,KAAK;MAC/C,IAAIH,SAAS,EAAE;QACXR,YAAY,CAACW,WAAW,CAACC,IAAI,CAAC,MAAMzD,aAAa,CAAC,CAAC,CAAC,CAAC;MACzD;IACJ,CAAC,CAAC,EACF2C,MAAM,CAACe,eAAe,CAClBnD,wBAAwB,EACxB,CAACoD,CAAC,EAAEC,YAAY,KAAK;MACjBd,eAAe,CAACe,OAAO,GAAGD,YAAY;MACtC,OAAO,KAAK;IAChB,CAAC,EACDzD,oBACJ,CAAC,EACDwC,MAAM,CAACe,eAAe,CAClBxD,aAAa,EACb8C,OAAO,IAAI;MACP,MAAMC,KAAK,GAAGD,OAAO;MACrB,IAAIP,UAAU,EAAE;QACZ,OAAO,IAAI;MACf;MACA,IAAIQ,KAAK,CAACa,MAAM,KAAKrC,QAAQ,CAACoC,OAAO,EAAE;QACnC,IAAIZ,KAAK,CAACc,QAAQ,EAAE;UAChBxB,WAAW,CAAC,CAACD,UAAU,CAAC;QAC5B,CAAC,MAAM;UACHE,cAAc,CAAC,CAAC;UAChBD,WAAW,CAAC,IAAI,CAAC;QACrB;QACA,OAAO,IAAI;MACf;MAEA,OAAO,KAAK;IAChB,CAAC,EACDpC,oBACJ,CAAC,EACDwC,MAAM,CAACe,eAAe,CAClBtD,iBAAiB,EACjB6C,KAAK,IAAI;MACL,IAAIA,KAAK,CAACa,MAAM,KAAKrC,QAAQ,CAACoC,OAAO,EAAE;QACnC;QACA;QACAZ,KAAK,CAACC,cAAc,CAAC,CAAC;QACtB,OAAO,IAAI;MACf;MACA,OAAO,KAAK;IAChB,CAAC,EACD/C,oBACJ,CAAC,EACDwC,MAAM,CAACe,eAAe,CAACpD,kBAAkB,EAAEyC,QAAQ,EAAE5C,oBAAoB,CAAC,EAC1EwC,MAAM,CAACe,eAAe,CAACrD,qBAAqB,EAAE0C,QAAQ,EAAE5C,oBAAoB,CAChF,CAAC;IACD,OAAO,MAAM;MACTkD,SAAS,GAAG,KAAK;MACjBC,UAAU,CAAC,CAAC;IAChB,CAAC;EACL,CAAC,EAAE,CAACd,cAAc,EAAEG,MAAM,EAAEF,UAAU,EAAEH,UAAU,EAAEF,OAAO,EAAEW,QAAQ,EAAER,WAAW,CAAC,CAAC;EAEpF,MAAMyB,WAAW,GAAGA,CAACC,SAA6B,EAAEC,UAA8B,KAAK;IACnF;IACAC,UAAU,CAAC,MAAM;MACbzB,aAAa,CAAC,KAAK,CAAC;IACxB,CAAC,EAAE,GAAG,CAAC;IAEPC,MAAM,CAACyB,MAAM,CAAC,MAAM;MAChB,MAAMjB,IAAI,GAAGpD,aAAa,CAACqC,OAAO,CAAC;MACnC,IAAI3B,YAAY,CAAC0C,IAAI,CAAC,EAAE;QACpBA,IAAI,CAACkB,iBAAiB,CAACJ,SAAS,EAAEC,UAAU,CAAC;MACjD;IACJ,CAAC,CAAC;EACN,CAAC;EAED,MAAMI,aAAa,GAAGA,CAAA,KAAM;IACxB5B,aAAa,CAAC,IAAI,CAAC;EACvB,CAAC;EAED,MAAMR,SAAS,GAAGI,UAAU,IAAIrC,gBAAgB,CAAC2C,SAAS,CAAC,IAAI,CAACH,UAAU;EAC1E,MAAM8B,SAAS,GAAGjC,UAAU,IAAIG,UAAU;EAC1C,oBACInD,KAAA,CAAAuC,aAAA,CAACtC,QAAQ;IAACiF,QAAQ,EAAE;EAAK,gBACrBlF,KAAA,CAAAuC,aAAA,CAAAvC,KAAA,CAAAmF,QAAA,qBACInF,KAAA,CAAAuC,aAAA;IAAKK,SAAS,EAAEA;EAAU,gBACtB5C,KAAA,CAAAuC,aAAA,CAACR,SAAS;IACNC,EAAE,EAAEA,EAAG;IACPE,SAAS,EACL+C,SAAS,GACH,WAAWtE,gBAAgB,CAAC2C,SAAS,CAAC,GAAG,WAAW,GAAG,EAAE,EAAE,GAC3D,IACT;IACD/B,GAAG,EAAEA,GAAI;IACTU,OAAO,EAAEA,OAAQ;IACjBE,QAAQ,EAAEA,QAAS;IACnBC,KAAK,EAAEA,KAAM;IACbC,MAAM,EAAEA,MAAO;IACfC,QAAQ,EAAEA;EAAS,CACtB,CACA,CAAC,EACLS,SAAS,IAAIpC,gBAAgB,CAAC2C,SAAS,CAAC,IAAI2B,SAAS,iBAClDjF,KAAA,CAAAuC,aAAA,CAACrB,YAAY;IACTmC,MAAM,EAAEA,MAAO;IACflB,QAAQ,EAAEA,QAAS;IACnBG,QAAQ,EAAEA,QAAS;IACnB0C,aAAa,EAAEA,aAAc;IAC7BN,WAAW,EAAEA;EAAY,CAC5B,CAEP,CACI,CAAC;AAEnB","ignoreList":[]}
1
+ {"version":3,"names":["React","Suspense","useCallback","useEffect","useRef","useState","mergeRegister","useLexicalComposerContext","useLexicalNodeSelection","$getNodeByKey","$getSelection","$isNodeSelection","CLICK_COMMAND","COMMAND_PRIORITY_LOW","DRAGSTART_COMMAND","KEY_BACKSPACE_COMMAND","KEY_DELETE_COMMAND","SELECTION_CHANGE_COMMAND","ImageResizer","$isImageNode","imageCache","Set","useSuspenseImage","src","has","Promise","resolve","img","Image","onload","add","LazyImage","id","altText","className","imageRef","width","height","maxWidth","createElement","undefined","alt","ref","style","draggable","ImageComponent","nodeKey","resizable","isSelected","setSelected","clearSelection","isResizing","setIsResizing","editor","selection","setSelection","activeEditorRef","onDelete","payload","event","preventDefault","node","remove","isMounted","unregister","registerUpdateListener","editorState","read","registerCommand","_","activeEditor","current","target","shiftKey","onResizeEnd","nextWidth","nextHeight","setTimeout","update","setWidthAndHeight","onResizeStart","isFocused","fallback","Fragment"],"sources":["ImageComponent.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 * as React from \"react\";\nimport { Suspense, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport type { LexicalEditor, NodeKey, BaseSelection } from \"lexical\";\nimport { mergeRegister } from \"lexical\";\n\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useLexicalNodeSelection } from \"@lexical/react/useLexicalNodeSelection\";\nimport {\n $getNodeByKey,\n $getSelection,\n $isNodeSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_LOW,\n DRAGSTART_COMMAND,\n KEY_BACKSPACE_COMMAND,\n KEY_DELETE_COMMAND,\n SELECTION_CHANGE_COMMAND\n} from \"lexical\";\nimport { ImageResizer } from \"./ImageResizer.js\";\nimport { $isImageNode } from \"~/ImageNode.js\";\n\nconst imageCache = new Set();\n\nfunction useSuspenseImage(src: string) {\n if (!imageCache.has(src)) {\n throw new Promise(resolve => {\n const img = new Image();\n img.src = src;\n img.onload = () => {\n imageCache.add(src);\n resolve(null);\n };\n });\n }\n}\n\nfunction LazyImage({\n id,\n altText,\n className,\n imageRef,\n src,\n width,\n height,\n maxWidth\n}: {\n id: string;\n altText: string;\n className: string | null;\n height: \"inherit\" | number;\n imageRef: { current: null | HTMLImageElement };\n maxWidth: number;\n src: string;\n width: \"inherit\" | number;\n}): JSX.Element {\n useSuspenseImage(src);\n return (\n <img\n id={id}\n className={className || undefined}\n src={src}\n alt={altText}\n ref={imageRef}\n style={{\n height,\n maxWidth,\n width\n }}\n draggable=\"false\"\n />\n );\n}\n\ninterface ImageComponentProps {\n id: string;\n altText: string;\n height: \"inherit\" | number;\n maxWidth: number;\n nodeKey: NodeKey;\n resizable: boolean;\n src: string;\n width: \"inherit\" | number;\n}\n\nexport default function ImageComponent({\n id,\n src,\n altText,\n nodeKey,\n width,\n height,\n maxWidth,\n resizable\n}: ImageComponentProps): JSX.Element {\n const imageRef = useRef<null | HTMLImageElement>(null);\n const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey);\n const [isResizing, setIsResizing] = useState<boolean>(false);\n const [editor] = useLexicalComposerContext();\n const [selection, setSelection] = useState<BaseSelection | null>(null);\n const activeEditorRef = useRef<LexicalEditor | null>(null);\n\n const onDelete = useCallback(\n (payload: KeyboardEvent) => {\n if (isSelected && $isNodeSelection($getSelection())) {\n const event: KeyboardEvent = payload;\n event.preventDefault();\n const node = $getNodeByKey(nodeKey);\n if ($isImageNode(node)) {\n node.remove();\n }\n setSelected(false);\n }\n return false;\n },\n [isSelected, nodeKey, setSelected]\n );\n\n useEffect(() => {\n let isMounted = true;\n const unregister = mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n if (isMounted) {\n setSelection(editorState.read(() => $getSelection()));\n }\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n (_, activeEditor) => {\n activeEditorRef.current = activeEditor;\n return false;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand<MouseEvent>(\n CLICK_COMMAND,\n payload => {\n const event = payload;\n if (isResizing) {\n return true;\n }\n if (event.target === imageRef.current) {\n if (event.shiftKey) {\n setSelected(!isSelected);\n } else {\n clearSelection();\n setSelected(true);\n }\n return true;\n }\n\n return false;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(\n DRAGSTART_COMMAND,\n event => {\n if (event.target === imageRef.current) {\n // TODO This is just a temporary workaround for FF to behave like other browsers.\n // Ideally, this handles drag & drop too (and all browsers).\n event.preventDefault();\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(KEY_DELETE_COMMAND, onDelete, COMMAND_PRIORITY_LOW),\n editor.registerCommand(KEY_BACKSPACE_COMMAND, onDelete, COMMAND_PRIORITY_LOW)\n );\n return () => {\n isMounted = false;\n unregister();\n };\n }, [clearSelection, editor, isResizing, isSelected, nodeKey, onDelete, setSelected]);\n\n const onResizeEnd = (nextWidth: \"inherit\" | number, nextHeight: \"inherit\" | number) => {\n // Delay hiding the resize bars for click case\n setTimeout(() => {\n setIsResizing(false);\n }, 200);\n\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isImageNode(node)) {\n node.setWidthAndHeight(nextWidth, nextHeight);\n }\n });\n };\n\n const onResizeStart = () => {\n setIsResizing(true);\n };\n\n const draggable = isSelected && $isNodeSelection(selection) && !isResizing;\n const isFocused = isSelected || isResizing;\n return (\n <Suspense fallback={null}>\n <>\n <div draggable={draggable}>\n <LazyImage\n id={id}\n className={\n isFocused\n ? `focused ${$isNodeSelection(selection) ? \"draggable\" : \"\"}`\n : null\n }\n src={src}\n altText={altText}\n imageRef={imageRef}\n width={width}\n height={height}\n maxWidth={maxWidth}\n />\n </div>\n {resizable && $isNodeSelection(selection) && isFocused ? (\n <ImageResizer\n editor={editor}\n imageRef={imageRef}\n maxWidth={maxWidth}\n onResizeStart={onResizeStart}\n onResizeEnd={onResizeEnd}\n />\n ) : null}\n </>\n </Suspense>\n );\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,24 +1,23 @@
1
1
  {
2
2
  "name": "@webiny/lexical-nodes",
3
- "version": "0.0.0-unstable.df7a8bb475",
3
+ "version": "0.0.0-unstable.e2758ee1cf",
4
4
  "type": "module",
5
5
  "dependencies": {
6
- "@lexical/code": "0.39.0",
7
- "@lexical/hashtag": "0.39.0",
8
- "@lexical/history": "0.39.0",
9
- "@lexical/list": "0.39.0",
10
- "@lexical/mark": "0.39.0",
11
- "@lexical/overflow": "0.39.0",
12
- "@lexical/react": "0.39.0",
13
- "@lexical/rich-text": "0.39.0",
14
- "@lexical/selection": "0.39.0",
15
- "@lexical/utils": "0.39.0",
6
+ "@lexical/code": "0.40.0",
7
+ "@lexical/hashtag": "0.40.0",
8
+ "@lexical/list": "0.40.0",
9
+ "@lexical/mark": "0.40.0",
10
+ "@lexical/overflow": "0.40.0",
11
+ "@lexical/react": "0.40.0",
12
+ "@lexical/rich-text": "0.40.0",
13
+ "@lexical/selection": "0.40.0",
14
+ "@lexical/utils": "0.40.0",
16
15
  "@types/prismjs": "1.26.6",
17
- "@webiny/lexical-theme": "0.0.0-unstable.df7a8bb475",
18
- "lexical": "0.39.0"
16
+ "@webiny/lexical-theme": "0.0.0-unstable.e2758ee1cf",
17
+ "lexical": "0.40.0"
19
18
  },
20
19
  "devDependencies": {
21
- "@webiny/build-tools": "0.0.0-unstable.df7a8bb475",
20
+ "@webiny/build-tools": "0.0.0-unstable.e2758ee1cf",
22
21
  "react": "18.2.0"
23
22
  },
24
23
  "publishConfig": {
@@ -32,5 +31,5 @@
32
31
  ]
33
32
  }
34
33
  },
35
- "gitHead": "df7a8bb4755a1da047f0af8c56bdb649cc81bf7d"
34
+ "gitHead": "e2758ee1cfa3b9a7152e9bb995a90ccabd33266f"
36
35
  }
@@ -1,10 +0,0 @@
1
- import type { ReactNode } from "react";
2
- import type { HistoryState } from "@lexical/history";
3
- type ContextShape = {
4
- historyState?: HistoryState;
5
- };
6
- export declare const SharedHistoryContext: ({ children }: {
7
- children: ReactNode;
8
- }) => JSX.Element;
9
- export declare const useSharedHistoryContext: () => ContextShape;
10
- export {};
@@ -1,19 +0,0 @@
1
- import * as React from "react";
2
- import { createContext, useContext, useMemo } from "react";
3
- import { createEmptyHistoryState } from "@lexical/history";
4
- const Context = /*#__PURE__*/createContext({});
5
- export const SharedHistoryContext = ({
6
- children
7
- }) => {
8
- const historyContext = useMemo(() => ({
9
- historyState: createEmptyHistoryState()
10
- }), []);
11
- return /*#__PURE__*/React.createElement(Context.Provider, {
12
- value: historyContext
13
- }, children);
14
- };
15
- export const useSharedHistoryContext = () => {
16
- return useContext(Context);
17
- };
18
-
19
- //# sourceMappingURL=SharedHistoryContext.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["React","createContext","useContext","useMemo","createEmptyHistoryState","Context","SharedHistoryContext","children","historyContext","historyState","createElement","Provider","value","useSharedHistoryContext"],"sources":["SharedHistoryContext.tsx"],"sourcesContent":["import * as React from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\nimport type { HistoryState } from \"@lexical/history\";\nimport { createEmptyHistoryState } from \"@lexical/history\";\n\ntype ContextShape = {\n historyState?: HistoryState;\n};\n\nconst Context: React.Context<ContextShape> = createContext({});\n\nexport const SharedHistoryContext = ({ children }: { children: ReactNode }): JSX.Element => {\n const historyContext = useMemo(() => ({ historyState: createEmptyHistoryState() }), []);\n return <Context.Provider value={historyContext}>{children}</Context.Provider>;\n};\n\nexport const useSharedHistoryContext = (): ContextShape => {\n return useContext(Context);\n};\n"],"mappings":"AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,SAASC,aAAa,EAAEC,UAAU,EAAEC,OAAO,QAAQ,OAAO;AAE1D,SAASC,uBAAuB,QAAQ,kBAAkB;AAM1D,MAAMC,OAAoC,gBAAGJ,aAAa,CAAC,CAAC,CAAC,CAAC;AAE9D,OAAO,MAAMK,oBAAoB,GAAGA,CAAC;EAAEC;AAAkC,CAAC,KAAkB;EACxF,MAAMC,cAAc,GAAGL,OAAO,CAAC,OAAO;IAAEM,YAAY,EAAEL,uBAAuB,CAAC;EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;EACvF,oBAAOJ,KAAA,CAAAU,aAAA,CAACL,OAAO,CAACM,QAAQ;IAACC,KAAK,EAAEJ;EAAe,GAAED,QAA2B,CAAC;AACjF,CAAC;AAED,OAAO,MAAMM,uBAAuB,GAAGA,CAAA,KAAoB;EACvD,OAAOX,UAAU,CAACG,OAAO,CAAC;AAC9B,CAAC","ignoreList":[]}