@webiny/lexical-editor 5.37.1 → 5.37.2-beta.1
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/nodes/link-node.d.ts +18 -0
- package/nodes/link-node.js +111 -0
- package/nodes/link-node.js.map +1 -0
- package/nodes/webinyNodes.js +23 -9
- package/nodes/webinyNodes.js.map +1 -1
- package/package.json +6 -6
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.js +4 -2
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.js.map +1 -1
- package/utils/getLexicalTextSelectionState.js +4 -1
- package/utils/getLexicalTextSelectionState.js.map +1 -1
- package/utils/isUrlLinkReference.d.ts +1 -0
- package/utils/isUrlLinkReference.js +10 -0
- package/utils/isUrlLinkReference.js.map +1 -0
- package/utils/sanitizeUrl.d.ts +0 -7
- package/utils/sanitizeUrl.js +4 -0
- package/utils/sanitizeUrl.js.map +1 -1
|
@@ -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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"}
|
package/nodes/webinyNodes.js
CHANGED
|
@@ -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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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;
|
package/nodes/webinyNodes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
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.1",
|
|
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.1",
|
|
23
|
+
"@webiny/react-properties": "5.37.2-beta.1",
|
|
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.1",
|
|
31
|
+
"@webiny/project-utils": "5.37.2-beta.1"
|
|
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": "
|
|
41
|
+
"gitHead": "154f92c422ca0f8985474c75bf2763eca1de5052"
|
|
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,12 +147,13 @@ 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"
|
|
152
154
|
}));
|
|
153
155
|
}
|
|
154
|
-
}), " ", /*#__PURE__*/_react.default.createElement("span", null, "
|
|
156
|
+
}), " ", /*#__PURE__*/_react.default.createElement("span", null, "New tab")), /*#__PURE__*/_react.default.createElement("input", {
|
|
155
157
|
ref: inputRef,
|
|
156
158
|
className: "link-input",
|
|
157
159
|
value: linkUrl.url,
|
|
@@ -184,7 +186,7 @@ function FloatingLinkEditor(_ref) {
|
|
|
184
186
|
type: "checkbox",
|
|
185
187
|
checked: linkUrl.target === "_blank",
|
|
186
188
|
readOnly: true
|
|
187
|
-
}), " ", /*#__PURE__*/_react.default.createElement("span", null, "
|
|
189
|
+
}), " ", /*#__PURE__*/_react.default.createElement("span", null, "New tab")), /*#__PURE__*/_react.default.createElement("div", {
|
|
188
190
|
className: "link-input"
|
|
189
191
|
}, /*#__PURE__*/_react.default.createElement("a", {
|
|
190
192
|
href: linkUrl.url,
|
|
@@ -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>New tab</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>New tab</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"}
|
package/utils/sanitizeUrl.d.ts
CHANGED
package/utils/sanitizeUrl.js
CHANGED
|
@@ -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
|
}
|
package/utils/sanitizeUrl.js.map
CHANGED
|
@@ -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":";;;;;;
|
|
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"}
|