@webiny/lexical-editor 5.44.1-beta.0 → 5.45.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/README.md +6 -12
  2. package/commands/image.d.ts +2 -2
  3. package/commands/image.js +2 -8
  4. package/commands/image.js.map +1 -1
  5. package/commands/index.d.ts +5 -4
  6. package/commands/index.js +5 -49
  7. package/commands/index.js.map +1 -1
  8. package/commands/list.d.ts +1 -1
  9. package/commands/list.js +4 -10
  10. package/commands/list.js.map +1 -1
  11. package/commands/quote.d.ts +1 -1
  12. package/commands/quote.js +2 -8
  13. package/commands/quote.js.map +1 -1
  14. package/commands/toolbar.js +2 -8
  15. package/commands/toolbar.js.map +1 -1
  16. package/commands/typography.d.ts +8 -0
  17. package/commands/typography.js +4 -0
  18. package/commands/typography.js.map +1 -0
  19. package/components/Editor/EnsureHeadingTagPlugin.js +10 -16
  20. package/components/Editor/EnsureHeadingTagPlugin.js.map +1 -1
  21. package/components/Editor/RichTextEditor.d.ts +12 -8
  22. package/components/Editor/RichTextEditor.js +89 -102
  23. package/components/Editor/RichTextEditor.js.map +1 -1
  24. package/components/Editor/normalizeInputValue.d.ts +1 -1
  25. package/components/Editor/normalizeInputValue.js +2 -8
  26. package/components/Editor/normalizeInputValue.js.map +1 -1
  27. package/components/LexicalEditorConfig/LexicalEditorConfig.d.ts +14 -16
  28. package/components/LexicalEditorConfig/LexicalEditorConfig.js +21 -69
  29. package/components/LexicalEditorConfig/LexicalEditorConfig.js.map +1 -1
  30. package/components/LexicalEditorConfig/components/Node.d.ts +1 -1
  31. package/components/LexicalEditorConfig/components/Node.js +17 -26
  32. package/components/LexicalEditorConfig/components/Node.js.map +1 -1
  33. package/components/LexicalEditorConfig/components/Plugin.js +17 -26
  34. package/components/LexicalEditorConfig/components/Plugin.js.map +1 -1
  35. package/components/LexicalEditorConfig/components/ToolbarElement.js +17 -26
  36. package/components/LexicalEditorConfig/components/ToolbarElement.js.map +1 -1
  37. package/components/LexicalHtmlRenderer.d.ts +4 -7
  38. package/components/LexicalHtmlRenderer.js +35 -53
  39. package/components/LexicalHtmlRenderer.js.map +1 -1
  40. package/components/Toolbar/StaticToolbar.css +416 -0
  41. package/components/Toolbar/StaticToolbar.d.ts +3 -1
  42. package/components/Toolbar/StaticToolbar.js +19 -23
  43. package/components/Toolbar/StaticToolbar.js.map +1 -1
  44. package/components/ToolbarActions/BoldAction.js +16 -21
  45. package/components/ToolbarActions/BoldAction.js.map +1 -1
  46. package/components/ToolbarActions/BulletListAction.js +25 -31
  47. package/components/ToolbarActions/BulletListAction.js.map +1 -1
  48. package/components/ToolbarActions/CodeHighlightAction.js +16 -21
  49. package/components/ToolbarActions/CodeHighlightAction.js.map +1 -1
  50. package/components/ToolbarActions/FontColorAction.js +32 -42
  51. package/components/ToolbarActions/FontColorAction.js.map +1 -1
  52. package/components/ToolbarActions/ImageAction.js +19 -34
  53. package/components/ToolbarActions/ImageAction.js.map +1 -1
  54. package/components/ToolbarActions/ItalicAction.js +16 -21
  55. package/components/ToolbarActions/ItalicAction.js.map +1 -1
  56. package/components/ToolbarActions/LinkAction.js +19 -24
  57. package/components/ToolbarActions/LinkAction.js.map +1 -1
  58. package/components/ToolbarActions/NumberedListAction.js +25 -36
  59. package/components/ToolbarActions/NumberedListAction.js.map +1 -1
  60. package/components/ToolbarActions/QuoteAction.js +20 -25
  61. package/components/ToolbarActions/QuoteAction.js.map +1 -1
  62. package/components/ToolbarActions/TextAlignmentAction.js +36 -45
  63. package/components/ToolbarActions/TextAlignmentAction.js.map +1 -1
  64. package/components/ToolbarActions/TypographyAction.js +57 -79
  65. package/components/ToolbarActions/TypographyAction.js.map +1 -1
  66. package/components/ToolbarActions/UnderlineAction.js +16 -21
  67. package/components/ToolbarActions/UnderlineAction.js.map +1 -1
  68. package/context/FontColorActionContext.js +2 -9
  69. package/context/FontColorActionContext.js.map +1 -1
  70. package/context/RichTextEditorContext.d.ts +6 -7
  71. package/context/RichTextEditorContext.js +28 -26
  72. package/context/RichTextEditorContext.js.map +1 -1
  73. package/context/SharedHistoryContext.d.ts +2 -2
  74. package/context/SharedHistoryContext.js +12 -20
  75. package/context/SharedHistoryContext.js.map +1 -1
  76. package/context/TextAlignmentActionContextProps.d.ts +1 -1
  77. package/context/TextAlignmentActionContextProps.js +2 -9
  78. package/context/TextAlignmentActionContextProps.js.map +1 -1
  79. package/context/TypographyActionContext.d.ts +3 -2
  80. package/context/TypographyActionContext.js +2 -9
  81. package/context/TypographyActionContext.js.map +1 -1
  82. package/exports/admin/lexical.d.ts +15 -0
  83. package/exports/admin/lexical.js +23 -0
  84. package/exports/admin/lexical.js.map +1 -0
  85. package/hooks/index.d.ts +7 -8
  86. package/hooks/index.js +7 -93
  87. package/hooks/index.js.map +1 -1
  88. package/hooks/useCurrentElement.d.ts +3 -3
  89. package/hooks/useCurrentElement.js +11 -18
  90. package/hooks/useCurrentElement.js.map +1 -1
  91. package/hooks/useCurrentSelection.d.ts +2 -1
  92. package/hooks/useCurrentSelection.js +27 -40
  93. package/hooks/useCurrentSelection.js.map +1 -1
  94. package/hooks/useFontColorPicker.d.ts +1 -1
  95. package/hooks/useFontColorPicker.js +5 -11
  96. package/hooks/useFontColorPicker.js.map +1 -1
  97. package/hooks/useIsMounted.js +6 -14
  98. package/hooks/useIsMounted.js.map +1 -1
  99. package/hooks/useRichTextEditor.d.ts +1 -1
  100. package/hooks/useRichTextEditor.js +5 -11
  101. package/hooks/useRichTextEditor.js.map +1 -1
  102. package/hooks/useTextAlignmentAction.d.ts +1 -1
  103. package/hooks/useTextAlignmentAction.js +5 -11
  104. package/hooks/useTextAlignmentAction.js.map +1 -1
  105. package/hooks/useTypographyAction.d.ts +1 -1
  106. package/hooks/useTypographyAction.js +5 -11
  107. package/hooks/useTypographyAction.js.map +1 -1
  108. package/index.d.ts +33 -38
  109. package/index.js +44 -322
  110. package/index.js.map +1 -1
  111. package/package.json +18 -22
  112. package/plugins/BlurEventPlugin/BlurEventPlugin.d.ts +2 -2
  113. package/plugins/BlurEventPlugin/BlurEventPlugin.js +16 -22
  114. package/plugins/BlurEventPlugin/BlurEventPlugin.js.map +1 -1
  115. package/plugins/CodeHighlightPlugin/CodeHighlightPlugin.js +9 -14
  116. package/plugins/CodeHighlightPlugin/CodeHighlightPlugin.js.map +1 -1
  117. package/plugins/CodeHighlightPlugin/index.d.ts +1 -1
  118. package/plugins/CodeHighlightPlugin/index.js +1 -16
  119. package/plugins/CodeHighlightPlugin/index.js.map +1 -1
  120. package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditor.d.ts +10 -0
  121. package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditor.js +28 -0
  122. package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditor.js.map +1 -0
  123. package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorController.d.ts +7 -0
  124. package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorController.js +61 -0
  125. package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorController.js.map +1 -0
  126. package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.css +2 -136
  127. package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.d.ts +4 -16
  128. package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.js +7 -180
  129. package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.js.map +1 -1
  130. package/plugins/FloatingLinkEditorPlugin/index.d.ts +1 -1
  131. package/plugins/FloatingLinkEditorPlugin/index.js +1 -16
  132. package/plugins/FloatingLinkEditorPlugin/index.js.map +1 -1
  133. package/plugins/FloatingLinkEditorPlugin/isChildOfLinkEditor.js +3 -9
  134. package/plugins/FloatingLinkEditorPlugin/isChildOfLinkEditor.js.map +1 -1
  135. package/plugins/FloatingLinkEditorPlugin/types.d.ts +10 -0
  136. package/plugins/FloatingLinkEditorPlugin/types.js +3 -0
  137. package/plugins/FloatingLinkEditorPlugin/types.js.map +1 -0
  138. package/plugins/FloatingLinkEditorPlugin/useFloatingLinkEditor.d.ts +8 -2
  139. package/plugins/FloatingLinkEditorPlugin/useFloatingLinkEditor.js +120 -88
  140. package/plugins/FloatingLinkEditorPlugin/useFloatingLinkEditor.js.map +1 -1
  141. package/plugins/FontColorPlugin/FontColorPlugin.js +19 -22
  142. package/plugins/FontColorPlugin/FontColorPlugin.js.map +1 -1
  143. package/plugins/FontColorPlugin/applyColorToNode.d.ts +2 -2
  144. package/plugins/FontColorPlugin/applyColorToNode.js +4 -10
  145. package/plugins/FontColorPlugin/applyColorToNode.js.map +1 -1
  146. package/plugins/FontColorPlugin/applyColorToSelection.d.ts +2 -2
  147. package/plugins/FontColorPlugin/applyColorToSelection.js +28 -44
  148. package/plugins/FontColorPlugin/applyColorToSelection.js.map +1 -1
  149. package/plugins/ImagesPlugin/ImagesPlugin.d.ts +1 -2
  150. package/plugins/ImagesPlugin/ImagesPlugin.js +58 -60
  151. package/plugins/ImagesPlugin/ImagesPlugin.js.map +1 -1
  152. package/plugins/LinkPlugin/LinkPlugin.js +29 -37
  153. package/plugins/LinkPlugin/LinkPlugin.js.map +1 -1
  154. package/plugins/ListPLugin/ListPlugin.js +52 -15
  155. package/plugins/ListPLugin/ListPlugin.js.map +1 -1
  156. package/plugins/QuoteNodePlugin/QuoteNodePlugin.js +19 -16
  157. package/plugins/QuoteNodePlugin/QuoteNodePlugin.js.map +1 -1
  158. package/plugins/StateHandlingPlugin.d.ts +1 -1
  159. package/plugins/StateHandlingPlugin.js +32 -39
  160. package/plugins/StateHandlingPlugin.js.map +1 -1
  161. package/plugins/TypographyPlugin/TypographyPlugin.js +17 -21
  162. package/plugins/TypographyPlugin/TypographyPlugin.js.map +1 -1
  163. package/types.d.ts +4 -4
  164. package/types.js +6 -38
  165. package/types.js.map +1 -1
  166. package/ui/ContentEditable.d.ts +0 -1
  167. package/ui/ContentEditable.js +7 -14
  168. package/ui/ContentEditable.js.map +1 -1
  169. package/ui/Divider.d.ts +0 -1
  170. package/ui/Divider.js +3 -10
  171. package/ui/Divider.js.map +1 -1
  172. package/ui/DropDown.d.ts +1 -1
  173. package/ui/DropDown.js +64 -90
  174. package/ui/DropDown.js.map +1 -1
  175. package/ui/ImageResizer.d.ts +0 -1
  176. package/ui/ImageResizer.js +78 -83
  177. package/ui/ImageResizer.js.map +1 -1
  178. package/ui/LinkPreview.d.ts +0 -1
  179. package/ui/LinkPreview.js +22 -29
  180. package/ui/LinkPreview.js.map +1 -1
  181. package/ui/Placeholder.d.ts +1 -1
  182. package/ui/Placeholder.js +10 -16
  183. package/ui/Placeholder.js.map +1 -1
  184. package/ui/TextInput.d.ts +0 -1
  185. package/ui/TextInput.js +11 -18
  186. package/ui/TextInput.js.map +1 -1
  187. package/ui/ToolbarActionDialog.js +30 -42
  188. package/ui/ToolbarActionDialog.js.map +1 -1
  189. package/utils/canUseDOM.js +1 -7
  190. package/utils/canUseDOM.js.map +1 -1
  191. package/utils/files.d.ts +6 -6
  192. package/utils/files.js +5 -32
  193. package/utils/files.js.map +1 -1
  194. package/utils/getDOMRangeRect.js +4 -10
  195. package/utils/getDOMRangeRect.js.map +1 -1
  196. package/utils/getSelectedNode.d.ts +1 -1
  197. package/utils/getSelectedNode.js +9 -16
  198. package/utils/getSelectedNode.js.map +1 -1
  199. package/utils/getTransparentImage.js +1 -7
  200. package/utils/getTransparentImage.js.map +1 -1
  201. package/utils/insertImage.d.ts +1 -1
  202. package/utils/insertImage.js +8 -14
  203. package/utils/insertImage.js.map +1 -1
  204. package/utils/isAnchorLink.js +1 -7
  205. package/utils/isAnchorLink.js.map +1 -1
  206. package/utils/isChildOfFloatingToolbar.js +3 -12
  207. package/utils/isChildOfFloatingToolbar.js.map +1 -1
  208. package/utils/isHTMLElement.js +1 -7
  209. package/utils/isHTMLElement.js.map +1 -1
  210. package/utils/isValidJSON.js +3 -9
  211. package/utils/isValidJSON.js.map +1 -1
  212. package/utils/isValidLexicalData.d.ts +3 -3
  213. package/utils/isValidLexicalData.js +6 -12
  214. package/utils/isValidLexicalData.js.map +1 -1
  215. package/utils/point.js +35 -60
  216. package/utils/point.js.map +1 -1
  217. package/utils/rect.d.ts +1 -1
  218. package/utils/rect.js +115 -149
  219. package/utils/rect.js.map +1 -1
  220. package/utils/sanitizeUrl.js +6 -13
  221. package/utils/sanitizeUrl.js.map +1 -1
  222. package/utils/setFloatingElemPosition.d.ts +1 -1
  223. package/utils/setFloatingElemPosition.js +24 -30
  224. package/utils/setFloatingElemPosition.js.map +1 -1
  225. package/components/Editor/HeadingEditor.d.ts +0 -7
  226. package/components/Editor/HeadingEditor.js +0 -30
  227. package/components/Editor/HeadingEditor.js.map +0 -1
  228. package/components/Editor/ParagraphEditor.d.ts +0 -7
  229. package/components/Editor/ParagraphEditor.js +0 -29
  230. package/components/Editor/ParagraphEditor.js.map +0 -1
  231. package/components/Toolbar/Toolbar.css +0 -643
  232. package/components/Toolbar/Toolbar.d.ts +0 -11
  233. package/components/Toolbar/Toolbar.js +0 -165
  234. package/components/Toolbar/Toolbar.js.map +0 -1
  235. package/components/ToolbarActions/FontSizeAction.d.ts +0 -14
  236. package/components/ToolbarActions/FontSizeAction.js +0 -109
  237. package/components/ToolbarActions/FontSizeAction.js.map +0 -1
  238. package/hooks/useList.d.ts +0 -2
  239. package/hooks/useList.js +0 -54
  240. package/hooks/useList.js.map +0 -1
  241. package/hooks/useQuote.d.ts +0 -2
  242. package/hooks/useQuote.js +0 -22
  243. package/hooks/useQuote.js.map +0 -1
  244. package/plugins/FloatingLinkEditorPlugin/LinkEditForm.d.ts +0 -9
  245. package/plugins/FloatingLinkEditorPlugin/LinkEditForm.js +0 -118
  246. package/plugins/FloatingLinkEditorPlugin/LinkEditForm.js.map +0 -1
  247. package/plugins/FloatingLinkEditorPlugin/LinkPreviewForm.d.ts +0 -9
  248. package/plugins/FloatingLinkEditorPlugin/LinkPreviewForm.js +0 -44
  249. package/plugins/FloatingLinkEditorPlugin/LinkPreviewForm.js.map +0 -1
  250. package/utils/generateInitialLexicalValue.d.ts +0 -4
  251. package/utils/generateInitialLexicalValue.js +0 -33
  252. package/utils/generateInitialLexicalValue.js.map +0 -1
@@ -1,96 +1,128 @@
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.useFloatingLinkEditor = useFloatingLinkEditor;
9
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
- var _react = _interopRequireWildcard(require("react"));
11
- var _reactDom = require("react-dom");
12
- var _hooks = require("../../hooks");
13
- var _getSelectedNode = require("../../utils/getSelectedNode");
14
- var _lexicalNodes = require("@webiny/lexical-nodes");
15
- var _isChildOfLinkEditor = require("./isChildOfLinkEditor");
16
- var _lexical = require("lexical");
17
- var _utils = require("@lexical/utils");
18
- var _FloatingLinkEditorPlugin = require("./FloatingLinkEditorPlugin");
19
- var _commands = require("../../commands");
20
- var isLink = function isLink(selection) {
21
- if (!(0, _lexical.$isRangeSelection)(selection)) {
22
- return;
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ import { SELECTION_CHANGE_COMMAND, COMMAND_PRIORITY_LOW, $getSelection, $isRangeSelection, mergeRegister } from "lexical";
3
+ import { $isLinkNode, TOGGLE_LINK_COMMAND } from "@webiny/lexical-nodes";
4
+ import { getSelectedNode } from "../../utils/getSelectedNode.js";
5
+ import { setFloatingElemPosition } from "../../utils/setFloatingElemPosition.js";
6
+ import { sanitizeUrl } from "../../utils/sanitizeUrl.js";
7
+ const emptyLinkData = {
8
+ url: "",
9
+ target: null,
10
+ alt: null
11
+ };
12
+ function getSelectionKey(selection) {
13
+ if ($isRangeSelection(selection)) {
14
+ return `${selection.anchor.key}:${selection.anchor.offset}-${selection.focus.key}:${selection.focus.offset}`;
23
15
  }
24
- var node = (0, _getSelectedNode.getSelectedNode)(selection);
25
- var linkParent = (0, _utils.$findMatchingParent)(node, _lexicalNodes.$isLinkNode);
26
- var autoLinkParent = (0, _utils.$findMatchingParent)(node, _lexicalNodes.$isAutoLinkNode);
27
- var isLinkOrChildOfLink = Boolean((0, _lexicalNodes.$isLinkNode)(node) || linkParent);
28
- if (!isLinkOrChildOfLink) {
29
- return false;
16
+ return null;
17
+ }
18
+ function getLinkDataFromSelection() {
19
+ const selection = $getSelection();
20
+ if (!$isRangeSelection(selection)) {
21
+ return emptyLinkData;
30
22
  }
31
- return linkParent !== null && autoLinkParent == null;
32
- };
33
- var isSelectionCollapsed = function isSelectionCollapsed(selection) {
34
- return (0, _lexical.$isRangeSelection)(selection) && selection.isCollapsed();
35
- };
36
- var isLinkFocused = function isLinkFocused(selection) {
37
- return isLink(selection) && isSelectionCollapsed(selection);
38
- };
39
- var isLinkSelected = function isLinkSelected(selection) {
40
- return isLink(selection) && !isSelectionCollapsed(selection);
41
- };
42
- function useFloatingLinkEditor(anchorElem) {
43
- var _useRichTextEditor = (0, _hooks.useRichTextEditor)(),
44
- editor = _useRichTextEditor.editor;
45
- var _useState = (0, _react.useState)(false),
46
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
47
- isLinkEditorVisible = _useState2[0],
48
- setShowLinkEditor = _useState2[1];
49
- var newLinkRef = (0, _react.useRef)(false);
50
- var showLinkEditor = function showLinkEditor(state) {
51
- setShowLinkEditor(state);
52
- if (!state) {
53
- newLinkRef.current = false;
54
- }
55
- };
56
- (0, _react.useEffect)(function () {
57
- return (0, _utils.mergeRegister)(editor.registerCommand(_lexical.SELECTION_CHANGE_COMMAND, function () {
58
- var selection = (0, _lexical.$getSelection)();
59
- if (isLinkFocused(selection)) {
60
- showLinkEditor(true);
61
- return false;
62
- }
63
- if (isLinkSelected(selection) && newLinkRef.current) {
64
- return false;
65
- }
66
- if (isLinkSelected(selection) && !newLinkRef.current) {
67
- showLinkEditor(false);
68
- return false;
69
- }
70
- showLinkEditor(false);
71
- return false;
72
- }, _lexical.COMMAND_PRIORITY_LOW), editor.registerCommand(_lexical.BLUR_COMMAND, function (payload) {
73
- if (!(0, _isChildOfLinkEditor.isChildOfLinkEditor)(payload.relatedTarget)) {
74
- showLinkEditor(false);
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()
30
+ };
31
+ }
32
+ if ($isLinkNode(node)) {
33
+ return {
34
+ url: node.getURL(),
35
+ target: node.getTarget(),
36
+ alt: node.getAlt()
37
+ };
38
+ }
39
+ return emptyLinkData;
40
+ }
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) {
53
+ const editorElem = editorRef.current;
54
+ if (editorElem) {
55
+ setFloatingElemPosition(null, editorElem);
56
+ }
57
+ setLastSelection(null);
58
+ setLinkData(emptyLinkData);
59
+ return true;
75
60
  }
76
- return false;
77
- }, _lexical.COMMAND_PRIORITY_LOW), editor.registerCommand(_lexicalNodes.TOGGLE_LINK_COMMAND, function (payload) {
78
- var addLink = !!payload;
79
- if (addLink) {
80
- newLinkRef.current = true;
81
- showLinkEditor(true);
82
- editor.dispatchCommand(_commands.HIDE_FLOATING_TOOLBAR, {});
83
- } else {
84
- showLinkEditor(false);
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);
85
79
  }
86
- return false;
87
- }, _lexical.COMMAND_PRIORITY_CRITICAL));
80
+ setLastSelection(null);
81
+ setLinkData(emptyLinkData);
82
+ }
83
+ return true;
84
+ }, [editor]);
85
+ const removeLink = useCallback(() => {
86
+ editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);
88
87
  }, [editor]);
89
- return /*#__PURE__*/(0, _reactDom.createPortal)(/*#__PURE__*/_react.default.createElement(_FloatingLinkEditorPlugin.FloatingLinkEditor, {
90
- isVisible: isLinkEditorVisible,
91
- editor: editor,
92
- anchorElem: anchorElem
93
- }), anchorElem);
88
+ const applyChanges = useCallback(linkData => {
89
+ const confirmedLinkData = {
90
+ url: sanitizeUrl(linkData.url),
91
+ target: linkData.target,
92
+ alt: linkData.alt
93
+ };
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
+ };
94
126
  }
95
127
 
96
128
  //# sourceMappingURL=useFloatingLinkEditor.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_reactDom","_hooks","_getSelectedNode","_lexicalNodes","_isChildOfLinkEditor","_lexical","_utils","_FloatingLinkEditorPlugin","_commands","isLink","selection","$isRangeSelection","node","getSelectedNode","linkParent","$findMatchingParent","$isLinkNode","autoLinkParent","$isAutoLinkNode","isLinkOrChildOfLink","Boolean","isSelectionCollapsed","isCollapsed","isLinkFocused","isLinkSelected","useFloatingLinkEditor","anchorElem","_useRichTextEditor","useRichTextEditor","editor","_useState","useState","_useState2","_slicedToArray2","default","isLinkEditorVisible","setShowLinkEditor","newLinkRef","useRef","showLinkEditor","state","current","useEffect","mergeRegister","registerCommand","SELECTION_CHANGE_COMMAND","$getSelection","COMMAND_PRIORITY_LOW","BLUR_COMMAND","payload","isChildOfLinkEditor","relatedTarget","TOGGLE_LINK_COMMAND","addLink","dispatchCommand","HIDE_FLOATING_TOOLBAR","COMMAND_PRIORITY_CRITICAL","createPortal","createElement","FloatingLinkEditor","isVisible"],"sources":["useFloatingLinkEditor.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useRichTextEditor } from \"~/hooks\";\nimport { getSelectedNode } from \"~/utils/getSelectedNode\";\nimport { BaseSelection } from \"lexical\";\nimport { $isAutoLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from \"@webiny/lexical-nodes\";\nimport { isChildOfLinkEditor } from \"~/plugins/FloatingLinkEditorPlugin/isChildOfLinkEditor\";\nimport {\n $getSelection,\n $isRangeSelection,\n BLUR_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_LOW,\n SELECTION_CHANGE_COMMAND\n} from \"lexical\";\nimport { $findMatchingParent, mergeRegister } from \"@lexical/utils\";\nimport { FloatingLinkEditor } from \"./FloatingLinkEditorPlugin\";\nimport { HIDE_FLOATING_TOOLBAR } from \"~/commands\";\n\nconst isLink = (selection: BaseSelection | null) => {\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 return false;\n }\n\n return linkParent !== null && autoLinkParent == null;\n};\n\nconst isSelectionCollapsed = (selection: BaseSelection | null) => {\n return $isRangeSelection(selection) && selection.isCollapsed();\n};\n\nconst isLinkFocused = (selection: BaseSelection | null) => {\n return isLink(selection) && isSelectionCollapsed(selection);\n};\n\nconst isLinkSelected = (selection: BaseSelection | null) => {\n return isLink(selection) && !isSelectionCollapsed(selection);\n};\n\nexport function useFloatingLinkEditor(anchorElem: HTMLElement): JSX.Element | null {\n const { editor } = useRichTextEditor();\n const [isLinkEditorVisible, setShowLinkEditor] = useState(false);\n const newLinkRef = useRef(false);\n\n const showLinkEditor = (state: boolean) => {\n setShowLinkEditor(state);\n if (!state) {\n newLinkRef.current = false;\n }\n };\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n const selection = $getSelection();\n\n if (isLinkFocused(selection)) {\n showLinkEditor(true);\n return false;\n }\n\n if (isLinkSelected(selection) && newLinkRef.current) {\n return false;\n }\n\n if (isLinkSelected(selection) && !newLinkRef.current) {\n showLinkEditor(false);\n return false;\n }\n\n showLinkEditor(false);\n\n return false;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(\n BLUR_COMMAND,\n payload => {\n if (!isChildOfLinkEditor(payload.relatedTarget as HTMLElement)) {\n showLinkEditor(false);\n }\n\n return false;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(\n TOGGLE_LINK_COMMAND,\n payload => {\n const addLink = !!payload;\n\n if (addLink) {\n newLinkRef.current = true;\n showLinkEditor(true);\n editor.dispatchCommand(HIDE_FLOATING_TOOLBAR, {});\n } else {\n showLinkEditor(false);\n }\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n )\n );\n }, [editor]);\n\n return createPortal(\n <FloatingLinkEditor\n isVisible={isLinkEditorVisible}\n editor={editor}\n anchorElem={anchorElem}\n />,\n anchorElem\n );\n}\n"],"mappings":"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","ignoreList":[]}
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,28 +1,25 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.FontColorPlugin = void 0;
7
- var _react = require("react");
8
- var _lexical = require("lexical");
9
- var _lexicalNodes = require("@webiny/lexical-nodes");
10
- var _hooks = require("../../hooks");
11
- var _applyColorToSelection = require("./applyColorToSelection");
12
- var FontColorPlugin = exports.FontColorPlugin = function FontColorPlugin() {
13
- var _useRichTextEditor = (0, _hooks.useRichTextEditor)(),
14
- editor = _useRichTextEditor.editor;
15
- (0, _react.useEffect)(function () {
16
- return editor.registerCommand(_lexicalNodes.ADD_FONT_COLOR_COMMAND, function (payload) {
17
- editor.update(function () {
18
- var color = payload.color;
19
- var selection = (0, _lexical.$getSelection)();
20
- if ((0, _lexical.$isRangeSelection)(selection)) {
21
- (0, _applyColorToSelection.applyColorToSelection)(selection, color);
1
+ import { useEffect } from "react";
2
+ import { $getSelection, $isRangeSelection, COMMAND_PRIORITY_EDITOR } from "lexical";
3
+ import { ADD_FONT_COLOR_COMMAND } from "@webiny/lexical-nodes";
4
+ import { useRichTextEditor } from "../../hooks/index.js";
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);
22
19
  }
23
20
  });
24
21
  return true;
25
- }, _lexical.COMMAND_PRIORITY_EDITOR);
22
+ }, COMMAND_PRIORITY_EDITOR);
26
23
  }, [editor]);
27
24
  return null;
28
25
  };
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_lexical","_lexicalNodes","_hooks","_applyColorToSelection","FontColorPlugin","exports","_useRichTextEditor","useRichTextEditor","editor","useEffect","registerCommand","ADD_FONT_COLOR_COMMAND","payload","update","color","selection","$getSelection","$isRangeSelection","applyColorToSelection","COMMAND_PRIORITY_EDITOR"],"sources":["FontColorPlugin.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport { $getSelection, $isRangeSelection, COMMAND_PRIORITY_EDITOR } from \"lexical\";\nimport { ADD_FONT_COLOR_COMMAND, FontColorPayload } from \"@webiny/lexical-nodes\";\nimport { useRichTextEditor } from \"~/hooks\";\nimport { applyColorToSelection } from \"./applyColorToSelection\";\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,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AACA,IAAAE,aAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AACA,IAAAI,sBAAA,GAAAJ,OAAA;AAEO,IAAMK,eAAe,GAAAC,OAAA,CAAAD,eAAA,GAAG,SAAlBA,eAAeA,CAAA,EAAS;EACjC,IAAAE,kBAAA,GAAmB,IAAAC,wBAAiB,EAAC,CAAC;IAA9BC,MAAM,GAAAF,kBAAA,CAANE,MAAM;EAEd,IAAAC,gBAAS,EAAC,YAAM;IACZ,OAAOD,MAAM,CAACE,eAAe,CACzBC,oCAAsB,EACtB,UAAAC,OAAO,EAAI;MACPJ,MAAM,CAACK,MAAM,CAAC,YAAM;QAChB,IAAQC,KAAK,GAAKF,OAAO,CAAjBE,KAAK;QACb,IAAMC,SAAS,GAAG,IAAAC,sBAAa,EAAC,CAAC;QAEjC,IAAI,IAAAC,0BAAiB,EAACF,SAAS,CAAC,EAAE;UAC9B,IAAAG,4CAAqB,EAACH,SAAS,EAAED,KAAK,CAAC;QAC3C;MACJ,CAAC,CAAC;MACF,OAAO,IAAI;IACf,CAAC,EACDK,gCACJ,CAAC;EACL,CAAC,EAAE,CAACX,MAAM,CAAC,CAAC;EAEZ,OAAO,IAAI;AACf,CAAC","ignoreList":[]}
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,3 +1,3 @@
1
- import { TextNode } from "lexical";
2
- import { ThemeColorValue } from "@webiny/lexical-nodes";
1
+ import type { TextNode } from "lexical";
2
+ import type { ThemeColorValue } from "@webiny/lexical-nodes";
3
3
  export declare function applyColorToNode(textNode: TextNode, color: ThemeColorValue): import("@webiny/lexical-nodes").FontColorNode;
@@ -1,13 +1,7 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.applyColorToNode = applyColorToNode;
7
- var _lexicalNodes = require("@webiny/lexical-nodes");
8
- function applyColorToNode(textNode, color) {
9
- var fontColorNode = (0, _lexicalNodes.$createFontColorNode)(textNode.getTextContent(), color);
10
- (0, _lexicalNodes.$applyStylesToNode)(fontColorNode, textNode);
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);
11
5
  return textNode.replace(fontColorNode);
12
6
  }
13
7
 
@@ -1 +1 @@
1
- {"version":3,"names":["_lexicalNodes","require","applyColorToNode","textNode","color","fontColorNode","$createFontColorNode","getTextContent","$applyStylesToNode","replace"],"sources":["applyColorToNode.ts"],"sourcesContent":["import { TextNode } from \"lexical\";\nimport { $applyStylesToNode, $createFontColorNode, ThemeColorValue } 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":";;;;;;AACA,IAAAA,aAAA,GAAAC,OAAA;AAEO,SAASC,gBAAgBA,CAACC,QAAkB,EAAEC,KAAsB,EAAE;EACzE,IAAMC,aAAa,GAAG,IAAAC,kCAAoB,EAACH,QAAQ,CAACI,cAAc,CAAC,CAAC,EAAEH,KAAK,CAAC;EAC5E,IAAAI,gCAAkB,EAACH,aAAa,EAAEF,QAAQ,CAAC;EAE3C,OAAOA,QAAQ,CAACM,OAAO,CAACJ,aAAa,CAAC;AAC1C","ignoreList":[]}
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,3 +1,3 @@
1
- import { RangeSelection } from "lexical";
2
- import { ThemeColorValue } from "@webiny/lexical-nodes";
1
+ import type { RangeSelection } from "lexical";
2
+ import type { ThemeColorValue } from "@webiny/lexical-nodes";
3
3
  export declare function applyColorToSelection(selection: RangeSelection, color: ThemeColorValue): void;
@@ -1,36 +1,24 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.applyColorToSelection = applyColorToSelection;
8
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
- var _lexical = require("lexical");
10
- var _applyColorToNode = require("./applyColorToNode");
11
- function applyColorToSelection(selection, color) {
1
+ import { TextNode } from "lexical";
2
+ import { applyColorToNode } from "./applyColorToNode.js";
3
+ export function applyColorToSelection(selection, color) {
12
4
  // Basic variables
13
- var textNodes = selection.getNodes().filter(function (node) {
14
- return node instanceof _lexical.TextNode;
15
- });
16
- var selectedTextNodesLength = textNodes.length;
17
- var startEndPoints = selection.getStartEndPoints();
5
+ const textNodes = selection.getNodes().filter(node => node instanceof TextNode);
6
+ const selectedTextNodesLength = textNodes.length;
7
+ const startEndPoints = selection.getStartEndPoints();
18
8
  if (startEndPoints === null) {
19
9
  return;
20
10
  }
21
- var _startEndPoints = (0, _slicedToArray2.default)(startEndPoints, 2),
22
- anchor = _startEndPoints[0],
23
- focus = _startEndPoints[1];
24
- var lastIndex = selectedTextNodesLength - 1;
25
- var firstNode = textNodes[0];
26
- var lastNode = textNodes[lastIndex];
27
- var firstNodeText = firstNode.getTextContent();
28
- var firstNodeTextLength = firstNodeText.length;
29
- var focusOffset = focus.offset;
30
- var anchorOffset = anchor.offset;
31
- var isBefore = anchor.isBefore(focus);
32
- var startOffset = isBefore ? anchorOffset : focusOffset;
33
- var endOffset = isBefore ? focusOffset : anchorOffset;
11
+ const [anchor, focus] = startEndPoints;
12
+ const lastIndex = selectedTextNodesLength - 1;
13
+ const firstNode = textNodes[0];
14
+ const lastNode = textNodes[lastIndex];
15
+ const firstNodeText = firstNode.getTextContent();
16
+ const firstNodeTextLength = firstNodeText.length;
17
+ const focusOffset = focus.offset;
18
+ const anchorOffset = anchor.offset;
19
+ const isBefore = anchor.isBefore(focus);
20
+ const startOffset = isBefore ? anchorOffset : focusOffset;
21
+ const endOffset = isBefore ? focusOffset : anchorOffset;
34
22
 
35
23
  // No actual text is selected, so do nothing.
36
24
  if (startOffset === endOffset) {
@@ -41,41 +29,37 @@ function applyColorToSelection(selection, color) {
41
29
  if (selectedTextNodesLength === 1) {
42
30
  // The entire node is selected.
43
31
  if (startOffset === 0 && endOffset === firstNodeTextLength) {
44
- var _fontColorNode = (0, _applyColorToNode.applyColorToNode)(firstNode, color);
45
- _fontColorNode.select(startOffset, endOffset);
32
+ const fontColorNode = applyColorToNode(firstNode, color);
33
+ fontColorNode.select(startOffset, endOffset);
46
34
  return;
47
35
  }
48
36
 
49
37
  // The node is partially selected, so split it into two nodes and style the selected part.
50
- var splitNodes = firstNode.splitText(startOffset, endOffset);
51
- var replacement = startOffset === 0 ? splitNodes[0] : splitNodes[1];
52
- var fontColorNode = (0, _applyColorToNode.applyColorToNode)(replacement, color);
38
+ const splitNodes = firstNode.splitText(startOffset, endOffset);
39
+ const replacement = startOffset === 0 ? splitNodes[0] : splitNodes[1];
40
+ const fontColorNode = applyColorToNode(replacement, color);
53
41
  fontColorNode.select(0, endOffset - startOffset);
54
42
  return;
55
43
  }
56
44
 
57
45
  // Several nodes are selected.
58
- textNodes.forEach(function (textNode) {
46
+ textNodes.forEach(textNode => {
59
47
  // First node is partially selected.
60
48
  if (textNode === firstNode && startOffset > 0) {
61
- var _textNode$splitText = textNode.splitText(startOffset),
62
- _textNode$splitText2 = (0, _slicedToArray2.default)(_textNode$splitText, 2),
63
- toColor = _textNode$splitText2[1];
64
- (0, _applyColorToNode.applyColorToNode)(toColor, color);
49
+ const [, toColor] = textNode.splitText(startOffset);
50
+ applyColorToNode(toColor, color);
65
51
  return;
66
52
  }
67
53
 
68
54
  // Last node is partially selected.
69
55
  if (textNode === lastNode && lastNode.getTextContent().length !== endOffset) {
70
- var _textNode$splitText3 = textNode.splitText(endOffset),
71
- _textNode$splitText4 = (0, _slicedToArray2.default)(_textNode$splitText3, 1),
72
- _toColor = _textNode$splitText4[0];
73
- (0, _applyColorToNode.applyColorToNode)(_toColor, color);
56
+ const [toColor] = textNode.splitText(endOffset);
57
+ applyColorToNode(toColor, color);
74
58
  return;
75
59
  }
76
60
 
77
61
  // Colorize the whole node.
78
- (0, _applyColorToNode.applyColorToNode)(textNode, color);
62
+ applyColorToNode(textNode, color);
79
63
  });
80
64
  }
81
65
 
@@ -1 +1 @@
1
- {"version":3,"names":["_lexical","require","_applyColorToNode","applyColorToSelection","selection","color","textNodes","getNodes","filter","node","TextNode","selectedTextNodesLength","length","startEndPoints","getStartEndPoints","_startEndPoints","_slicedToArray2","default","anchor","focus","lastIndex","firstNode","lastNode","firstNodeText","getTextContent","firstNodeTextLength","focusOffset","offset","anchorOffset","isBefore","startOffset","endOffset","fontColorNode","applyColorToNode","select","splitNodes","splitText","replacement","forEach","textNode","_textNode$splitText","_textNode$splitText2","toColor","_textNode$splitText3","_textNode$splitText4"],"sources":["applyColorToSelection.ts"],"sourcesContent":["import { RangeSelection, TextNode } from \"lexical\";\nimport { ThemeColorValue } from \"@webiny/lexical-nodes\";\nimport { applyColorToNode } from \"~/plugins/FontColorPlugin/applyColorToNode\";\n\nexport function applyColorToSelection(selection: RangeSelection, color: ThemeColorValue) {\n // Basic variables\n const textNodes = selection.getNodes().filter(node => node instanceof TextNode) as TextNode[];\n\n const selectedTextNodesLength = textNodes.length;\n const startEndPoints = selection.getStartEndPoints();\n\n if (startEndPoints === null) {\n return;\n }\n\n const [anchor, focus] = startEndPoints;\n\n const lastIndex = selectedTextNodesLength - 1;\n const firstNode = textNodes[0];\n const lastNode = textNodes[lastIndex];\n const firstNodeText = firstNode.getTextContent();\n const firstNodeTextLength = firstNodeText.length;\n const focusOffset = focus.offset;\n const anchorOffset = anchor.offset;\n const isBefore = anchor.isBefore(focus);\n const startOffset = isBefore ? anchorOffset : focusOffset;\n const endOffset = isBefore ? focusOffset : anchorOffset;\n\n // No actual text is selected, so do nothing.\n if (startOffset === endOffset) {\n return;\n }\n\n // Only one node is selected.\n if (selectedTextNodesLength === 1) {\n // The entire node is selected.\n if (startOffset === 0 && endOffset === firstNodeTextLength) {\n const fontColorNode = applyColorToNode(firstNode, color);\n fontColorNode.select(startOffset, endOffset);\n return;\n }\n\n // The node is partially selected, so split it into two nodes and style the selected part.\n const splitNodes = firstNode.splitText(startOffset, endOffset);\n const replacement = startOffset === 0 ? splitNodes[0] : splitNodes[1];\n const fontColorNode = applyColorToNode(replacement, color);\n fontColorNode.select(0, endOffset - startOffset);\n\n return;\n }\n\n // Several nodes are selected.\n textNodes.forEach(textNode => {\n // First node is partially selected.\n if (textNode === firstNode && startOffset > 0) {\n const [, toColor] = textNode.splitText(startOffset);\n applyColorToNode(toColor, color);\n\n return;\n }\n\n // Last node is partially selected.\n if (textNode === lastNode && lastNode.getTextContent().length !== endOffset) {\n const [toColor] = textNode.splitText(endOffset);\n applyColorToNode(toColor, color);\n return;\n }\n\n // Colorize the whole node.\n applyColorToNode(textNode, color);\n });\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["TextNode","applyColorToNode","applyColorToSelection","selection","color","textNodes","getNodes","filter","node","selectedTextNodesLength","length","startEndPoints","getStartEndPoints","anchor","focus","lastIndex","firstNode","lastNode","firstNodeText","getTextContent","firstNodeTextLength","focusOffset","offset","anchorOffset","isBefore","startOffset","endOffset","fontColorNode","select","splitNodes","splitText","replacement","forEach","textNode","toColor"],"sources":["applyColorToSelection.ts"],"sourcesContent":["import type { RangeSelection } from \"lexical\";\nimport { TextNode } from \"lexical\";\nimport type { ThemeColorValue } from \"@webiny/lexical-nodes\";\nimport { applyColorToNode } from \"~/plugins/FontColorPlugin/applyColorToNode.js\";\n\nexport function applyColorToSelection(selection: RangeSelection, color: ThemeColorValue) {\n // Basic variables\n const textNodes = selection.getNodes().filter(node => node instanceof TextNode) as TextNode[];\n\n const selectedTextNodesLength = textNodes.length;\n const startEndPoints = selection.getStartEndPoints();\n\n if (startEndPoints === null) {\n return;\n }\n\n const [anchor, focus] = startEndPoints;\n\n const lastIndex = selectedTextNodesLength - 1;\n const firstNode = textNodes[0];\n const lastNode = textNodes[lastIndex];\n const firstNodeText = firstNode.getTextContent();\n const firstNodeTextLength = firstNodeText.length;\n const focusOffset = focus.offset;\n const anchorOffset = anchor.offset;\n const isBefore = anchor.isBefore(focus);\n const startOffset = isBefore ? anchorOffset : focusOffset;\n const endOffset = isBefore ? focusOffset : anchorOffset;\n\n // No actual text is selected, so do nothing.\n if (startOffset === endOffset) {\n return;\n }\n\n // Only one node is selected.\n if (selectedTextNodesLength === 1) {\n // The entire node is selected.\n if (startOffset === 0 && endOffset === firstNodeTextLength) {\n const fontColorNode = applyColorToNode(firstNode, color);\n fontColorNode.select(startOffset, endOffset);\n return;\n }\n\n // The node is partially selected, so split it into two nodes and style the selected part.\n const splitNodes = firstNode.splitText(startOffset, endOffset);\n const replacement = startOffset === 0 ? splitNodes[0] : splitNodes[1];\n const fontColorNode = applyColorToNode(replacement, color);\n fontColorNode.select(0, endOffset - startOffset);\n\n return;\n }\n\n // Several nodes are selected.\n textNodes.forEach(textNode => {\n // First node is partially selected.\n if (textNode === firstNode && startOffset > 0) {\n const [, toColor] = textNode.splitText(startOffset);\n applyColorToNode(toColor, color);\n\n return;\n }\n\n // Last node is partially selected.\n if (textNode === lastNode && lastNode.getTextContent().length !== endOffset) {\n const [toColor] = textNode.splitText(endOffset);\n applyColorToNode(toColor, color);\n return;\n }\n\n // Colorize the whole node.\n applyColorToNode(textNode, color);\n });\n}\n"],"mappings":"AACA,SAASA,QAAQ,QAAQ,SAAS;AAElC,SAASC,gBAAgB;AAEzB,OAAO,SAASC,qBAAqBA,CAACC,SAAyB,EAAEC,KAAsB,EAAE;EACrF;EACA,MAAMC,SAAS,GAAGF,SAAS,CAACG,QAAQ,CAAC,CAAC,CAACC,MAAM,CAACC,IAAI,IAAIA,IAAI,YAAYR,QAAQ,CAAe;EAE7F,MAAMS,uBAAuB,GAAGJ,SAAS,CAACK,MAAM;EAChD,MAAMC,cAAc,GAAGR,SAAS,CAACS,iBAAiB,CAAC,CAAC;EAEpD,IAAID,cAAc,KAAK,IAAI,EAAE;IACzB;EACJ;EAEA,MAAM,CAACE,MAAM,EAAEC,KAAK,CAAC,GAAGH,cAAc;EAEtC,MAAMI,SAAS,GAAGN,uBAAuB,GAAG,CAAC;EAC7C,MAAMO,SAAS,GAAGX,SAAS,CAAC,CAAC,CAAC;EAC9B,MAAMY,QAAQ,GAAGZ,SAAS,CAACU,SAAS,CAAC;EACrC,MAAMG,aAAa,GAAGF,SAAS,CAACG,cAAc,CAAC,CAAC;EAChD,MAAMC,mBAAmB,GAAGF,aAAa,CAACR,MAAM;EAChD,MAAMW,WAAW,GAAGP,KAAK,CAACQ,MAAM;EAChC,MAAMC,YAAY,GAAGV,MAAM,CAACS,MAAM;EAClC,MAAME,QAAQ,GAAGX,MAAM,CAACW,QAAQ,CAACV,KAAK,CAAC;EACvC,MAAMW,WAAW,GAAGD,QAAQ,GAAGD,YAAY,GAAGF,WAAW;EACzD,MAAMK,SAAS,GAAGF,QAAQ,GAAGH,WAAW,GAAGE,YAAY;;EAEvD;EACA,IAAIE,WAAW,KAAKC,SAAS,EAAE;IAC3B;EACJ;;EAEA;EACA,IAAIjB,uBAAuB,KAAK,CAAC,EAAE;IAC/B;IACA,IAAIgB,WAAW,KAAK,CAAC,IAAIC,SAAS,KAAKN,mBAAmB,EAAE;MACxD,MAAMO,aAAa,GAAG1B,gBAAgB,CAACe,SAAS,EAAEZ,KAAK,CAAC;MACxDuB,aAAa,CAACC,MAAM,CAACH,WAAW,EAAEC,SAAS,CAAC;MAC5C;IACJ;;IAEA;IACA,MAAMG,UAAU,GAAGb,SAAS,CAACc,SAAS,CAACL,WAAW,EAAEC,SAAS,CAAC;IAC9D,MAAMK,WAAW,GAAGN,WAAW,KAAK,CAAC,GAAGI,UAAU,CAAC,CAAC,CAAC,GAAGA,UAAU,CAAC,CAAC,CAAC;IACrE,MAAMF,aAAa,GAAG1B,gBAAgB,CAAC8B,WAAW,EAAE3B,KAAK,CAAC;IAC1DuB,aAAa,CAACC,MAAM,CAAC,CAAC,EAAEF,SAAS,GAAGD,WAAW,CAAC;IAEhD;EACJ;;EAEA;EACApB,SAAS,CAAC2B,OAAO,CAACC,QAAQ,IAAI;IAC1B;IACA,IAAIA,QAAQ,KAAKjB,SAAS,IAAIS,WAAW,GAAG,CAAC,EAAE;MAC3C,MAAM,GAAGS,OAAO,CAAC,GAAGD,QAAQ,CAACH,SAAS,CAACL,WAAW,CAAC;MACnDxB,gBAAgB,CAACiC,OAAO,EAAE9B,KAAK,CAAC;MAEhC;IACJ;;IAEA;IACA,IAAI6B,QAAQ,KAAKhB,QAAQ,IAAIA,QAAQ,CAACE,cAAc,CAAC,CAAC,CAACT,MAAM,KAAKgB,SAAS,EAAE;MACzE,MAAM,CAACQ,OAAO,CAAC,GAAGD,QAAQ,CAACH,SAAS,CAACJ,SAAS,CAAC;MAC/CzB,gBAAgB,CAACiC,OAAO,EAAE9B,KAAK,CAAC;MAChC;IACJ;;IAEA;IACAH,gBAAgB,CAACgC,QAAQ,EAAE7B,KAAK,CAAC;EACrC,CAAC,CAAC;AACN","ignoreList":[]}
@@ -1,5 +1,4 @@
1
- /// <reference types="react" />
2
- import { ImagePayload } from "../../commands";
1
+ import type { ImagePayload } from "../../commands/index.js";
3
2
  export type InsertImagePayload = Readonly<ImagePayload>;
4
3
  export declare function ImagesPlugin({ captionsEnabled }: {
5
4
  captionsEnabled?: boolean;