@webiny/lexical-nodes 6.0.0-alpha.0 → 6.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/FontColorNode.d.ts +4 -4
- package/FontColorNode.js +2 -3
- package/FontColorNode.js.map +1 -1
- package/HeadingNode.d.ts +29 -17
- package/HeadingNode.js +141 -60
- package/HeadingNode.js.map +1 -1
- package/ImageNode.js +7 -5
- package/ImageNode.js.map +1 -1
- package/LinkNode.d.ts +2 -2
- package/LinkNode.js +4 -6
- package/LinkNode.js.map +1 -1
- package/ListItemNode.d.ts +4 -3
- package/ListItemNode.js +4 -4
- package/ListItemNode.js.map +1 -1
- package/ListNode.d.ts +28 -14
- package/ListNode.js +75 -55
- package/ListNode.js.map +1 -1
- package/ParagraphNode.d.ts +28 -16
- package/ParagraphNode.js +87 -74
- package/ParagraphNode.js.map +1 -1
- package/QuoteNode.d.ts +26 -19
- package/QuoteNode.js +63 -91
- package/QuoteNode.js.map +1 -1
- package/components/ImageNode/Placeholder.d.ts +1 -1
- package/components/ImageNode/Placeholder.js.map +1 -1
- package/components/ImageNode/SharedHistoryContext.d.ts +2 -2
- package/components/ImageNode/SharedHistoryContext.js.map +1 -1
- package/generateInitialLexicalValue.d.ts +4 -0
- package/generateInitialLexicalValue.js +27 -0
- package/generateInitialLexicalValue.js.map +1 -0
- package/index.d.ts +4 -8
- package/index.js +5 -16
- package/index.js.map +1 -1
- package/package.json +4 -4
- package/prepareLexicalState.d.ts +2 -0
- package/prepareLexicalState.js +53 -0
- package/prepareLexicalState.js.map +1 -0
- package/types.d.ts +4 -5
- package/types.js.map +1 -1
- package/utils/clearNodeFormating.d.ts +1 -1
- package/utils/clearNodeFormating.js.map +1 -1
- package/utils/formatList.d.ts +3 -3
- package/utils/formatList.js.map +1 -1
- package/utils/formatToHeading.d.ts +2 -2
- package/utils/formatToHeading.js.map +1 -1
- package/utils/formatToParagraph.d.ts +1 -1
- package/utils/formatToParagraph.js.map +1 -1
- package/utils/formatToQuote.d.ts +1 -1
- package/utils/formatToQuote.js.map +1 -1
- package/utils/getStyleId.d.ts +11 -0
- package/utils/getStyleId.js +14 -0
- package/utils/getStyleId.js.map +1 -0
- package/utils/listNode.d.ts +2 -2
- package/utils/listNode.js.map +1 -1
- package/utils/toggleLink.d.ts +1 -1
- package/utils/toggleLink.js.map +1 -1
- package/TypographyNode.d.ts +0 -39
- package/TypographyNode.js +0 -109
- package/TypographyNode.js.map +0 -1
package/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","version","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} from \"lexical\";\n\nimport { addClassNamesToElement, isHTMLAnchorElement } from \"@lexical/utils\";\nimport {\n $applyNodeReplacement,\n $isElementNode,\n $isRangeSelection,\n createCommand,\n ElementNode,\n Spread\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 \"link\";\n }\n\n static override clone(node: LinkNode): LinkNode {\n return new LinkNode(\n node.__url,\n { rel: node.__rel, target: node.__target, title: node.__title, alt: node.__alt },\n node.__key\n );\n }\n\n constructor(url: string, attributes: LinkAttributes = {}, key?: NodeKey) {\n super(key);\n const { target = null, rel = null, title = null, alt = null } = attributes;\n this.__url = url;\n this.__target = target;\n this.__rel = rel;\n this.__title = title;\n this.__alt = alt;\n }\n\n override createDOM(config: EditorConfig): HTMLAnchorElement {\n const element = document.createElement(\"a\") as HTMLAnchorElement;\n element.href = this.sanitizeUrl(this.__url);\n if (this.__target !== null) {\n element.target = this.__target;\n }\n if (this.__rel !== null) {\n element.rel = this.__rel;\n }\n if (this.__title !== null) {\n element.title = this.__title;\n }\n if (this.__alt) {\n element.setAttribute(\"alt\", this.__alt);\n }\n addClassNamesToElement(element, config.theme.link);\n return element;\n }\n\n override updateDOM(prevNode: LinkNode, anchor: HTMLAnchorElement): boolean {\n const url = this.__url;\n const target = this.__target;\n const rel = this.__rel;\n const title = this.__title;\n const alt = this.__alt;\n\n if (url !== prevNode.__url) {\n anchor.href = url;\n }\n\n if (target !== prevNode.__target) {\n if (target) {\n anchor.target = target;\n } else {\n anchor.removeAttribute(\"target\");\n }\n }\n\n if (rel !== prevNode.__rel) {\n if (rel) {\n anchor.rel = rel;\n } else {\n anchor.removeAttribute(\"rel\");\n }\n }\n\n if (title !== prevNode.__title) {\n if (title) {\n anchor.title = title;\n } else {\n anchor.removeAttribute(\"title\");\n }\n }\n\n if (alt !== prevNode.__alt) {\n if (alt) {\n anchor.setAttribute(\"alt\", alt);\n } else {\n anchor.removeAttribute(\"alt\");\n }\n }\n\n return false;\n }\n\n static override importDOM(): DOMConversionMap | null {\n return {\n a: () => ({\n conversion: convertAnchorElement,\n priority: 1\n })\n };\n }\n\n static override importJSON(\n serializedNode: SerializedLinkNode | SerializedAutoLinkNode\n ): LinkNode {\n const node = $createLinkNode(serializedNode.url, {\n rel: serializedNode.rel,\n target: serializedNode.target,\n title: serializedNode.title,\n alt: serializedNode.alt\n });\n node.setFormat(serializedNode.format);\n node.setIndent(serializedNode.indent);\n node.setDirection(serializedNode.direction);\n return node;\n }\n\n sanitizeUrl(url: string): string {\n try {\n const parsedUrl = new URL(url);\n // eslint-disable-next-line no-script-url\n if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {\n return \"about:blank\";\n }\n } catch {\n return url;\n }\n return url;\n }\n\n override exportJSON(): SerializedLinkNode | SerializedAutoLinkNode {\n return {\n ...super.exportJSON(),\n rel: this.getRel(),\n target: this.getTarget(),\n title: this.getTitle(),\n alt: this.getAlt(),\n type: \"link\",\n url: this.getURL(),\n version: 1\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 version: 1\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":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAaA,SAASA,sBAAsB,EAAEC,mBAAmB,QAAQ,gBAAgB;AAC5E,SACIC,qBAAqB,EACrBC,cAAc,EACdC,iBAAiB,EACjBC,aAAa,EACbC,WAAW,QAER,SAAS;AAsBhB,MAAMC,uBAAuB,GAAG,IAAIC,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;;AAEvF;AACA,OAAO,MAAMC,QAAQ,SAASH,WAAW,CAAC;EACtC;;EAEA;;EAEA;;EAEA;;EAEA;;EAGA,OAAgBI,OAAOA,CAAA,EAAW;IAC9B,OAAO,MAAM;EACjB;EAEA,OAAgBC,KAAKA,CAACC,IAAc,EAAY;IAC5C,OAAO,IAAIH,QAAQ,CACfG,IAAI,CAACC,KAAK,EACV;MAAEC,GAAG,EAAEF,IAAI,CAACG,KAAK;MAAEC,MAAM,EAAEJ,IAAI,CAACK,QAAQ;MAAEC,KAAK,EAAEN,IAAI,CAACO,OAAO;MAAEC,GAAG,EAAER,IAAI,CAACS;IAAM,CAAC,EAChFT,IAAI,CAACU,KACT,CAAC;EACL;EAEAC,WAAWA,CAACC,GAAW,EAAEC,UAA0B,GAAG,CAAC,CAAC,EAAEC,GAAa,EAAE;IACrE,KAAK,CAACA,GAAG,CAAC;IACV,MAAM;MAAEV,MAAM,GAAG,IAAI;MAAEF,GAAG,GAAG,IAAI;MAAEI,KAAK,GAAG,IAAI;MAAEE,GAAG,GAAG;IAAK,CAAC,GAAGK,UAAU;IAC1E,IAAI,CAACZ,KAAK,GAAGW,GAAG;IAChB,IAAI,CAACP,QAAQ,GAAGD,MAAM;IACtB,IAAI,CAACD,KAAK,GAAGD,GAAG;IAChB,IAAI,CAACK,OAAO,GAAGD,KAAK;IACpB,IAAI,CAACG,KAAK,GAAGD,GAAG;EACpB;EAESO,SAASA,CAACC,MAAoB,EAAqB;IACxD,MAAMC,OAAO,GAAGC,QAAQ,CAACC,aAAa,CAAC,GAAG,CAAsB;IAChEF,OAAO,CAACG,IAAI,GAAG,IAAI,CAACC,WAAW,CAAC,IAAI,CAACpB,KAAK,CAAC;IAC3C,IAAI,IAAI,CAACI,QAAQ,KAAK,IAAI,EAAE;MACxBY,OAAO,CAACb,MAAM,GAAG,IAAI,CAACC,QAAQ;IAClC;IACA,IAAI,IAAI,CAACF,KAAK,KAAK,IAAI,EAAE;MACrBc,OAAO,CAACf,GAAG,GAAG,IAAI,CAACC,KAAK;IAC5B;IACA,IAAI,IAAI,CAACI,OAAO,KAAK,IAAI,EAAE;MACvBU,OAAO,CAACX,KAAK,GAAG,IAAI,CAACC,OAAO;IAChC;IACA,IAAI,IAAI,CAACE,KAAK,EAAE;MACZQ,OAAO,CAACK,YAAY,CAAC,KAAK,EAAE,IAAI,CAACb,KAAK,CAAC;IAC3C;IACArB,sBAAsB,CAAC6B,OAAO,EAAED,MAAM,CAACO,KAAK,CAACC,IAAI,CAAC;IAClD,OAAOP,OAAO;EAClB;EAESQ,SAASA,CAACC,QAAkB,EAAEC,MAAyB,EAAW;IACvE,MAAMf,GAAG,GAAG,IAAI,CAACX,KAAK;IACtB,MAAMG,MAAM,GAAG,IAAI,CAACC,QAAQ;IAC5B,MAAMH,GAAG,GAAG,IAAI,CAACC,KAAK;IACtB,MAAMG,KAAK,GAAG,IAAI,CAACC,OAAO;IAC1B,MAAMC,GAAG,GAAG,IAAI,CAACC,KAAK;IAEtB,IAAIG,GAAG,KAAKc,QAAQ,CAACzB,KAAK,EAAE;MACxB0B,MAAM,CAACP,IAAI,GAAGR,GAAG;IACrB;IAEA,IAAIR,MAAM,KAAKsB,QAAQ,CAACrB,QAAQ,EAAE;MAC9B,IAAID,MAAM,EAAE;QACRuB,MAAM,CAACvB,MAAM,GAAGA,MAAM;MAC1B,CAAC,MAAM;QACHuB,MAAM,CAACC,eAAe,CAAC,QAAQ,CAAC;MACpC;IACJ;IAEA,IAAI1B,GAAG,KAAKwB,QAAQ,CAACvB,KAAK,EAAE;MACxB,IAAID,GAAG,EAAE;QACLyB,MAAM,CAACzB,GAAG,GAAGA,GAAG;MACpB,CAAC,MAAM;QACHyB,MAAM,CAACC,eAAe,CAAC,KAAK,CAAC;MACjC;IACJ;IAEA,IAAItB,KAAK,KAAKoB,QAAQ,CAACnB,OAAO,EAAE;MAC5B,IAAID,KAAK,EAAE;QACPqB,MAAM,CAACrB,KAAK,GAAGA,KAAK;MACxB,CAAC,MAAM;QACHqB,MAAM,CAACC,eAAe,CAAC,OAAO,CAAC;MACnC;IACJ;IAEA,IAAIpB,GAAG,KAAKkB,QAAQ,CAACjB,KAAK,EAAE;MACxB,IAAID,GAAG,EAAE;QACLmB,MAAM,CAACL,YAAY,CAAC,KAAK,EAAEd,GAAG,CAAC;MACnC,CAAC,MAAM;QACHmB,MAAM,CAACC,eAAe,CAAC,KAAK,CAAC;MACjC;IACJ;IAEA,OAAO,KAAK;EAChB;EAEA,OAAgBC,SAASA,CAAA,EAA4B;IACjD,OAAO;MACHC,CAAC,EAAEA,CAAA,MAAO;QACNC,UAAU,EAAEC,oBAAoB;QAChCC,QAAQ,EAAE;MACd,CAAC;IACL,CAAC;EACL;EAEA,OAAgBC,UAAUA,CACtBC,cAA2D,EACnD;IACR,MAAMnC,IAAI,GAAGoC,eAAe,CAACD,cAAc,CAACvB,GAAG,EAAE;MAC7CV,GAAG,EAAEiC,cAAc,CAACjC,GAAG;MACvBE,MAAM,EAAE+B,cAAc,CAAC/B,MAAM;MAC7BE,KAAK,EAAE6B,cAAc,CAAC7B,KAAK;MAC3BE,GAAG,EAAE2B,cAAc,CAAC3B;IACxB,CAAC,CAAC;IACFR,IAAI,CAACqC,SAAS,CAACF,cAAc,CAACG,MAAM,CAAC;IACrCtC,IAAI,CAACuC,SAAS,CAACJ,cAAc,CAACK,MAAM,CAAC;IACrCxC,IAAI,CAACyC,YAAY,CAACN,cAAc,CAACO,SAAS,CAAC;IAC3C,OAAO1C,IAAI;EACf;EAEAqB,WAAWA,CAACT,GAAW,EAAU;IAC7B,IAAI;MACA,MAAM+B,SAAS,GAAG,IAAIC,GAAG,CAAChC,GAAG,CAAC;MAC9B;MACA,IAAI,CAACjB,uBAAuB,CAACkD,GAAG,CAACF,SAAS,CAACG,QAAQ,CAAC,EAAE;QAClD,OAAO,aAAa;MACxB;IACJ,CAAC,CAAC,MAAM;MACJ,OAAOlC,GAAG;IACd;IACA,OAAOA,GAAG;EACd;EAESmC,UAAUA,CAAA,EAAgD;IAC/D,OAAO;MACH,GAAG,KAAK,CAACA,UAAU,CAAC,CAAC;MACrB7C,GAAG,EAAE,IAAI,CAAC8C,MAAM,CAAC,CAAC;MAClB5C,MAAM,EAAE,IAAI,CAAC6C,SAAS,CAAC,CAAC;MACxB3C,KAAK,EAAE,IAAI,CAAC4C,QAAQ,CAAC,CAAC;MACtB1C,GAAG,EAAE,IAAI,CAAC2C,MAAM,CAAC,CAAC;MAClBC,IAAI,EAAE,MAAM;MACZxC,GAAG,EAAE,IAAI,CAACyC,MAAM,CAAC,CAAC;MAClBC,OAAO,EAAE;IACb,CAAC;EACL;EAEAD,MAAMA,CAAA,EAAW;IACb,OAAO,IAAI,CAACE,SAAS,CAAC,CAAC,CAACtD,KAAK;EACjC;EAEAuD,MAAMA,CAAC5C,GAAW,EAAQ;IACtB,MAAM6C,QAAQ,GAAG,IAAI,CAACC,WAAW,CAAC,CAAC;IACnCD,QAAQ,CAACxD,KAAK,GAAGW,GAAG;EACxB;EAEAqC,SAASA,CAAA,EAAkB;IACvB,OAAO,IAAI,CAACM,SAAS,CAAC,CAAC,CAAClD,QAAQ;EACpC;EAEAsD,SAASA,CAACvD,MAAqB,EAAQ;IACnC,MAAMqD,QAAQ,GAAG,IAAI,CAACC,WAAW,CAAC,CAAC;IACnCD,QAAQ,CAACpD,QAAQ,GAAGD,MAAM;EAC9B;EAEA4C,MAAMA,CAAA,EAAkB;IACpB,OAAO,IAAI,CAACO,SAAS,CAAC,CAAC,CAACpD,KAAK;EACjC;EAEAyD,MAAMA,CAAC1D,GAAkB,EAAQ;IAC7B,MAAMuD,QAAQ,GAAG,IAAI,CAACC,WAAW,CAAC,CAAC;IACnCD,QAAQ,CAACtD,KAAK,GAAGD,GAAG;EACxB;EAEAgD,QAAQA,CAAA,EAAkB;IACtB,OAAO,IAAI,CAACK,SAAS,CAAC,CAAC,CAAChD,OAAO;EACnC;EAEAsD,QAAQA,CAACvD,KAAoB,EAAQ;IACjC,MAAMmD,QAAQ,GAAG,IAAI,CAACC,WAAW,CAAC,CAAC;IACnCD,QAAQ,CAAClD,OAAO,GAAGD,KAAK;EAC5B;EAEA6C,MAAMA,CAAA,EAAkB;IACpB,OAAO,IAAI,CAAC1C,KAAK;EACrB;EAEAqD,MAAMA,CAACC,IAAmB,EAAQ;IAC9B,MAAMN,QAAQ,GAAG,KAAK,CAACC,WAAW,CAAC,CAAC;IACpCD,QAAQ,CAAChD,KAAK,GAAGsD,IAAI;EACzB;EAESC,cAAcA,CACnBC,SAAyB,EACzBC,gBAAgB,GAAG,IAAI,EACL;IAClB,MAAMjD,OAAO,GAAG,IAAI,CAACkD,gBAAgB,CAAC,CAAC,CAACH,cAAc,CAACC,SAAS,EAAEC,gBAAgB,CAAC;IACnF,IAAI3E,cAAc,CAAC0B,OAAO,CAAC,EAAE;MACzB,MAAMmD,QAAQ,GAAGhC,eAAe,CAAC,IAAI,CAACnC,KAAK,EAAE;QACzCC,GAAG,EAAE,IAAI,CAACC,KAAK;QACfC,MAAM,EAAE,IAAI,CAACC,QAAQ;QACrBC,KAAK,EAAE,IAAI,CAACC,OAAO;QACnBC,GAAG,EAAE,IAAI,CAACC;MACd,CAAC,CAAC;MACFQ,OAAO,CAACoD,MAAM,CAACD,QAAQ,CAAC;MACxB,OAAOA,QAAQ;IACnB;IACA,OAAO,IAAI;EACf;EAESE,mBAAmBA,CAAA,EAAU;IAClC,OAAO,KAAK;EAChB;EAESC,kBAAkBA,CAAA,EAAU;IACjC,OAAO,KAAK;EAChB;EAESC,UAAUA,CAAA,EAAU;IACzB,OAAO,KAAK;EAChB;EAESC,QAAQA,CAAA,EAAS;IACtB,OAAO,IAAI;EACf;EAESC,gBAAgBA,CAACC,CAAc,EAAEV,SAAyB,EAAW;IAC1E,IAAI,CAACzE,iBAAiB,CAACyE,SAAS,CAAC,EAAE;MAC/B,OAAO,KAAK;IAChB;IAEA,MAAMW,UAAU,GAAGX,SAAS,CAACtC,MAAM,CAACkD,OAAO,CAAC,CAAC;IAC7C,MAAMC,SAAS,GAAGb,SAAS,CAACc,KAAK,CAACF,OAAO,CAAC,CAAC;IAE3C,OACI,IAAI,CAACG,UAAU,CAACJ,UAAU,CAAC,IAC3B,IAAI,CAACI,UAAU,CAACF,SAAS,CAAC,IAC1Bb,SAAS,CAACgB,cAAc,CAAC,CAAC,CAACC,MAAM,GAAG,CAAC;EAE7C;AACJ;AAEA,SAASlD,oBAAoBA,CAACmD,OAAa,EAAuB;EAC9D,IAAInF,IAAI,GAAG,IAAI;EACf,IAAIX,mBAAmB,CAAC8F,OAAO,CAAC,EAAE;IAC9B,MAAMC,OAAO,GAAGD,OAAO,CAACE,WAAW;IACnC,IAAKD,OAAO,KAAK,IAAI,IAAIA,OAAO,KAAK,EAAE,IAAKD,OAAO,CAACG,QAAQ,CAACJ,MAAM,GAAG,CAAC,EAAE;MACrElF,IAAI,GAAGoC,eAAe,CAAC+C,OAAO,CAACI,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;QACvDrF,GAAG,EAAEiF,OAAO,CAACI,YAAY,CAAC,KAAK,CAAC;QAChCnF,MAAM,EAAE+E,OAAO,CAACI,YAAY,CAAC,QAAQ,CAAC;QACtCjF,KAAK,EAAE6E,OAAO,CAACI,YAAY,CAAC,OAAO,CAAC;QACpC/E,GAAG,EAAE2E,OAAO,CAACI,YAAY,CAAC,KAAK;MACnC,CAAC,CAAC;IACN;EACJ;EACA,OAAO;IAAEvF;EAAK,CAAC;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASoC,eAAeA,CAACxB,GAAW,EAAEC,UAA2B,EAAY;EAChF,OAAOvB,qBAAqB,CAAC,IAAIO,QAAQ,CAACe,GAAG,EAAEC,UAAU,CAAC,CAAC;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS2E,WAAWA,CAACxF,IAAoC,EAAoB;EAChF,OAAOA,IAAI,YAAYH,QAAQ;AACnC;AAIA;AACA;AACA,OAAO,MAAM4F,YAAY,SAAS5F,QAAQ,CAAC;EACvC,OAAgBC,OAAOA,CAAA,EAAW;IAC9B,OAAO,UAAU;EACrB;EAEA,OAAgBC,KAAKA,CAACC,IAAkB,EAAgB;IACpD,OAAO,IAAIyF,YAAY,CACnBzF,IAAI,CAACC,KAAK,EACV;MAAEC,GAAG,EAAEF,IAAI,CAACG,KAAK;MAAEC,MAAM,EAAEJ,IAAI,CAACK,QAAQ;MAAEC,KAAK,EAAEN,IAAI,CAACO;IAAQ,CAAC,EAC/DP,IAAI,CAACU,KACT,CAAC;EACL;EAEA,OAAgBwB,UAAUA,CAACC,cAAsC,EAAgB;IAC7E,MAAMnC,IAAI,GAAG0F,mBAAmB,CAACvD,cAAc,CAACvB,GAAG,EAAE;MACjDV,GAAG,EAAEiC,cAAc,CAACjC,GAAG;MACvBE,MAAM,EAAE+B,cAAc,CAAC/B,MAAM;MAC7BE,KAAK,EAAE6B,cAAc,CAAC7B;IAC1B,CAAC,CAAC;IACFN,IAAI,CAACqC,SAAS,CAACF,cAAc,CAACG,MAAM,CAAC;IACrCtC,IAAI,CAACuC,SAAS,CAACJ,cAAc,CAACK,MAAM,CAAC;IACrCxC,IAAI,CAACyC,YAAY,CAACN,cAAc,CAACO,SAAS,CAAC;IAC3C,OAAO1C,IAAI;EACf;EAEA,OAAgB6B,SAASA,CAAA,EAAS;IAC9B;IACA,OAAO,IAAI;EACf;EAESkB,UAAUA,CAAA,EAA2B;IAC1C,OAAO;MACH,GAAG,KAAK,CAACA,UAAU,CAAC,CAAC;MACrBK,IAAI,EAAE,UAAU;MAChBE,OAAO,EAAE;IACb,CAAC;EACL;EAESU,cAAcA,CACnBC,SAAyB,EACzBC,gBAAgB,GAAG,IAAI,EACL;IAClB,MAAMjD,OAAO,GAAG,IAAI,CAACkD,gBAAgB,CAAC,CAAC,CAACH,cAAc,CAACC,SAAS,EAAEC,gBAAgB,CAAC;IACnF,IAAI3E,cAAc,CAAC0B,OAAO,CAAC,EAAE;MACzB,MAAMmD,QAAQ,GAAGsB,mBAAmB,CAAC,IAAI,CAACzF,KAAK,EAAE;QAC7CC,GAAG,EAAE,IAAI,CAACC,KAAK;QACfC,MAAM,EAAE,IAAI,CAACC,QAAQ;QACrBC,KAAK,EAAE,IAAI,CAACC;MAChB,CAAC,CAAC;MACFU,OAAO,CAACoD,MAAM,CAACD,QAAQ,CAAC;MACxB,OAAOA,QAAQ;IACnB;IACA,OAAO,IAAI;EACf;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASsB,mBAAmBA,CAAC9E,GAAW,EAAEC,UAA2B,EAAgB;EACxF,OAAOvB,qBAAqB,CAAC,IAAImG,YAAY,CAAC7E,GAAG,EAAEC,UAAU,CAAC,CAAC;AACnE;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS8E,eAAeA,CAAC3F,IAAoC,EAAwB;EACxF,OAAOA,IAAI,YAAYyF,YAAY;AACvC;AAEA,OAAO,MAAMG,mBAEZ,GAAGnG,aAAa,CAAC,qBAAqB,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["addClassNamesToElement","isHTMLAnchorElement","$applyNodeReplacement","$isElementNode","$isRangeSelection","createCommand","ElementNode","SUPPORTED_URL_PROTOCOLS","Set","LinkNode","getType","clone","node","__url","rel","__rel","target","__target","title","__title","alt","__alt","__key","constructor","url","attributes","key","createDOM","config","element","document","createElement","href","sanitizeUrl","setAttribute","theme","link","updateDOM","prevNode","anchor","removeAttribute","importDOM","a","conversion","convertAnchorElement","priority","importJSON","serializedNode","$createLinkNode","setFormat","format","setIndent","indent","setDirection","direction","parsedUrl","URL","has","protocol","exportJSON","getRel","getTarget","getTitle","getAlt","type","getURL","getLatest","setURL","writable","getWritable","setTarget","setRel","setTitle","setAlt","text","insertNewAfter","selection","restoreSelection","getParentOrThrow","linkNode","append","canInsertTextBefore","canInsertTextAfter","canBeEmpty","isInline","extractWithChild","_","anchorNode","getNode","focusNode","focus","isParentOf","getTextContent","length","domNode","content","textContent","children","getAttribute","$isLinkNode","AutoLinkNode","$createAutoLinkNode","$isAutoLinkNode","TOGGLE_LINK_COMMAND"],"sources":["LinkNode.ts"],"sourcesContent":["/** @module @lexical/link */\n/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type {\n DOMConversionMap,\n DOMConversionOutput,\n EditorConfig,\n RangeSelection,\n LexicalCommand,\n LexicalNode,\n NodeKey,\n SerializedElementNode,\n Spread\n} from \"lexical\";\n\nimport { addClassNamesToElement, isHTMLAnchorElement } from \"@lexical/utils\";\nimport {\n $applyNodeReplacement,\n $isElementNode,\n $isRangeSelection,\n createCommand,\n ElementNode\n} from \"lexical\";\n\nexport type LinkAttributes = {\n rel?: null | string;\n target?: null | string;\n title?: null | string;\n alt?: null | string;\n};\n\ndeclare global {\n interface HTMLAnchorElement {\n alt?: string;\n }\n}\n\nexport type SerializedLinkNode = Spread<\n {\n url: string;\n },\n Spread<LinkAttributes, SerializedElementNode>\n>;\n\nconst SUPPORTED_URL_PROTOCOLS = new Set([\"http:\", \"https:\", \"mailto:\", \"sms:\", \"tel:\"]);\n\n/** @noInheritDoc */\nexport class LinkNode extends ElementNode {\n /** @internal */\n __url: string;\n /** @internal */\n __target: null | string;\n /** @internal */\n __rel: null | string;\n /** @internal */\n __title: null | string;\n /** @internal */\n __alt: null | string;\n\n static override getType(): string {\n return \"wby-link\";\n }\n\n static override clone(node: LinkNode): LinkNode {\n return new LinkNode(\n node.__url,\n { rel: node.__rel, target: node.__target, title: node.__title, alt: node.__alt },\n node.__key\n );\n }\n\n constructor(url: string, attributes: LinkAttributes = {}, key?: NodeKey) {\n super(key);\n const { target = null, rel = null, title = null, alt = null } = attributes;\n this.__url = url;\n this.__target = target;\n this.__rel = rel;\n this.__title = title;\n this.__alt = alt;\n }\n\n override createDOM(config: EditorConfig): HTMLAnchorElement {\n const element = document.createElement(\"a\") as HTMLAnchorElement;\n element.href = this.sanitizeUrl(this.__url);\n if (this.__target !== null) {\n element.target = this.__target;\n }\n if (this.__rel !== null) {\n element.rel = this.__rel;\n }\n if (this.__title !== null) {\n element.title = this.__title;\n }\n if (this.__alt) {\n element.setAttribute(\"alt\", this.__alt);\n }\n addClassNamesToElement(element, config.theme.link);\n return element;\n }\n\n override updateDOM(prevNode: LinkNode, anchor: HTMLAnchorElement): boolean {\n const url = this.__url;\n const target = this.__target;\n const rel = this.__rel;\n const title = this.__title;\n const alt = this.__alt;\n\n if (url !== prevNode.__url) {\n anchor.href = url;\n }\n\n if (target !== prevNode.__target) {\n if (target) {\n anchor.target = target;\n } else {\n anchor.removeAttribute(\"target\");\n }\n }\n\n if (rel !== prevNode.__rel) {\n if (rel) {\n anchor.rel = rel;\n } else {\n anchor.removeAttribute(\"rel\");\n }\n }\n\n if (title !== prevNode.__title) {\n if (title) {\n anchor.title = title;\n } else {\n anchor.removeAttribute(\"title\");\n }\n }\n\n if (alt !== prevNode.__alt) {\n if (alt) {\n anchor.setAttribute(\"alt\", alt);\n } else {\n anchor.removeAttribute(\"alt\");\n }\n }\n\n return false;\n }\n\n static override importDOM(): DOMConversionMap | null {\n return {\n a: () => ({\n conversion: convertAnchorElement,\n priority: 1\n })\n };\n }\n\n static override importJSON(\n serializedNode: SerializedLinkNode | SerializedAutoLinkNode\n ): LinkNode {\n const node = $createLinkNode(serializedNode.url, {\n rel: serializedNode.rel,\n target: serializedNode.target,\n title: serializedNode.title,\n alt: serializedNode.alt\n });\n node.setFormat(serializedNode.format);\n node.setIndent(serializedNode.indent);\n node.setDirection(serializedNode.direction);\n return node;\n }\n\n sanitizeUrl(url: string): string {\n try {\n const parsedUrl = new URL(url);\n // eslint-disable-next-line no-script-url\n if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {\n return \"about:blank\";\n }\n } catch {\n return url;\n }\n return url;\n }\n\n override exportJSON(): SerializedLinkNode | SerializedAutoLinkNode {\n return {\n ...super.exportJSON(),\n rel: this.getRel(),\n target: this.getTarget(),\n title: this.getTitle(),\n alt: this.getAlt(),\n type: \"wby-link\",\n url: this.getURL()\n };\n }\n\n getURL(): string {\n return this.getLatest().__url;\n }\n\n setURL(url: string): void {\n const writable = this.getWritable();\n writable.__url = url;\n }\n\n getTarget(): null | string {\n return this.getLatest().__target;\n }\n\n setTarget(target: null | string): void {\n const writable = this.getWritable();\n writable.__target = target;\n }\n\n getRel(): null | string {\n return this.getLatest().__rel;\n }\n\n setRel(rel: null | string): void {\n const writable = this.getWritable();\n writable.__rel = rel;\n }\n\n getTitle(): null | string {\n return this.getLatest().__title;\n }\n\n setTitle(title: null | string): void {\n const writable = this.getWritable();\n writable.__title = title;\n }\n\n getAlt(): string | null {\n return this.__alt;\n }\n\n setAlt(text: string | null): void {\n const writable = super.getWritable();\n writable.__alt = text;\n }\n\n override insertNewAfter(\n selection: RangeSelection,\n restoreSelection = true\n ): null | ElementNode {\n const element = this.getParentOrThrow().insertNewAfter(selection, restoreSelection);\n if ($isElementNode(element)) {\n const linkNode = $createLinkNode(this.__url, {\n rel: this.__rel,\n target: this.__target,\n title: this.__title,\n alt: this.__alt\n });\n element.append(linkNode);\n return linkNode;\n }\n return null;\n }\n\n override canInsertTextBefore(): false {\n return false;\n }\n\n override canInsertTextAfter(): false {\n return false;\n }\n\n override canBeEmpty(): false {\n return false;\n }\n\n override isInline(): true {\n return true;\n }\n\n override extractWithChild(_: LexicalNode, selection: RangeSelection): boolean {\n if (!$isRangeSelection(selection)) {\n return false;\n }\n\n const anchorNode = selection.anchor.getNode();\n const focusNode = selection.focus.getNode();\n\n return (\n this.isParentOf(anchorNode) &&\n this.isParentOf(focusNode) &&\n selection.getTextContent().length > 0\n );\n }\n}\n\nfunction convertAnchorElement(domNode: Node): DOMConversionOutput {\n let node = null;\n if (isHTMLAnchorElement(domNode)) {\n const content = domNode.textContent;\n if ((content !== null && content !== \"\") || domNode.children.length > 0) {\n node = $createLinkNode(domNode.getAttribute(\"href\") || \"\", {\n rel: domNode.getAttribute(\"rel\"),\n target: domNode.getAttribute(\"target\"),\n title: domNode.getAttribute(\"title\"),\n alt: domNode.getAttribute(\"alt\")\n });\n }\n }\n return { node };\n}\n\n/**\n * Takes a URL and creates a LinkNode.\n * @param url - The URL the LinkNode should direct to.\n * @param attributes - Optional HTML a tag attributes { target, rel, title }\n * @returns The LinkNode.\n */\nexport function $createLinkNode(url: string, attributes?: LinkAttributes): LinkNode {\n return $applyNodeReplacement(new LinkNode(url, attributes));\n}\n\n/**\n * Determines if node is a LinkNode.\n * @param node - The node to be checked.\n * @returns true if node is a LinkNode, false otherwise.\n */\nexport function $isLinkNode(node: LexicalNode | null | undefined): node is LinkNode {\n return node instanceof LinkNode;\n}\n\nexport type SerializedAutoLinkNode = SerializedLinkNode;\n\n// Custom node type to override `canInsertTextAfter` that will\n// allow typing within the link\nexport class AutoLinkNode extends LinkNode {\n static override getType(): string {\n return \"autolink\";\n }\n\n static override clone(node: AutoLinkNode): AutoLinkNode {\n return new AutoLinkNode(\n node.__url,\n { rel: node.__rel, target: node.__target, title: node.__title },\n node.__key\n );\n }\n\n static override importJSON(serializedNode: SerializedAutoLinkNode): AutoLinkNode {\n const node = $createAutoLinkNode(serializedNode.url, {\n rel: serializedNode.rel,\n target: serializedNode.target,\n title: serializedNode.title\n });\n node.setFormat(serializedNode.format);\n node.setIndent(serializedNode.indent);\n node.setDirection(serializedNode.direction);\n return node;\n }\n\n static override importDOM(): null {\n // TODO: Should link node should handle the import over autolink?\n return null;\n }\n\n override exportJSON(): SerializedAutoLinkNode {\n return {\n ...super.exportJSON(),\n type: \"autolink\"\n };\n }\n\n override insertNewAfter(\n selection: RangeSelection,\n restoreSelection = true\n ): null | ElementNode {\n const element = this.getParentOrThrow().insertNewAfter(selection, restoreSelection);\n if ($isElementNode(element)) {\n const linkNode = $createAutoLinkNode(this.__url, {\n rel: this.__rel,\n target: this.__target,\n title: this.__title\n });\n element.append(linkNode);\n return linkNode;\n }\n return null;\n }\n}\n\n/**\n * Takes a URL and creates an AutoLinkNode. AutoLinkNodes are generally automatically generated\n * during typing, which is especially useful when a button to generate a LinkNode is not practical.\n * @param url - The URL the LinkNode should direct to.\n * @param attributes - Optional HTML a tag attributes. { target, rel, title }\n * @returns The LinkNode.\n */\nexport function $createAutoLinkNode(url: string, attributes?: LinkAttributes): AutoLinkNode {\n return $applyNodeReplacement(new AutoLinkNode(url, attributes));\n}\n\n/**\n * Determines if node is an AutoLinkNode.\n * @param node - The node to be checked.\n * @returns true if node is an AutoLinkNode, false otherwise.\n */\nexport function $isAutoLinkNode(node: LexicalNode | null | undefined): node is AutoLinkNode {\n return node instanceof AutoLinkNode;\n}\n\nexport const TOGGLE_LINK_COMMAND: LexicalCommand<\n string | ({ url: string } & LinkAttributes) | null\n> = createCommand(\"TOGGLE_LINK_COMMAND\");\n"],"mappings":"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","ignoreList":[]}
|
package/ListItemNode.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { DOMConversionMap, EditorConfig,
|
|
1
|
+
import type { DOMConversionMap, EditorConfig, LexicalNode, NodeKey, ParagraphNode, RangeSelection, SerializedElementNode, Spread } from "lexical";
|
|
2
|
+
import { ElementNode } from "lexical";
|
|
3
|
+
export declare const LIST_ITEM_TYPE = "wby-list-item";
|
|
2
4
|
export type SerializedWebinyListItemNode = Spread<{
|
|
3
5
|
checked: boolean | undefined;
|
|
4
|
-
type:
|
|
6
|
+
type: typeof LIST_ITEM_TYPE;
|
|
5
7
|
value: number;
|
|
6
|
-
version: 1;
|
|
7
8
|
}, SerializedElementNode>;
|
|
8
9
|
/** @noInheritDoc */
|
|
9
10
|
export declare class ListItemNode extends ElementNode {
|
package/ListItemNode.js
CHANGED
|
@@ -4,6 +4,7 @@ import { addClassNamesToElement, removeClassNamesFromElement } from "@lexical/ut
|
|
|
4
4
|
import { $handleIndent, $handleOutdent, mergeLists, updateChildrenListItemValue } from "./utils/formatList";
|
|
5
5
|
import { $createParagraphNode, $isParagraphNode } from "./ParagraphNode";
|
|
6
6
|
import { isNestedListNode } from "./utils/listNode";
|
|
7
|
+
export const LIST_ITEM_TYPE = "wby-list-item";
|
|
7
8
|
/** @noInheritDoc */
|
|
8
9
|
export class ListItemNode extends ElementNode {
|
|
9
10
|
/** @internal */
|
|
@@ -11,7 +12,7 @@ export class ListItemNode extends ElementNode {
|
|
|
11
12
|
/** @internal */
|
|
12
13
|
|
|
13
14
|
static getType() {
|
|
14
|
-
return
|
|
15
|
+
return LIST_ITEM_TYPE;
|
|
15
16
|
}
|
|
16
17
|
static clone(node) {
|
|
17
18
|
return new ListItemNode(node.__value, node.__checked, node.__key);
|
|
@@ -60,9 +61,8 @@ export class ListItemNode extends ElementNode {
|
|
|
60
61
|
return {
|
|
61
62
|
...super.exportJSON(),
|
|
62
63
|
checked: this.getChecked(),
|
|
63
|
-
type:
|
|
64
|
-
value: this.getValue()
|
|
65
|
-
version: 1
|
|
64
|
+
type: LIST_ITEM_TYPE,
|
|
65
|
+
value: this.getValue()
|
|
66
66
|
};
|
|
67
67
|
}
|
|
68
68
|
append(...nodes) {
|
package/ListItemNode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["$isElementNode","$isRangeSelection","ElementNode","$createListNode","$isListNode","addClassNamesToElement","removeClassNamesFromElement","$handleIndent","$handleOutdent","mergeLists","updateChildrenListItemValue","$createParagraphNode","$isParagraphNode","isNestedListNode","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","version","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 {\n $isElementNode,\n $isRangeSelection,\n DOMConversionMap,\n DOMConversionOutput,\n EditorConfig,\n EditorThemeClasses,\n ElementNode,\n LexicalNode,\n NodeKey,\n ParagraphNode,\n RangeSelection,\n SerializedElementNode,\n Spread\n} from \"lexical\";\nimport { $createListNode, $isListNode, ListNode } from \"~/ListNode\";\nimport { addClassNamesToElement, removeClassNamesFromElement } from \"@lexical/utils\";\nimport {\n $handleIndent,\n $handleOutdent,\n mergeLists,\n updateChildrenListItemValue\n} from \"~/utils/formatList\";\nimport { $createParagraphNode, $isParagraphNode } from \"~/ParagraphNode\";\nimport { isNestedListNode } from \"~/utils/listNode\";\n\nexport type SerializedWebinyListItemNode = Spread<\n {\n checked: boolean | undefined;\n type: \"webiny-listitem\";\n value: number;\n version: 1;\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 \"webiny-listitem\";\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: \"webiny-listitem\",\n value: this.getValue(),\n version: 1\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","$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\";\nimport { $createListNode, $isListNode } from \"~/ListNode\";\nimport { addClassNamesToElement, removeClassNamesFromElement } from \"@lexical/utils\";\nimport {\n $handleIndent,\n $handleOutdent,\n mergeLists,\n updateChildrenListItemValue\n} from \"~/utils/formatList\";\nimport { $createParagraphNode, $isParagraphNode } from \"~/ParagraphNode\";\nimport { isNestedListNode } from \"~/utils/listNode\";\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,SAASA,cAAc,EAAEC,iBAAiB,EAAEC,WAAW,QAAQ,SAAS;AAExE,SAASC,eAAe,EAAEC,WAAW;AACrC,SAASC,sBAAsB,EAAEC,2BAA2B,QAAQ,gBAAgB;AACpF,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,IAAI7B,WAAW,CAAC4B,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,IAAI7B,WAAW,CAAC4B,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,CAACnE,WAAW,CAACkE,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,GAAG1E,eAAe,CAACmE,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,CAACnE,WAAW,CAACiF,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,IAAInE,WAAW,CAACuF,aAAa,CAAC,EAAE;QAC5BjF,2BAA2B,CAACiF,aAAa,CAAC;MAC9C;MAEA,OAAOD,KAAK;IAChB;;IAEA;;IAEA,IAAItF,WAAW,CAACc,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,GAAGzF,eAAe,CAACkF,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,IAAI7B,WAAW,CAAC4B,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,IAAInE,WAAW,CAAC4B,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,OAAOd,WAAW,CAACc,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,GAAG5I,WAAW,CAAC2I,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,IAAI/E,WAAW,CAAC+E,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;IAC5BvD,2BAA2B,CAACkC,GAAG,EAAE,GAAG8F,eAAe,CAAC;EACxD;EAEA,IAAID,YAAY,CAACxE,MAAM,GAAG,CAAC,EAAE;IACzBxD,sBAAsB,CAACmC,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,IAAI5I,WAAW,CAACiJ,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.d.ts
CHANGED
|
@@ -1,27 +1,41 @@
|
|
|
1
|
-
import { DOMConversion, DOMConversionMap, EditorConfig,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import type { DOMConversion, DOMConversionMap, DOMExportOutput, EditorConfig, LexicalEditor, LexicalNode, NodeKey, SerializedElementNode, Spread } from "lexical";
|
|
2
|
+
import { ElementNode } from "lexical";
|
|
3
|
+
import type { EditorTheme } from "@webiny/lexical-theme";
|
|
4
|
+
import type { ListNodeTagType } from "@lexical/list/LexicalListNode";
|
|
5
|
+
import type { ListType } from "@lexical/list";
|
|
6
|
+
import type { TypographyStylesNode } from "./types";
|
|
4
7
|
export type SerializedWebinyListNode = Spread<{
|
|
5
|
-
|
|
8
|
+
styleId?: string;
|
|
9
|
+
className?: string;
|
|
6
10
|
listType: ListType;
|
|
7
11
|
start: number;
|
|
8
12
|
tag: ListNodeTagType;
|
|
9
|
-
type: "
|
|
10
|
-
version: 1;
|
|
13
|
+
type: "wby-list";
|
|
11
14
|
}, SerializedElementNode>;
|
|
12
|
-
|
|
15
|
+
type ListNodeOptions = {
|
|
16
|
+
styleId?: string;
|
|
17
|
+
className?: string;
|
|
18
|
+
start?: number;
|
|
19
|
+
key?: NodeKey;
|
|
20
|
+
};
|
|
21
|
+
export declare class ListNode extends ElementNode implements TypographyStylesNode {
|
|
13
22
|
/** @internal */
|
|
14
23
|
__tag: ListNodeTagType;
|
|
15
24
|
/** @internal */
|
|
16
25
|
__start: number;
|
|
17
26
|
/** @internal */
|
|
18
27
|
__listType: ListType;
|
|
19
|
-
private
|
|
20
|
-
|
|
28
|
+
private __styleId;
|
|
29
|
+
private __className;
|
|
30
|
+
constructor(listType: ListType, options?: ListNodeOptions);
|
|
21
31
|
static getType(): string;
|
|
22
32
|
createDOM(config: EditorConfig): HTMLElement;
|
|
33
|
+
exportDOM(editor: LexicalEditor): DOMExportOutput;
|
|
23
34
|
static clone(node: ListNode): ListNode;
|
|
24
|
-
getStyleId(): string;
|
|
35
|
+
getStyleId(): string | undefined;
|
|
36
|
+
setStyleId(styleId: string | undefined): void;
|
|
37
|
+
setClassName(className: string | undefined): void;
|
|
38
|
+
getClassName(): string | undefined;
|
|
25
39
|
static importJSON(serializedNode: SerializedWebinyListNode): ListNode;
|
|
26
40
|
exportJSON(): SerializedWebinyListNode;
|
|
27
41
|
static importDomConversionMap(): DOMConversion<HTMLElement> | null;
|
|
@@ -30,10 +44,10 @@ export declare class ListNode extends ElementNode {
|
|
|
30
44
|
extractWithChild(child: LexicalNode): boolean;
|
|
31
45
|
getListType(): ListType;
|
|
32
46
|
getStart(): number;
|
|
33
|
-
private setDefaultThemeListStyleByTag;
|
|
34
|
-
private hasThemeStyle;
|
|
35
47
|
private getTag;
|
|
36
|
-
|
|
48
|
+
protected updateElementWithThemeClasses(element: HTMLElement, theme: EditorTheme): HTMLElement;
|
|
49
|
+
private setDefaultTypography;
|
|
37
50
|
}
|
|
38
|
-
export declare function $createListNode(listType: ListType,
|
|
51
|
+
export declare function $createListNode(listType: ListType, styleId?: string, start?: number): ListNode;
|
|
39
52
|
export declare function $isListNode(node: LexicalNode | null | undefined): node is ListNode;
|
|
53
|
+
export {};
|
package/ListNode.js
CHANGED
|
@@ -3,7 +3,6 @@ import { findTypographyStyleByHtmlTag } from "@webiny/lexical-theme";
|
|
|
3
3
|
import { addClassNamesToElement, removeClassNamesFromElement } from "@lexical/utils";
|
|
4
4
|
import { $getListDepth, wrapInListItem } from "./utils/listNode";
|
|
5
5
|
import { $isListItemNode } from "./ListItemNode";
|
|
6
|
-
const TypographyStyleAttrName = "data-theme-list-style-id";
|
|
7
6
|
export class ListNode extends ElementNode {
|
|
8
7
|
/** @internal */
|
|
9
8
|
|
|
@@ -11,59 +10,88 @@ export class ListNode extends ElementNode {
|
|
|
11
10
|
|
|
12
11
|
/** @internal */
|
|
13
12
|
|
|
14
|
-
constructor(listType,
|
|
13
|
+
constructor(listType, options = {}) {
|
|
14
|
+
const {
|
|
15
|
+
styleId,
|
|
16
|
+
key,
|
|
17
|
+
className,
|
|
18
|
+
start
|
|
19
|
+
} = options;
|
|
15
20
|
super(key);
|
|
16
|
-
this.
|
|
21
|
+
this.__styleId = styleId ?? "";
|
|
22
|
+
this.__className = className;
|
|
17
23
|
const _listType = TAG_TO_WEBINY_LIST_TYPE[listType] || listType;
|
|
18
24
|
this.__listType = _listType;
|
|
19
25
|
this.__tag = _listType === "number" ? "ol" : "ul";
|
|
20
26
|
this.__start = start || 1;
|
|
21
27
|
}
|
|
22
28
|
static getType() {
|
|
23
|
-
return "
|
|
29
|
+
return "wby-list";
|
|
24
30
|
}
|
|
25
31
|
createDOM(config) {
|
|
26
32
|
const tag = this.__tag;
|
|
27
|
-
const
|
|
28
|
-
const wTheme = config.theme;
|
|
33
|
+
const element = document.createElement(tag);
|
|
29
34
|
if (this.__start !== 1) {
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// If styleId is not set or user removed from theme, set default style
|
|
34
|
-
if (!this.hasThemeStyle() || !this.isStyleExistInTheme(wTheme)) {
|
|
35
|
-
this.setDefaultThemeListStyleByTag(this.__tag, wTheme);
|
|
35
|
+
element.setAttribute("start", String(this.__start));
|
|
36
36
|
}
|
|
37
|
+
this.updateElementWithThemeClasses(element, config.theme);
|
|
37
38
|
|
|
38
39
|
// @ts-expect-error Internal field.
|
|
39
|
-
|
|
40
|
+
element.__lexicalListType = this.__listType;
|
|
40
41
|
const theme = config.theme;
|
|
41
|
-
setListThemeClassNames(
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
setListThemeClassNames(element, theme, this, this.__styleId);
|
|
43
|
+
return element;
|
|
44
|
+
}
|
|
45
|
+
exportDOM(editor) {
|
|
46
|
+
const base = super.exportDOM(editor);
|
|
47
|
+
const element = base.element;
|
|
48
|
+
if (element && this.__className) {
|
|
49
|
+
element.classList.add(this.__className);
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
...base,
|
|
53
|
+
element
|
|
54
|
+
};
|
|
44
55
|
}
|
|
45
56
|
static clone(node) {
|
|
46
|
-
return new ListNode(node.getListType(),
|
|
57
|
+
return new ListNode(node.getListType(), {
|
|
58
|
+
className: node.getClassName(),
|
|
59
|
+
styleId: node.getStyleId(),
|
|
60
|
+
start: node.getStart(),
|
|
61
|
+
key: node.getKey()
|
|
62
|
+
});
|
|
47
63
|
}
|
|
48
64
|
getStyleId() {
|
|
49
|
-
return this.
|
|
65
|
+
return this.__styleId;
|
|
66
|
+
}
|
|
67
|
+
setStyleId(styleId) {
|
|
68
|
+
this.__styleId = styleId ?? "";
|
|
69
|
+
}
|
|
70
|
+
setClassName(className) {
|
|
71
|
+
this.__className = className;
|
|
72
|
+
}
|
|
73
|
+
getClassName() {
|
|
74
|
+
return this.__className;
|
|
50
75
|
}
|
|
51
76
|
static importJSON(serializedNode) {
|
|
52
|
-
const node = $createListNode(serializedNode.listType,
|
|
77
|
+
const node = $createListNode(serializedNode.listType,
|
|
78
|
+
// `styleId` is for backwards compatibility
|
|
79
|
+
serializedNode.styleId ?? serializedNode.styleId, serializedNode.start);
|
|
53
80
|
node.setFormat(serializedNode.format);
|
|
54
81
|
node.setIndent(serializedNode.indent);
|
|
55
82
|
node.setDirection(serializedNode.direction);
|
|
83
|
+
node.setClassName(serializedNode.className);
|
|
56
84
|
return node;
|
|
57
85
|
}
|
|
58
86
|
exportJSON() {
|
|
59
87
|
return {
|
|
60
88
|
...super.exportJSON(),
|
|
61
|
-
|
|
89
|
+
styleId: this.__styleId,
|
|
90
|
+
className: this.__className,
|
|
62
91
|
listType: this.getListType(),
|
|
63
92
|
start: this.getStart(),
|
|
64
93
|
tag: this.getTag(),
|
|
65
|
-
type: "
|
|
66
|
-
version: 1
|
|
94
|
+
type: "wby-list"
|
|
67
95
|
};
|
|
68
96
|
}
|
|
69
97
|
static importDomConversionMap() {
|
|
@@ -83,17 +111,10 @@ export class ListNode extends ElementNode {
|
|
|
83
111
|
};
|
|
84
112
|
}
|
|
85
113
|
updateDOM(prevNode, dom, config) {
|
|
86
|
-
const wTheme = config.theme;
|
|
87
114
|
if (prevNode.__tag !== this.__tag) {
|
|
88
115
|
return true;
|
|
89
116
|
}
|
|
90
|
-
|
|
91
|
-
// if styleId is not set or user removed from theme, set default style.
|
|
92
|
-
if (!this.hasThemeStyle() || !this.isStyleExistInTheme(wTheme)) {
|
|
93
|
-
this.setDefaultThemeListStyleByTag(this.__tag, wTheme);
|
|
94
|
-
}
|
|
95
|
-
setListThemeClassNames(dom, config.theme, this, this.__themeStyleId);
|
|
96
|
-
dom.setAttribute(TypographyStyleAttrName, this.__themeStyleId);
|
|
117
|
+
setListThemeClassNames(dom, config.theme, this, this.__styleId);
|
|
97
118
|
return false;
|
|
98
119
|
}
|
|
99
120
|
extractWithChild(child) {
|
|
@@ -105,34 +126,30 @@ export class ListNode extends ElementNode {
|
|
|
105
126
|
getStart() {
|
|
106
127
|
return this.__start;
|
|
107
128
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
return;
|
|
129
|
+
getTag() {
|
|
130
|
+
return this.__tag;
|
|
131
|
+
}
|
|
132
|
+
updateElementWithThemeClasses(element, theme) {
|
|
133
|
+
if (!theme?.emotionMap) {
|
|
134
|
+
return element;
|
|
115
135
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
return;
|
|
136
|
+
if (!this.__styleId || !this.__className) {
|
|
137
|
+
this.setDefaultTypography(theme.emotionMap);
|
|
119
138
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
this.__themeStyleId = style.id;
|
|
139
|
+
if (this.__className) {
|
|
140
|
+
addClassNamesToElement(element, this.__className);
|
|
123
141
|
}
|
|
142
|
+
return element;
|
|
124
143
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
isStyleExistInTheme(theme) {
|
|
132
|
-
return theme?.emotionMap ? !!theme?.emotionMap[this.__themeStyleId] : false;
|
|
144
|
+
setDefaultTypography(themeEmotionMap) {
|
|
145
|
+
const typographyStyle = findTypographyStyleByHtmlTag(this.getTag(), themeEmotionMap);
|
|
146
|
+
if (typographyStyle) {
|
|
147
|
+
this.__styleId = typographyStyle.id;
|
|
148
|
+
this.__className = typographyStyle.className;
|
|
149
|
+
}
|
|
133
150
|
}
|
|
134
151
|
}
|
|
135
|
-
function setListThemeClassNames(dom, editorTheme, node,
|
|
152
|
+
function setListThemeClassNames(dom, editorTheme, node, styleId) {
|
|
136
153
|
const editorThemeClasses = editorTheme;
|
|
137
154
|
const classesToAdd = [];
|
|
138
155
|
const classesToRemove = [];
|
|
@@ -143,7 +160,7 @@ function setListThemeClassNames(dom, editorTheme, node, themeStyleId) {
|
|
|
143
160
|
const listDepth = $getListDepth(node) - 1;
|
|
144
161
|
const normalizedListDepth = listDepth % listLevelsClassNames.length;
|
|
145
162
|
const listLevelClassName = listLevelsClassNames[normalizedListDepth];
|
|
146
|
-
const listClassName = `${listTheme[node.__tag]} ${emotionMap[
|
|
163
|
+
const listClassName = `${listTheme[node.__tag]} ${emotionMap[styleId]?.className ?? ""}`;
|
|
147
164
|
let nestedListClassName;
|
|
148
165
|
const nestedListTheme = listTheme.nested;
|
|
149
166
|
if (nestedListTheme !== undefined && nestedListTheme.list) {
|
|
@@ -218,8 +235,11 @@ const TAG_TO_WEBINY_LIST_TYPE = {
|
|
|
218
235
|
ol: "number",
|
|
219
236
|
ul: "bullet"
|
|
220
237
|
};
|
|
221
|
-
export function $createListNode(listType,
|
|
222
|
-
return new ListNode(listType,
|
|
238
|
+
export function $createListNode(listType, styleId, start = 1) {
|
|
239
|
+
return new ListNode(listType, {
|
|
240
|
+
start,
|
|
241
|
+
styleId
|
|
242
|
+
});
|
|
223
243
|
}
|
|
224
244
|
export function $isListNode(node) {
|
|
225
245
|
return node instanceof ListNode;
|