@webiny/lexical-editor 0.0.0-unstable.13771d80a8
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/LICENSE +21 -0
- package/README.md +17 -0
- package/components/AddRichTextEditorNodeType.d.ts +6 -0
- package/components/AddRichTextEditorNodeType.js +28 -0
- package/components/AddRichTextEditorNodeType.js.map +1 -0
- package/components/AddRichTextEditorPlugin.d.ts +12 -0
- package/components/AddRichTextEditorPlugin.js +33 -0
- package/components/AddRichTextEditorPlugin.js.map +1 -0
- package/components/AddToolbarAction.d.ts +7 -0
- package/components/AddToolbarAction.js +33 -0
- package/components/AddToolbarAction.js.map +1 -0
- package/components/Editor/HeadingEditor.d.ts +7 -0
- package/components/Editor/HeadingEditor.js +28 -0
- package/components/Editor/HeadingEditor.js.map +1 -0
- package/components/Editor/ParagraphEditor.d.ts +7 -0
- package/components/Editor/ParagraphEditor.js +30 -0
- package/components/Editor/ParagraphEditor.js.map +1 -0
- package/components/Editor/RichTextEditor.d.ts +25 -0
- package/components/Editor/RichTextEditor.js +112 -0
- package/components/Editor/RichTextEditor.js.map +1 -0
- package/components/LexicalEditorConfig/LexicalEditorConfig.d.ts +7 -0
- package/components/LexicalEditorConfig/LexicalEditorConfig.js +15 -0
- package/components/LexicalEditorConfig/LexicalEditorConfig.js.map +1 -0
- package/components/LexicalHtmlRenderer.d.ts +11 -0
- package/components/LexicalHtmlRenderer.js +48 -0
- package/components/LexicalHtmlRenderer.js.map +1 -0
- package/components/Toolbar/HeadingToolbar.d.ts +12 -0
- package/components/Toolbar/HeadingToolbar.js +23 -0
- package/components/Toolbar/HeadingToolbar.js.map +1 -0
- package/components/Toolbar/ParagraphToolbar.d.ts +12 -0
- package/components/Toolbar/ParagraphToolbar.js +23 -0
- package/components/Toolbar/ParagraphToolbar.js.map +1 -0
- package/components/Toolbar/Toolbar.css +423 -0
- package/components/Toolbar/Toolbar.d.ts +13 -0
- package/components/Toolbar/Toolbar.js +161 -0
- package/components/Toolbar/Toolbar.js.map +1 -0
- package/components/ToolbarActions/BoldAction.d.ts +5 -0
- package/components/ToolbarActions/BoldAction.js +38 -0
- package/components/ToolbarActions/BoldAction.js.map +1 -0
- package/components/ToolbarActions/BulletListAction.d.ts +5 -0
- package/components/ToolbarActions/BulletListAction.js +89 -0
- package/components/ToolbarActions/BulletListAction.js.map +1 -0
- package/components/ToolbarActions/CodeHighlightAction.d.ts +6 -0
- package/components/ToolbarActions/CodeHighlightAction.js +39 -0
- package/components/ToolbarActions/CodeHighlightAction.js.map +1 -0
- package/components/ToolbarActions/FontColorAction.d.ts +11 -0
- package/components/ToolbarActions/FontColorAction.js +88 -0
- package/components/ToolbarActions/FontColorAction.js.map +1 -0
- package/components/ToolbarActions/FontSizeAction.d.ts +2 -0
- package/components/ToolbarActions/FontSizeAction.js +104 -0
- package/components/ToolbarActions/FontSizeAction.js.map +1 -0
- package/components/ToolbarActions/ItalicAction.d.ts +5 -0
- package/components/ToolbarActions/ItalicAction.js +38 -0
- package/components/ToolbarActions/ItalicAction.js.map +1 -0
- package/components/ToolbarActions/LinkAction.d.ts +7 -0
- package/components/ToolbarActions/LinkAction.js +69 -0
- package/components/ToolbarActions/LinkAction.js.map +1 -0
- package/components/ToolbarActions/NumberedListAction.d.ts +5 -0
- package/components/ToolbarActions/NumberedListAction.js +89 -0
- package/components/ToolbarActions/NumberedListAction.js.map +1 -0
- package/components/ToolbarActions/QuoteAction.d.ts +4 -0
- package/components/ToolbarActions/QuoteAction.js +66 -0
- package/components/ToolbarActions/QuoteAction.js.map +1 -0
- package/components/ToolbarActions/UnderlineAction.d.ts +5 -0
- package/components/ToolbarActions/UnderlineAction.js +38 -0
- package/components/ToolbarActions/UnderlineAction.js.map +1 -0
- package/components/ToolbarPresets/HeadingToolbarPreset.d.ts +2 -0
- package/components/ToolbarPresets/HeadingToolbarPreset.js +48 -0
- package/components/ToolbarPresets/HeadingToolbarPreset.js.map +1 -0
- package/components/ToolbarPresets/ParagraphToolbarPreset.d.ts +2 -0
- package/components/ToolbarPresets/ParagraphToolbarPreset.js +63 -0
- package/components/ToolbarPresets/ParagraphToolbarPreset.js.map +1 -0
- package/context/FontColorActionContext.d.ts +6 -0
- package/context/FontColorActionContext.js +10 -0
- package/context/FontColorActionContext.js.map +1 -0
- package/context/RichTextEditorContext.d.ts +11 -0
- package/context/RichTextEditorContext.js +29 -0
- package/context/RichTextEditorContext.js.map +1 -0
- package/hooks/useFontColorPicker.d.ts +2 -0
- package/hooks/useFontColorPicker.js +15 -0
- package/hooks/useFontColorPicker.js.map +1 -0
- package/hooks/useRichTextEditor.d.ts +2 -0
- package/hooks/useRichTextEditor.js +15 -0
- package/hooks/useRichTextEditor.js.map +1 -0
- package/images/icons/LICENSE.md +5 -0
- package/images/icons/chat-square-quote.svg +1 -0
- package/images/icons/chevron-down.svg +1 -0
- package/images/icons/code.svg +1 -0
- package/images/icons/font-color.svg +1 -0
- package/images/icons/link.svg +1 -0
- package/images/icons/list-ol.svg +1 -0
- package/images/icons/list-ul.svg +1 -0
- package/images/icons/pencil-fill.svg +1 -0
- package/images/icons/text-center.svg +1 -0
- package/images/icons/text-left.svg +1 -0
- package/images/icons/text-paragraph.svg +1 -0
- package/images/icons/text-right.svg +1 -0
- package/images/icons/type-bold.svg +1 -0
- package/images/icons/type-h1.svg +1 -0
- package/images/icons/type-h2.svg +1 -0
- package/images/icons/type-h3.svg +1 -0
- package/images/icons/type-h4.svg +1 -0
- package/images/icons/type-h5.svg +1 -0
- package/images/icons/type-h6.svg +1 -0
- package/images/icons/type-italic.svg +1 -0
- package/images/icons/type-strikethrough.svg +1 -0
- package/images/icons/type-underline.svg +1 -0
- package/images/icons/unlink_icon.svg +1 -0
- package/index.d.ts +37 -0
- package/index.js +260 -0
- package/index.js.map +1 -0
- package/nodes/FontColorNode.d.ts +43 -0
- package/nodes/FontColorNode.js +127 -0
- package/nodes/FontColorNode.js.map +1 -0
- package/nodes/webinyNodes.d.ts +2 -0
- package/nodes/webinyNodes.js +16 -0
- package/nodes/webinyNodes.js.map +1 -0
- package/package.json +38 -0
- package/plugins/AutoLinkPlugin/AutoLinkPlugin.d.ts +11 -0
- package/plugins/AutoLinkPlugin/AutoLinkPlugin.js +46 -0
- package/plugins/AutoLinkPlugin/AutoLinkPlugin.js.map +1 -0
- package/plugins/AutoLinkPlugin/index.d.ts +1 -0
- package/plugins/AutoLinkPlugin/index.js +16 -0
- package/plugins/AutoLinkPlugin/index.js.map +1 -0
- package/plugins/BlurEventPlugin/BlurEventPlugin.d.ts +7 -0
- package/plugins/BlurEventPlugin/BlurEventPlugin.js +28 -0
- package/plugins/BlurEventPlugin/BlurEventPlugin.js.map +1 -0
- package/plugins/ClickableLinkPlugin/ClickableLinkPlugin.d.ts +17 -0
- package/plugins/ClickableLinkPlugin/ClickableLinkPlugin.js +88 -0
- package/plugins/ClickableLinkPlugin/ClickableLinkPlugin.js.map +1 -0
- package/plugins/ClickableLinkPlugin/index.d.ts +1 -0
- package/plugins/ClickableLinkPlugin/index.js +16 -0
- package/plugins/ClickableLinkPlugin/index.js.map +1 -0
- package/plugins/CodeHighlightPlugin/CodeHighlightPlugin.d.ts +1 -0
- package/plugins/CodeHighlightPlugin/CodeHighlightPlugin.js +20 -0
- package/plugins/CodeHighlightPlugin/CodeHighlightPlugin.js.map +1 -0
- package/plugins/CodeHighlightPlugin/index.d.ts +1 -0
- package/plugins/CodeHighlightPlugin/index.js +16 -0
- package/plugins/CodeHighlightPlugin/index.js.map +1 -0
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.css +118 -0
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.d.ts +7 -0
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.js +222 -0
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.js.map +1 -0
- package/plugins/FloatingLinkEditorPlugin/index.d.ts +1 -0
- package/plugins/FloatingLinkEditorPlugin/index.js +16 -0
- package/plugins/FloatingLinkEditorPlugin/index.js.map +1 -0
- package/plugins/FontColorPlugin/FontColorPlugin.d.ts +2 -0
- package/plugins/FontColorPlugin/FontColorPlugin.js +38 -0
- package/plugins/FontColorPlugin/FontColorPlugin.js.map +1 -0
- package/plugins/LexicalUpdateStatePlugin/LexicalUpdateStatePlugin.d.ts +8 -0
- package/plugins/LexicalUpdateStatePlugin/LexicalUpdateStatePlugin.js +34 -0
- package/plugins/LexicalUpdateStatePlugin/LexicalUpdateStatePlugin.js.map +1 -0
- package/plugins/LexicalUpdateStatePlugin/index.d.ts +1 -0
- package/plugins/LexicalUpdateStatePlugin/index.js +16 -0
- package/plugins/LexicalUpdateStatePlugin/index.js.map +1 -0
- package/themes/webinyLexicalTheme.css +422 -0
- package/themes/webinyLexicalTheme.d.ts +7 -0
- package/themes/webinyLexicalTheme.js +86 -0
- package/themes/webinyLexicalTheme.js.map +1 -0
- package/types.d.ts +3 -0
- package/types.js +12 -0
- package/types.js.map +1 -0
- package/ui/Divider.d.ts +2 -0
- package/ui/Divider.js +13 -0
- package/ui/Divider.js.map +1 -0
- package/ui/DropDown.d.ts +26 -0
- package/ui/DropDown.js +173 -0
- package/ui/DropDown.js.map +1 -0
- package/ui/Input.css +32 -0
- package/ui/LinkPreview.css +69 -0
- package/ui/LinkPreview.d.ts +12 -0
- package/ui/LinkPreview.js +101 -0
- package/ui/LinkPreview.js.map +1 -0
- package/ui/Placeholder.css +23 -0
- package/ui/Placeholder.d.ts +13 -0
- package/ui/Placeholder.js +24 -0
- package/ui/Placeholder.js.map +1 -0
- package/ui/TextInput.d.ts +18 -0
- package/ui/TextInput.js +39 -0
- package/ui/TextInput.js.map +1 -0
- package/ui/ToolbarActionDialog.d.ts +12 -0
- package/ui/ToolbarActionDialog.js +107 -0
- package/ui/ToolbarActionDialog.js.map +1 -0
- package/utils/generateInitialLexicalValue.d.ts +5 -0
- package/utils/generateInitialLexicalValue.js +29 -0
- package/utils/generateInitialLexicalValue.js.map +1 -0
- package/utils/getDOMRangeRect.d.ts +10 -0
- package/utils/getDOMRangeRect.js +27 -0
- package/utils/getDOMRangeRect.js.map +1 -0
- package/utils/getSelectedNode.d.ts +2 -0
- package/utils/getSelectedNode.js +30 -0
- package/utils/getSelectedNode.js.map +1 -0
- package/utils/isValidJSON.d.ts +1 -0
- package/utils/isValidJSON.js +18 -0
- package/utils/isValidJSON.js.map +1 -0
- package/utils/isValidLexicalData.d.ts +2 -0
- package/utils/isValidLexicalData.js +24 -0
- package/utils/isValidLexicalData.js.map +1 -0
- package/utils/point.d.ts +21 -0
- package/utils/point.js +77 -0
- package/utils/point.js.map +1 -0
- package/utils/rect.d.ts +47 -0
- package/utils/rect.js +169 -0
- package/utils/rect.js.map +1 -0
- package/utils/sanitizeUrl.d.ts +8 -0
- package/utils/sanitizeUrl.js +27 -0
- package/utils/sanitizeUrl.js.map +1 -0
- package/utils/setFloatingElemPosition.d.ts +3 -0
- package/utils/setFloatingElemPosition.js +40 -0
- package/utils/setFloatingElemPosition.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["BlurEventPlugin","onBlur","useLexicalComposerContext","editor","useEffect","registerCommand","BLUR_COMMAND","editorState","getEditorState","JSON","stringify","toJSON","COMMAND_PRIORITY_LOW"],"sources":["BlurEventPlugin.tsx"],"sourcesContent":["import { FC, useEffect } from \"react\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { BLUR_COMMAND, COMMAND_PRIORITY_LOW } from \"lexical\";\nimport { LexicalValue } from \"~/types\";\n\ninterface BlurEventPlugin {\n onBlur?: (editorState: LexicalValue) => void;\n}\n\nexport const BlurEventPlugin: FC<BlurEventPlugin> = ({ onBlur }) => {\n const [editor] = useLexicalComposerContext();\n\n useEffect(\n () =>\n editor.registerCommand(\n BLUR_COMMAND,\n () => {\n if (typeof onBlur === \"function\") {\n const editorState = editor.getEditorState();\n onBlur(JSON.stringify(editorState.toJSON()));\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n ),\n []\n );\n return null;\n};\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAOO,IAAMA,eAAoC,GAAG,SAAvCA,eAAoC,OAAmB;EAAA,IAAbC,MAAM,QAANA,MAAM;EACzD,4BAAiB,IAAAC,iDAAyB,GAAE;IAAA;IAArCC,MAAM;EAEb,IAAAC,gBAAS,EACL;IAAA,OACID,MAAM,CAACE,eAAe,CAClBC,qBAAY,EACZ,YAAM;MACF,IAAI,OAAOL,MAAM,KAAK,UAAU,EAAE;QAC9B,IAAMM,YAAW,GAAGJ,MAAM,CAACK,cAAc,EAAE;QAC3CP,MAAM,CAACQ,IAAI,CAACC,SAAS,CAACH,YAAW,CAACI,MAAM,EAAE,CAAC,CAAC;MAChD;MACA,OAAO,KAAK;IAChB,CAAC,EACDC,6BAAoB,CACvB;EAAA,GACL,EAAE,CACL;EACD,OAAO,IAAI;AACf,CAAC;AAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
/// <reference types="react" />
|
|
9
|
+
/// <reference types="react" />
|
|
10
|
+
/// <reference types="web" />
|
|
11
|
+
import type { LinkNode } from "@lexical/link";
|
|
12
|
+
declare type LinkFilter = (event: MouseEvent, linkNode: LinkNode) => boolean;
|
|
13
|
+
export declare function ClickableLinkPlugin({ filter, newTab }: {
|
|
14
|
+
filter?: LinkFilter;
|
|
15
|
+
newTab?: boolean;
|
|
16
|
+
}): JSX.Element | null;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.ClickableLinkPlugin = ClickableLinkPlugin;
|
|
8
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
9
|
+
var _link = require("@lexical/link");
|
|
10
|
+
var _LexicalComposerContext = require("@lexical/react/LexicalComposerContext");
|
|
11
|
+
var _lexical = require("lexical");
|
|
12
|
+
var _react = require("react");
|
|
13
|
+
/**
|
|
14
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
15
|
+
*
|
|
16
|
+
* This source code is licensed under the MIT license found in the
|
|
17
|
+
* LICENSE file in the root directory of this source tree.
|
|
18
|
+
*
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
function ClickableLinkPlugin(_ref) {
|
|
22
|
+
var filter = _ref.filter,
|
|
23
|
+
_ref$newTab = _ref.newTab,
|
|
24
|
+
newTab = _ref$newTab === void 0 ? true : _ref$newTab;
|
|
25
|
+
var _useLexicalComposerCo = (0, _LexicalComposerContext.useLexicalComposerContext)(),
|
|
26
|
+
_useLexicalComposerCo2 = (0, _slicedToArray2.default)(_useLexicalComposerCo, 1),
|
|
27
|
+
editor = _useLexicalComposerCo2[0];
|
|
28
|
+
(0, _react.useEffect)(function () {
|
|
29
|
+
function onClick(e) {
|
|
30
|
+
var event = e;
|
|
31
|
+
var linkDomNode = getLinkDomNode(event, editor);
|
|
32
|
+
if (linkDomNode === null) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
var href = linkDomNode.getAttribute("href");
|
|
36
|
+
if (linkDomNode.getAttribute("contenteditable") === "false" || href === undefined) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Allow user to select link text without following url
|
|
41
|
+
var selection = editor.getEditorState().read(_lexical.$getSelection);
|
|
42
|
+
if ((0, _lexical.$isRangeSelection)(selection) && !selection.isCollapsed()) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
var linkNode = null;
|
|
46
|
+
editor.update(function () {
|
|
47
|
+
var maybeLinkNode = (0, _lexical.$getNearestNodeFromDOMNode)(linkDomNode);
|
|
48
|
+
if ((0, _link.$isLinkNode)(maybeLinkNode)) {
|
|
49
|
+
linkNode = maybeLinkNode;
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
if (linkNode === null || filter !== undefined && !filter(event, linkNode)) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
if (href !== null) {
|
|
57
|
+
window.open(href, newTab || event.metaKey || event.ctrlKey ? "_blank" : "_self");
|
|
58
|
+
}
|
|
59
|
+
} catch (_unused) {
|
|
60
|
+
// It didn't work, which is better than throwing an exception!
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return editor.registerRootListener(function (rootElement, prevRootElement) {
|
|
64
|
+
if (prevRootElement !== null) {
|
|
65
|
+
prevRootElement.removeEventListener("click", onClick);
|
|
66
|
+
}
|
|
67
|
+
if (rootElement !== null) {
|
|
68
|
+
rootElement.addEventListener("click", onClick);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}, [editor, filter, newTab]);
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
function isLinkDomNode(domNode) {
|
|
75
|
+
return domNode.nodeName.toLowerCase() === "a";
|
|
76
|
+
}
|
|
77
|
+
function getLinkDomNode(event, editor) {
|
|
78
|
+
return editor.getEditorState().read(function () {
|
|
79
|
+
var domNode = event.target;
|
|
80
|
+
if (isLinkDomNode(domNode)) {
|
|
81
|
+
return domNode;
|
|
82
|
+
}
|
|
83
|
+
if (domNode.parentNode && isLinkDomNode(domNode.parentNode)) {
|
|
84
|
+
return domNode.parentNode;
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
});
|
|
88
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ClickableLinkPlugin","filter","newTab","useLexicalComposerContext","editor","useEffect","onClick","e","event","linkDomNode","getLinkDomNode","href","getAttribute","undefined","selection","getEditorState","read","$getSelection","$isRangeSelection","isCollapsed","linkNode","update","maybeLinkNode","$getNearestNodeFromDOMNode","$isLinkNode","window","open","metaKey","ctrlKey","registerRootListener","rootElement","prevRootElement","removeEventListener","addEventListener","isLinkDomNode","domNode","nodeName","toLowerCase","target","parentNode"],"sources":["ClickableLinkPlugin.tsx"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type { LinkNode } from \"@lexical/link\";\nimport type { LexicalEditor } from \"lexical\";\n\nimport { $isLinkNode } from \"@lexical/link\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $getNearestNodeFromDOMNode, $getSelection, $isRangeSelection } from \"lexical\";\nimport { useEffect } from \"react\";\n\ntype LinkFilter = (event: MouseEvent, linkNode: LinkNode) => boolean;\n\nexport function ClickableLinkPlugin({\n filter,\n newTab = true\n}: {\n filter?: LinkFilter;\n newTab?: boolean;\n}): JSX.Element | null {\n const [editor] = useLexicalComposerContext();\n useEffect(() => {\n function onClick(e: Event) {\n const event = e as MouseEvent;\n const linkDomNode = getLinkDomNode(event, editor);\n\n if (linkDomNode === null) {\n return;\n }\n\n const href = linkDomNode.getAttribute(\"href\");\n\n if (linkDomNode.getAttribute(\"contenteditable\") === \"false\" || href === undefined) {\n return;\n }\n\n // Allow user to select link text without following url\n const selection = editor.getEditorState().read($getSelection);\n if ($isRangeSelection(selection) && !selection.isCollapsed()) {\n return;\n }\n\n let linkNode = null;\n editor.update(() => {\n const maybeLinkNode = $getNearestNodeFromDOMNode(linkDomNode);\n\n if ($isLinkNode(maybeLinkNode)) {\n linkNode = maybeLinkNode;\n }\n });\n\n if (linkNode === null || (filter !== undefined && !filter(event, linkNode))) {\n return;\n }\n\n try {\n if (href !== null) {\n window.open(\n href,\n newTab || event.metaKey || event.ctrlKey ? \"_blank\" : \"_self\"\n );\n }\n } catch {\n // It didn't work, which is better than throwing an exception!\n }\n }\n\n return editor.registerRootListener(\n (rootElement: null | HTMLElement, prevRootElement: null | HTMLElement) => {\n if (prevRootElement !== null) {\n prevRootElement.removeEventListener(\"click\", onClick);\n }\n\n if (rootElement !== null) {\n rootElement.addEventListener(\"click\", onClick);\n }\n }\n );\n }, [editor, filter, newTab]);\n return null;\n}\n\nfunction isLinkDomNode(domNode: Node): boolean {\n return domNode.nodeName.toLowerCase() === \"a\";\n}\n\nfunction getLinkDomNode(event: MouseEvent, editor: LexicalEditor): HTMLAnchorElement | null {\n return editor.getEditorState().read(() => {\n const domNode = event.target as Node;\n\n if (isLinkDomNode(domNode)) {\n return domNode as HTMLAnchorElement;\n }\n\n if (domNode.parentNode && isLinkDomNode(domNode.parentNode)) {\n return domNode.parentNode as HTMLAnchorElement;\n }\n\n return null;\n });\n}\n"],"mappings":";;;;;;;;AAWA;AACA;AACA;AACA;AAdA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYO,SAASA,mBAAmB,OAMZ;EAAA,IALnBC,MAAM,QAANA,MAAM;IAAA,mBACNC,MAAM;IAANA,MAAM,4BAAG,IAAI;EAKb,4BAAiB,IAAAC,iDAAyB,GAAE;IAAA;IAArCC,MAAM;EACb,IAAAC,gBAAS,EAAC,YAAM;IACZ,SAASC,OAAO,CAACC,CAAQ,EAAE;MACvB,IAAMC,KAAK,GAAGD,CAAe;MAC7B,IAAME,WAAW,GAAGC,cAAc,CAACF,KAAK,EAAEJ,MAAM,CAAC;MAEjD,IAAIK,WAAW,KAAK,IAAI,EAAE;QACtB;MACJ;MAEA,IAAME,IAAI,GAAGF,WAAW,CAACG,YAAY,CAAC,MAAM,CAAC;MAE7C,IAAIH,WAAW,CAACG,YAAY,CAAC,iBAAiB,CAAC,KAAK,OAAO,IAAID,IAAI,KAAKE,SAAS,EAAE;QAC/E;MACJ;;MAEA;MACA,IAAMC,SAAS,GAAGV,MAAM,CAACW,cAAc,EAAE,CAACC,IAAI,CAACC,sBAAa,CAAC;MAC7D,IAAI,IAAAC,0BAAiB,EAACJ,SAAS,CAAC,IAAI,CAACA,SAAS,CAACK,WAAW,EAAE,EAAE;QAC1D;MACJ;MAEA,IAAIC,QAAQ,GAAG,IAAI;MACnBhB,MAAM,CAACiB,MAAM,CAAC,YAAM;QAChB,IAAMC,aAAa,GAAG,IAAAC,mCAA0B,EAACd,WAAW,CAAC;QAE7D,IAAI,IAAAe,iBAAW,EAACF,aAAa,CAAC,EAAE;UAC5BF,QAAQ,GAAGE,aAAa;QAC5B;MACJ,CAAC,CAAC;MAEF,IAAIF,QAAQ,KAAK,IAAI,IAAKnB,MAAM,KAAKY,SAAS,IAAI,CAACZ,MAAM,CAACO,KAAK,EAAEY,QAAQ,CAAE,EAAE;QACzE;MACJ;MAEA,IAAI;QACA,IAAIT,IAAI,KAAK,IAAI,EAAE;UACfc,MAAM,CAACC,IAAI,CACPf,IAAI,EACJT,MAAM,IAAIM,KAAK,CAACmB,OAAO,IAAInB,KAAK,CAACoB,OAAO,GAAG,QAAQ,GAAG,OAAO,CAChE;QACL;MACJ,CAAC,CAAC,gBAAM;QACJ;MAAA;IAER;IAEA,OAAOxB,MAAM,CAACyB,oBAAoB,CAC9B,UAACC,WAA+B,EAAEC,eAAmC,EAAK;MACtE,IAAIA,eAAe,KAAK,IAAI,EAAE;QAC1BA,eAAe,CAACC,mBAAmB,CAAC,OAAO,EAAE1B,OAAO,CAAC;MACzD;MAEA,IAAIwB,WAAW,KAAK,IAAI,EAAE;QACtBA,WAAW,CAACG,gBAAgB,CAAC,OAAO,EAAE3B,OAAO,CAAC;MAClD;IACJ,CAAC,CACJ;EACL,CAAC,EAAE,CAACF,MAAM,EAAEH,MAAM,EAAEC,MAAM,CAAC,CAAC;EAC5B,OAAO,IAAI;AACf;AAEA,SAASgC,aAAa,CAACC,OAAa,EAAW;EAC3C,OAAOA,OAAO,CAACC,QAAQ,CAACC,WAAW,EAAE,KAAK,GAAG;AACjD;AAEA,SAAS3B,cAAc,CAACF,KAAiB,EAAEJ,MAAqB,EAA4B;EACxF,OAAOA,MAAM,CAACW,cAAc,EAAE,CAACC,IAAI,CAAC,YAAM;IACtC,IAAMmB,OAAO,GAAG3B,KAAK,CAAC8B,MAAc;IAEpC,IAAIJ,aAAa,CAACC,OAAO,CAAC,EAAE;MACxB,OAAOA,OAAO;IAClB;IAEA,IAAIA,OAAO,CAACI,UAAU,IAAIL,aAAa,CAACC,OAAO,CAACI,UAAU,CAAC,EAAE;MACzD,OAAOJ,OAAO,CAACI,UAAU;IAC7B;IAEA,OAAO,IAAI;EACf,CAAC,CAAC;AACN"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./ClickableLinkPlugin";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _ClickableLinkPlugin = require("./ClickableLinkPlugin");
|
|
7
|
+
Object.keys(_ClickableLinkPlugin).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _ClickableLinkPlugin[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function get() {
|
|
13
|
+
return _ClickableLinkPlugin[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./ClickableLinkPlugin\";\n"],"mappings":";;;;;AAAA;AAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function CodeHighlightPlugin(): null;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.CodeHighlightPlugin = CodeHighlightPlugin;
|
|
8
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
9
|
+
var _react = require("react");
|
|
10
|
+
var _code = require("@lexical/code");
|
|
11
|
+
var _LexicalComposerContext = require("@lexical/react/LexicalComposerContext");
|
|
12
|
+
function CodeHighlightPlugin() {
|
|
13
|
+
var _useLexicalComposerCo = (0, _LexicalComposerContext.useLexicalComposerContext)(),
|
|
14
|
+
_useLexicalComposerCo2 = (0, _slicedToArray2.default)(_useLexicalComposerCo, 1),
|
|
15
|
+
editor = _useLexicalComposerCo2[0];
|
|
16
|
+
(0, _react.useEffect)(function () {
|
|
17
|
+
return (0, _code.registerCodeHighlighting)(editor);
|
|
18
|
+
}, [editor]);
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["CodeHighlightPlugin","useLexicalComposerContext","editor","useEffect","registerCodeHighlighting"],"sources":["CodeHighlightPlugin.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport { registerCodeHighlighting } from \"@lexical/code\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\n\nexport function CodeHighlightPlugin() {\n const [editor] = useLexicalComposerContext();\n useEffect(() => {\n return registerCodeHighlighting(editor);\n }, [editor]);\n return null;\n}\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAEO,SAASA,mBAAmB,GAAG;EAClC,4BAAiB,IAAAC,iDAAyB,GAAE;IAAA;IAArCC,MAAM;EACb,IAAAC,gBAAS,EAAC,YAAM;IACZ,OAAO,IAAAC,8BAAwB,EAACF,MAAM,CAAC;EAC3C,CAAC,EAAE,CAACA,MAAM,CAAC,CAAC;EACZ,OAAO,IAAI;AACf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./CodeHighlightPlugin";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _CodeHighlightPlugin = require("./CodeHighlightPlugin");
|
|
7
|
+
Object.keys(_CodeHighlightPlugin).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _CodeHighlightPlugin[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function get() {
|
|
13
|
+
return _CodeHighlightPlugin[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./CodeHighlightPlugin\";\n"],"mappings":";;;;;AAAA;AAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
.link-editor {
|
|
2
|
+
position: absolute;
|
|
3
|
+
top: 0;
|
|
4
|
+
left: 0;
|
|
5
|
+
z-index: 10;
|
|
6
|
+
max-width: 400px;
|
|
7
|
+
width: 100%;
|
|
8
|
+
height: 48px;
|
|
9
|
+
opacity: 0;
|
|
10
|
+
background-color: #fff;
|
|
11
|
+
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3);
|
|
12
|
+
border-radius: 8px;
|
|
13
|
+
transition: opacity 0.5s;
|
|
14
|
+
will-change: transform;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.link-editor .button {
|
|
18
|
+
width: 20px;
|
|
19
|
+
height: 20px;
|
|
20
|
+
display: inline-block;
|
|
21
|
+
padding: 6px;
|
|
22
|
+
border-radius: 8px;
|
|
23
|
+
cursor: pointer;
|
|
24
|
+
margin: 0 2px;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.link-editor .button.hovered {
|
|
28
|
+
width: 20px;
|
|
29
|
+
height: 20px;
|
|
30
|
+
display: inline-block;
|
|
31
|
+
background-color: #eee;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.link-editor .button.active,
|
|
35
|
+
.toolbar .button.active {
|
|
36
|
+
background-color: rgb(223, 232, 250);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.link-editor .link-input {
|
|
40
|
+
display: block;
|
|
41
|
+
width: calc(100% - 24px);
|
|
42
|
+
height: 32px;
|
|
43
|
+
box-sizing: border-box;
|
|
44
|
+
margin: 8px 12px;
|
|
45
|
+
padding: 8px 12px;
|
|
46
|
+
border-radius: 15px;
|
|
47
|
+
background-color: #eee;
|
|
48
|
+
font-size: 15px;
|
|
49
|
+
color: rgb(5, 5, 5);
|
|
50
|
+
border: 0;
|
|
51
|
+
outline: 0;
|
|
52
|
+
position: relative;
|
|
53
|
+
font-family: inherit;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.link-editor .link-input .link-unlink {
|
|
57
|
+
background-image: url(../../images/icons/unlink_icon.svg);
|
|
58
|
+
background-size: 18px;
|
|
59
|
+
background-position: center;
|
|
60
|
+
background-repeat: no-repeat;
|
|
61
|
+
width: 35px;
|
|
62
|
+
vertical-align: -0.25em;
|
|
63
|
+
position: absolute;
|
|
64
|
+
right: 5px;
|
|
65
|
+
top: 0;
|
|
66
|
+
bottom: 0;
|
|
67
|
+
cursor: pointer;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.link-editor .link-input .link-edit {
|
|
71
|
+
background-image: url(../../images/icons/pencil-fill.svg);
|
|
72
|
+
background-size: 16px;
|
|
73
|
+
background-position: center;
|
|
74
|
+
background-repeat: no-repeat;
|
|
75
|
+
width: 35px;
|
|
76
|
+
vertical-align: -0.25em;
|
|
77
|
+
position: absolute;
|
|
78
|
+
right: 35px;
|
|
79
|
+
top: 0;
|
|
80
|
+
bottom: 0;
|
|
81
|
+
cursor: pointer;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.link-editor .link-input a {
|
|
85
|
+
color: rgb(33, 111, 219);
|
|
86
|
+
text-decoration: none;
|
|
87
|
+
display: block;
|
|
88
|
+
white-space: nowrap;
|
|
89
|
+
overflow: hidden;
|
|
90
|
+
margin-right: 30px;
|
|
91
|
+
text-overflow: ellipsis;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.link-editor .link-input a:hover {
|
|
95
|
+
text-decoration: underline;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.link-editor .font-size-wrapper,
|
|
99
|
+
.link-editor .font-family-wrapper {
|
|
100
|
+
display: flex;
|
|
101
|
+
margin: 0 4px;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.link-editor select {
|
|
105
|
+
padding: 6px;
|
|
106
|
+
border: none;
|
|
107
|
+
background-color: rgba(0, 0, 0, 0.075);
|
|
108
|
+
border-radius: 4px;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.link-editor .button i,
|
|
112
|
+
.actions i {
|
|
113
|
+
background-size: contain;
|
|
114
|
+
display: inline-block;
|
|
115
|
+
height: 20px;
|
|
116
|
+
width: 20px;
|
|
117
|
+
vertical-align: -0.25em;
|
|
118
|
+
}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.FloatingLinkEditorPlugin = FloatingLinkEditorPlugin;
|
|
9
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
+
require("./FloatingLinkEditorPlugin.css");
|
|
12
|
+
var _link = require("@lexical/link");
|
|
13
|
+
var _LexicalComposerContext = require("@lexical/react/LexicalComposerContext");
|
|
14
|
+
var _utils = require("@lexical/utils");
|
|
15
|
+
var _lexical = require("lexical");
|
|
16
|
+
var _reactDom = require("react-dom");
|
|
17
|
+
var _LinkPreview = require("../../ui/LinkPreview");
|
|
18
|
+
var _getSelectedNode = require("../../utils/getSelectedNode");
|
|
19
|
+
var _sanitizeUrl = require("../../utils/sanitizeUrl");
|
|
20
|
+
var _setFloatingElemPosition = require("../../utils/setFloatingElemPosition");
|
|
21
|
+
function FloatingLinkEditor(_ref) {
|
|
22
|
+
var editor = _ref.editor,
|
|
23
|
+
anchorElem = _ref.anchorElem;
|
|
24
|
+
var editorRef = (0, _react.useRef)(null);
|
|
25
|
+
var inputRef = (0, _react.useRef)(null);
|
|
26
|
+
var _useState = (0, _react.useState)(""),
|
|
27
|
+
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
28
|
+
linkUrl = _useState2[0],
|
|
29
|
+
setLinkUrl = _useState2[1];
|
|
30
|
+
var _useState3 = (0, _react.useState)(false),
|
|
31
|
+
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
|
|
32
|
+
isEditMode = _useState4[0],
|
|
33
|
+
setEditMode = _useState4[1];
|
|
34
|
+
var _useState5 = (0, _react.useState)(null),
|
|
35
|
+
_useState6 = (0, _slicedToArray2.default)(_useState5, 2),
|
|
36
|
+
lastSelection = _useState6[0],
|
|
37
|
+
setLastSelection = _useState6[1];
|
|
38
|
+
var updateLinkEditor = (0, _react.useCallback)(function () {
|
|
39
|
+
var selection = (0, _lexical.$getSelection)();
|
|
40
|
+
if ((0, _lexical.$isRangeSelection)(selection)) {
|
|
41
|
+
var node = (0, _getSelectedNode.getSelectedNode)(selection);
|
|
42
|
+
var parent = node.getParent();
|
|
43
|
+
if ((0, _link.$isLinkNode)(parent)) {
|
|
44
|
+
setLinkUrl(parent.getURL());
|
|
45
|
+
} else if ((0, _link.$isLinkNode)(node)) {
|
|
46
|
+
setLinkUrl(node.getURL());
|
|
47
|
+
} else {
|
|
48
|
+
setLinkUrl("");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
var editorElem = editorRef.current;
|
|
52
|
+
var nativeSelection = window.getSelection();
|
|
53
|
+
var activeElement = document.activeElement;
|
|
54
|
+
if (editorElem === null) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
var rootElement = editor.getRootElement();
|
|
58
|
+
if (selection !== null && nativeSelection !== null && rootElement !== null && rootElement.contains(nativeSelection.anchorNode)) {
|
|
59
|
+
var domRange = nativeSelection.getRangeAt(0);
|
|
60
|
+
var rect;
|
|
61
|
+
if (nativeSelection.anchorNode === rootElement) {
|
|
62
|
+
var inner = rootElement;
|
|
63
|
+
while (inner.firstElementChild != null) {
|
|
64
|
+
inner = inner.firstElementChild;
|
|
65
|
+
}
|
|
66
|
+
rect = inner.getBoundingClientRect();
|
|
67
|
+
} else {
|
|
68
|
+
rect = domRange.getBoundingClientRect();
|
|
69
|
+
}
|
|
70
|
+
(0, _setFloatingElemPosition.setFloatingElemPosition)(rect, editorElem, anchorElem);
|
|
71
|
+
setLastSelection(selection);
|
|
72
|
+
} else if (!activeElement || activeElement.className !== "link-input") {
|
|
73
|
+
if (rootElement !== null) {
|
|
74
|
+
(0, _setFloatingElemPosition.setFloatingElemPosition)(null, editorElem, anchorElem);
|
|
75
|
+
}
|
|
76
|
+
setLastSelection(null);
|
|
77
|
+
setEditMode(false);
|
|
78
|
+
setLinkUrl("");
|
|
79
|
+
}
|
|
80
|
+
return true;
|
|
81
|
+
}, [anchorElem, editor]);
|
|
82
|
+
var removeLink = function removeLink() {
|
|
83
|
+
editor.dispatchCommand(_link.TOGGLE_LINK_COMMAND, null);
|
|
84
|
+
setEditMode(false);
|
|
85
|
+
};
|
|
86
|
+
(0, _react.useEffect)(function () {
|
|
87
|
+
var scrollerElem = anchorElem.parentElement;
|
|
88
|
+
var update = function update() {
|
|
89
|
+
editor.getEditorState().read(function () {
|
|
90
|
+
updateLinkEditor();
|
|
91
|
+
});
|
|
92
|
+
};
|
|
93
|
+
window.addEventListener("resize", update);
|
|
94
|
+
if (scrollerElem) {
|
|
95
|
+
scrollerElem.addEventListener("scroll", update);
|
|
96
|
+
}
|
|
97
|
+
return function () {
|
|
98
|
+
window.removeEventListener("resize", update);
|
|
99
|
+
if (scrollerElem) {
|
|
100
|
+
scrollerElem.removeEventListener("scroll", update);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
}, [anchorElem.parentElement, editor, updateLinkEditor]);
|
|
104
|
+
(0, _react.useEffect)(function () {
|
|
105
|
+
return (0, _utils.mergeRegister)(editor.registerUpdateListener(function (_ref2) {
|
|
106
|
+
var editorState = _ref2.editorState;
|
|
107
|
+
editorState.read(function () {
|
|
108
|
+
updateLinkEditor();
|
|
109
|
+
});
|
|
110
|
+
}), editor.registerCommand(_lexical.SELECTION_CHANGE_COMMAND, function () {
|
|
111
|
+
updateLinkEditor();
|
|
112
|
+
return true;
|
|
113
|
+
}, _lexical.COMMAND_PRIORITY_LOW));
|
|
114
|
+
}, [editor, updateLinkEditor]);
|
|
115
|
+
(0, _react.useEffect)(function () {
|
|
116
|
+
editor.getEditorState().read(function () {
|
|
117
|
+
updateLinkEditor();
|
|
118
|
+
});
|
|
119
|
+
}, [editor, updateLinkEditor]);
|
|
120
|
+
(0, _react.useEffect)(function () {
|
|
121
|
+
if (isEditMode && inputRef.current) {
|
|
122
|
+
inputRef.current.focus();
|
|
123
|
+
}
|
|
124
|
+
}, [isEditMode]);
|
|
125
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
126
|
+
ref: editorRef,
|
|
127
|
+
className: "link-editor"
|
|
128
|
+
}, isEditMode ? /*#__PURE__*/_react.default.createElement("input", {
|
|
129
|
+
ref: inputRef,
|
|
130
|
+
className: "link-input",
|
|
131
|
+
value: linkUrl,
|
|
132
|
+
onChange: function onChange(event) {
|
|
133
|
+
setLinkUrl(event.target.value);
|
|
134
|
+
},
|
|
135
|
+
onKeyDown: function onKeyDown(event) {
|
|
136
|
+
if (event.key === "Enter") {
|
|
137
|
+
event.preventDefault();
|
|
138
|
+
if (lastSelection !== null) {
|
|
139
|
+
if (linkUrl !== "") {
|
|
140
|
+
editor.dispatchCommand(_link.TOGGLE_LINK_COMMAND, (0, _sanitizeUrl.sanitizeUrl)(linkUrl));
|
|
141
|
+
}
|
|
142
|
+
setEditMode(false);
|
|
143
|
+
}
|
|
144
|
+
} else if (event.key === "Escape") {
|
|
145
|
+
event.preventDefault();
|
|
146
|
+
setEditMode(false);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
|
|
150
|
+
className: "link-input"
|
|
151
|
+
}, /*#__PURE__*/_react.default.createElement("a", {
|
|
152
|
+
href: linkUrl,
|
|
153
|
+
target: "_blank",
|
|
154
|
+
rel: "noopener noreferrer"
|
|
155
|
+
}, linkUrl), /*#__PURE__*/_react.default.createElement("div", {
|
|
156
|
+
className: "link-edit",
|
|
157
|
+
role: "button",
|
|
158
|
+
tabIndex: 0,
|
|
159
|
+
onMouseDown: function onMouseDown(event) {
|
|
160
|
+
return event.preventDefault();
|
|
161
|
+
},
|
|
162
|
+
onClick: function onClick() {
|
|
163
|
+
setEditMode(true);
|
|
164
|
+
}
|
|
165
|
+
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
166
|
+
className: "link-unlink",
|
|
167
|
+
role: "button",
|
|
168
|
+
tabIndex: 0,
|
|
169
|
+
onMouseDown: function onMouseDown(event) {
|
|
170
|
+
return event.preventDefault();
|
|
171
|
+
},
|
|
172
|
+
onClick: function onClick() {
|
|
173
|
+
removeLink();
|
|
174
|
+
}
|
|
175
|
+
})), /*#__PURE__*/_react.default.createElement(_LinkPreview.LinkPreview, {
|
|
176
|
+
url: linkUrl
|
|
177
|
+
})));
|
|
178
|
+
}
|
|
179
|
+
function useFloatingLinkEditorToolbar(editor, anchorElem) {
|
|
180
|
+
var _useState7 = (0, _react.useState)(editor),
|
|
181
|
+
_useState8 = (0, _slicedToArray2.default)(_useState7, 2),
|
|
182
|
+
activeEditor = _useState8[0],
|
|
183
|
+
setActiveEditor = _useState8[1];
|
|
184
|
+
var _useState9 = (0, _react.useState)(false),
|
|
185
|
+
_useState10 = (0, _slicedToArray2.default)(_useState9, 2),
|
|
186
|
+
isLink = _useState10[0],
|
|
187
|
+
setIsLink = _useState10[1];
|
|
188
|
+
var updateToolbar = (0, _react.useCallback)(function () {
|
|
189
|
+
var selection = (0, _lexical.$getSelection)();
|
|
190
|
+
if ((0, _lexical.$isRangeSelection)(selection)) {
|
|
191
|
+
var node = (0, _getSelectedNode.getSelectedNode)(selection);
|
|
192
|
+
var linkParent = (0, _utils.$findMatchingParent)(node, _link.$isLinkNode);
|
|
193
|
+
var autoLinkParent = (0, _utils.$findMatchingParent)(node, _link.$isAutoLinkNode);
|
|
194
|
+
|
|
195
|
+
// We don't want this menu to open for auto links.
|
|
196
|
+
if (linkParent != null && autoLinkParent == null) {
|
|
197
|
+
setIsLink(true);
|
|
198
|
+
} else {
|
|
199
|
+
setIsLink(false);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}, []);
|
|
203
|
+
(0, _react.useEffect)(function () {
|
|
204
|
+
return editor.registerCommand(_lexical.SELECTION_CHANGE_COMMAND, function (_payload, newEditor) {
|
|
205
|
+
updateToolbar();
|
|
206
|
+
setActiveEditor(newEditor);
|
|
207
|
+
return false;
|
|
208
|
+
}, _lexical.COMMAND_PRIORITY_CRITICAL);
|
|
209
|
+
}, [editor, updateToolbar]);
|
|
210
|
+
return isLink ? /*#__PURE__*/(0, _reactDom.createPortal)( /*#__PURE__*/_react.default.createElement(FloatingLinkEditor, {
|
|
211
|
+
editor: activeEditor,
|
|
212
|
+
anchorElem: anchorElem
|
|
213
|
+
}), anchorElem) : null;
|
|
214
|
+
}
|
|
215
|
+
function FloatingLinkEditorPlugin(_ref3) {
|
|
216
|
+
var _ref3$anchorElem = _ref3.anchorElem,
|
|
217
|
+
anchorElem = _ref3$anchorElem === void 0 ? document.body : _ref3$anchorElem;
|
|
218
|
+
var _useLexicalComposerCo = (0, _LexicalComposerContext.useLexicalComposerContext)(),
|
|
219
|
+
_useLexicalComposerCo2 = (0, _slicedToArray2.default)(_useLexicalComposerCo, 1),
|
|
220
|
+
editor = _useLexicalComposerCo2[0];
|
|
221
|
+
return useFloatingLinkEditorToolbar(editor, anchorElem);
|
|
222
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["FloatingLinkEditor","editor","anchorElem","editorRef","useRef","inputRef","useState","linkUrl","setLinkUrl","isEditMode","setEditMode","lastSelection","setLastSelection","updateLinkEditor","useCallback","selection","$getSelection","$isRangeSelection","node","getSelectedNode","parent","getParent","$isLinkNode","getURL","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","editorState","registerCommand","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","focus","event","target","value","key","preventDefault","sanitizeUrl","useFloatingLinkEditorToolbar","activeEditor","setActiveEditor","isLink","setIsLink","updateToolbar","linkParent","$findMatchingParent","autoLinkParent","$isAutoLinkNode","_payload","newEditor","COMMAND_PRIORITY_CRITICAL","createPortal","FloatingLinkEditorPlugin","body","useLexicalComposerContext"],"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(\"\");\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(parent.getURL());\n } else if ($isLinkNode(node)) {\n setLinkUrl(node.getURL());\n } else {\n setLinkUrl(\"\");\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(\"\");\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 <input\n ref={inputRef}\n className=\"link-input\"\n value={linkUrl}\n onChange={event => {\n setLinkUrl(event.target.value);\n }}\n onKeyDown={event => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n if (lastSelection !== null) {\n if (linkUrl !== \"\") {\n editor.dispatchCommand(\n TOGGLE_LINK_COMMAND,\n sanitizeUrl(linkUrl)\n );\n }\n setEditMode(false);\n }\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n setEditMode(false);\n }\n }}\n />\n ) : (\n <>\n <div className=\"link-input\">\n <a href={linkUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n {linkUrl}\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} />\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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./FloatingLinkEditorPlugin";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _FloatingLinkEditorPlugin = require("./FloatingLinkEditorPlugin");
|
|
7
|
+
Object.keys(_FloatingLinkEditorPlugin).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _FloatingLinkEditorPlugin[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function get() {
|
|
13
|
+
return _FloatingLinkEditorPlugin[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./FloatingLinkEditorPlugin\";\n"],"mappings":";;;;;AAAA;AAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.FontColorPlugin = void 0;
|
|
8
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
9
|
+
var _react = require("react");
|
|
10
|
+
var _LexicalComposerContext = require("@lexical/react/LexicalComposerContext");
|
|
11
|
+
var _FontColorNode = require("../../nodes/FontColorNode");
|
|
12
|
+
var _lexical = require("lexical");
|
|
13
|
+
var _utils = require("@lexical/utils");
|
|
14
|
+
var FontColorPlugin = function FontColorPlugin() {
|
|
15
|
+
var _useLexicalComposerCo = (0, _LexicalComposerContext.useLexicalComposerContext)(),
|
|
16
|
+
_useLexicalComposerCo2 = (0, _slicedToArray2.default)(_useLexicalComposerCo, 1),
|
|
17
|
+
editor = _useLexicalComposerCo2[0];
|
|
18
|
+
(0, _react.useEffect)(function () {
|
|
19
|
+
return editor.registerCommand(_FontColorNode.ADD_FONT_COLOR_COMMAND, function (payload) {
|
|
20
|
+
editor.update(function () {
|
|
21
|
+
var color = payload.color,
|
|
22
|
+
themeColorName = payload.themeColorName;
|
|
23
|
+
var selection = (0, _lexical.$getSelection)();
|
|
24
|
+
if ((0, _lexical.$isRangeSelection)(selection)) {
|
|
25
|
+
var fontColorNode = (0, _FontColorNode.$createFontColorNode)(selection.getTextContent(), color, themeColorName);
|
|
26
|
+
(0, _FontColorNode.$applyStylesToNode)(fontColorNode, selection);
|
|
27
|
+
(0, _lexical.$insertNodes)([fontColorNode]);
|
|
28
|
+
if ((0, _lexical.$isRootOrShadowRoot)(fontColorNode.getParentOrThrow())) {
|
|
29
|
+
(0, _utils.$wrapNodeInElement)(fontColorNode, _lexical.$createParagraphNode).selectEnd();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
return true;
|
|
34
|
+
}, _lexical.COMMAND_PRIORITY_EDITOR);
|
|
35
|
+
}, [editor]);
|
|
36
|
+
return null;
|
|
37
|
+
};
|
|
38
|
+
exports.FontColorPlugin = FontColorPlugin;
|