@webiny/lexical-editor 5.37.1 → 5.37.2-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,18 @@
1
+ /// <reference types="react" />
2
+ /// <reference types="web" />
3
+ import { LinkAttributes, LinkNode as BaseLinkNode, SerializedAutoLinkNode, SerializedLinkNode as BaseSerializedLinkNode } from "@lexical/link";
4
+ import { DOMConversionMap, EditorConfig, NodeKey, Spread } from "lexical";
5
+ export declare type SerializedLinkNode = Spread<{
6
+ type: "link-node";
7
+ version: 1;
8
+ }, Spread<LinkAttributes, BaseSerializedLinkNode>>;
9
+ export declare class LinkNode extends BaseLinkNode {
10
+ constructor(url: string, attributes?: LinkAttributes, key?: NodeKey);
11
+ static getType(): string;
12
+ createDOM(config: EditorConfig): HTMLAnchorElement;
13
+ static importDOM(): DOMConversionMap | null;
14
+ static importJSON(serializedNode: BaseSerializedLinkNode | SerializedLinkNode | SerializedAutoLinkNode): LinkNode;
15
+ exportJSON(): BaseSerializedLinkNode | SerializedLinkNode | SerializedAutoLinkNode;
16
+ }
17
+ export declare const $isLinkNode: (node: any) => node is LinkNode;
18
+ export declare const $createLinkNode: (url: string, attributes?: LinkAttributes, key?: KeyType) => LinkNode;
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.LinkNode = exports.$isLinkNode = exports.$createLinkNode = void 0;
8
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
11
+ var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
12
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
13
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
14
+ var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
15
+ var _link = require("@lexical/link");
16
+ var _utils = require("@lexical/utils");
17
+ var _sanitizeUrl = require("../utils/sanitizeUrl");
18
+ var LinkNode = /*#__PURE__*/function (_BaseLinkNode) {
19
+ (0, _inherits2.default)(LinkNode, _BaseLinkNode);
20
+ var _super = (0, _createSuper2.default)(LinkNode);
21
+ function LinkNode(url) {
22
+ var attributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
23
+ var key = arguments.length > 2 ? arguments[2] : undefined;
24
+ (0, _classCallCheck2.default)(this, LinkNode);
25
+ return _super.call(this, url, attributes, key);
26
+ }
27
+ (0, _createClass2.default)(LinkNode, [{
28
+ key: "createDOM",
29
+ value: function createDOM(config) {
30
+ var element = document.createElement("a");
31
+ element.href = (0, _sanitizeUrl.sanitizeUrl)(this.__url);
32
+ if (this.__target !== null) {
33
+ element.target = this.__target;
34
+ }
35
+ if (this.__rel !== null) {
36
+ element.rel = this.__rel;
37
+ }
38
+ if (this.__title !== null) {
39
+ element.title = this.__title;
40
+ }
41
+ (0, _utils.addClassNamesToElement)(element, config.theme.link);
42
+ return element;
43
+ }
44
+ }, {
45
+ key: "exportJSON",
46
+ value: function exportJSON() {
47
+ return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, (0, _get2.default)((0, _getPrototypeOf2.default)(LinkNode.prototype), "exportJSON", this).call(this)), {}, {
48
+ type: "link-node",
49
+ version: 1
50
+ });
51
+ }
52
+ }], [{
53
+ key: "getType",
54
+ value: function getType() {
55
+ return "link-node";
56
+ }
57
+ }, {
58
+ key: "importDOM",
59
+ value: function importDOM() {
60
+ return {
61
+ a: function a() {
62
+ return {
63
+ conversion: convertAnchorElement,
64
+ priority: 1
65
+ };
66
+ }
67
+ };
68
+ }
69
+ }, {
70
+ key: "importJSON",
71
+ value: function importJSON(serializedNode) {
72
+ var node = $createLinkNode(serializedNode.url, {
73
+ rel: serializedNode.rel,
74
+ target: serializedNode.target,
75
+ title: serializedNode.title
76
+ });
77
+ node.setFormat(serializedNode.format);
78
+ node.setIndent(serializedNode.indent);
79
+ node.setDirection(serializedNode.direction);
80
+ return node;
81
+ }
82
+ }]);
83
+ return LinkNode;
84
+ }(_link.LinkNode);
85
+ exports.LinkNode = LinkNode;
86
+ function convertAnchorElement(domNode) {
87
+ var node = null;
88
+ if ((0, _utils.isHTMLAnchorElement)(domNode)) {
89
+ var content = domNode.textContent;
90
+ if (content !== null && content !== "") {
91
+ node = $createLinkNode(domNode.getAttribute("href") || "", {
92
+ rel: domNode.getAttribute("rel"),
93
+ target: domNode.getAttribute("target"),
94
+ title: domNode.getAttribute("title")
95
+ });
96
+ }
97
+ }
98
+ return {
99
+ node: node
100
+ };
101
+ }
102
+ var $isLinkNode = function $isLinkNode(node) {
103
+ return node instanceof LinkNode;
104
+ };
105
+ exports.$isLinkNode = $isLinkNode;
106
+ var $createLinkNode = function $createLinkNode(url) {
107
+ var attributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
108
+ var key = arguments.length > 2 ? arguments[2] : undefined;
109
+ return new LinkNode(url, attributes, key);
110
+ };
111
+ exports.$createLinkNode = $createLinkNode;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_link","require","_utils","_sanitizeUrl","LinkNode","_BaseLinkNode","_inherits2","default","_super","_createSuper2","url","attributes","arguments","length","undefined","key","_classCallCheck2","call","_createClass2","value","createDOM","config","element","document","createElement","href","sanitizeUrl","__url","__target","target","__rel","rel","__title","title","addClassNamesToElement","theme","link","exportJSON","_objectSpread2","_get2","_getPrototypeOf2","prototype","type","version","getType","importDOM","a","conversion","convertAnchorElement","priority","importJSON","serializedNode","node","$createLinkNode","setFormat","format","setIndent","indent","setDirection","direction","BaseLinkNode","exports","domNode","isHTMLAnchorElement","content","textContent","getAttribute","$isLinkNode"],"sources":["link-node.ts"],"sourcesContent":["import {\n LinkAttributes,\n LinkNode as BaseLinkNode,\n SerializedAutoLinkNode,\n SerializedLinkNode as BaseSerializedLinkNode\n} from \"@lexical/link\";\nimport { DOMConversionMap, DOMConversionOutput, EditorConfig, NodeKey, Spread } from \"lexical\";\nimport { addClassNamesToElement, isHTMLAnchorElement } from \"@lexical/utils\";\nimport { sanitizeUrl } from \"~/utils/sanitizeUrl\";\n\nexport type SerializedLinkNode = Spread<\n {\n type: \"link-node\";\n version: 1;\n },\n Spread<LinkAttributes, BaseSerializedLinkNode>\n>;\n\nexport class LinkNode extends BaseLinkNode {\n constructor(url: string, attributes: LinkAttributes = {}, key?: NodeKey) {\n super(url, attributes, key);\n }\n\n static override getType(): string {\n return \"link-node\";\n }\n\n override createDOM(config: EditorConfig): HTMLAnchorElement {\n const element = document.createElement(\"a\");\n element.href = 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 addClassNamesToElement(element, config.theme.link);\n return element;\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: BaseSerializedLinkNode | SerializedLinkNode | SerializedAutoLinkNode\n ): LinkNode {\n const node = $createLinkNode(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 override exportJSON(): BaseSerializedLinkNode | SerializedLinkNode | SerializedAutoLinkNode {\n return {\n ...super.exportJSON(),\n type: \"link-node\",\n version: 1\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 !== \"\") {\n node = $createLinkNode(domNode.getAttribute(\"href\") || \"\", {\n rel: domNode.getAttribute(\"rel\"),\n target: domNode.getAttribute(\"target\"),\n title: domNode.getAttribute(\"title\")\n });\n }\n }\n return { node };\n}\n\nexport const $isLinkNode = (node: any): node is LinkNode => {\n return node instanceof LinkNode;\n};\n\nexport const $createLinkNode = (url: string, attributes: LinkAttributes = {}, key?: KeyType) => {\n return new LinkNode(url, attributes, key);\n};\n"],"mappings":"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"}
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.WebinyNodes = void 0;
7
+ var _lexical = require("lexical");
7
8
  var _code = require("@lexical/code");
8
9
  var _hashtag = require("@lexical/hashtag");
9
10
  var _link = require("@lexical/link");
@@ -13,20 +14,24 @@ var _FontColorNode = require("./FontColorNode");
13
14
  var _TypographyElementNode = require("./TypographyElementNode");
14
15
  var _ListNode = require("./ListNode");
15
16
  var _ListItemNode = require("./ListItemNode");
16
- var _lexical = require("lexical");
17
17
  var _HeadingNode = require("./HeadingNode");
18
18
  var _ParagraphNode = require("./ParagraphNode");
19
19
  var _richText = require("@lexical/rich-text");
20
20
  var _QuoteNode = require("./QuoteNode");
21
21
  var _ImageNode = require("./ImageNode");
22
- /*
23
- * This is a list of all the nodes that Webiny's Lexical implementation supports OOTB.
24
- * */
25
- var WebinyNodes = [_ImageNode.ImageNode, _ListNode.ListNode, _ListItemNode.ListItemNode, _code.CodeNode, _hashtag.HashtagNode, _code.CodeHighlightNode, _link.AutoLinkNode, _link.LinkNode, _overflow.OverflowNode, _mark.MarkNode, _FontColorNode.FontColorNode, _TypographyElementNode.TypographyElementNode,
26
- /*
27
- * In order to provide additional Webiny-related functionality, we override Lexical's ParagraphNode and HeadingNode nodes.
28
- * More info on overriding can be found here: https://lexical.dev/docs/concepts/node-replacement.
29
- * */
22
+ var _linkNode = require("./link-node");
23
+ // This is a list of all the nodes that our Lexical implementation supports OOTB.
24
+ var WebinyNodes = [
25
+ // These nodes are copy-pasted from Lexical and modified to fit our needs.
26
+ // https://github.com/facebook/lexical/tree/main/packages/lexical-playground/src/nodes
27
+ // https://github.com/facebook/lexical/tree/main/packages
28
+ _ImageNode.ImageNode, _ListNode.ListNode, _ListItemNode.ListItemNode,
29
+ // These nodes are directly imported from Lexical.
30
+ _code.CodeNode, _hashtag.HashtagNode, _code.CodeHighlightNode, _link.AutoLinkNode, _overflow.OverflowNode, _mark.MarkNode,
31
+ // Our custom nodes.
32
+ _FontColorNode.FontColorNode, _TypographyElementNode.TypographyElementNode,
33
+ // The following code replaces the built-in Lexical nodes with our custom ones.
34
+ // https://lexical.dev/docs/concepts/node-replacement
30
35
  _ParagraphNode.ParagraphNode, {
31
36
  replace: _lexical.ParagraphNode,
32
37
  with: function _with() {
@@ -42,5 +47,14 @@ _ParagraphNode.ParagraphNode, {
42
47
  with: function _with() {
43
48
  return new _QuoteNode.QuoteNode();
44
49
  }
50
+ }, _linkNode.LinkNode, {
51
+ replace: _link.LinkNode,
52
+ with: function _with(node) {
53
+ return new _linkNode.LinkNode(node.getURL(), {
54
+ rel: node.getRel(),
55
+ title: node.getTitle(),
56
+ target: node.getTarget()
57
+ }, node.getKey());
58
+ }
45
59
  }];
46
60
  exports.WebinyNodes = WebinyNodes;
@@ -1 +1 @@
1
- {"version":3,"names":["_code","require","_hashtag","_link","_mark","_overflow","_FontColorNode","_TypographyElementNode","_ListNode","_ListItemNode","_lexical","_HeadingNode","_ParagraphNode","_richText","_QuoteNode","_ImageNode","WebinyNodes","ImageNode","ListNode","ListItemNode","CodeNode","HashtagNode","CodeHighlightNode","AutoLinkNode","LinkNode","OverflowNode","MarkNode","FontColorNode","TypographyElementNode","ParagraphNode","replace","BaseParagraphNode","with","_with","HeadingNode","BaseHeadingNode","node","getTag","QuoteNode","BaseQuoteNode","exports"],"sources":["webinyNodes.ts"],"sourcesContent":["import type { Klass, LexicalNode } from \"lexical\";\n\nimport { CodeHighlightNode, CodeNode } from \"@lexical/code\";\nimport { HashtagNode } from \"@lexical/hashtag\";\nimport { AutoLinkNode, LinkNode } from \"@lexical/link\";\nimport { MarkNode } from \"@lexical/mark\";\nimport { OverflowNode } from \"@lexical/overflow\";\nimport { FontColorNode } from \"~/nodes/FontColorNode\";\nimport { TypographyElementNode } from \"~/nodes/TypographyElementNode\";\nimport { ListNode } from \"~/nodes/ListNode\";\nimport { ListItemNode } from \"~/nodes/ListItemNode\";\nimport { ParagraphNode as BaseParagraphNode } from \"lexical\";\nimport { HeadingNode } from \"~/nodes/HeadingNode\";\nimport { ParagraphNode } from \"~/nodes/ParagraphNode\";\nimport { HeadingNode as BaseHeadingNode, QuoteNode as BaseQuoteNode } from \"@lexical/rich-text\";\nimport { QuoteNode } from \"~/nodes/QuoteNode\";\nimport { ImageNode } from \"~/nodes/ImageNode\";\n\n/*\n * This is a list of all the nodes that Webiny's Lexical implementation supports OOTB.\n * */\nexport const WebinyNodes: ReadonlyArray<\n | Klass<LexicalNode>\n | {\n replace: Klass<LexicalNode>;\n with: <T extends { new (...args: any): any }>(node: InstanceType<T>) => LexicalNode;\n }\n> = [\n ImageNode,\n ListNode,\n ListItemNode,\n CodeNode,\n HashtagNode,\n CodeHighlightNode,\n AutoLinkNode,\n LinkNode,\n OverflowNode,\n MarkNode,\n FontColorNode,\n TypographyElementNode,\n /*\n * In order to provide additional Webiny-related functionality, we override Lexical's ParagraphNode and HeadingNode nodes.\n * More info on overriding can be found here: https://lexical.dev/docs/concepts/node-replacement.\n * */\n ParagraphNode,\n {\n replace: BaseParagraphNode,\n with: () => {\n return new ParagraphNode();\n }\n },\n HeadingNode,\n {\n replace: BaseHeadingNode,\n with: (node: BaseHeadingNode) => {\n return new HeadingNode(node.getTag());\n }\n },\n QuoteNode,\n {\n replace: BaseQuoteNode,\n with: () => {\n return new QuoteNode();\n }\n }\n];\n"],"mappings":";;;;;;AAEA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AACA,IAAAE,KAAA,GAAAF,OAAA;AACA,IAAAG,KAAA,GAAAH,OAAA;AACA,IAAAI,SAAA,GAAAJ,OAAA;AACA,IAAAK,cAAA,GAAAL,OAAA;AACA,IAAAM,sBAAA,GAAAN,OAAA;AACA,IAAAO,SAAA,GAAAP,OAAA;AACA,IAAAQ,aAAA,GAAAR,OAAA;AACA,IAAAS,QAAA,GAAAT,OAAA;AACA,IAAAU,YAAA,GAAAV,OAAA;AACA,IAAAW,cAAA,GAAAX,OAAA;AACA,IAAAY,SAAA,GAAAZ,OAAA;AACA,IAAAa,UAAA,GAAAb,OAAA;AACA,IAAAc,UAAA,GAAAd,OAAA;AAEA;AACA;AACA;AACO,IAAMe,WAMZ,GAAG,CACAC,oBAAS,EACTC,kBAAQ,EACRC,0BAAY,EACZC,cAAQ,EACRC,oBAAW,EACXC,uBAAiB,EACjBC,kBAAY,EACZC,cAAQ,EACRC,sBAAY,EACZC,cAAQ,EACRC,4BAAa,EACbC,4CAAqB;AACrB;AACJ;AACA;AACA;AACIC,4BAAa,EACb;EACIC,OAAO,EAAEC,sBAAiB;EAC1BC,IAAI,EAAE,SAAAC,MAAA,EAAM;IACR,OAAO,IAAIJ,4BAAa,CAAC,CAAC;EAC9B;AACJ,CAAC,EACDK,wBAAW,EACX;EACIJ,OAAO,EAAEK,qBAAe;EACxBH,IAAI,EAAE,SAAAC,MAACG,IAAqB,EAAK;IAC7B,OAAO,IAAIF,wBAAW,CAACE,IAAI,CAACC,MAAM,CAAC,CAAC,CAAC;EACzC;AACJ,CAAC,EACDC,oBAAS,EACT;EACIR,OAAO,EAAES,mBAAa;EACtBP,IAAI,EAAE,SAAAC,MAAA,EAAM;IACR,OAAO,IAAIK,oBAAS,CAAC,CAAC;EAC1B;AACJ,CAAC,CACJ;AAACE,OAAA,CAAAxB,WAAA,GAAAA,WAAA"}
1
+ {"version":3,"names":["_lexical","require","_code","_hashtag","_link","_mark","_overflow","_FontColorNode","_TypographyElementNode","_ListNode","_ListItemNode","_HeadingNode","_ParagraphNode","_richText","_QuoteNode","_ImageNode","_linkNode","WebinyNodes","ImageNode","ListNode","ListItemNode","CodeNode","HashtagNode","CodeHighlightNode","AutoLinkNode","OverflowNode","MarkNode","FontColorNode","TypographyElementNode","ParagraphNode","replace","BaseParagraphNode","with","_with","HeadingNode","BaseHeadingNode","node","getTag","QuoteNode","BaseQuoteNode","LinkNode","BaseLinkNode","getURL","rel","getRel","title","getTitle","target","getTarget","getKey","exports"],"sources":["webinyNodes.ts"],"sourcesContent":["import type { Klass, LexicalNode } from \"lexical\";\nimport { ParagraphNode as BaseParagraphNode } from \"lexical\";\nimport { CodeHighlightNode, CodeNode } from \"@lexical/code\";\nimport { HashtagNode } from \"@lexical/hashtag\";\nimport { AutoLinkNode, LinkNode as BaseLinkNode } from \"@lexical/link\";\nimport { MarkNode } from \"@lexical/mark\";\nimport { OverflowNode } from \"@lexical/overflow\";\nimport { FontColorNode } from \"~/nodes/FontColorNode\";\nimport { TypographyElementNode } from \"~/nodes/TypographyElementNode\";\nimport { ListNode } from \"~/nodes/ListNode\";\nimport { ListItemNode } from \"~/nodes/ListItemNode\";\nimport { HeadingNode } from \"~/nodes/HeadingNode\";\nimport { ParagraphNode } from \"~/nodes/ParagraphNode\";\nimport { HeadingNode as BaseHeadingNode, QuoteNode as BaseQuoteNode } from \"@lexical/rich-text\";\nimport { QuoteNode } from \"~/nodes/QuoteNode\";\nimport { ImageNode } from \"~/nodes/ImageNode\";\nimport { LinkNode } from \"~/nodes/link-node\";\n\n// This is a list of all the nodes that our Lexical implementation supports OOTB.\nexport const WebinyNodes: ReadonlyArray<\n | Klass<LexicalNode>\n | {\n replace: Klass<LexicalNode>;\n with: <T extends { new (...args: any): any }>(node: InstanceType<T>) => LexicalNode;\n }\n> = [\n // These nodes are copy-pasted from Lexical and modified to fit our needs.\n // https://github.com/facebook/lexical/tree/main/packages/lexical-playground/src/nodes\n // https://github.com/facebook/lexical/tree/main/packages\n ImageNode,\n ListNode,\n ListItemNode,\n\n // These nodes are directly imported from Lexical.\n CodeNode,\n HashtagNode,\n CodeHighlightNode,\n AutoLinkNode,\n OverflowNode,\n MarkNode,\n\n // Our custom nodes.\n FontColorNode,\n TypographyElementNode,\n\n // The following code replaces the built-in Lexical nodes with our custom ones.\n // https://lexical.dev/docs/concepts/node-replacement\n ParagraphNode,\n {\n replace: BaseParagraphNode,\n with: () => {\n return new ParagraphNode();\n }\n },\n HeadingNode,\n {\n replace: BaseHeadingNode,\n with: (node: BaseHeadingNode) => {\n return new HeadingNode(node.getTag());\n }\n },\n QuoteNode,\n {\n replace: BaseQuoteNode,\n with: () => {\n return new QuoteNode();\n }\n },\n LinkNode,\n {\n replace: BaseLinkNode,\n with: (node: BaseLinkNode) => {\n return new LinkNode(\n node.getURL(),\n {\n rel: node.getRel(),\n title: node.getTitle(),\n target: node.getTarget()\n },\n node.getKey()\n );\n }\n }\n];\n"],"mappings":";;;;;;AACA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,QAAA,GAAAF,OAAA;AACA,IAAAG,KAAA,GAAAH,OAAA;AACA,IAAAI,KAAA,GAAAJ,OAAA;AACA,IAAAK,SAAA,GAAAL,OAAA;AACA,IAAAM,cAAA,GAAAN,OAAA;AACA,IAAAO,sBAAA,GAAAP,OAAA;AACA,IAAAQ,SAAA,GAAAR,OAAA;AACA,IAAAS,aAAA,GAAAT,OAAA;AACA,IAAAU,YAAA,GAAAV,OAAA;AACA,IAAAW,cAAA,GAAAX,OAAA;AACA,IAAAY,SAAA,GAAAZ,OAAA;AACA,IAAAa,UAAA,GAAAb,OAAA;AACA,IAAAc,UAAA,GAAAd,OAAA;AACA,IAAAe,SAAA,GAAAf,OAAA;AAEA;AACO,IAAMgB,WAMZ,GAAG;AACA;AACA;AACA;AACAC,oBAAS,EACTC,kBAAQ,EACRC,0BAAY;AAEZ;AACAC,cAAQ,EACRC,oBAAW,EACXC,uBAAiB,EACjBC,kBAAY,EACZC,sBAAY,EACZC,cAAQ;AAER;AACAC,4BAAa,EACbC,4CAAqB;AAErB;AACA;AACAC,4BAAa,EACb;EACIC,OAAO,EAAEC,sBAAiB;EAC1BC,IAAI,EAAE,SAAAC,MAAA,EAAM;IACR,OAAO,IAAIJ,4BAAa,CAAC,CAAC;EAC9B;AACJ,CAAC,EACDK,wBAAW,EACX;EACIJ,OAAO,EAAEK,qBAAe;EACxBH,IAAI,EAAE,SAAAC,MAACG,IAAqB,EAAK;IAC7B,OAAO,IAAIF,wBAAW,CAACE,IAAI,CAACC,MAAM,CAAC,CAAC,CAAC;EACzC;AACJ,CAAC,EACDC,oBAAS,EACT;EACIR,OAAO,EAAES,mBAAa;EACtBP,IAAI,EAAE,SAAAC,MAAA,EAAM;IACR,OAAO,IAAIK,oBAAS,CAAC,CAAC;EAC1B;AACJ,CAAC,EACDE,kBAAQ,EACR;EACIV,OAAO,EAAEW,cAAY;EACrBT,IAAI,EAAE,SAAAC,MAACG,IAAkB,EAAK;IAC1B,OAAO,IAAII,kBAAQ,CACfJ,IAAI,CAACM,MAAM,CAAC,CAAC,EACb;MACIC,GAAG,EAAEP,IAAI,CAACQ,MAAM,CAAC,CAAC;MAClBC,KAAK,EAAET,IAAI,CAACU,QAAQ,CAAC,CAAC;MACtBC,MAAM,EAAEX,IAAI,CAACY,SAAS,CAAC;IAC3B,CAAC,EACDZ,IAAI,CAACa,MAAM,CAAC,CAChB,CAAC;EACL;AACJ,CAAC,CACJ;AAACC,OAAA,CAAAjC,WAAA,GAAAA,WAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/lexical-editor",
3
- "version": "5.37.1",
3
+ "version": "5.37.2-beta.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/webiny/webiny-js.git"
@@ -19,16 +19,16 @@
19
19
  "@lexical/rich-text": "0.11.3",
20
20
  "@lexical/selection": "0.11.3",
21
21
  "@lexical/utils": "0.11.3",
22
- "@webiny/react-composition": "5.37.1",
23
- "@webiny/react-properties": "5.37.1",
22
+ "@webiny/react-composition": "5.37.2-beta.0",
23
+ "@webiny/react-properties": "5.37.2-beta.0",
24
24
  "lexical": "0.11.3",
25
25
  "react": "17.0.2",
26
26
  "react-dom": "17.0.2",
27
27
  "react-style-object-to-css": "1.1.2"
28
28
  },
29
29
  "devDependencies": {
30
- "@webiny/cli": "5.37.1",
31
- "@webiny/project-utils": "5.37.1"
30
+ "@webiny/cli": "5.37.2-beta.0",
31
+ "@webiny/project-utils": "5.37.2-beta.0"
32
32
  },
33
33
  "publishConfig": {
34
34
  "access": "public",
@@ -38,5 +38,5 @@
38
38
  "build": "yarn webiny run build",
39
39
  "watch": "yarn webiny run watch"
40
40
  },
41
- "gitHead": "989e824c350e47a18f0d521684f75fc1936f92d1"
41
+ "gitHead": "f6ce49cc7eaf13904a366391210cd56951fe5d21"
42
42
  }
@@ -19,6 +19,7 @@ var _LinkPreview = require("../../ui/LinkPreview");
19
19
  var _getSelectedNode = require("../../utils/getSelectedNode");
20
20
  var _sanitizeUrl = require("../../utils/sanitizeUrl");
21
21
  var _setFloatingElemPosition = require("../../utils/setFloatingElemPosition");
22
+ var _isUrlLinkReference = require("../../utils/isUrlLinkReference");
22
23
  function FloatingLinkEditor(_ref) {
23
24
  var editor = _ref.editor,
24
25
  anchorElem = _ref.anchorElem;
@@ -146,6 +147,7 @@ function FloatingLinkEditor(_ref) {
146
147
  }, /*#__PURE__*/_react.default.createElement("input", {
147
148
  type: "checkbox",
148
149
  checked: linkUrl.target === "_blank",
150
+ disabled: (0, _isUrlLinkReference.isUrlLinkReference)(linkUrl.url),
149
151
  onChange: function onChange() {
150
152
  return setLinkUrl((0, _objectSpread2.default)((0, _objectSpread2.default)({}, linkUrl), {}, {
151
153
  target: linkUrl.target ? null : "_blank"
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_link","_LexicalComposerContext","_utils","_lexical","_reactDom","_LinkPreview","_getSelectedNode","_sanitizeUrl","_setFloatingElemPosition","FloatingLinkEditor","_ref","editor","anchorElem","editorRef","useRef","inputRef","_useState","useState","url","target","_useState2","_slicedToArray2","default","linkUrl","setLinkUrl","_useState3","_useState4","isEditMode","setEditMode","_useState5","_useState6","lastSelection","setLastSelection","updateLinkEditor","useCallback","selection","$getSelection","$isRangeSelection","node","getSelectedNode","parent","getParent","$isLinkNode","getURL","getTarget","editorElem","current","nativeSelection","window","getSelection","activeElement","document","rootElement","getRootElement","contains","anchorNode","domRange","getRangeAt","rect","inner","firstElementChild","getBoundingClientRect","setFloatingElemPosition","className","removeLink","dispatchCommand","TOGGLE_LINK_COMMAND","useEffect","scrollerElem","parentElement","update","getEditorState","read","addEventListener","removeEventListener","mergeRegister","registerUpdateListener","_ref2","editorState","registerCommand","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","focus","createElement","ref","Fragment","type","checked","onChange","_objectSpread2","value","event","onKeyDown","key","preventDefault","sanitizeUrl","readOnly","href","rel","role","tabIndex","onMouseDown","onClick","LinkPreview","useFloatingLinkEditorToolbar","_useState7","_useState8","activeEditor","setActiveEditor","_useState9","_useState10","isLink","setIsLink","updateToolbar","linkParent","$findMatchingParent","autoLinkParent","$isAutoLinkNode","_payload","newEditor","COMMAND_PRIORITY_CRITICAL","createPortal","FloatingLinkEditorPlugin","_ref3","_ref3$anchorElem","body","_useLexicalComposerCo","useLexicalComposerContext","_useLexicalComposerCo2"],"sources":["FloatingLinkEditorPlugin.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport \"./FloatingLinkEditorPlugin.css\";\nimport { $isAutoLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from \"@lexical/link\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $findMatchingParent, mergeRegister } from \"@lexical/utils\";\nimport {\n $getSelection,\n $isRangeSelection,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_LOW,\n GridSelection,\n LexicalEditor,\n NodeSelection,\n RangeSelection,\n SELECTION_CHANGE_COMMAND\n} from \"lexical\";\n\nimport { createPortal } from \"react-dom\";\nimport { LinkPreview } from \"../../ui/LinkPreview\";\nimport { getSelectedNode } from \"../../utils/getSelectedNode\";\nimport { sanitizeUrl } from \"../../utils/sanitizeUrl\";\nimport { setFloatingElemPosition } from \"../../utils/setFloatingElemPosition\";\n\nfunction FloatingLinkEditor({\n editor,\n anchorElem\n}: {\n editor: LexicalEditor;\n anchorElem: HTMLElement;\n}): JSX.Element {\n const editorRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const [linkUrl, setLinkUrl] = useState<{ url: string; target: string | null }>({\n url: \"\",\n target: null\n });\n const [isEditMode, setEditMode] = useState(false);\n const [lastSelection, setLastSelection] = useState<\n RangeSelection | GridSelection | NodeSelection | null\n >(null);\n\n const updateLinkEditor = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n if ($isLinkNode(parent)) {\n setLinkUrl({ url: parent.getURL(), target: parent.getTarget() });\n } else if ($isLinkNode(node)) {\n setLinkUrl({ url: node.getURL(), target: node.getTarget() });\n } else {\n setLinkUrl({ url: \"\", target: null });\n }\n }\n const editorElem = editorRef.current;\n const nativeSelection = window.getSelection();\n const activeElement = document.activeElement;\n\n if (editorElem === null) {\n return;\n }\n\n const rootElement = editor.getRootElement();\n\n if (\n selection !== null &&\n nativeSelection !== null &&\n rootElement !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n const domRange = nativeSelection.getRangeAt(0);\n let rect;\n if (nativeSelection.anchorNode === rootElement) {\n let inner = rootElement;\n while (inner.firstElementChild != null) {\n inner = inner.firstElementChild as HTMLElement;\n }\n rect = inner.getBoundingClientRect();\n } else {\n rect = domRange.getBoundingClientRect();\n }\n\n setFloatingElemPosition(rect, editorElem, anchorElem);\n setLastSelection(selection);\n } else if (!activeElement || activeElement.className !== \"link-input\") {\n if (rootElement !== null) {\n setFloatingElemPosition(null, editorElem, anchorElem);\n }\n setLastSelection(null);\n setEditMode(false);\n setLinkUrl({ url: \"\", target: null });\n }\n\n return true;\n }, [anchorElem, editor]);\n\n const removeLink = () => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n setEditMode(false);\n };\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement;\n\n const update = () => {\n editor.getEditorState().read(() => {\n updateLinkEditor();\n });\n };\n\n window.addEventListener(\"resize\", update);\n\n if (scrollerElem) {\n scrollerElem.addEventListener(\"scroll\", update);\n }\n\n return () => {\n window.removeEventListener(\"resize\", update);\n\n if (scrollerElem) {\n scrollerElem.removeEventListener(\"scroll\", update);\n }\n };\n }, [anchorElem.parentElement, editor, updateLinkEditor]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateLinkEditor();\n });\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateLinkEditor();\n return true;\n },\n COMMAND_PRIORITY_LOW\n )\n );\n }, [editor, updateLinkEditor]);\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n updateLinkEditor();\n });\n }, [editor, updateLinkEditor]);\n\n useEffect(() => {\n if (isEditMode && inputRef.current) {\n inputRef.current.focus();\n }\n }, [isEditMode]);\n\n return (\n <div ref={editorRef} className=\"link-editor\">\n {isEditMode ? (\n <>\n <div className={\"link-editor-target-checkbox\"}>\n <input\n type={\"checkbox\"}\n checked={linkUrl.target === \"_blank\"}\n onChange={() =>\n setLinkUrl({ ...linkUrl, target: linkUrl.target ? null : \"_blank\" })\n }\n />{\" \"}\n <span>Open in new page</span>\n </div>\n <input\n ref={inputRef}\n className=\"link-input\"\n value={linkUrl.url}\n onChange={event => {\n setLinkUrl({ url: event.target.value, target: null });\n }}\n onKeyDown={event => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n if (lastSelection !== null) {\n if (linkUrl.url !== \"\") {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n url: sanitizeUrl(linkUrl.url),\n target: linkUrl.target\n });\n }\n setEditMode(false);\n }\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n setEditMode(false);\n }\n }}\n />\n </>\n ) : (\n <>\n <div className={\"link-editor-target-checkbox\"}>\n <input type={\"checkbox\"} checked={linkUrl.target === \"_blank\"} readOnly />{\" \"}\n <span>Open in new page</span>\n </div>\n <div className=\"link-input\">\n <a href={linkUrl.url} target=\"_blank\" rel=\"noopener noreferrer\">\n {linkUrl.url}\n </a>\n <div\n className=\"link-edit\"\n role=\"button\"\n tabIndex={0}\n onMouseDown={event => event.preventDefault()}\n onClick={() => {\n setEditMode(true);\n }}\n />\n <div\n className=\"link-unlink\"\n role=\"button\"\n tabIndex={0}\n onMouseDown={event => event.preventDefault()}\n onClick={() => {\n removeLink();\n }}\n />\n </div>\n <LinkPreview url={linkUrl.url} />\n </>\n )}\n </div>\n );\n}\n\nfunction useFloatingLinkEditorToolbar(\n editor: LexicalEditor,\n anchorElem: HTMLElement\n): JSX.Element | null {\n const [activeEditor, setActiveEditor] = useState(editor);\n const [isLink, setIsLink] = useState(false);\n\n const updateToolbar = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkParent = $findMatchingParent(node, $isLinkNode);\n const autoLinkParent = $findMatchingParent(node, $isAutoLinkNode);\n\n // We don't want this menu to open for auto links.\n if (linkParent != null && autoLinkParent == null) {\n setIsLink(true);\n } else {\n setIsLink(false);\n }\n }\n }, []);\n\n useEffect(() => {\n return editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n (_payload, newEditor) => {\n updateToolbar();\n setActiveEditor(newEditor);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n );\n }, [editor, updateToolbar]);\n\n return isLink\n ? createPortal(\n <FloatingLinkEditor editor={activeEditor} anchorElem={anchorElem} />,\n anchorElem\n )\n : null;\n}\n\nexport function FloatingLinkEditorPlugin({\n anchorElem = document.body\n}: {\n anchorElem?: HTMLElement;\n}): JSX.Element | null {\n const [editor] = useLexicalComposerContext();\n return useFloatingLinkEditorToolbar(editor, anchorElem);\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_link","_LexicalComposerContext","_utils","_lexical","_reactDom","_LinkPreview","_getSelectedNode","_sanitizeUrl","_setFloatingElemPosition","_isUrlLinkReference","FloatingLinkEditor","_ref","editor","anchorElem","editorRef","useRef","inputRef","_useState","useState","url","target","_useState2","_slicedToArray2","default","linkUrl","setLinkUrl","_useState3","_useState4","isEditMode","setEditMode","_useState5","_useState6","lastSelection","setLastSelection","updateLinkEditor","useCallback","selection","$getSelection","$isRangeSelection","node","getSelectedNode","parent","getParent","$isLinkNode","getURL","getTarget","editorElem","current","nativeSelection","window","getSelection","activeElement","document","rootElement","getRootElement","contains","anchorNode","domRange","getRangeAt","rect","inner","firstElementChild","getBoundingClientRect","setFloatingElemPosition","className","removeLink","dispatchCommand","TOGGLE_LINK_COMMAND","useEffect","scrollerElem","parentElement","update","getEditorState","read","addEventListener","removeEventListener","mergeRegister","registerUpdateListener","_ref2","editorState","registerCommand","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","focus","createElement","ref","Fragment","type","checked","disabled","isUrlLinkReference","onChange","_objectSpread2","value","event","onKeyDown","key","preventDefault","sanitizeUrl","readOnly","href","rel","role","tabIndex","onMouseDown","onClick","LinkPreview","useFloatingLinkEditorToolbar","_useState7","_useState8","activeEditor","setActiveEditor","_useState9","_useState10","isLink","setIsLink","updateToolbar","linkParent","$findMatchingParent","autoLinkParent","$isAutoLinkNode","_payload","newEditor","COMMAND_PRIORITY_CRITICAL","createPortal","FloatingLinkEditorPlugin","_ref3","_ref3$anchorElem","body","_useLexicalComposerCo","useLexicalComposerContext","_useLexicalComposerCo2"],"sources":["FloatingLinkEditorPlugin.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport \"./FloatingLinkEditorPlugin.css\";\nimport { $isAutoLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from \"@lexical/link\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $findMatchingParent, mergeRegister } from \"@lexical/utils\";\nimport {\n $getSelection,\n $isRangeSelection,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_LOW,\n GridSelection,\n LexicalEditor,\n NodeSelection,\n RangeSelection,\n SELECTION_CHANGE_COMMAND\n} from \"lexical\";\n\nimport { createPortal } from \"react-dom\";\nimport { LinkPreview } from \"../../ui/LinkPreview\";\nimport { getSelectedNode } from \"../../utils/getSelectedNode\";\nimport { sanitizeUrl } from \"../../utils/sanitizeUrl\";\nimport { setFloatingElemPosition } from \"../../utils/setFloatingElemPosition\";\nimport { isUrlLinkReference } from \"~/utils/isUrlLinkReference\";\n\nfunction FloatingLinkEditor({\n editor,\n anchorElem\n}: {\n editor: LexicalEditor;\n anchorElem: HTMLElement;\n}): JSX.Element {\n const editorRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const [linkUrl, setLinkUrl] = useState<{ url: string; target: string | null }>({\n url: \"\",\n target: null\n });\n const [isEditMode, setEditMode] = useState(false);\n const [lastSelection, setLastSelection] = useState<\n RangeSelection | GridSelection | NodeSelection | null\n >(null);\n\n const updateLinkEditor = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n if ($isLinkNode(parent)) {\n setLinkUrl({ url: parent.getURL(), target: parent.getTarget() });\n } else if ($isLinkNode(node)) {\n setLinkUrl({ url: node.getURL(), target: node.getTarget() });\n } else {\n setLinkUrl({ url: \"\", target: null });\n }\n }\n const editorElem = editorRef.current;\n const nativeSelection = window.getSelection();\n const activeElement = document.activeElement;\n\n if (editorElem === null) {\n return;\n }\n\n const rootElement = editor.getRootElement();\n\n if (\n selection !== null &&\n nativeSelection !== null &&\n rootElement !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n const domRange = nativeSelection.getRangeAt(0);\n let rect;\n if (nativeSelection.anchorNode === rootElement) {\n let inner = rootElement;\n while (inner.firstElementChild != null) {\n inner = inner.firstElementChild as HTMLElement;\n }\n rect = inner.getBoundingClientRect();\n } else {\n rect = domRange.getBoundingClientRect();\n }\n\n setFloatingElemPosition(rect, editorElem, anchorElem);\n setLastSelection(selection);\n } else if (!activeElement || activeElement.className !== \"link-input\") {\n if (rootElement !== null) {\n setFloatingElemPosition(null, editorElem, anchorElem);\n }\n setLastSelection(null);\n setEditMode(false);\n setLinkUrl({ url: \"\", target: null });\n }\n\n return true;\n }, [anchorElem, editor]);\n\n const removeLink = () => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n setEditMode(false);\n };\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement;\n\n const update = () => {\n editor.getEditorState().read(() => {\n updateLinkEditor();\n });\n };\n\n window.addEventListener(\"resize\", update);\n\n if (scrollerElem) {\n scrollerElem.addEventListener(\"scroll\", update);\n }\n\n return () => {\n window.removeEventListener(\"resize\", update);\n\n if (scrollerElem) {\n scrollerElem.removeEventListener(\"scroll\", update);\n }\n };\n }, [anchorElem.parentElement, editor, updateLinkEditor]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateLinkEditor();\n });\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateLinkEditor();\n return true;\n },\n COMMAND_PRIORITY_LOW\n )\n );\n }, [editor, updateLinkEditor]);\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n updateLinkEditor();\n });\n }, [editor, updateLinkEditor]);\n\n useEffect(() => {\n if (isEditMode && inputRef.current) {\n inputRef.current.focus();\n }\n }, [isEditMode]);\n\n return (\n <div ref={editorRef} className=\"link-editor\">\n {isEditMode ? (\n <>\n <div className={\"link-editor-target-checkbox\"}>\n <input\n type={\"checkbox\"}\n checked={linkUrl.target === \"_blank\"}\n disabled={isUrlLinkReference(linkUrl.url)}\n onChange={() =>\n setLinkUrl({ ...linkUrl, target: linkUrl.target ? null : \"_blank\" })\n }\n />{\" \"}\n <span>Open in new page</span>\n </div>\n <input\n ref={inputRef}\n className=\"link-input\"\n value={linkUrl.url}\n onChange={event => {\n setLinkUrl({ url: event.target.value, target: null });\n }}\n onKeyDown={event => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n if (lastSelection !== null) {\n if (linkUrl.url !== \"\") {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n url: sanitizeUrl(linkUrl.url),\n target: linkUrl.target\n });\n }\n setEditMode(false);\n }\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n setEditMode(false);\n }\n }}\n />\n </>\n ) : (\n <>\n <div className={\"link-editor-target-checkbox\"}>\n <input type={\"checkbox\"} checked={linkUrl.target === \"_blank\"} readOnly />{\" \"}\n <span>Open in new page</span>\n </div>\n <div className=\"link-input\">\n <a href={linkUrl.url} target=\"_blank\" rel=\"noopener noreferrer\">\n {linkUrl.url}\n </a>\n <div\n className=\"link-edit\"\n role=\"button\"\n tabIndex={0}\n onMouseDown={event => event.preventDefault()}\n onClick={() => {\n setEditMode(true);\n }}\n />\n <div\n className=\"link-unlink\"\n role=\"button\"\n tabIndex={0}\n onMouseDown={event => event.preventDefault()}\n onClick={() => {\n removeLink();\n }}\n />\n </div>\n <LinkPreview url={linkUrl.url} />\n </>\n )}\n </div>\n );\n}\n\nfunction useFloatingLinkEditorToolbar(\n editor: LexicalEditor,\n anchorElem: HTMLElement\n): JSX.Element | null {\n const [activeEditor, setActiveEditor] = useState(editor);\n const [isLink, setIsLink] = useState(false);\n\n const updateToolbar = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkParent = $findMatchingParent(node, $isLinkNode);\n const autoLinkParent = $findMatchingParent(node, $isAutoLinkNode);\n\n // We don't want this menu to open for auto links.\n if (linkParent != null && autoLinkParent == null) {\n setIsLink(true);\n } else {\n setIsLink(false);\n }\n }\n }, []);\n\n useEffect(() => {\n return editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n (_payload, newEditor) => {\n updateToolbar();\n setActiveEditor(newEditor);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n );\n }, [editor, updateToolbar]);\n\n return isLink\n ? createPortal(\n <FloatingLinkEditor editor={activeEditor} anchorElem={anchorElem} />,\n anchorElem\n )\n : null;\n}\n\nexport function FloatingLinkEditorPlugin({\n anchorElem = document.body\n}: {\n anchorElem?: HTMLElement;\n}): JSX.Element | null {\n const [editor] = useLexicalComposerContext();\n return useFloatingLinkEditorToolbar(editor, anchorElem);\n}\n"],"mappings":"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"}
@@ -18,6 +18,7 @@ var _ParagraphNode = require("../nodes/ParagraphNode");
18
18
  var _HeadingNode = require("../nodes/HeadingNode");
19
19
  var _QuoteNode = require("../nodes/QuoteNode");
20
20
  var _selection = require("@lexical/selection");
21
+ var _linkNode = require("../nodes/link-node");
21
22
  var getSelectionTextFormat = function getSelectionTextFormat(selection) {
22
23
  return !(0, _lexical.$isRangeSelection)(selection) ? {
23
24
  italic: false,
@@ -75,7 +76,9 @@ var getToolbarState = function getToolbarState(selection, node, parent, element,
75
76
  state.isRTL = (0, _selection.$isParentElementRTL)(selection);
76
77
 
77
78
  // link
78
- state.link.isSelected = (0, _link.$isLinkNode)(parent) || (0, _link.$isLinkNode)(node);
79
+ state.link.isSelected = (0, _link.$isLinkNode)(parent) || (0, _link.$isLinkNode)(node) ||
80
+ // custom link node
81
+ (0, _linkNode.$isLinkNode)(parent) || (0, _linkNode.$isLinkNode)(node);
79
82
  if (state.link.isSelected) {
80
83
  state.textType = "link";
81
84
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_lexical","require","_utils","_getSelectedNode","_link","_ListNode","_richText","_TypographyElementNode","_FontColorNode","_ParagraphNode","_HeadingNode","_QuoteNode","_selection","getSelectionTextFormat","selection","$isRangeSelection","italic","bold","underline","code","hasFormat","exports","getDefaultToolbarState","isRTL","link","isSelected","list","typography","fontColor","quote","paragraph","heading","textType","undefined","getToolbarState","node","parent","element","anchorNode","textFormat","state","_objectSpread2","default","$isParentElementRTL","$isLinkNode","$isFontColorNode","$isListNode","parentList","$getNearestNodeOfType","ListNode","type","getListType","$isBaseHeadingNode","$isHeadingNode","$isBaseParagraphNode","$isParagraphNode","$isTypographyElementNode","value","getTypographyValue","tag","includes","$isQuoteNode","getLexicalTextSelectionState","activeEditor","anchor","getNode","getKey","$findMatchingParent","e","getParent","$isRootOrShadowRoot","getTopLevelElementOrThrow","elementKey","elementDOM","getElementByKey","getSelectedNode","isElementDom","selectedText","getTextContent"],"sources":["getLexicalTextSelectionState.ts"],"sourcesContent":["import { TextFormatting, TextBlockSelection, ToolbarState, TypographyValue } from \"~/types\";\nimport {\n $isParagraphNode as $isBaseParagraphNode,\n $isRangeSelection,\n $isRootOrShadowRoot,\n ElementNode,\n LexicalEditor,\n LexicalNode,\n RangeSelection,\n TextNode\n} from \"lexical\";\nimport { $findMatchingParent, $getNearestNodeOfType } from \"@lexical/utils\";\nimport { getSelectedNode } from \"~/utils/getSelectedNode\";\nimport { $isLinkNode } from \"@lexical/link\";\nimport { $isListNode, ListNode } from \"~/nodes/ListNode\";\nimport { $isHeadingNode as $isBaseHeadingNode } from \"@lexical/rich-text\";\nimport { $isTypographyElementNode } from \"~/nodes/TypographyElementNode\";\nimport { $isFontColorNode } from \"~/nodes/FontColorNode\";\nimport { $isParagraphNode } from \"~/nodes/ParagraphNode\";\nimport { $isHeadingNode } from \"~/nodes/HeadingNode\";\nimport { $isQuoteNode } from \"~/nodes/QuoteNode\";\nimport { $isParentElementRTL } from \"@lexical/selection\";\n\nexport const getSelectionTextFormat = (selection: RangeSelection | undefined): TextFormatting => {\n return !$isRangeSelection(selection)\n ? {\n italic: false,\n bold: false,\n underline: false,\n code: false\n }\n : {\n bold: selection.hasFormat(\"bold\"),\n italic: selection.hasFormat(\"italic\"),\n underline: selection.hasFormat(\"underline\"),\n code: selection.hasFormat(\"code\")\n };\n};\n\nconst getDefaultToolbarState = (): ToolbarState => {\n return {\n bold: false,\n italic: false,\n underline: false,\n code: false,\n isRTL: false,\n link: { isSelected: false },\n list: { isSelected: false },\n typography: { isSelected: false },\n fontColor: { isSelected: false },\n quote: { isSelected: false },\n paragraph: { isSelected: false },\n heading: { isSelected: false },\n textType: undefined\n };\n};\n\nexport const getToolbarState = (\n selection: RangeSelection,\n node: LexicalNode,\n parent: LexicalNode | null,\n element: LexicalNode | null,\n anchorNode: ElementNode | TextNode\n): ToolbarState => {\n const textFormat = getSelectionTextFormat(selection);\n let state: ToolbarState = getDefaultToolbarState();\n state = {\n ...state,\n bold: textFormat.bold,\n italic: textFormat.italic,\n underline: textFormat.underline,\n code: textFormat.code\n };\n\n state.isRTL = $isParentElementRTL(selection);\n\n // link\n state.link.isSelected = $isLinkNode(parent) || $isLinkNode(node);\n if (state.link.isSelected) {\n state.textType = \"link\";\n }\n\n // font color\n if ($isFontColorNode(node)) {\n state.fontColor.isSelected = true;\n }\n\n if ($isListNode(element)) {\n const parentList = $getNearestNodeOfType<ListNode>(anchorNode, ListNode);\n const type = parentList ? parentList.getListType() : element.getListType();\n state.list.isSelected = true;\n state.textType = type;\n }\n\n if ($isBaseHeadingNode(element)) {\n state.textType = \"heading\";\n }\n\n if ($isHeadingNode(element)) {\n state.textType = \"heading\";\n state.heading.isSelected = true;\n }\n\n if ($isBaseParagraphNode(element)) {\n state.textType = \"paragraph\";\n }\n\n if ($isParagraphNode(element)) {\n state.textType = \"paragraph\";\n state.paragraph.isSelected = true;\n }\n\n if ($isTypographyElementNode(element)) {\n state.typography.isSelected = true;\n const value = element?.getTypographyValue() as TypographyValue;\n if (value.tag.includes(\"h\")) {\n state.textType = \"heading\";\n }\n if (value.tag.includes(\"p\")) {\n state.textType = \"paragraph\";\n }\n }\n\n if ($isTypographyElementNode(element)) {\n state.fontColor.isSelected = true;\n }\n\n if ($isQuoteNode(element)) {\n state.textType = \"quoteblock\";\n state.quote.isSelected = true;\n }\n\n return state;\n};\n\n/*\n * @desc Get selection data and provide processed toolbar state and data about the text, element and parent nodes.\n */\nexport const getLexicalTextSelectionState = (\n activeEditor: LexicalEditor,\n selection: RangeSelection\n): TextBlockSelection | null => {\n if ($isRangeSelection(selection)) {\n const anchorNode = selection.anchor.getNode();\n let element =\n anchorNode.getKey() === \"root\"\n ? anchorNode\n : $findMatchingParent(anchorNode, e => {\n const parent = e.getParent();\n return parent !== null && $isRootOrShadowRoot(parent);\n });\n\n if (element === null) {\n element = anchorNode.getTopLevelElementOrThrow();\n }\n\n const elementKey = element.getKey();\n const elementDOM = activeEditor.getElementByKey(elementKey);\n\n // Update links\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n const isElementDom = elementDOM !== null;\n const selectedText = selection.getTextContent();\n\n return {\n // node/element data from selection\n elementKey,\n element,\n parent,\n node,\n anchorNode,\n selection,\n isElementDom,\n selectedText,\n state: getToolbarState(selection, node, parent, element, anchorNode)\n };\n }\n return null;\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["_lexical","require","_utils","_getSelectedNode","_link","_ListNode","_richText","_TypographyElementNode","_FontColorNode","_ParagraphNode","_HeadingNode","_QuoteNode","_selection","_linkNode","getSelectionTextFormat","selection","$isRangeSelection","italic","bold","underline","code","hasFormat","exports","getDefaultToolbarState","isRTL","link","isSelected","list","typography","fontColor","quote","paragraph","heading","textType","undefined","getToolbarState","node","parent","element","anchorNode","textFormat","state","_objectSpread2","default","$isParentElementRTL","$isBaseLinkNode","$isLinkNode","$isFontColorNode","$isListNode","parentList","$getNearestNodeOfType","ListNode","type","getListType","$isBaseHeadingNode","$isHeadingNode","$isBaseParagraphNode","$isParagraphNode","$isTypographyElementNode","value","getTypographyValue","tag","includes","$isQuoteNode","getLexicalTextSelectionState","activeEditor","anchor","getNode","getKey","$findMatchingParent","e","getParent","$isRootOrShadowRoot","getTopLevelElementOrThrow","elementKey","elementDOM","getElementByKey","getSelectedNode","isElementDom","selectedText","getTextContent"],"sources":["getLexicalTextSelectionState.ts"],"sourcesContent":["import { TextFormatting, TextBlockSelection, ToolbarState, TypographyValue } from \"~/types\";\nimport {\n $isParagraphNode as $isBaseParagraphNode,\n $isRangeSelection,\n $isRootOrShadowRoot,\n ElementNode,\n LexicalEditor,\n LexicalNode,\n RangeSelection,\n TextNode\n} from \"lexical\";\nimport { $findMatchingParent, $getNearestNodeOfType } from \"@lexical/utils\";\nimport { getSelectedNode } from \"~/utils/getSelectedNode\";\nimport { $isLinkNode as $isBaseLinkNode } from \"@lexical/link\";\nimport { $isListNode, ListNode } from \"~/nodes/ListNode\";\nimport { $isHeadingNode as $isBaseHeadingNode } from \"@lexical/rich-text\";\nimport { $isTypographyElementNode } from \"~/nodes/TypographyElementNode\";\nimport { $isFontColorNode } from \"~/nodes/FontColorNode\";\nimport { $isParagraphNode } from \"~/nodes/ParagraphNode\";\nimport { $isHeadingNode } from \"~/nodes/HeadingNode\";\nimport { $isQuoteNode } from \"~/nodes/QuoteNode\";\nimport { $isParentElementRTL } from \"@lexical/selection\";\nimport { $isLinkNode } from \"~/nodes/link-node\";\n\nexport const getSelectionTextFormat = (selection: RangeSelection | undefined): TextFormatting => {\n return !$isRangeSelection(selection)\n ? {\n italic: false,\n bold: false,\n underline: false,\n code: false\n }\n : {\n bold: selection.hasFormat(\"bold\"),\n italic: selection.hasFormat(\"italic\"),\n underline: selection.hasFormat(\"underline\"),\n code: selection.hasFormat(\"code\")\n };\n};\n\nconst getDefaultToolbarState = (): ToolbarState => {\n return {\n bold: false,\n italic: false,\n underline: false,\n code: false,\n isRTL: false,\n link: { isSelected: false },\n list: { isSelected: false },\n typography: { isSelected: false },\n fontColor: { isSelected: false },\n quote: { isSelected: false },\n paragraph: { isSelected: false },\n heading: { isSelected: false },\n textType: undefined\n };\n};\n\nexport const getToolbarState = (\n selection: RangeSelection,\n node: LexicalNode,\n parent: LexicalNode | null,\n element: LexicalNode | null,\n anchorNode: ElementNode | TextNode\n): ToolbarState => {\n const textFormat = getSelectionTextFormat(selection);\n let state: ToolbarState = getDefaultToolbarState();\n state = {\n ...state,\n bold: textFormat.bold,\n italic: textFormat.italic,\n underline: textFormat.underline,\n code: textFormat.code\n };\n\n state.isRTL = $isParentElementRTL(selection);\n\n // link\n state.link.isSelected =\n $isBaseLinkNode(parent) ||\n $isBaseLinkNode(node) ||\n // custom link node\n $isLinkNode(parent) ||\n $isLinkNode(node);\n if (state.link.isSelected) {\n state.textType = \"link\";\n }\n\n // font color\n if ($isFontColorNode(node)) {\n state.fontColor.isSelected = true;\n }\n\n if ($isListNode(element)) {\n const parentList = $getNearestNodeOfType<ListNode>(anchorNode, ListNode);\n const type = parentList ? parentList.getListType() : element.getListType();\n state.list.isSelected = true;\n state.textType = type;\n }\n\n if ($isBaseHeadingNode(element)) {\n state.textType = \"heading\";\n }\n\n if ($isHeadingNode(element)) {\n state.textType = \"heading\";\n state.heading.isSelected = true;\n }\n\n if ($isBaseParagraphNode(element)) {\n state.textType = \"paragraph\";\n }\n\n if ($isParagraphNode(element)) {\n state.textType = \"paragraph\";\n state.paragraph.isSelected = true;\n }\n\n if ($isTypographyElementNode(element)) {\n state.typography.isSelected = true;\n const value = element?.getTypographyValue() as TypographyValue;\n if (value.tag.includes(\"h\")) {\n state.textType = \"heading\";\n }\n if (value.tag.includes(\"p\")) {\n state.textType = \"paragraph\";\n }\n }\n\n if ($isTypographyElementNode(element)) {\n state.fontColor.isSelected = true;\n }\n\n if ($isQuoteNode(element)) {\n state.textType = \"quoteblock\";\n state.quote.isSelected = true;\n }\n\n return state;\n};\n\n/*\n * @desc Get selection data and provide processed toolbar state and data about the text, element and parent nodes.\n */\nexport const getLexicalTextSelectionState = (\n activeEditor: LexicalEditor,\n selection: RangeSelection\n): TextBlockSelection | null => {\n if ($isRangeSelection(selection)) {\n const anchorNode = selection.anchor.getNode();\n let element =\n anchorNode.getKey() === \"root\"\n ? anchorNode\n : $findMatchingParent(anchorNode, e => {\n const parent = e.getParent();\n return parent !== null && $isRootOrShadowRoot(parent);\n });\n\n if (element === null) {\n element = anchorNode.getTopLevelElementOrThrow();\n }\n\n const elementKey = element.getKey();\n const elementDOM = activeEditor.getElementByKey(elementKey);\n\n // Update links\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n const isElementDom = elementDOM !== null;\n const selectedText = selection.getTextContent();\n\n return {\n // node/element data from selection\n elementKey,\n element,\n parent,\n node,\n anchorNode,\n selection,\n isElementDom,\n selectedText,\n state: getToolbarState(selection, node, parent, element, anchorNode)\n };\n }\n return null;\n};\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const isUrlLinkReference: (url: string) => boolean;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isUrlLinkReference = void 0;
7
+ var isUrlLinkReference = function isUrlLinkReference(url) {
8
+ return url.startsWith("#");
9
+ };
10
+ exports.isUrlLinkReference = isUrlLinkReference;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["isUrlLinkReference","url","startsWith","exports"],"sources":["isUrlLinkReference.ts"],"sourcesContent":["export const isUrlLinkReference = (url: string) => {\n return url.startsWith(\"#\");\n};\n"],"mappings":";;;;;;AAAO,IAAMA,kBAAkB,GAAG,SAArBA,kBAAkBA,CAAIC,GAAW,EAAK;EAC/C,OAAOA,GAAG,CAACC,UAAU,CAAC,GAAG,CAAC;AAC9B,CAAC;AAACC,OAAA,CAAAH,kBAAA,GAAAA,kBAAA"}
@@ -1,8 +1 @@
1
- /**
2
- * Copyright (c) Meta Platforms, Inc. and affiliates.
3
- *
4
- * This source code is licensed under the MIT license found in the
5
- * LICENSE file in the root directory of this source tree.
6
- *
7
- */
8
1
  export declare const sanitizeUrl: (url: string) => string;
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.sanitizeUrl = void 0;
7
+ var _isUrlLinkReference = require("./isUrlLinkReference");
7
8
  /**
8
9
  * Copyright (c) Meta Platforms, Inc. and affiliates.
9
10
  *
@@ -19,6 +20,9 @@ var sanitizeUrl = function sanitizeUrl(url) {
19
20
  /** A pattern that matches safe data URLs. */
20
21
  var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;
21
22
  url = String(url).trim();
23
+ if ((0, _isUrlLinkReference.isUrlLinkReference)(url)) {
24
+ return url;
25
+ }
22
26
  if (url.match(SAFE_URL_PATTERN) || url.match(DATA_URL_PATTERN)) {
23
27
  return url;
24
28
  }
@@ -1 +1 @@
1
- {"version":3,"names":["sanitizeUrl","url","SAFE_URL_PATTERN","DATA_URL_PATTERN","String","trim","match","exports"],"sources":["sanitizeUrl.ts"],"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 */\n\nexport const sanitizeUrl = (url: string): string => {\n /** A pattern that matches safe URLs. */\n const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^&:/?#]*(?:[/?#]|$))/gi;\n\n /** A pattern that matches safe data URLs. */\n const DATA_URL_PATTERN =\n /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;\n\n url = String(url).trim();\n\n if (url.match(SAFE_URL_PATTERN) || url.match(DATA_URL_PATTERN)) {\n return url;\n }\n\n return `https://`;\n};\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO,IAAMA,WAAW,GAAG,SAAdA,WAAWA,CAAIC,GAAW,EAAa;EAChD;EACA,IAAMC,gBAAgB,GAAG,iEAAiE;;EAE1F;EACA,IAAMC,gBAAgB,GAClB,qIAAqI;EAEzIF,GAAG,GAAGG,MAAM,CAACH,GAAG,CAAC,CAACI,IAAI,CAAC,CAAC;EAExB,IAAIJ,GAAG,CAACK,KAAK,CAACJ,gBAAgB,CAAC,IAAID,GAAG,CAACK,KAAK,CAACH,gBAAgB,CAAC,EAAE;IAC5D,OAAOF,GAAG;EACd;EAEA;AACJ,CAAC;AAACM,OAAA,CAAAP,WAAA,GAAAA,WAAA"}
1
+ {"version":3,"names":["_isUrlLinkReference","require","sanitizeUrl","url","SAFE_URL_PATTERN","DATA_URL_PATTERN","String","trim","isUrlLinkReference","match","exports"],"sources":["sanitizeUrl.ts"],"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 { isUrlLinkReference } from \"~/utils/isUrlLinkReference\";\n\nexport const sanitizeUrl = (url: string): string => {\n /** A pattern that matches safe URLs. */\n const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^&:/?#]*(?:[/?#]|$))/gi;\n\n /** A pattern that matches safe data URLs. */\n const DATA_URL_PATTERN =\n /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;\n\n url = String(url).trim();\n\n if (isUrlLinkReference(url)) {\n return url;\n }\n\n if (url.match(SAFE_URL_PATTERN) || url.match(DATA_URL_PATTERN)) {\n return url;\n }\n\n return `https://`;\n};\n"],"mappings":";;;;;;AAOA,IAAAA,mBAAA,GAAAC,OAAA;AAPA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGO,IAAMC,WAAW,GAAG,SAAdA,WAAWA,CAAIC,GAAW,EAAa;EAChD;EACA,IAAMC,gBAAgB,GAAG,iEAAiE;;EAE1F;EACA,IAAMC,gBAAgB,GAClB,qIAAqI;EAEzIF,GAAG,GAAGG,MAAM,CAACH,GAAG,CAAC,CAACI,IAAI,CAAC,CAAC;EAExB,IAAI,IAAAC,sCAAkB,EAACL,GAAG,CAAC,EAAE;IACzB,OAAOA,GAAG;EACd;EAEA,IAAIA,GAAG,CAACM,KAAK,CAACL,gBAAgB,CAAC,IAAID,GAAG,CAACM,KAAK,CAACJ,gBAAgB,CAAC,EAAE;IAC5D,OAAOF,GAAG;EACd;EAEA;AACJ,CAAC;AAACO,OAAA,CAAAR,WAAA,GAAAA,WAAA"}