@webiny/lexical-editor 6.3.0 → 6.4.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/commands/image.js +2 -1
  2. package/commands/image.js.map +1 -1
  3. package/commands/index.js +0 -2
  4. package/commands/list.js +4 -3
  5. package/commands/list.js.map +1 -1
  6. package/commands/quote.js +2 -1
  7. package/commands/quote.js.map +1 -1
  8. package/commands/toolbar.js +2 -1
  9. package/commands/toolbar.js.map +1 -1
  10. package/commands/typography.js +2 -1
  11. package/commands/typography.js.map +1 -1
  12. package/components/Editor/EnsureHeadingTagPlugin.js +8 -15
  13. package/components/Editor/EnsureHeadingTagPlugin.js.map +1 -1
  14. package/components/Editor/RichTextEditor.js +82 -121
  15. package/components/Editor/RichTextEditor.js.map +1 -1
  16. package/components/Editor/normalizeInputValue.js +11 -13
  17. package/components/Editor/normalizeInputValue.js.map +1 -1
  18. package/components/LexicalEditorConfig/LexicalEditorConfig.js +24 -15
  19. package/components/LexicalEditorConfig/LexicalEditorConfig.js.map +1 -1
  20. package/components/LexicalEditorConfig/components/Node.js +21 -26
  21. package/components/LexicalEditorConfig/components/Node.js.map +1 -1
  22. package/components/LexicalEditorConfig/components/Plugin.js +21 -26
  23. package/components/LexicalEditorConfig/components/Plugin.js.map +1 -1
  24. package/components/LexicalEditorConfig/components/ToolbarElement.js +21 -26
  25. package/components/LexicalEditorConfig/components/ToolbarElement.js.map +1 -1
  26. package/components/LexicalHtmlRenderer.js +35 -40
  27. package/components/LexicalHtmlRenderer.js.map +1 -1
  28. package/components/Toolbar/StaticToolbar.js +11 -16
  29. package/components/Toolbar/StaticToolbar.js.map +1 -1
  30. package/components/ToolbarActions/BoldAction.js +16 -19
  31. package/components/ToolbarActions/BoldAction.js.map +1 -1
  32. package/components/ToolbarActions/BulletListAction.js +24 -32
  33. package/components/ToolbarActions/BulletListAction.js.map +1 -1
  34. package/components/ToolbarActions/CodeHighlightAction.js +16 -19
  35. package/components/ToolbarActions/CodeHighlightAction.js.map +1 -1
  36. package/components/ToolbarActions/FontColorAction.js +32 -38
  37. package/components/ToolbarActions/FontColorAction.js.map +1 -1
  38. package/components/ToolbarActions/ImageAction.js +28 -30
  39. package/components/ToolbarActions/ImageAction.js.map +1 -1
  40. package/components/ToolbarActions/ItalicAction.js +16 -19
  41. package/components/ToolbarActions/ItalicAction.js.map +1 -1
  42. package/components/ToolbarActions/LinkAction.js +25 -30
  43. package/components/ToolbarActions/LinkAction.js.map +1 -1
  44. package/components/ToolbarActions/NumberedListAction.js +28 -37
  45. package/components/ToolbarActions/NumberedListAction.js.map +1 -1
  46. package/components/ToolbarActions/QuoteAction.js +22 -27
  47. package/components/ToolbarActions/QuoteAction.js.map +1 -1
  48. package/components/ToolbarActions/TextAlignmentAction.js +38 -50
  49. package/components/ToolbarActions/TextAlignmentAction.js.map +1 -1
  50. package/components/ToolbarActions/TypographyAction.js +69 -99
  51. package/components/ToolbarActions/TypographyAction.js.map +1 -1
  52. package/components/ToolbarActions/UnderlineAction.js +16 -19
  53. package/components/ToolbarActions/UnderlineAction.js.map +1 -1
  54. package/context/FontColorActionContext.js +3 -2
  55. package/context/FontColorActionContext.js.map +1 -1
  56. package/context/RichTextEditorContext.js +26 -29
  57. package/context/RichTextEditorContext.js.map +1 -1
  58. package/context/SharedHistoryContext.js +11 -15
  59. package/context/SharedHistoryContext.js.map +1 -1
  60. package/context/TextAlignmentActionContextProps.js +3 -2
  61. package/context/TextAlignmentActionContextProps.js.map +1 -1
  62. package/context/TypographyActionContext.js +3 -2
  63. package/context/TypographyActionContext.js.map +1 -1
  64. package/exports/admin/lexical.js +2 -20
  65. package/hooks/index.js +0 -2
  66. package/hooks/useCurrentElement.js +18 -21
  67. package/hooks/useCurrentElement.js.map +1 -1
  68. package/hooks/useCurrentSelection.js +39 -48
  69. package/hooks/useCurrentSelection.js.map +1 -1
  70. package/hooks/useFontColorPicker.js +5 -6
  71. package/hooks/useFontColorPicker.js.map +1 -1
  72. package/hooks/useIsMounted.js +7 -8
  73. package/hooks/useIsMounted.js.map +1 -1
  74. package/hooks/useRichTextEditor.js +5 -6
  75. package/hooks/useRichTextEditor.js.map +1 -1
  76. package/hooks/useTextAlignmentAction.js +5 -6
  77. package/hooks/useTextAlignmentAction.js.map +1 -1
  78. package/hooks/useTypographyAction.js +5 -6
  79. package/hooks/useTypographyAction.js.map +1 -1
  80. package/images/icons/chat-square-quote.js +19 -0
  81. package/images/icons/chat-square-quote.js.map +1 -0
  82. package/images/icons/chevron-down.js +18 -0
  83. package/images/icons/chevron-down.js.map +1 -0
  84. package/images/icons/code.js +17 -0
  85. package/images/icons/code.js.map +1 -0
  86. package/images/icons/font-color.js +17 -0
  87. package/images/icons/font-color.js.map +1 -0
  88. package/images/icons/indent.js +18 -0
  89. package/images/icons/indent.js.map +1 -0
  90. package/images/icons/insert-image.js +20 -0
  91. package/images/icons/insert-image.js.map +1 -0
  92. package/images/icons/justify.js +19 -0
  93. package/images/icons/justify.js.map +1 -0
  94. package/images/icons/link.js +19 -0
  95. package/images/icons/link.js.map +1 -0
  96. package/images/icons/list-ol.js +20 -0
  97. package/images/icons/list-ol.js.map +1 -0
  98. package/images/icons/list-ul.js +18 -0
  99. package/images/icons/list-ul.js.map +1 -0
  100. package/images/icons/outdent.js +18 -0
  101. package/images/icons/outdent.js.map +1 -0
  102. package/images/icons/pencil-fill.js +17 -0
  103. package/images/icons/pencil-fill.js.map +1 -0
  104. package/images/icons/text-center.js +18 -0
  105. package/images/icons/text-center.js.map +1 -0
  106. package/images/icons/text-left.js +18 -0
  107. package/images/icons/text-left.js.map +1 -0
  108. package/images/icons/text-paragraph.js +18 -0
  109. package/images/icons/text-paragraph.js.map +1 -0
  110. package/images/icons/text-right.js +18 -0
  111. package/images/icons/text-right.js.map +1 -0
  112. package/images/icons/type-bold.js +17 -0
  113. package/images/icons/type-bold.js.map +1 -0
  114. package/images/icons/type-h1.js +17 -0
  115. package/images/icons/type-h1.js.map +1 -0
  116. package/images/icons/type-h2.js +17 -0
  117. package/images/icons/type-h2.js.map +1 -0
  118. package/images/icons/type-h3.js +17 -0
  119. package/images/icons/type-h3.js.map +1 -0
  120. package/images/icons/type-h4.js +17 -0
  121. package/images/icons/type-h4.js.map +1 -0
  122. package/images/icons/type-h5.js +17 -0
  123. package/images/icons/type-h5.js.map +1 -0
  124. package/images/icons/type-h6.js +17 -0
  125. package/images/icons/type-h6.js.map +1 -0
  126. package/images/icons/type-italic.js +17 -0
  127. package/images/icons/type-italic.js.map +1 -0
  128. package/images/icons/type-strikethrough.js +17 -0
  129. package/images/icons/type-strikethrough.js.map +1 -0
  130. package/images/icons/type-underline.js +17 -0
  131. package/images/icons/type-underline.js.map +1 -0
  132. package/images/icons/unlink_icon.js +27 -0
  133. package/images/icons/unlink_icon.js.map +1 -0
  134. package/index.js +5 -18
  135. package/package.json +7 -7
  136. package/plugins/BlurEventPlugin/BlurEventPlugin.js +11 -14
  137. package/plugins/BlurEventPlugin/BlurEventPlugin.js.map +1 -1
  138. package/plugins/CodeHighlightPlugin/CodeHighlightPlugin.js +7 -8
  139. package/plugins/CodeHighlightPlugin/CodeHighlightPlugin.js.map +1 -1
  140. package/plugins/CodeHighlightPlugin/index.js +0 -2
  141. package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditor.js +16 -24
  142. package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditor.js.map +1 -1
  143. package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorController.js +37 -51
  144. package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorController.js.map +1 -1
  145. package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.js +6 -5
  146. package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.js.map +1 -1
  147. package/plugins/FloatingLinkEditorPlugin/index.js +0 -2
  148. package/plugins/FloatingLinkEditorPlugin/isChildOfLinkEditor.js +6 -9
  149. package/plugins/FloatingLinkEditorPlugin/isChildOfLinkEditor.js.map +1 -1
  150. package/plugins/FloatingLinkEditorPlugin/types.js +0 -3
  151. package/plugins/FloatingLinkEditorPlugin/useFloatingLinkEditor.js +101 -108
  152. package/plugins/FloatingLinkEditorPlugin/useFloatingLinkEditor.js.map +1 -1
  153. package/plugins/FontColorPlugin/FontColorPlugin.js +14 -19
  154. package/plugins/FontColorPlugin/FontColorPlugin.js.map +1 -1
  155. package/plugins/FontColorPlugin/applyColorToNode.js +5 -4
  156. package/plugins/FontColorPlugin/applyColorToNode.js.map +1 -1
  157. package/plugins/FontColorPlugin/applyColorToSelection.js +42 -60
  158. package/plugins/FontColorPlugin/applyColorToSelection.js.map +1 -1
  159. package/plugins/ImagesPlugin/ImagesPlugin.js +79 -121
  160. package/plugins/ImagesPlugin/ImagesPlugin.js.map +1 -1
  161. package/plugins/LinkPlugin/LinkPlugin.js +46 -52
  162. package/plugins/LinkPlugin/LinkPlugin.js.map +1 -1
  163. package/plugins/ListPLugin/ListPlugin.js +44 -52
  164. package/plugins/ListPLugin/ListPlugin.js.map +1 -1
  165. package/plugins/QuoteNodePlugin/QuoteNodePlugin.js +18 -19
  166. package/plugins/QuoteNodePlugin/QuoteNodePlugin.js.map +1 -1
  167. package/plugins/StateHandlingPlugin.js +55 -64
  168. package/plugins/StateHandlingPlugin.js.map +1 -1
  169. package/plugins/TypographyPlugin/TypographyPlugin.js +13 -20
  170. package/plugins/TypographyPlugin/TypographyPlugin.js.map +1 -1
  171. package/static/svg/chat-square-quote.123cfa24.svg +1 -0
  172. package/static/svg/chevron-down.d9636921.svg +1 -0
  173. package/static/svg/code.912b1f4d.svg +1 -0
  174. package/static/svg/font-color.4f0c0de5.svg +1 -0
  175. package/static/svg/indent.4d78e483.svg +3 -0
  176. package/static/svg/insert-image.354465f1.svg +4 -0
  177. package/static/svg/justify.dab42aec.svg +3 -0
  178. package/static/svg/link.b774de25.svg +1 -0
  179. package/static/svg/list-ol.d64946f3.svg +1 -0
  180. package/static/svg/list-ul.1d54da3f.svg +1 -0
  181. package/static/svg/outdent.5c13ff16.svg +3 -0
  182. package/static/svg/pencil-fill.94cb216b.svg +1 -0
  183. package/static/svg/text-center.a411e780.svg +1 -0
  184. package/static/svg/text-left.54f41f4e.svg +1 -0
  185. package/static/svg/text-paragraph.61674422.svg +1 -0
  186. package/static/svg/text-right.9288b7a2.svg +1 -0
  187. package/static/svg/type-bold.7e3e270b.svg +1 -0
  188. package/static/svg/type-h1.f292ffe1.svg +1 -0
  189. package/static/svg/type-h2.a9d1aa48.svg +1 -0
  190. package/static/svg/type-h3.4a29ff88.svg +1 -0
  191. package/static/svg/type-h4.7f48750c.svg +1 -0
  192. package/static/svg/type-h5.14b4ac56.svg +1 -0
  193. package/static/svg/type-h6.4e9dfe2d.svg +1 -0
  194. package/static/svg/type-italic.d8e45748.svg +1 -0
  195. package/static/svg/type-strikethrough.2694a816.svg +1 -0
  196. package/static/svg/type-underline.104a0ed5.svg +1 -0
  197. package/static/svg/unlink_icon.074ceed3.svg +1 -0
  198. package/types.js +0 -8
  199. package/ui/ContentEditable.js +6 -14
  200. package/ui/ContentEditable.js.map +1 -1
  201. package/ui/Divider.js +6 -5
  202. package/ui/Divider.js.map +1 -1
  203. package/ui/DropDown.js +146 -176
  204. package/ui/DropDown.js.map +1 -1
  205. package/ui/ImageResizer.js +173 -204
  206. package/ui/ImageResizer.js.map +1 -1
  207. package/ui/LinkPreview.js +61 -84
  208. package/ui/LinkPreview.js.map +1 -1
  209. package/ui/Placeholder.js +9 -20
  210. package/ui/Placeholder.js.map +1 -1
  211. package/ui/TextInput.js +17 -30
  212. package/ui/TextInput.js.map +1 -1
  213. package/ui/ToolbarActionDialog.js +64 -73
  214. package/ui/ToolbarActionDialog.js.map +1 -1
  215. package/utils/canUseDOM.js +2 -1
  216. package/utils/canUseDOM.js.map +1 -1
  217. package/utils/files.js +9 -8
  218. package/utils/files.js.map +1 -1
  219. package/utils/getDOMRangeRect.js +10 -20
  220. package/utils/getDOMRangeRect.js.map +1 -1
  221. package/utils/getSelectedNode.js +9 -20
  222. package/utils/getSelectedNode.js.map +1 -1
  223. package/utils/getTransparentImage.js +2 -3
  224. package/utils/getTransparentImage.js.map +1 -1
  225. package/utils/insertImage.js +9 -11
  226. package/utils/insertImage.js.map +1 -1
  227. package/utils/isAnchorLink.js +2 -3
  228. package/utils/isAnchorLink.js.map +1 -1
  229. package/utils/isChildOfFloatingToolbar.js +6 -9
  230. package/utils/isChildOfFloatingToolbar.js.map +1 -1
  231. package/utils/isHTMLElement.js +3 -9
  232. package/utils/isHTMLElement.js.map +1 -1
  233. package/utils/isValidJSON.js +9 -10
  234. package/utils/isValidJSON.js.map +1 -1
  235. package/utils/isValidLexicalData.js +17 -20
  236. package/utils/isValidLexicalData.js.map +1 -1
  237. package/utils/point.js +32 -45
  238. package/utils/point.js.map +1 -1
  239. package/utils/rect.js +92 -125
  240. package/utils/rect.js.map +1 -1
  241. package/utils/sanitizeUrl.js +8 -21
  242. package/utils/sanitizeUrl.js.map +1 -1
  243. package/utils/setFloatingElemPosition.js +23 -27
  244. package/utils/setFloatingElemPosition.js.map +1 -1
  245. package/commands/index.js.map +0 -1
  246. package/exports/admin/lexical.js.map +0 -1
  247. package/hooks/index.js.map +0 -1
  248. package/index.js.map +0 -1
  249. package/plugins/CodeHighlightPlugin/index.js.map +0 -1
  250. package/plugins/FloatingLinkEditorPlugin/index.js.map +0 -1
  251. package/plugins/FloatingLinkEditorPlugin/types.js.map +0 -1
  252. package/types.js.map +0 -1
@@ -1,61 +1,47 @@
1
- import React, { useCallback, useState, useEffect } from "react";
1
+ import react, { useCallback, useEffect, useState } from "react";
2
2
  import { createPortal } from "react-dom";
3
3
  import { useRichTextEditor } from "../../hooks/index.js";
4
4
  import { getSelectedNode } from "../../utils/getSelectedNode.js";
5
5
  import { $isAutoLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from "@webiny/lexical-nodes";
6
6
  import { isChildOfLinkEditor } from "./isChildOfLinkEditor.js";
7
7
  import debounce from "lodash/debounce.js";
8
- import { $getSelection, $isRangeSelection, BLUR_COMMAND, COMMAND_PRIORITY_CRITICAL, COMMAND_PRIORITY_LOW, SELECTION_CHANGE_COMMAND, mergeRegister, $findMatchingParent } from "lexical";
8
+ import { $findMatchingParent, $getSelection, $isRangeSelection, BLUR_COMMAND, COMMAND_PRIORITY_CRITICAL, COMMAND_PRIORITY_LOW, SELECTION_CHANGE_COMMAND, mergeRegister } from "lexical";
9
9
  import { FloatingLinkEditor } from "./FloatingLinkEditor.js";
10
- export const FloatingLinkEditorController = props => {
11
- const {
12
- editor,
13
- getOverlaysElement
14
- } = useRichTextEditor();
15
- const [isLink, setIsLink] = useState(false);
16
- const debounceSetIsLink = useCallback(debounce(setIsLink, 50), []);
17
- const updateToolbar = useCallback(() => {
18
- const selection = $getSelection();
19
- if (!$isRangeSelection(selection)) {
20
- return;
21
- }
22
- const node = getSelectedNode(selection);
23
- const linkParent = $findMatchingParent(node, $isLinkNode);
24
- const autoLinkParent = $findMatchingParent(node, $isAutoLinkNode);
25
- const isLinkOrChildOfLink = Boolean($isLinkNode(node) || linkParent);
26
- if (!isLinkOrChildOfLink) {
27
- // When hiding the toolbar, we want to hide immediately.
28
- setIsLink(false);
29
- }
30
- if (selection.dirty) {
31
- // We don't want this menu to open for auto links.
32
- if (linkParent != null && autoLinkParent == null) {
33
- // When showing the toolbar, we want to debounce it, because sometimes selection gets updated
34
- // multiple times, and the `selection.dirty` flag goes from true to false multiple times,
35
- // eventually settling on `false`, which we want to set once it has settled.
36
- debounceSetIsLink(true);
37
- }
38
- }
39
- }, []);
40
- useEffect(() => {
41
- return mergeRegister(editor.registerCommand(SELECTION_CHANGE_COMMAND, () => {
42
- updateToolbar();
43
- return false;
44
- }, COMMAND_PRIORITY_CRITICAL), editor.registerCommand(BLUR_COMMAND, payload => {
45
- if (!isChildOfLinkEditor(payload.relatedTarget)) {
46
- setIsLink(false);
47
- }
48
- return false;
49
- }, COMMAND_PRIORITY_LOW), editor.registerCommand(TOGGLE_LINK_COMMAND, payload => {
50
- setIsLink(!!payload);
51
- return false;
52
- }, COMMAND_PRIORITY_CRITICAL));
53
- }, [editor, updateToolbar]);
54
- return /*#__PURE__*/createPortal(/*#__PURE__*/React.createElement(FloatingLinkEditor, {
55
- isVisible: isLink,
56
- editor: editor,
57
- LinkForm: props.LinkForm
58
- }), getOverlaysElement());
10
+ const FloatingLinkEditorController = (props)=>{
11
+ const { editor, getOverlaysElement } = useRichTextEditor();
12
+ const [isLink, setIsLink] = useState(false);
13
+ const debounceSetIsLink = useCallback(debounce(setIsLink, 50), []);
14
+ const updateToolbar = useCallback(()=>{
15
+ const selection = $getSelection();
16
+ if (!$isRangeSelection(selection)) return;
17
+ const node = getSelectedNode(selection);
18
+ const linkParent = $findMatchingParent(node, $isLinkNode);
19
+ const autoLinkParent = $findMatchingParent(node, $isAutoLinkNode);
20
+ const isLinkOrChildOfLink = Boolean($isLinkNode(node) || linkParent);
21
+ if (!isLinkOrChildOfLink) setIsLink(false);
22
+ if (selection.dirty) {
23
+ if (null != linkParent && null == autoLinkParent) debounceSetIsLink(true);
24
+ }
25
+ }, []);
26
+ useEffect(()=>mergeRegister(editor.registerCommand(SELECTION_CHANGE_COMMAND, ()=>{
27
+ updateToolbar();
28
+ return false;
29
+ }, COMMAND_PRIORITY_CRITICAL), editor.registerCommand(BLUR_COMMAND, (payload)=>{
30
+ if (!isChildOfLinkEditor(payload.relatedTarget)) setIsLink(false);
31
+ return false;
32
+ }, COMMAND_PRIORITY_LOW), editor.registerCommand(TOGGLE_LINK_COMMAND, (payload)=>{
33
+ setIsLink(!!payload);
34
+ return false;
35
+ }, COMMAND_PRIORITY_CRITICAL)), [
36
+ editor,
37
+ updateToolbar
38
+ ]);
39
+ return /*#__PURE__*/ createPortal(/*#__PURE__*/ react.createElement(FloatingLinkEditor, {
40
+ isVisible: isLink,
41
+ editor: editor,
42
+ LinkForm: props.LinkForm
43
+ }), getOverlaysElement());
59
44
  };
45
+ export { FloatingLinkEditorController };
60
46
 
61
47
  //# sourceMappingURL=FloatingLinkEditorController.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","useState","useEffect","createPortal","useRichTextEditor","getSelectedNode","$isAutoLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","isChildOfLinkEditor","debounce","$getSelection","$isRangeSelection","BLUR_COMMAND","COMMAND_PRIORITY_CRITICAL","COMMAND_PRIORITY_LOW","SELECTION_CHANGE_COMMAND","mergeRegister","$findMatchingParent","FloatingLinkEditor","FloatingLinkEditorController","props","editor","getOverlaysElement","isLink","setIsLink","debounceSetIsLink","updateToolbar","selection","node","linkParent","autoLinkParent","isLinkOrChildOfLink","Boolean","dirty","registerCommand","payload","relatedTarget","createElement","isVisible","LinkForm"],"sources":["FloatingLinkEditorController.tsx"],"sourcesContent":["import React, { useCallback, useState, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useRichTextEditor } from \"~/hooks/index.js\";\nimport { getSelectedNode } from \"~/utils/getSelectedNode.js\";\nimport { $isAutoLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from \"@webiny/lexical-nodes\";\nimport { isChildOfLinkEditor } from \"~/plugins/FloatingLinkEditorPlugin/isChildOfLinkEditor.js\";\nimport debounce from \"lodash/debounce.js\";\nimport {\n $getSelection,\n $isRangeSelection,\n BLUR_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_LOW,\n SELECTION_CHANGE_COMMAND,\n mergeRegister,\n $findMatchingParent\n} from \"lexical\";\nimport { FloatingLinkEditor } from \"./FloatingLinkEditor.js\";\nimport { LinkFormProps } from \"./types.js\";\n\ninterface FloatingLinkEditorProps {\n LinkForm: React.FunctionComponent<LinkFormProps>;\n}\n\nexport const FloatingLinkEditorController = (props: FloatingLinkEditorProps) => {\n const { editor, getOverlaysElement } = useRichTextEditor();\n const [isLink, setIsLink] = useState(false);\n\n const debounceSetIsLink = useCallback(debounce(setIsLink, 50), []);\n\n const updateToolbar = useCallback(() => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) {\n return;\n }\n\n const node = getSelectedNode(selection);\n const linkParent = $findMatchingParent(node, $isLinkNode);\n const autoLinkParent = $findMatchingParent(node, $isAutoLinkNode);\n const isLinkOrChildOfLink = Boolean($isLinkNode(node) || linkParent);\n\n if (!isLinkOrChildOfLink) {\n // When hiding the toolbar, we want to hide immediately.\n setIsLink(false);\n }\n\n if (selection.dirty) {\n // We don't want this menu to open for auto links.\n if (linkParent != null && autoLinkParent == null) {\n // When showing the toolbar, we want to debounce it, because sometimes selection gets updated\n // multiple times, and the `selection.dirty` flag goes from true to false multiple times,\n // eventually settling on `false`, which we want to set once it has settled.\n debounceSetIsLink(true);\n }\n }\n }, []);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateToolbar();\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n ),\n editor.registerCommand(\n BLUR_COMMAND,\n payload => {\n if (!isChildOfLinkEditor(payload.relatedTarget as HTMLElement)) {\n setIsLink(false);\n }\n\n return false;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(\n TOGGLE_LINK_COMMAND,\n payload => {\n setIsLink(!!payload);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n )\n );\n }, [editor, updateToolbar]);\n\n return createPortal(\n <FloatingLinkEditor isVisible={isLink} editor={editor} LinkForm={props.LinkForm} />,\n getOverlaysElement()\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,QAAQ,EAAEC,SAAS,QAAQ,OAAO;AAC/D,SAASC,YAAY,QAAQ,WAAW;AACxC,SAASC,iBAAiB;AAC1B,SAASC,eAAe;AACxB,SAASC,eAAe,EAAEC,WAAW,EAAEC,mBAAmB,QAAQ,uBAAuB;AACzF,SAASC,mBAAmB;AAC5B,OAAOC,QAAQ,MAAM,oBAAoB;AACzC,SACIC,aAAa,EACbC,iBAAiB,EACjBC,YAAY,EACZC,yBAAyB,EACzBC,oBAAoB,EACpBC,wBAAwB,EACxBC,aAAa,EACbC,mBAAmB,QAChB,SAAS;AAChB,SAASC,kBAAkB;AAO3B,OAAO,MAAMC,4BAA4B,GAAIC,KAA8B,IAAK;EAC5E,MAAM;IAAEC,MAAM;IAAEC;EAAmB,CAAC,GAAGnB,iBAAiB,CAAC,CAAC;EAC1D,MAAM,CAACoB,MAAM,EAAEC,SAAS,CAAC,GAAGxB,QAAQ,CAAC,KAAK,CAAC;EAE3C,MAAMyB,iBAAiB,GAAG1B,WAAW,CAACU,QAAQ,CAACe,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;EAElE,MAAME,aAAa,GAAG3B,WAAW,CAAC,MAAM;IACpC,MAAM4B,SAAS,GAAGjB,aAAa,CAAC,CAAC;IACjC,IAAI,CAACC,iBAAiB,CAACgB,SAAS,CAAC,EAAE;MAC/B;IACJ;IAEA,MAAMC,IAAI,GAAGxB,eAAe,CAACuB,SAAS,CAAC;IACvC,MAAME,UAAU,GAAGZ,mBAAmB,CAACW,IAAI,EAAEtB,WAAW,CAAC;IACzD,MAAMwB,cAAc,GAAGb,mBAAmB,CAACW,IAAI,EAAEvB,eAAe,CAAC;IACjE,MAAM0B,mBAAmB,GAAGC,OAAO,CAAC1B,WAAW,CAACsB,IAAI,CAAC,IAAIC,UAAU,CAAC;IAEpE,IAAI,CAACE,mBAAmB,EAAE;MACtB;MACAP,SAAS,CAAC,KAAK,CAAC;IACpB;IAEA,IAAIG,SAAS,CAACM,KAAK,EAAE;MACjB;MACA,IAAIJ,UAAU,IAAI,IAAI,IAAIC,cAAc,IAAI,IAAI,EAAE;QAC9C;QACA;QACA;QACAL,iBAAiB,CAAC,IAAI,CAAC;MAC3B;IACJ;EACJ,CAAC,EAAE,EAAE,CAAC;EAENxB,SAAS,CAAC,MAAM;IACZ,OAAOe,aAAa,CAChBK,MAAM,CAACa,eAAe,CAClBnB,wBAAwB,EACxB,MAAM;MACFW,aAAa,CAAC,CAAC;MACf,OAAO,KAAK;IAChB,CAAC,EACDb,yBACJ,CAAC,EACDQ,MAAM,CAACa,eAAe,CAClBtB,YAAY,EACZuB,OAAO,IAAI;MACP,IAAI,CAAC3B,mBAAmB,CAAC2B,OAAO,CAACC,aAA4B,CAAC,EAAE;QAC5DZ,SAAS,CAAC,KAAK,CAAC;MACpB;MAEA,OAAO,KAAK;IAChB,CAAC,EACDV,oBACJ,CAAC,EACDO,MAAM,CAACa,eAAe,CAClB3B,mBAAmB,EACnB4B,OAAO,IAAI;MACPX,SAAS,CAAC,CAAC,CAACW,OAAO,CAAC;MACpB,OAAO,KAAK;IAChB,CAAC,EACDtB,yBACJ,CACJ,CAAC;EACL,CAAC,EAAE,CAACQ,MAAM,EAAEK,aAAa,CAAC,CAAC;EAE3B,oBAAOxB,YAAY,cACfJ,KAAA,CAAAuC,aAAA,CAACnB,kBAAkB;IAACoB,SAAS,EAAEf,MAAO;IAACF,MAAM,EAAEA,MAAO;IAACkB,QAAQ,EAAEnB,KAAK,CAACmB;EAAS,CAAE,CAAC,EACnFjB,kBAAkB,CAAC,CACvB,CAAC;AACL,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"plugins/FloatingLinkEditorPlugin/FloatingLinkEditorController.js","sources":["../../../src/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorController.tsx"],"sourcesContent":["import React, { useCallback, useState, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useRichTextEditor } from \"~/hooks/index.js\";\nimport { getSelectedNode } from \"~/utils/getSelectedNode.js\";\nimport { $isAutoLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from \"@webiny/lexical-nodes\";\nimport { isChildOfLinkEditor } from \"~/plugins/FloatingLinkEditorPlugin/isChildOfLinkEditor.js\";\nimport debounce from \"lodash/debounce.js\";\nimport {\n $getSelection,\n $isRangeSelection,\n BLUR_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_LOW,\n SELECTION_CHANGE_COMMAND,\n mergeRegister,\n $findMatchingParent\n} from \"lexical\";\nimport { FloatingLinkEditor } from \"./FloatingLinkEditor.js\";\nimport { LinkFormProps } from \"./types.js\";\n\ninterface FloatingLinkEditorProps {\n LinkForm: React.FunctionComponent<LinkFormProps>;\n}\n\nexport const FloatingLinkEditorController = (props: FloatingLinkEditorProps) => {\n const { editor, getOverlaysElement } = useRichTextEditor();\n const [isLink, setIsLink] = useState(false);\n\n const debounceSetIsLink = useCallback(debounce(setIsLink, 50), []);\n\n const updateToolbar = useCallback(() => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) {\n return;\n }\n\n const node = getSelectedNode(selection);\n const linkParent = $findMatchingParent(node, $isLinkNode);\n const autoLinkParent = $findMatchingParent(node, $isAutoLinkNode);\n const isLinkOrChildOfLink = Boolean($isLinkNode(node) || linkParent);\n\n if (!isLinkOrChildOfLink) {\n // When hiding the toolbar, we want to hide immediately.\n setIsLink(false);\n }\n\n if (selection.dirty) {\n // We don't want this menu to open for auto links.\n if (linkParent != null && autoLinkParent == null) {\n // When showing the toolbar, we want to debounce it, because sometimes selection gets updated\n // multiple times, and the `selection.dirty` flag goes from true to false multiple times,\n // eventually settling on `false`, which we want to set once it has settled.\n debounceSetIsLink(true);\n }\n }\n }, []);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateToolbar();\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n ),\n editor.registerCommand(\n BLUR_COMMAND,\n payload => {\n if (!isChildOfLinkEditor(payload.relatedTarget as HTMLElement)) {\n setIsLink(false);\n }\n\n return false;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(\n TOGGLE_LINK_COMMAND,\n payload => {\n setIsLink(!!payload);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n )\n );\n }, [editor, updateToolbar]);\n\n return createPortal(\n <FloatingLinkEditor isVisible={isLink} editor={editor} LinkForm={props.LinkForm} />,\n getOverlaysElement()\n );\n};\n"],"names":["FloatingLinkEditorController","props","editor","getOverlaysElement","useRichTextEditor","isLink","setIsLink","useState","debounceSetIsLink","useCallback","debounce","updateToolbar","selection","$getSelection","$isRangeSelection","node","getSelectedNode","linkParent","$findMatchingParent","$isLinkNode","autoLinkParent","$isAutoLinkNode","isLinkOrChildOfLink","Boolean","useEffect","mergeRegister","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_CRITICAL","BLUR_COMMAND","payload","isChildOfLinkEditor","COMMAND_PRIORITY_LOW","TOGGLE_LINK_COMMAND","createPortal","FloatingLinkEditor"],"mappings":";;;;;;;;;AAwBO,MAAMA,+BAA+B,CAACC;IACzC,MAAM,EAAEC,MAAM,EAAEC,kBAAkB,EAAE,GAAGC;IACvC,MAAM,CAACC,QAAQC,UAAU,GAAGC,SAAS;IAErC,MAAMC,oBAAoBC,YAAYC,SAASJ,WAAW,KAAK,EAAE;IAEjE,MAAMK,gBAAgBF,YAAY;QAC9B,MAAMG,YAAYC;QAClB,IAAI,CAACC,kBAAkBF,YACnB;QAGJ,MAAMG,OAAOC,gBAAgBJ;QAC7B,MAAMK,aAAaC,oBAAoBH,MAAMI;QAC7C,MAAMC,iBAAiBF,oBAAoBH,MAAMM;QACjD,MAAMC,sBAAsBC,QAAQJ,YAAYJ,SAASE;QAEzD,IAAI,CAACK,qBAEDhB,UAAU;QAGd,IAAIM,UAAU,KAAK,EAEf;YAAA,IAAIK,AAAc,QAAdA,cAAsBG,AAAkB,QAAlBA,gBAItBZ,kBAAkB;QACtB;IAER,GAAG,EAAE;IAELgB,UAAU,IACCC,cACHvB,OAAO,eAAe,CAClBwB,0BACA;YACIf;YACA,OAAO;QACX,GACAgB,4BAEJzB,OAAO,eAAe,CAClB0B,cACAC,CAAAA;YACI,IAAI,CAACC,oBAAoBD,QAAQ,aAAa,GAC1CvB,UAAU;YAGd,OAAO;QACX,GACAyB,uBAEJ7B,OAAO,eAAe,CAClB8B,qBACAH,CAAAA;YACIvB,UAAU,CAAC,CAACuB;YACZ,OAAO;QACX,GACAF,6BAGT;QAACzB;QAAQS;KAAc;IAE1B,OAAO,WAAP,GAAOsB,aAAa,WAADA,GACf,oBAACC,oBAAkBA;QAAC,WAAW7B;QAAQ,QAAQH;QAAQ,UAAUD,MAAM,QAAQ;QAC/EE;AAER"}
@@ -1,10 +1,11 @@
1
- import React from "react";
1
+ import react from "react";
2
2
  import { FloatingLinkEditorController } from "./FloatingLinkEditorController.js";
3
3
  import "./FloatingLinkEditorPlugin.css";
4
- export function FloatingLinkEditorPlugin(props) {
5
- return /*#__PURE__*/React.createElement(FloatingLinkEditorController, {
6
- LinkForm: props.LinkForm
7
- });
4
+ function FloatingLinkEditorPlugin(props) {
5
+ return /*#__PURE__*/ react.createElement(FloatingLinkEditorController, {
6
+ LinkForm: props.LinkForm
7
+ });
8
8
  }
9
+ export { FloatingLinkEditorPlugin };
9
10
 
10
11
  //# sourceMappingURL=FloatingLinkEditorPlugin.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","FloatingLinkEditorController","FloatingLinkEditorPlugin","props","createElement","LinkForm"],"sources":["FloatingLinkEditorPlugin.tsx"],"sourcesContent":["import React from \"react\";\nimport { FloatingLinkEditorController } from \"./FloatingLinkEditorController.js\";\nimport \"./FloatingLinkEditorPlugin.css\";\nimport { LinkFormProps } from \"./types.js\";\n\nexport function FloatingLinkEditorPlugin(props: {\n LinkForm: React.FunctionComponent<LinkFormProps>;\n}) {\n return <FloatingLinkEditorController LinkForm={props.LinkForm} />;\n}\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,4BAA4B;AACrC;AAGA,OAAO,SAASC,wBAAwBA,CAACC,KAExC,EAAE;EACC,oBAAOH,KAAA,CAAAI,aAAA,CAACH,4BAA4B;IAACI,QAAQ,EAAEF,KAAK,CAACE;EAAS,CAAE,CAAC;AACrE","ignoreList":[]}
1
+ {"version":3,"file":"plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.js","sources":["../../../src/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.tsx"],"sourcesContent":["import React from \"react\";\nimport { FloatingLinkEditorController } from \"./FloatingLinkEditorController.js\";\nimport \"./FloatingLinkEditorPlugin.css\";\nimport { LinkFormProps } from \"./types.js\";\n\nexport function FloatingLinkEditorPlugin(props: {\n LinkForm: React.FunctionComponent<LinkFormProps>;\n}) {\n return <FloatingLinkEditorController LinkForm={props.LinkForm} />;\n}\n"],"names":["FloatingLinkEditorPlugin","props","FloatingLinkEditorController"],"mappings":";;;AAKO,SAASA,yBAAyBC,KAExC;IACG,OAAO,WAAP,GAAO,oBAACC,8BAA4BA;QAAC,UAAUD,MAAM,QAAQ;;AACjE"}
@@ -1,3 +1 @@
1
1
  export * from "./FloatingLinkEditorPlugin.js";
2
-
3
- //# sourceMappingURL=index.js.map
@@ -1,12 +1,9 @@
1
- export const isChildOfLinkEditor = element => {
2
- const parent = element ? element.parentElement : null;
3
- if (!parent) {
4
- return false;
5
- }
6
- if (parent.classList.contains("link-editor")) {
7
- return true;
8
- }
9
- return isChildOfLinkEditor(parent);
1
+ const isChildOfLinkEditor = (element)=>{
2
+ const parent = element ? element.parentElement : null;
3
+ if (!parent) return false;
4
+ if (parent.classList.contains("link-editor")) return true;
5
+ return isChildOfLinkEditor(parent);
10
6
  };
7
+ export { isChildOfLinkEditor };
11
8
 
12
9
  //# sourceMappingURL=isChildOfLinkEditor.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["isChildOfLinkEditor","element","parent","parentElement","classList","contains"],"sources":["isChildOfLinkEditor.ts"],"sourcesContent":["export const isChildOfLinkEditor = (element: HTMLElement | null): boolean => {\n const parent = element ? element.parentElement : null;\n\n if (!parent) {\n return false;\n }\n\n if (parent.classList.contains(\"link-editor\")) {\n return true;\n }\n\n return isChildOfLinkEditor(parent);\n};\n"],"mappings":"AAAA,OAAO,MAAMA,mBAAmB,GAAIC,OAA2B,IAAc;EACzE,MAAMC,MAAM,GAAGD,OAAO,GAAGA,OAAO,CAACE,aAAa,GAAG,IAAI;EAErD,IAAI,CAACD,MAAM,EAAE;IACT,OAAO,KAAK;EAChB;EAEA,IAAIA,MAAM,CAACE,SAAS,CAACC,QAAQ,CAAC,aAAa,CAAC,EAAE;IAC1C,OAAO,IAAI;EACf;EAEA,OAAOL,mBAAmB,CAACE,MAAM,CAAC;AACtC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"plugins/FloatingLinkEditorPlugin/isChildOfLinkEditor.js","sources":["../../../src/plugins/FloatingLinkEditorPlugin/isChildOfLinkEditor.ts"],"sourcesContent":["export const isChildOfLinkEditor = (element: HTMLElement | null): boolean => {\n const parent = element ? element.parentElement : null;\n\n if (!parent) {\n return false;\n }\n\n if (parent.classList.contains(\"link-editor\")) {\n return true;\n }\n\n return isChildOfLinkEditor(parent);\n};\n"],"names":["isChildOfLinkEditor","element","parent"],"mappings":"AAAO,MAAMA,sBAAsB,CAACC;IAChC,MAAMC,SAASD,UAAUA,QAAQ,aAAa,GAAG;IAEjD,IAAI,CAACC,QACD,OAAO;IAGX,IAAIA,OAAO,SAAS,CAAC,QAAQ,CAAC,gBAC1B,OAAO;IAGX,OAAOF,oBAAoBE;AAC/B"}
@@ -1,3 +0,0 @@
1
- export {};
2
-
3
- //# sourceMappingURL=types.js.map
@@ -1,128 +1,121 @@
1
1
  import { useCallback, useEffect, useRef, useState } from "react";
2
- import { SELECTION_CHANGE_COMMAND, COMMAND_PRIORITY_LOW, $getSelection, $isRangeSelection, mergeRegister } from "lexical";
2
+ import { $getSelection, $isRangeSelection, COMMAND_PRIORITY_LOW, SELECTION_CHANGE_COMMAND, mergeRegister } from "lexical";
3
3
  import { $isLinkNode, TOGGLE_LINK_COMMAND } from "@webiny/lexical-nodes";
4
4
  import { getSelectedNode } from "../../utils/getSelectedNode.js";
5
5
  import { setFloatingElemPosition } from "../../utils/setFloatingElemPosition.js";
6
6
  import { sanitizeUrl } from "../../utils/sanitizeUrl.js";
7
7
  const emptyLinkData = {
8
- url: "",
9
- target: null,
10
- alt: null
8
+ url: "",
9
+ target: null,
10
+ alt: null
11
11
  };
12
12
  function getSelectionKey(selection) {
13
- if ($isRangeSelection(selection)) {
14
- return `${selection.anchor.key}:${selection.anchor.offset}-${selection.focus.key}:${selection.focus.offset}`;
15
- }
16
- return null;
13
+ if ($isRangeSelection(selection)) return `${selection.anchor.key}:${selection.anchor.offset}-${selection.focus.key}:${selection.focus.offset}`;
14
+ return null;
17
15
  }
18
16
  function getLinkDataFromSelection() {
19
- const selection = $getSelection();
20
- if (!$isRangeSelection(selection)) {
21
- return emptyLinkData;
22
- }
23
- const node = getSelectedNode(selection);
24
- const parent = node.getParent();
25
- if ($isLinkNode(parent)) {
26
- return {
27
- url: parent.getURL(),
28
- target: parent.getTarget(),
29
- alt: parent.getAlt()
17
+ const selection = $getSelection();
18
+ if (!$isRangeSelection(selection)) return emptyLinkData;
19
+ const node = getSelectedNode(selection);
20
+ const parent = node.getParent();
21
+ if ($isLinkNode(parent)) return {
22
+ url: parent.getURL(),
23
+ target: parent.getTarget(),
24
+ alt: parent.getAlt()
30
25
  };
31
- }
32
- if ($isLinkNode(node)) {
33
- return {
34
- url: node.getURL(),
35
- target: node.getTarget(),
36
- alt: node.getAlt()
26
+ if ($isLinkNode(node)) return {
27
+ url: node.getURL(),
28
+ target: node.getTarget(),
29
+ alt: node.getAlt()
37
30
  };
38
- }
39
- return emptyLinkData;
31
+ return emptyLinkData;
40
32
  }
41
- export function useFloatingLinkEditor(editor) {
42
- const editorRef = useRef(null);
43
- const [linkData, setLinkData] = useState(emptyLinkData);
44
- const [lastSelection, setLastSelection] = useState(null);
45
- const suppressedSelectionKeyRef = useRef(null);
46
- const updateLinkEditor = useCallback(() => {
47
- const selection = $getSelection();
48
- const selectionKey = getSelectionKey(selection);
49
-
50
- // If we're still on the same selection that was suppressed, hide the popover.
51
- if (suppressedSelectionKeyRef.current !== null) {
52
- if (selectionKey === suppressedSelectionKeyRef.current) {
33
+ function useFloatingLinkEditor(editor) {
34
+ const editorRef = useRef(null);
35
+ const [linkData, setLinkData] = useState(emptyLinkData);
36
+ const [lastSelection, setLastSelection] = useState(null);
37
+ const suppressedSelectionKeyRef = useRef(null);
38
+ const updateLinkEditor = useCallback(()=>{
39
+ const selection = $getSelection();
40
+ const selectionKey = getSelectionKey(selection);
41
+ if (null !== suppressedSelectionKeyRef.current) {
42
+ if (selectionKey === suppressedSelectionKeyRef.current) {
43
+ const editorElem = editorRef.current;
44
+ if (editorElem) setFloatingElemPosition(null, editorElem);
45
+ setLastSelection(null);
46
+ setLinkData(emptyLinkData);
47
+ return true;
48
+ }
49
+ suppressedSelectionKeyRef.current = null;
50
+ }
51
+ setLinkData(getLinkDataFromSelection());
53
52
  const editorElem = editorRef.current;
54
- if (editorElem) {
55
- setFloatingElemPosition(null, editorElem);
53
+ const nativeSelection = window.getSelection();
54
+ const activeElement = document.activeElement;
55
+ if (null === editorElem) return;
56
+ const rootElement = editor.getRootElement();
57
+ if (null !== selection && null !== nativeSelection && null !== rootElement && rootElement.contains(nativeSelection.anchorNode)) {
58
+ const range = nativeSelection.getRangeAt(0);
59
+ setFloatingElemPosition(range, editorElem);
60
+ setLastSelection(selection);
61
+ } else if (!activeElement || "link-input" !== activeElement.className) {
62
+ if (null !== rootElement) setFloatingElemPosition(null, editorElem);
63
+ setLastSelection(null);
64
+ setLinkData(emptyLinkData);
56
65
  }
57
- setLastSelection(null);
58
- setLinkData(emptyLinkData);
59
66
  return true;
60
- }
61
- // New selection — clear suppression.
62
- suppressedSelectionKeyRef.current = null;
63
- }
64
- setLinkData(getLinkDataFromSelection());
65
- const editorElem = editorRef.current;
66
- const nativeSelection = window.getSelection();
67
- const activeElement = document.activeElement;
68
- if (editorElem === null) {
69
- return;
70
- }
71
- const rootElement = editor.getRootElement();
72
- if (selection !== null && nativeSelection !== null && rootElement !== null && rootElement.contains(nativeSelection.anchorNode)) {
73
- const range = nativeSelection.getRangeAt(0);
74
- setFloatingElemPosition(range, editorElem);
75
- setLastSelection(selection);
76
- } else if (!activeElement || activeElement.className !== "link-input") {
77
- if (rootElement !== null) {
78
- setFloatingElemPosition(null, editorElem);
79
- }
80
- setLastSelection(null);
81
- setLinkData(emptyLinkData);
82
- }
83
- return true;
84
- }, [editor]);
85
- const removeLink = useCallback(() => {
86
- editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);
87
- }, [editor]);
88
- const applyChanges = useCallback(linkData => {
89
- const confirmedLinkData = {
90
- url: sanitizeUrl(linkData.url),
91
- target: linkData.target,
92
- alt: linkData.alt
67
+ }, [
68
+ editor
69
+ ]);
70
+ const removeLink = useCallback(()=>{
71
+ editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);
72
+ }, [
73
+ editor
74
+ ]);
75
+ const applyChanges = useCallback((linkData)=>{
76
+ const confirmedLinkData = {
77
+ url: sanitizeUrl(linkData.url),
78
+ target: linkData.target,
79
+ alt: linkData.alt
80
+ };
81
+ if (null !== lastSelection) {
82
+ editor.read(()=>{
83
+ const selection = $getSelection();
84
+ suppressedSelectionKeyRef.current = getSelectionKey(selection);
85
+ });
86
+ editor.dispatchCommand(TOGGLE_LINK_COMMAND, confirmedLinkData);
87
+ }
88
+ setLastSelection(null);
89
+ }, [
90
+ editor,
91
+ lastSelection
92
+ ]);
93
+ useEffect(()=>mergeRegister(editor.registerUpdateListener(({ editorState })=>{
94
+ editorState.read(()=>{
95
+ updateLinkEditor();
96
+ });
97
+ }), editor.registerCommand(SELECTION_CHANGE_COMMAND, ()=>{
98
+ updateLinkEditor();
99
+ return false;
100
+ }, COMMAND_PRIORITY_LOW)), [
101
+ editor,
102
+ updateLinkEditor
103
+ ]);
104
+ useEffect(()=>{
105
+ editor.read(()=>{
106
+ updateLinkEditor();
107
+ });
108
+ }, [
109
+ editor,
110
+ updateLinkEditor
111
+ ]);
112
+ return {
113
+ editorRef,
114
+ linkData,
115
+ applyChanges,
116
+ removeLink
93
117
  };
94
- if (lastSelection !== null) {
95
- editor.read(() => {
96
- const selection = $getSelection();
97
- suppressedSelectionKeyRef.current = getSelectionKey(selection);
98
- });
99
- editor.dispatchCommand(TOGGLE_LINK_COMMAND, confirmedLinkData);
100
- }
101
- setLastSelection(null);
102
- }, [editor, lastSelection]);
103
- useEffect(() => {
104
- return mergeRegister(editor.registerUpdateListener(({
105
- editorState
106
- }) => {
107
- editorState.read(() => {
108
- updateLinkEditor();
109
- });
110
- }), editor.registerCommand(SELECTION_CHANGE_COMMAND, () => {
111
- updateLinkEditor();
112
- return false;
113
- }, COMMAND_PRIORITY_LOW));
114
- }, [editor, updateLinkEditor]);
115
- useEffect(() => {
116
- editor.read(() => {
117
- updateLinkEditor();
118
- });
119
- }, [editor, updateLinkEditor]);
120
- return {
121
- editorRef,
122
- linkData,
123
- applyChanges,
124
- removeLink
125
- };
126
118
  }
119
+ export { useFloatingLinkEditor };
127
120
 
128
121
  //# sourceMappingURL=useFloatingLinkEditor.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useEffect","useRef","useState","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","$getSelection","$isRangeSelection","mergeRegister","$isLinkNode","TOGGLE_LINK_COMMAND","getSelectedNode","setFloatingElemPosition","sanitizeUrl","emptyLinkData","url","target","alt","getSelectionKey","selection","anchor","key","offset","focus","getLinkDataFromSelection","node","parent","getParent","getURL","getTarget","getAlt","useFloatingLinkEditor","editor","editorRef","linkData","setLinkData","lastSelection","setLastSelection","suppressedSelectionKeyRef","updateLinkEditor","selectionKey","current","editorElem","nativeSelection","window","getSelection","activeElement","document","rootElement","getRootElement","contains","anchorNode","range","getRangeAt","className","removeLink","dispatchCommand","applyChanges","confirmedLinkData","read","registerUpdateListener","editorState","registerCommand"],"sources":["useFloatingLinkEditor.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n SELECTION_CHANGE_COMMAND,\n type BaseSelection,\n type LexicalEditor,\n COMMAND_PRIORITY_LOW,\n $getSelection,\n $isRangeSelection,\n mergeRegister\n} from \"lexical\";\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from \"@webiny/lexical-nodes\";\nimport { getSelectedNode } from \"~/utils/getSelectedNode.js\";\nimport { setFloatingElemPosition } from \"~/utils/setFloatingElemPosition.js\";\nimport { sanitizeUrl } from \"~/utils/sanitizeUrl.js\";\nimport { LinkData } from \"./types.js\";\n\nconst emptyLinkData: LinkData = { url: \"\", target: null, alt: null };\n\nfunction getSelectionKey(selection: BaseSelection | null): string | null {\n if ($isRangeSelection(selection)) {\n return `${selection.anchor.key}:${selection.anchor.offset}-${selection.focus.key}:${selection.focus.offset}`;\n }\n return null;\n}\n\nfunction getLinkDataFromSelection(): LinkData {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) {\n return emptyLinkData;\n }\n\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n\n if ($isLinkNode(parent)) {\n return {\n url: parent.getURL(),\n target: parent.getTarget(),\n alt: parent.getAlt()\n };\n }\n\n if ($isLinkNode(node)) {\n return {\n url: node.getURL(),\n target: node.getTarget(),\n alt: node.getAlt()\n };\n }\n\n return emptyLinkData;\n}\n\nexport function useFloatingLinkEditor(editor: LexicalEditor) {\n const editorRef = useRef<HTMLDivElement | null>(null);\n const [linkData, setLinkData] = useState<LinkData>(emptyLinkData);\n const [lastSelection, setLastSelection] = useState<BaseSelection | null>(null);\n const suppressedSelectionKeyRef = useRef<string | null>(null);\n\n const updateLinkEditor = useCallback(() => {\n const selection = $getSelection();\n const selectionKey = getSelectionKey(selection);\n\n // If we're still on the same selection that was suppressed, hide the popover.\n if (suppressedSelectionKeyRef.current !== null) {\n if (selectionKey === suppressedSelectionKeyRef.current) {\n const editorElem = editorRef.current;\n if (editorElem) {\n setFloatingElemPosition(null, editorElem);\n }\n setLastSelection(null);\n setLinkData(emptyLinkData);\n return true;\n }\n // New selection — clear suppression.\n suppressedSelectionKeyRef.current = null;\n }\n\n setLinkData(getLinkDataFromSelection());\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 range = nativeSelection.getRangeAt(0);\n setFloatingElemPosition(range, editorElem);\n setLastSelection(selection);\n } else if (!activeElement || activeElement.className !== \"link-input\") {\n if (rootElement !== null) {\n setFloatingElemPosition(null, editorElem);\n }\n setLastSelection(null);\n setLinkData(emptyLinkData);\n }\n\n return true;\n }, [editor]);\n\n const removeLink = useCallback(() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }, [editor]);\n\n const applyChanges = useCallback(\n (linkData: LinkData) => {\n const confirmedLinkData = {\n url: sanitizeUrl(linkData.url),\n target: linkData.target,\n alt: linkData.alt\n };\n\n if (lastSelection !== null) {\n editor.read(() => {\n const selection = $getSelection();\n suppressedSelectionKeyRef.current = getSelectionKey(selection);\n });\n\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, confirmedLinkData);\n }\n\n setLastSelection(null);\n },\n [editor, lastSelection]\n );\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 false;\n },\n COMMAND_PRIORITY_LOW\n )\n );\n }, [editor, updateLinkEditor]);\n\n useEffect(() => {\n editor.read(() => {\n updateLinkEditor();\n });\n }, [editor, updateLinkEditor]);\n\n return { editorRef, linkData, applyChanges, removeLink };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"plugins/FloatingLinkEditorPlugin/useFloatingLinkEditor.js","sources":["../../../src/plugins/FloatingLinkEditorPlugin/useFloatingLinkEditor.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n SELECTION_CHANGE_COMMAND,\n type BaseSelection,\n type LexicalEditor,\n COMMAND_PRIORITY_LOW,\n $getSelection,\n $isRangeSelection,\n mergeRegister\n} from \"lexical\";\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from \"@webiny/lexical-nodes\";\nimport { getSelectedNode } from \"~/utils/getSelectedNode.js\";\nimport { setFloatingElemPosition } from \"~/utils/setFloatingElemPosition.js\";\nimport { sanitizeUrl } from \"~/utils/sanitizeUrl.js\";\nimport { LinkData } from \"./types.js\";\n\nconst emptyLinkData: LinkData = { url: \"\", target: null, alt: null };\n\nfunction getSelectionKey(selection: BaseSelection | null): string | null {\n if ($isRangeSelection(selection)) {\n return `${selection.anchor.key}:${selection.anchor.offset}-${selection.focus.key}:${selection.focus.offset}`;\n }\n return null;\n}\n\nfunction getLinkDataFromSelection(): LinkData {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) {\n return emptyLinkData;\n }\n\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n\n if ($isLinkNode(parent)) {\n return {\n url: parent.getURL(),\n target: parent.getTarget(),\n alt: parent.getAlt()\n };\n }\n\n if ($isLinkNode(node)) {\n return {\n url: node.getURL(),\n target: node.getTarget(),\n alt: node.getAlt()\n };\n }\n\n return emptyLinkData;\n}\n\nexport function useFloatingLinkEditor(editor: LexicalEditor) {\n const editorRef = useRef<HTMLDivElement | null>(null);\n const [linkData, setLinkData] = useState<LinkData>(emptyLinkData);\n const [lastSelection, setLastSelection] = useState<BaseSelection | null>(null);\n const suppressedSelectionKeyRef = useRef<string | null>(null);\n\n const updateLinkEditor = useCallback(() => {\n const selection = $getSelection();\n const selectionKey = getSelectionKey(selection);\n\n // If we're still on the same selection that was suppressed, hide the popover.\n if (suppressedSelectionKeyRef.current !== null) {\n if (selectionKey === suppressedSelectionKeyRef.current) {\n const editorElem = editorRef.current;\n if (editorElem) {\n setFloatingElemPosition(null, editorElem);\n }\n setLastSelection(null);\n setLinkData(emptyLinkData);\n return true;\n }\n // New selection — clear suppression.\n suppressedSelectionKeyRef.current = null;\n }\n\n setLinkData(getLinkDataFromSelection());\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 range = nativeSelection.getRangeAt(0);\n setFloatingElemPosition(range, editorElem);\n setLastSelection(selection);\n } else if (!activeElement || activeElement.className !== \"link-input\") {\n if (rootElement !== null) {\n setFloatingElemPosition(null, editorElem);\n }\n setLastSelection(null);\n setLinkData(emptyLinkData);\n }\n\n return true;\n }, [editor]);\n\n const removeLink = useCallback(() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }, [editor]);\n\n const applyChanges = useCallback(\n (linkData: LinkData) => {\n const confirmedLinkData = {\n url: sanitizeUrl(linkData.url),\n target: linkData.target,\n alt: linkData.alt\n };\n\n if (lastSelection !== null) {\n editor.read(() => {\n const selection = $getSelection();\n suppressedSelectionKeyRef.current = getSelectionKey(selection);\n });\n\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, confirmedLinkData);\n }\n\n setLastSelection(null);\n },\n [editor, lastSelection]\n );\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 false;\n },\n COMMAND_PRIORITY_LOW\n )\n );\n }, [editor, updateLinkEditor]);\n\n useEffect(() => {\n editor.read(() => {\n updateLinkEditor();\n });\n }, [editor, updateLinkEditor]);\n\n return { editorRef, linkData, applyChanges, removeLink };\n}\n"],"names":["emptyLinkData","getSelectionKey","selection","$isRangeSelection","getLinkDataFromSelection","$getSelection","node","getSelectedNode","parent","$isLinkNode","useFloatingLinkEditor","editor","editorRef","useRef","linkData","setLinkData","useState","lastSelection","setLastSelection","suppressedSelectionKeyRef","updateLinkEditor","useCallback","selectionKey","editorElem","setFloatingElemPosition","nativeSelection","window","activeElement","document","rootElement","range","removeLink","TOGGLE_LINK_COMMAND","applyChanges","confirmedLinkData","sanitizeUrl","useEffect","mergeRegister","editorState","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW"],"mappings":"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"}
@@ -3,25 +3,20 @@ import { $getSelection, $isRangeSelection, COMMAND_PRIORITY_EDITOR } from "lexic
3
3
  import { ADD_FONT_COLOR_COMMAND } from "@webiny/lexical-nodes";
4
4
  import { useRichTextEditor } from "../../hooks/index.js";
5
5
  import { applyColorToSelection } from "./applyColorToSelection.js";
6
- export const FontColorPlugin = () => {
7
- const {
8
- editor
9
- } = useRichTextEditor();
10
- useEffect(() => {
11
- return editor.registerCommand(ADD_FONT_COLOR_COMMAND, payload => {
12
- editor.update(() => {
13
- const {
14
- color
15
- } = payload;
16
- const selection = $getSelection();
17
- if ($isRangeSelection(selection)) {
18
- applyColorToSelection(selection, color);
19
- }
20
- });
21
- return true;
22
- }, COMMAND_PRIORITY_EDITOR);
23
- }, [editor]);
24
- return null;
6
+ const FontColorPlugin = ()=>{
7
+ const { editor } = useRichTextEditor();
8
+ useEffect(()=>editor.registerCommand(ADD_FONT_COLOR_COMMAND, (payload)=>{
9
+ editor.update(()=>{
10
+ const { color } = payload;
11
+ const selection = $getSelection();
12
+ if ($isRangeSelection(selection)) applyColorToSelection(selection, color);
13
+ });
14
+ return true;
15
+ }, COMMAND_PRIORITY_EDITOR), [
16
+ editor
17
+ ]);
18
+ return null;
25
19
  };
20
+ export { FontColorPlugin };
26
21
 
27
22
  //# sourceMappingURL=FontColorPlugin.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","$getSelection","$isRangeSelection","COMMAND_PRIORITY_EDITOR","ADD_FONT_COLOR_COMMAND","useRichTextEditor","applyColorToSelection","FontColorPlugin","editor","registerCommand","payload","update","color","selection"],"sources":["FontColorPlugin.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport { $getSelection, $isRangeSelection, COMMAND_PRIORITY_EDITOR } from \"lexical\";\nimport type { FontColorPayload } from \"@webiny/lexical-nodes\";\nimport { ADD_FONT_COLOR_COMMAND } from \"@webiny/lexical-nodes\";\nimport { useRichTextEditor } from \"~/hooks/index.js\";\nimport { applyColorToSelection } from \"./applyColorToSelection.js\";\n\nexport const FontColorPlugin = () => {\n const { editor } = useRichTextEditor();\n\n useEffect(() => {\n return editor.registerCommand<FontColorPayload>(\n ADD_FONT_COLOR_COMMAND,\n payload => {\n editor.update(() => {\n const { color } = payload;\n const selection = $getSelection();\n\n if ($isRangeSelection(selection)) {\n applyColorToSelection(selection, color);\n }\n });\n return true;\n },\n COMMAND_PRIORITY_EDITOR\n );\n }, [editor]);\n\n return null;\n};\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AACjC,SAASC,aAAa,EAAEC,iBAAiB,EAAEC,uBAAuB,QAAQ,SAAS;AAEnF,SAASC,sBAAsB,QAAQ,uBAAuB;AAC9D,SAASC,iBAAiB;AAC1B,SAASC,qBAAqB;AAE9B,OAAO,MAAMC,eAAe,GAAGA,CAAA,KAAM;EACjC,MAAM;IAAEC;EAAO,CAAC,GAAGH,iBAAiB,CAAC,CAAC;EAEtCL,SAAS,CAAC,MAAM;IACZ,OAAOQ,MAAM,CAACC,eAAe,CACzBL,sBAAsB,EACtBM,OAAO,IAAI;MACPF,MAAM,CAACG,MAAM,CAAC,MAAM;QAChB,MAAM;UAAEC;QAAM,CAAC,GAAGF,OAAO;QACzB,MAAMG,SAAS,GAAGZ,aAAa,CAAC,CAAC;QAEjC,IAAIC,iBAAiB,CAACW,SAAS,CAAC,EAAE;UAC9BP,qBAAqB,CAACO,SAAS,EAAED,KAAK,CAAC;QAC3C;MACJ,CAAC,CAAC;MACF,OAAO,IAAI;IACf,CAAC,EACDT,uBACJ,CAAC;EACL,CAAC,EAAE,CAACK,MAAM,CAAC,CAAC;EAEZ,OAAO,IAAI;AACf,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"plugins/FontColorPlugin/FontColorPlugin.js","sources":["../../../src/plugins/FontColorPlugin/FontColorPlugin.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport { $getSelection, $isRangeSelection, COMMAND_PRIORITY_EDITOR } from \"lexical\";\nimport type { FontColorPayload } from \"@webiny/lexical-nodes\";\nimport { ADD_FONT_COLOR_COMMAND } from \"@webiny/lexical-nodes\";\nimport { useRichTextEditor } from \"~/hooks/index.js\";\nimport { applyColorToSelection } from \"./applyColorToSelection.js\";\n\nexport const FontColorPlugin = () => {\n const { editor } = useRichTextEditor();\n\n useEffect(() => {\n return editor.registerCommand<FontColorPayload>(\n ADD_FONT_COLOR_COMMAND,\n payload => {\n editor.update(() => {\n const { color } = payload;\n const selection = $getSelection();\n\n if ($isRangeSelection(selection)) {\n applyColorToSelection(selection, color);\n }\n });\n return true;\n },\n COMMAND_PRIORITY_EDITOR\n );\n }, [editor]);\n\n return null;\n};\n"],"names":["FontColorPlugin","editor","useRichTextEditor","useEffect","ADD_FONT_COLOR_COMMAND","payload","color","selection","$getSelection","$isRangeSelection","applyColorToSelection","COMMAND_PRIORITY_EDITOR"],"mappings":";;;;;AAOO,MAAMA,kBAAkB;IAC3B,MAAM,EAAEC,MAAM,EAAE,GAAGC;IAEnBC,UAAU,IACCF,OAAO,eAAe,CACzBG,wBACAC,CAAAA;YACIJ,OAAO,MAAM,CAAC;gBACV,MAAM,EAAEK,KAAK,EAAE,GAAGD;gBAClB,MAAME,YAAYC;gBAElB,IAAIC,kBAAkBF,YAClBG,sBAAsBH,WAAWD;YAEzC;YACA,OAAO;QACX,GACAK,0BAEL;QAACV;KAAO;IAEX,OAAO;AACX"}
@@ -1,8 +1,9 @@
1
1
  import { $applyStylesToNode, $createFontColorNode } from "@webiny/lexical-nodes";
2
- export function applyColorToNode(textNode, color) {
3
- const fontColorNode = $createFontColorNode(textNode.getTextContent(), color);
4
- $applyStylesToNode(fontColorNode, textNode);
5
- return textNode.replace(fontColorNode);
2
+ function applyColorToNode(textNode, color) {
3
+ const fontColorNode = $createFontColorNode(textNode.getTextContent(), color);
4
+ $applyStylesToNode(fontColorNode, textNode);
5
+ return textNode.replace(fontColorNode);
6
6
  }
7
+ export { applyColorToNode };
7
8
 
8
9
  //# sourceMappingURL=applyColorToNode.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["$applyStylesToNode","$createFontColorNode","applyColorToNode","textNode","color","fontColorNode","getTextContent","replace"],"sources":["applyColorToNode.ts"],"sourcesContent":["import type { TextNode } from \"lexical\";\nimport type { ThemeColorValue } from \"@webiny/lexical-nodes\";\nimport { $applyStylesToNode, $createFontColorNode } from \"@webiny/lexical-nodes\";\n\nexport function applyColorToNode(textNode: TextNode, color: ThemeColorValue) {\n const fontColorNode = $createFontColorNode(textNode.getTextContent(), color);\n $applyStylesToNode(fontColorNode, textNode);\n\n return textNode.replace(fontColorNode);\n}\n"],"mappings":"AAEA,SAASA,kBAAkB,EAAEC,oBAAoB,QAAQ,uBAAuB;AAEhF,OAAO,SAASC,gBAAgBA,CAACC,QAAkB,EAAEC,KAAsB,EAAE;EACzE,MAAMC,aAAa,GAAGJ,oBAAoB,CAACE,QAAQ,CAACG,cAAc,CAAC,CAAC,EAAEF,KAAK,CAAC;EAC5EJ,kBAAkB,CAACK,aAAa,EAAEF,QAAQ,CAAC;EAE3C,OAAOA,QAAQ,CAACI,OAAO,CAACF,aAAa,CAAC;AAC1C","ignoreList":[]}
1
+ {"version":3,"file":"plugins/FontColorPlugin/applyColorToNode.js","sources":["../../../src/plugins/FontColorPlugin/applyColorToNode.ts"],"sourcesContent":["import type { TextNode } from \"lexical\";\nimport type { ThemeColorValue } from \"@webiny/lexical-nodes\";\nimport { $applyStylesToNode, $createFontColorNode } from \"@webiny/lexical-nodes\";\n\nexport function applyColorToNode(textNode: TextNode, color: ThemeColorValue) {\n const fontColorNode = $createFontColorNode(textNode.getTextContent(), color);\n $applyStylesToNode(fontColorNode, textNode);\n\n return textNode.replace(fontColorNode);\n}\n"],"names":["applyColorToNode","textNode","color","fontColorNode","$createFontColorNode","$applyStylesToNode"],"mappings":";AAIO,SAASA,iBAAiBC,QAAkB,EAAEC,KAAsB;IACvE,MAAMC,gBAAgBC,qBAAqBH,SAAS,cAAc,IAAIC;IACtEG,mBAAmBF,eAAeF;IAElC,OAAOA,SAAS,OAAO,CAACE;AAC5B"}