@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.
- package/commands/image.js +2 -1
- package/commands/image.js.map +1 -1
- package/commands/index.js +0 -2
- package/commands/list.js +4 -3
- package/commands/list.js.map +1 -1
- package/commands/quote.js +2 -1
- package/commands/quote.js.map +1 -1
- package/commands/toolbar.js +2 -1
- package/commands/toolbar.js.map +1 -1
- package/commands/typography.js +2 -1
- package/commands/typography.js.map +1 -1
- package/components/Editor/EnsureHeadingTagPlugin.js +8 -15
- package/components/Editor/EnsureHeadingTagPlugin.js.map +1 -1
- package/components/Editor/RichTextEditor.js +82 -121
- package/components/Editor/RichTextEditor.js.map +1 -1
- package/components/Editor/normalizeInputValue.js +11 -13
- package/components/Editor/normalizeInputValue.js.map +1 -1
- package/components/LexicalEditorConfig/LexicalEditorConfig.js +24 -15
- package/components/LexicalEditorConfig/LexicalEditorConfig.js.map +1 -1
- package/components/LexicalEditorConfig/components/Node.js +21 -26
- package/components/LexicalEditorConfig/components/Node.js.map +1 -1
- package/components/LexicalEditorConfig/components/Plugin.js +21 -26
- package/components/LexicalEditorConfig/components/Plugin.js.map +1 -1
- package/components/LexicalEditorConfig/components/ToolbarElement.js +21 -26
- package/components/LexicalEditorConfig/components/ToolbarElement.js.map +1 -1
- package/components/LexicalHtmlRenderer.js +35 -40
- package/components/LexicalHtmlRenderer.js.map +1 -1
- package/components/Toolbar/StaticToolbar.js +11 -16
- package/components/Toolbar/StaticToolbar.js.map +1 -1
- package/components/ToolbarActions/BoldAction.js +16 -19
- package/components/ToolbarActions/BoldAction.js.map +1 -1
- package/components/ToolbarActions/BulletListAction.js +24 -32
- package/components/ToolbarActions/BulletListAction.js.map +1 -1
- package/components/ToolbarActions/CodeHighlightAction.js +16 -19
- package/components/ToolbarActions/CodeHighlightAction.js.map +1 -1
- package/components/ToolbarActions/FontColorAction.js +32 -38
- package/components/ToolbarActions/FontColorAction.js.map +1 -1
- package/components/ToolbarActions/ImageAction.js +28 -30
- package/components/ToolbarActions/ImageAction.js.map +1 -1
- package/components/ToolbarActions/ItalicAction.js +16 -19
- package/components/ToolbarActions/ItalicAction.js.map +1 -1
- package/components/ToolbarActions/LinkAction.js +25 -30
- package/components/ToolbarActions/LinkAction.js.map +1 -1
- package/components/ToolbarActions/NumberedListAction.js +28 -37
- package/components/ToolbarActions/NumberedListAction.js.map +1 -1
- package/components/ToolbarActions/QuoteAction.js +22 -27
- package/components/ToolbarActions/QuoteAction.js.map +1 -1
- package/components/ToolbarActions/TextAlignmentAction.js +38 -50
- package/components/ToolbarActions/TextAlignmentAction.js.map +1 -1
- package/components/ToolbarActions/TypographyAction.js +69 -99
- package/components/ToolbarActions/TypographyAction.js.map +1 -1
- package/components/ToolbarActions/UnderlineAction.js +16 -19
- package/components/ToolbarActions/UnderlineAction.js.map +1 -1
- package/context/FontColorActionContext.js +3 -2
- package/context/FontColorActionContext.js.map +1 -1
- package/context/RichTextEditorContext.js +26 -29
- package/context/RichTextEditorContext.js.map +1 -1
- package/context/SharedHistoryContext.js +11 -15
- package/context/SharedHistoryContext.js.map +1 -1
- package/context/TextAlignmentActionContextProps.js +3 -2
- package/context/TextAlignmentActionContextProps.js.map +1 -1
- package/context/TypographyActionContext.js +3 -2
- package/context/TypographyActionContext.js.map +1 -1
- package/exports/admin/lexical.js +2 -20
- package/hooks/index.js +0 -2
- package/hooks/useCurrentElement.js +18 -21
- package/hooks/useCurrentElement.js.map +1 -1
- package/hooks/useCurrentSelection.js +39 -48
- package/hooks/useCurrentSelection.js.map +1 -1
- package/hooks/useFontColorPicker.js +5 -6
- package/hooks/useFontColorPicker.js.map +1 -1
- package/hooks/useIsMounted.js +7 -8
- package/hooks/useIsMounted.js.map +1 -1
- package/hooks/useRichTextEditor.js +5 -6
- package/hooks/useRichTextEditor.js.map +1 -1
- package/hooks/useTextAlignmentAction.js +5 -6
- package/hooks/useTextAlignmentAction.js.map +1 -1
- package/hooks/useTypographyAction.js +5 -6
- package/hooks/useTypographyAction.js.map +1 -1
- package/images/icons/chat-square-quote.js +19 -0
- package/images/icons/chat-square-quote.js.map +1 -0
- package/images/icons/chevron-down.js +18 -0
- package/images/icons/chevron-down.js.map +1 -0
- package/images/icons/code.js +17 -0
- package/images/icons/code.js.map +1 -0
- package/images/icons/font-color.js +17 -0
- package/images/icons/font-color.js.map +1 -0
- package/images/icons/indent.js +18 -0
- package/images/icons/indent.js.map +1 -0
- package/images/icons/insert-image.js +20 -0
- package/images/icons/insert-image.js.map +1 -0
- package/images/icons/justify.js +19 -0
- package/images/icons/justify.js.map +1 -0
- package/images/icons/link.js +19 -0
- package/images/icons/link.js.map +1 -0
- package/images/icons/list-ol.js +20 -0
- package/images/icons/list-ol.js.map +1 -0
- package/images/icons/list-ul.js +18 -0
- package/images/icons/list-ul.js.map +1 -0
- package/images/icons/outdent.js +18 -0
- package/images/icons/outdent.js.map +1 -0
- package/images/icons/pencil-fill.js +17 -0
- package/images/icons/pencil-fill.js.map +1 -0
- package/images/icons/text-center.js +18 -0
- package/images/icons/text-center.js.map +1 -0
- package/images/icons/text-left.js +18 -0
- package/images/icons/text-left.js.map +1 -0
- package/images/icons/text-paragraph.js +18 -0
- package/images/icons/text-paragraph.js.map +1 -0
- package/images/icons/text-right.js +18 -0
- package/images/icons/text-right.js.map +1 -0
- package/images/icons/type-bold.js +17 -0
- package/images/icons/type-bold.js.map +1 -0
- package/images/icons/type-h1.js +17 -0
- package/images/icons/type-h1.js.map +1 -0
- package/images/icons/type-h2.js +17 -0
- package/images/icons/type-h2.js.map +1 -0
- package/images/icons/type-h3.js +17 -0
- package/images/icons/type-h3.js.map +1 -0
- package/images/icons/type-h4.js +17 -0
- package/images/icons/type-h4.js.map +1 -0
- package/images/icons/type-h5.js +17 -0
- package/images/icons/type-h5.js.map +1 -0
- package/images/icons/type-h6.js +17 -0
- package/images/icons/type-h6.js.map +1 -0
- package/images/icons/type-italic.js +17 -0
- package/images/icons/type-italic.js.map +1 -0
- package/images/icons/type-strikethrough.js +17 -0
- package/images/icons/type-strikethrough.js.map +1 -0
- package/images/icons/type-underline.js +17 -0
- package/images/icons/type-underline.js.map +1 -0
- package/images/icons/unlink_icon.js +27 -0
- package/images/icons/unlink_icon.js.map +1 -0
- package/index.js +5 -18
- package/package.json +7 -7
- package/plugins/BlurEventPlugin/BlurEventPlugin.js +11 -14
- package/plugins/BlurEventPlugin/BlurEventPlugin.js.map +1 -1
- package/plugins/CodeHighlightPlugin/CodeHighlightPlugin.js +7 -8
- package/plugins/CodeHighlightPlugin/CodeHighlightPlugin.js.map +1 -1
- package/plugins/CodeHighlightPlugin/index.js +0 -2
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditor.js +16 -24
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditor.js.map +1 -1
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorController.js +37 -51
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorController.js.map +1 -1
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.js +6 -5
- package/plugins/FloatingLinkEditorPlugin/FloatingLinkEditorPlugin.js.map +1 -1
- package/plugins/FloatingLinkEditorPlugin/index.js +0 -2
- package/plugins/FloatingLinkEditorPlugin/isChildOfLinkEditor.js +6 -9
- package/plugins/FloatingLinkEditorPlugin/isChildOfLinkEditor.js.map +1 -1
- package/plugins/FloatingLinkEditorPlugin/types.js +0 -3
- package/plugins/FloatingLinkEditorPlugin/useFloatingLinkEditor.js +101 -108
- package/plugins/FloatingLinkEditorPlugin/useFloatingLinkEditor.js.map +1 -1
- package/plugins/FontColorPlugin/FontColorPlugin.js +14 -19
- package/plugins/FontColorPlugin/FontColorPlugin.js.map +1 -1
- package/plugins/FontColorPlugin/applyColorToNode.js +5 -4
- package/plugins/FontColorPlugin/applyColorToNode.js.map +1 -1
- package/plugins/FontColorPlugin/applyColorToSelection.js +42 -60
- package/plugins/FontColorPlugin/applyColorToSelection.js.map +1 -1
- package/plugins/ImagesPlugin/ImagesPlugin.js +79 -121
- package/plugins/ImagesPlugin/ImagesPlugin.js.map +1 -1
- package/plugins/LinkPlugin/LinkPlugin.js +46 -52
- package/plugins/LinkPlugin/LinkPlugin.js.map +1 -1
- package/plugins/ListPLugin/ListPlugin.js +44 -52
- package/plugins/ListPLugin/ListPlugin.js.map +1 -1
- package/plugins/QuoteNodePlugin/QuoteNodePlugin.js +18 -19
- package/plugins/QuoteNodePlugin/QuoteNodePlugin.js.map +1 -1
- package/plugins/StateHandlingPlugin.js +55 -64
- package/plugins/StateHandlingPlugin.js.map +1 -1
- package/plugins/TypographyPlugin/TypographyPlugin.js +13 -20
- package/plugins/TypographyPlugin/TypographyPlugin.js.map +1 -1
- package/static/svg/chat-square-quote.123cfa24.svg +1 -0
- package/static/svg/chevron-down.d9636921.svg +1 -0
- package/static/svg/code.912b1f4d.svg +1 -0
- package/static/svg/font-color.4f0c0de5.svg +1 -0
- package/static/svg/indent.4d78e483.svg +3 -0
- package/static/svg/insert-image.354465f1.svg +4 -0
- package/static/svg/justify.dab42aec.svg +3 -0
- package/static/svg/link.b774de25.svg +1 -0
- package/static/svg/list-ol.d64946f3.svg +1 -0
- package/static/svg/list-ul.1d54da3f.svg +1 -0
- package/static/svg/outdent.5c13ff16.svg +3 -0
- package/static/svg/pencil-fill.94cb216b.svg +1 -0
- package/static/svg/text-center.a411e780.svg +1 -0
- package/static/svg/text-left.54f41f4e.svg +1 -0
- package/static/svg/text-paragraph.61674422.svg +1 -0
- package/static/svg/text-right.9288b7a2.svg +1 -0
- package/static/svg/type-bold.7e3e270b.svg +1 -0
- package/static/svg/type-h1.f292ffe1.svg +1 -0
- package/static/svg/type-h2.a9d1aa48.svg +1 -0
- package/static/svg/type-h3.4a29ff88.svg +1 -0
- package/static/svg/type-h4.7f48750c.svg +1 -0
- package/static/svg/type-h5.14b4ac56.svg +1 -0
- package/static/svg/type-h6.4e9dfe2d.svg +1 -0
- package/static/svg/type-italic.d8e45748.svg +1 -0
- package/static/svg/type-strikethrough.2694a816.svg +1 -0
- package/static/svg/type-underline.104a0ed5.svg +1 -0
- package/static/svg/unlink_icon.074ceed3.svg +1 -0
- package/types.js +0 -8
- package/ui/ContentEditable.js +6 -14
- package/ui/ContentEditable.js.map +1 -1
- package/ui/Divider.js +6 -5
- package/ui/Divider.js.map +1 -1
- package/ui/DropDown.js +146 -176
- package/ui/DropDown.js.map +1 -1
- package/ui/ImageResizer.js +173 -204
- package/ui/ImageResizer.js.map +1 -1
- package/ui/LinkPreview.js +61 -84
- package/ui/LinkPreview.js.map +1 -1
- package/ui/Placeholder.js +9 -20
- package/ui/Placeholder.js.map +1 -1
- package/ui/TextInput.js +17 -30
- package/ui/TextInput.js.map +1 -1
- package/ui/ToolbarActionDialog.js +64 -73
- package/ui/ToolbarActionDialog.js.map +1 -1
- package/utils/canUseDOM.js +2 -1
- package/utils/canUseDOM.js.map +1 -1
- package/utils/files.js +9 -8
- package/utils/files.js.map +1 -1
- package/utils/getDOMRangeRect.js +10 -20
- package/utils/getDOMRangeRect.js.map +1 -1
- package/utils/getSelectedNode.js +9 -20
- package/utils/getSelectedNode.js.map +1 -1
- package/utils/getTransparentImage.js +2 -3
- package/utils/getTransparentImage.js.map +1 -1
- package/utils/insertImage.js +9 -11
- package/utils/insertImage.js.map +1 -1
- package/utils/isAnchorLink.js +2 -3
- package/utils/isAnchorLink.js.map +1 -1
- package/utils/isChildOfFloatingToolbar.js +6 -9
- package/utils/isChildOfFloatingToolbar.js.map +1 -1
- package/utils/isHTMLElement.js +3 -9
- package/utils/isHTMLElement.js.map +1 -1
- package/utils/isValidJSON.js +9 -10
- package/utils/isValidJSON.js.map +1 -1
- package/utils/isValidLexicalData.js +17 -20
- package/utils/isValidLexicalData.js.map +1 -1
- package/utils/point.js +32 -45
- package/utils/point.js.map +1 -1
- package/utils/rect.js +92 -125
- package/utils/rect.js.map +1 -1
- package/utils/sanitizeUrl.js +8 -21
- package/utils/sanitizeUrl.js.map +1 -1
- package/utils/setFloatingElemPosition.js +23 -27
- package/utils/setFloatingElemPosition.js.map +1 -1
- package/commands/index.js.map +0 -1
- package/exports/admin/lexical.js.map +0 -1
- package/hooks/index.js.map +0 -1
- package/index.js.map +0 -1
- package/plugins/CodeHighlightPlugin/index.js.map +0 -1
- package/plugins/FloatingLinkEditorPlugin/index.js.map +0 -1
- package/plugins/FloatingLinkEditorPlugin/types.js.map +0 -1
- package/types.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"components/ToolbarActions/FontColorAction.js","sources":["../../../src/components/ToolbarActions/FontColorAction.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo } from \"react\";\nimport type { LexicalCommand } from \"lexical\";\nimport { Compose, makeDecoratable } from \"@webiny/react-composition\";\nimport { FontColorActionContext } from \"~/context/FontColorActionContext.js\";\nimport type { FontColorPayload } from \"@webiny/lexical-nodes\";\nimport { $isFontColorNode, ADD_FONT_COLOR_COMMAND, ThemeColorValue } from \"@webiny/lexical-nodes\";\nimport { getSelectedNode } from \"~/utils/getSelectedNode.js\";\nimport { useDeriveValueFromSelection } from \"~/hooks/useCurrentSelection.js\";\nimport { useRichTextEditor } from \"~/hooks/index.js\";\n\nexport const FontColorPicker = makeDecoratable(\"FontColorPicker\", (): React.JSX.Element | null => {\n useEffect(() => {\n console.log(\"Default FontColorPicker, please add your own component\");\n }, []);\n return null;\n});\n\ninterface FontActionColorPicker {\n element: React.JSX.Element;\n}\n\nconst FontActionColorPicker = ({ element }: FontActionColorPicker): React.JSX.Element => {\n return <Compose component={FontColorPicker} with={() => () => element} />;\n};\n\nexport type FontColorAction = React.ComponentType<unknown> & {\n ColorPicker: typeof FontActionColorPicker;\n};\n\nexport const FontColorAction: FontColorAction = () => {\n const { editor } = useRichTextEditor();\n const fontColor = useDeriveValueFromSelection(({ rangeSelection }) => {\n if (!rangeSelection) {\n return \"#000\";\n }\n\n const node = getSelectedNode(rangeSelection);\n return $isFontColorNode(node) ? node.getColorStyle().color : \"#000\";\n });\n\n const onFontColorSelect = useCallback(\n (colorValue: string, themeColorName: string | undefined) => {\n editor.dispatchCommand<LexicalCommand<FontColorPayload>>(ADD_FONT_COLOR_COMMAND, {\n color: new ThemeColorValue(colorValue, themeColorName)\n });\n },\n []\n );\n\n const context = useMemo(\n () => ({\n value: fontColor,\n applyColor: onFontColorSelect\n }),\n [onFontColorSelect, fontColor]\n );\n\n return (\n <FontColorActionContext.Provider value={context}>\n <FontColorPicker />\n </FontColorActionContext.Provider>\n );\n};\n\nFontColorAction.ColorPicker = FontActionColorPicker;\n"],"names":["FontColorPicker","makeDecoratable","useEffect","console","FontActionColorPicker","element","Compose","FontColorAction","editor","useRichTextEditor","fontColor","useDeriveValueFromSelection","rangeSelection","node","getSelectedNode","$isFontColorNode","onFontColorSelect","useCallback","colorValue","themeColorName","ADD_FONT_COLOR_COMMAND","ThemeColorValue","context","useMemo","FontColorActionContext"],"mappings":";;;;;;;AAUO,MAAMA,kBAAkBC,gBAAgB,mBAAmB;IAC9DC,UAAU;QACNC,QAAQ,GAAG,CAAC;IAChB,GAAG,EAAE;IACL,OAAO;AACX;AAMA,MAAMC,wBAAwB,CAAC,EAAEC,OAAO,EAAyB,GACtD,WAAP,GAAO,oBAACC,SAAOA;QAAC,WAAWN;QAAiB,MAAM,IAAM,IAAMK;;AAO3D,MAAME,kBAAmC;IAC5C,MAAM,EAAEC,MAAM,EAAE,GAAGC;IACnB,MAAMC,YAAYC,4BAA4B,CAAC,EAAEC,cAAc,EAAE;QAC7D,IAAI,CAACA,gBACD,OAAO;QAGX,MAAMC,OAAOC,gBAAgBF;QAC7B,OAAOG,iBAAiBF,QAAQA,KAAK,aAAa,GAAG,KAAK,GAAG;IACjE;IAEA,MAAMG,oBAAoBC,YACtB,CAACC,YAAoBC;QACjBX,OAAO,eAAe,CAAmCY,wBAAwB;YAC7E,OAAO,IAAIC,gBAAgBH,YAAYC;QAC3C;IACJ,GACA,EAAE;IAGN,MAAMG,UAAUC,QACZ,IAAO;YACH,OAAOb;YACP,YAAYM;QAChB,IACA;QAACA;QAAmBN;KAAU;IAGlC,OAAO,WAAP,GACI,oBAACc,uBAAuB,QAAQ;QAAC,OAAOF;qBACpC,oBAACtB,iBAAeA;AAG5B;AAEAO,gBAAgB,WAAW,GAAGH"}
|
|
@@ -1,37 +1,35 @@
|
|
|
1
|
-
import
|
|
1
|
+
import react, { useEffect, useState } from "react";
|
|
2
2
|
import { useRichTextEditor } from "../../hooks/useRichTextEditor.js";
|
|
3
3
|
import { fileToImagePayload } from "../../utils/files.js";
|
|
4
4
|
import { INSERT_IMAGE_COMMAND } from "../../commands/index.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
if (!!toolbarActionPlugins?.length) {
|
|
13
|
-
const actionPlugin = toolbarActionPlugins.find(action => action.targetAction === "image-action");
|
|
14
|
-
setImageActionPlugin(actionPlugin);
|
|
15
|
-
}
|
|
16
|
-
}, [toolbarActionPlugins]);
|
|
17
|
-
const handleClick = () => {
|
|
18
|
-
if (typeof imageActionPlugin?.plugin === "function") {
|
|
19
|
-
const cb = data => {
|
|
20
|
-
const imagePayload = fileToImagePayload(data);
|
|
21
|
-
if (imagePayload) {
|
|
22
|
-
editor.dispatchCommand(INSERT_IMAGE_COMMAND, imagePayload);
|
|
5
|
+
const ImageAction = ()=>{
|
|
6
|
+
const { editor, toolbarActionPlugins } = useRichTextEditor();
|
|
7
|
+
const [imageActionPlugin, setImageActionPlugin] = useState();
|
|
8
|
+
useEffect(()=>{
|
|
9
|
+
if (!!toolbarActionPlugins?.length) {
|
|
10
|
+
const actionPlugin = toolbarActionPlugins.find((action)=>"image-action" === action.targetAction);
|
|
11
|
+
setImageActionPlugin(actionPlugin);
|
|
23
12
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
13
|
+
}, [
|
|
14
|
+
toolbarActionPlugins
|
|
15
|
+
]);
|
|
16
|
+
const handleClick = ()=>{
|
|
17
|
+
if ("function" == typeof imageActionPlugin?.plugin) {
|
|
18
|
+
const cb = (data)=>{
|
|
19
|
+
const imagePayload = fileToImagePayload(data);
|
|
20
|
+
if (imagePayload) editor.dispatchCommand(INSERT_IMAGE_COMMAND, imagePayload);
|
|
21
|
+
};
|
|
22
|
+
imageActionPlugin.plugin(cb);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
return /*#__PURE__*/ react.createElement("button", {
|
|
26
|
+
onClick: ()=>handleClick(),
|
|
27
|
+
className: "popup-item",
|
|
28
|
+
"aria-label": "Insert image"
|
|
29
|
+
}, /*#__PURE__*/ react.createElement("i", {
|
|
30
|
+
className: "icon insert-image"
|
|
31
|
+
}));
|
|
35
32
|
};
|
|
33
|
+
export { ImageAction };
|
|
36
34
|
|
|
37
35
|
//# sourceMappingURL=ImageAction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"components/ToolbarActions/ImageAction.js","sources":["../../../src/components/ToolbarActions/ImageAction.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport type { LexicalCommand } from \"lexical\";\nimport { useRichTextEditor } from \"~/hooks/useRichTextEditor.js\";\nimport type { FileManagerFileItem } from \"~/utils/files.js\";\nimport { fileToImagePayload } from \"~/utils/files.js\";\nimport type { ImagePayload } from \"~/commands/index.js\";\nimport { INSERT_IMAGE_COMMAND } from \"~/commands/index.js\";\nimport type { ToolbarActionPlugin } from \"~/types.js\";\n\nexport const ImageAction = () => {\n const { editor, toolbarActionPlugins } = useRichTextEditor();\n const [imageActionPlugin, setImageActionPlugin] = useState<ToolbarActionPlugin | undefined>();\n\n useEffect(() => {\n if (!!toolbarActionPlugins?.length) {\n const actionPlugin = toolbarActionPlugins.find(\n action => action.targetAction === \"image-action\"\n );\n setImageActionPlugin(actionPlugin);\n }\n }, [toolbarActionPlugins]);\n\n const handleClick = () => {\n if (typeof imageActionPlugin?.plugin === \"function\") {\n const cb = (data: FileManagerFileItem) => {\n const imagePayload = fileToImagePayload(data);\n if (imagePayload) {\n editor.dispatchCommand<LexicalCommand<ImagePayload>>(\n INSERT_IMAGE_COMMAND,\n imagePayload\n );\n }\n };\n imageActionPlugin.plugin(cb);\n }\n };\n\n return (\n <button onClick={() => handleClick()} className={\"popup-item\"} aria-label=\"Insert image\">\n <i className=\"icon insert-image\" />\n </button>\n );\n};\n"],"names":["ImageAction","editor","toolbarActionPlugins","useRichTextEditor","imageActionPlugin","setImageActionPlugin","useState","useEffect","actionPlugin","action","handleClick","cb","data","imagePayload","fileToImagePayload","INSERT_IMAGE_COMMAND"],"mappings":";;;;AASO,MAAMA,cAAc;IACvB,MAAM,EAAEC,MAAM,EAAEC,oBAAoB,EAAE,GAAGC;IACzC,MAAM,CAACC,mBAAmBC,qBAAqB,GAAGC;IAElDC,UAAU;QACN,IAAI,CAAC,CAACL,sBAAsB,QAAQ;YAChC,MAAMM,eAAeN,qBAAqB,IAAI,CAC1CO,CAAAA,SAAUA,AAAwB,mBAAxBA,OAAO,YAAY;YAEjCJ,qBAAqBG;QACzB;IACJ,GAAG;QAACN;KAAqB;IAEzB,MAAMQ,cAAc;QAChB,IAAI,AAAqC,cAArC,OAAON,mBAAmB,QAAuB;YACjD,MAAMO,KAAK,CAACC;gBACR,MAAMC,eAAeC,mBAAmBF;gBACxC,IAAIC,cACAZ,OAAO,eAAe,CAClBc,sBACAF;YAGZ;YACAT,kBAAkB,MAAM,CAACO;QAC7B;IACJ;IAEA,OAAO,WAAP,GACI,oBAAC;QAAO,SAAS,IAAMD;QAAe,WAAW;QAAc,cAAW;qBACtE,oBAAC;QAAE,WAAU;;AAGzB"}
|
|
@@ -1,25 +1,22 @@
|
|
|
1
|
-
import
|
|
1
|
+
import react from "react";
|
|
2
2
|
import { FORMAT_TEXT_COMMAND } from "lexical";
|
|
3
3
|
import { useCurrentSelection } from "../../hooks/useCurrentSelection.js";
|
|
4
4
|
import { useRichTextEditor } from "../../hooks/index.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
"aria-label": "Format text as italic"
|
|
20
|
-
}, /*#__PURE__*/React.createElement("i", {
|
|
21
|
-
className: "format italic"
|
|
22
|
-
}));
|
|
5
|
+
const ItalicAction = ()=>{
|
|
6
|
+
const { editor } = useRichTextEditor();
|
|
7
|
+
const { rangeSelection } = useCurrentSelection();
|
|
8
|
+
const isItalicSelected = rangeSelection ? rangeSelection.hasFormat("italic") : false;
|
|
9
|
+
const handleClick = ()=>{
|
|
10
|
+
editor.dispatchCommand(FORMAT_TEXT_COMMAND, "italic");
|
|
11
|
+
};
|
|
12
|
+
return /*#__PURE__*/ react.createElement("button", {
|
|
13
|
+
onClick: handleClick,
|
|
14
|
+
className: "popup-item spaced " + (isItalicSelected ? "active" : ""),
|
|
15
|
+
"aria-label": "Format text as italic"
|
|
16
|
+
}, /*#__PURE__*/ react.createElement("i", {
|
|
17
|
+
className: "format italic"
|
|
18
|
+
}));
|
|
23
19
|
};
|
|
20
|
+
export { ItalicAction };
|
|
24
21
|
|
|
25
22
|
//# sourceMappingURL=ItalicAction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"components/ToolbarActions/ItalicAction.js","sources":["../../../src/components/ToolbarActions/ItalicAction.tsx"],"sourcesContent":["import React from \"react\";\nimport { FORMAT_TEXT_COMMAND } from \"lexical\";\nimport { useCurrentSelection } from \"~/hooks/useCurrentSelection.js\";\nimport { useRichTextEditor } from \"~/hooks/index.js\";\n\nexport const ItalicAction = () => {\n const { editor } = useRichTextEditor();\n const { rangeSelection } = useCurrentSelection();\n const isItalicSelected = rangeSelection ? rangeSelection.hasFormat(\"italic\") : false;\n\n const handleClick = () => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"italic\");\n };\n\n return (\n <button\n onClick={handleClick}\n className={\"popup-item spaced \" + (isItalicSelected ? \"active\" : \"\")}\n aria-label=\"Format text as italic\"\n >\n <i className=\"format italic\" />\n </button>\n );\n};\n"],"names":["ItalicAction","editor","useRichTextEditor","rangeSelection","useCurrentSelection","isItalicSelected","handleClick","FORMAT_TEXT_COMMAND"],"mappings":";;;;AAKO,MAAMA,eAAe;IACxB,MAAM,EAAEC,MAAM,EAAE,GAAGC;IACnB,MAAM,EAAEC,cAAc,EAAE,GAAGC;IAC3B,MAAMC,mBAAmBF,iBAAiBA,eAAe,SAAS,CAAC,YAAY;IAE/E,MAAMG,cAAc;QAChBL,OAAO,eAAe,CAACM,qBAAqB;IAChD;IAEA,OAAO,WAAP,GACI,oBAAC;QACG,SAASD;QACT,WAAW,uBAAwBD,CAAAA,mBAAmB,WAAW,EAAC;QAClE,cAAW;qBAEX,oBAAC;QAAE,WAAU;;AAGzB"}
|
|
@@ -1,37 +1,32 @@
|
|
|
1
|
-
import
|
|
1
|
+
import react, { useCallback } from "react";
|
|
2
2
|
import { $isLinkNode, TOGGLE_LINK_COMMAND } from "@webiny/lexical-nodes";
|
|
3
3
|
import { getNodeFromSelection } from "../../hooks/useCurrentElement.js";
|
|
4
4
|
import { useDeriveValueFromSelection } from "../../hooks/useCurrentSelection.js";
|
|
5
5
|
import { useRichTextEditor } from "../../hooks/index.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
onClick: insertLink,
|
|
30
|
-
className: "popup-item spaced " + (isLink ? "active" : ""),
|
|
31
|
-
"aria-label": "Insert link"
|
|
32
|
-
}, /*#__PURE__*/React.createElement("i", {
|
|
33
|
-
className: "format link"
|
|
34
|
-
}));
|
|
6
|
+
const LinkAction = ()=>{
|
|
7
|
+
const { editor } = useRichTextEditor();
|
|
8
|
+
const isLink = useDeriveValueFromSelection(({ rangeSelection })=>{
|
|
9
|
+
if (!rangeSelection) return false;
|
|
10
|
+
const node = getNodeFromSelection(rangeSelection);
|
|
11
|
+
return node ? $isLinkNode(node) || $isLinkNode(node.getParent()) : false;
|
|
12
|
+
});
|
|
13
|
+
const insertLink = useCallback(()=>{
|
|
14
|
+
if (isLink) editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);
|
|
15
|
+
else editor.dispatchCommand(TOGGLE_LINK_COMMAND, {
|
|
16
|
+
url: "https://"
|
|
17
|
+
});
|
|
18
|
+
}, [
|
|
19
|
+
editor,
|
|
20
|
+
isLink
|
|
21
|
+
]);
|
|
22
|
+
return /*#__PURE__*/ react.createElement("button", {
|
|
23
|
+
onClick: insertLink,
|
|
24
|
+
className: "popup-item spaced " + (isLink ? "active" : ""),
|
|
25
|
+
"aria-label": "Insert link"
|
|
26
|
+
}, /*#__PURE__*/ react.createElement("i", {
|
|
27
|
+
className: "format link"
|
|
28
|
+
}));
|
|
35
29
|
};
|
|
30
|
+
export { LinkAction };
|
|
36
31
|
|
|
37
32
|
//# sourceMappingURL=LinkAction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"components/ToolbarActions/LinkAction.js","sources":["../../../src/components/ToolbarActions/LinkAction.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from \"@webiny/lexical-nodes\";\nimport { getNodeFromSelection } from \"~/hooks/useCurrentElement.js\";\nimport { useDeriveValueFromSelection } from \"~/hooks/useCurrentSelection.js\";\nimport { useRichTextEditor } from \"~/hooks/index.js\";\n\nexport const LinkAction = () => {\n const { editor } = useRichTextEditor();\n const isLink = useDeriveValueFromSelection(({ rangeSelection }) => {\n if (!rangeSelection) {\n return false;\n }\n const node = getNodeFromSelection(rangeSelection);\n return node ? $isLinkNode(node) || $isLinkNode(node.getParent()) : false;\n });\n\n const insertLink = useCallback(() => {\n if (!isLink) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, { url: \"https://\" });\n } else {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }, [editor, isLink]);\n\n return (\n <button\n onClick={insertLink}\n className={\"popup-item spaced \" + (isLink ? \"active\" : \"\")}\n aria-label=\"Insert link\"\n >\n <i className=\"format link\" />\n </button>\n );\n};\n"],"names":["LinkAction","editor","useRichTextEditor","isLink","useDeriveValueFromSelection","rangeSelection","node","getNodeFromSelection","$isLinkNode","insertLink","useCallback","TOGGLE_LINK_COMMAND"],"mappings":";;;;;AAMO,MAAMA,aAAa;IACtB,MAAM,EAAEC,MAAM,EAAE,GAAGC;IACnB,MAAMC,SAASC,4BAA4B,CAAC,EAAEC,cAAc,EAAE;QAC1D,IAAI,CAACA,gBACD,OAAO;QAEX,MAAMC,OAAOC,qBAAqBF;QAClC,OAAOC,OAAOE,YAAYF,SAASE,YAAYF,KAAK,SAAS,MAAM;IACvE;IAEA,MAAMG,aAAaC,YAAY;QAC3B,IAAKP,QAGDF,OAAO,eAAe,CAACU,qBAAqB;aAF5CV,OAAO,eAAe,CAACU,qBAAqB;YAAE,KAAK;QAAW;IAItE,GAAG;QAACV;QAAQE;KAAO;IAEnB,OAAO,WAAP,GACI,oBAAC;QACG,SAASM;QACT,WAAW,uBAAwBN,CAAAA,SAAS,WAAW,EAAC;QACxD,cAAW;qBAEX,oBAAC;QAAE,WAAU;;AAGzB"}
|
|
@@ -1,44 +1,35 @@
|
|
|
1
|
-
import
|
|
1
|
+
import react from "react";
|
|
2
2
|
import { $isListNode } from "@webiny/lexical-nodes";
|
|
3
3
|
import { INSERT_ORDERED_LIST_COMMAND, REMOVE_LIST_COMMAND } from "../../commands/index.js";
|
|
4
4
|
import { useRichTextEditor } from "../../hooks/useRichTextEditor.js";
|
|
5
5
|
import { useCurrentElement } from "../../hooks/useCurrentElement.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
return /*#__PURE__*/React.createElement("button", {
|
|
36
|
-
onClick: () => formatNumberedList(),
|
|
37
|
-
className: "popup-item spaced " + (isNumbered ? "active" : ""),
|
|
38
|
-
"aria-label": "Format text as numbered list"
|
|
39
|
-
}, /*#__PURE__*/React.createElement("i", {
|
|
40
|
-
className: "icon numbered-list"
|
|
41
|
-
}));
|
|
6
|
+
const NumberedListAction = ()=>{
|
|
7
|
+
const { element } = useCurrentElement();
|
|
8
|
+
const { editor, theme } = useRichTextEditor();
|
|
9
|
+
const isList = $isListNode(element);
|
|
10
|
+
const isNumbered = isList && "number" === element.getListType();
|
|
11
|
+
const getStyleId = ()=>{
|
|
12
|
+
const id = theme.getTypographyByTag("ol")?.id;
|
|
13
|
+
if (id) return id;
|
|
14
|
+
return theme.getTypographyByTag("ul")?.id;
|
|
15
|
+
};
|
|
16
|
+
const formatNumberedList = ()=>{
|
|
17
|
+
if (isNumbered) editor.dispatchCommand(REMOVE_LIST_COMMAND, void 0);
|
|
18
|
+
else {
|
|
19
|
+
const styleId = getStyleId();
|
|
20
|
+
editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, {
|
|
21
|
+
themeStyleId: styleId
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
return /*#__PURE__*/ react.createElement("button", {
|
|
26
|
+
onClick: ()=>formatNumberedList(),
|
|
27
|
+
className: "popup-item spaced " + (isNumbered ? "active" : ""),
|
|
28
|
+
"aria-label": "Format text as numbered list"
|
|
29
|
+
}, /*#__PURE__*/ react.createElement("i", {
|
|
30
|
+
className: "icon numbered-list"
|
|
31
|
+
}));
|
|
42
32
|
};
|
|
33
|
+
export { NumberedListAction };
|
|
43
34
|
|
|
44
35
|
//# sourceMappingURL=NumberedListAction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"components/ToolbarActions/NumberedListAction.js","sources":["../../../src/components/ToolbarActions/NumberedListAction.tsx"],"sourcesContent":["import React from \"react\";\nimport type { ListNode } from \"@webiny/lexical-nodes\";\nimport { $isListNode } from \"@webiny/lexical-nodes\";\nimport { INSERT_ORDERED_LIST_COMMAND, REMOVE_LIST_COMMAND } from \"~/commands/index.js\";\nimport { useRichTextEditor } from \"~/hooks/useRichTextEditor.js\";\nimport { useCurrentElement } from \"~/hooks/useCurrentElement.js\";\n\nexport const NumberedListAction = () => {\n const { element } = useCurrentElement();\n const { editor, theme } = useRichTextEditor();\n const isList = $isListNode(element);\n const isNumbered = isList && (element as ListNode).getListType() === \"number\";\n\n const getStyleId = (): string | undefined => {\n // check default style for numbered list\n const id = theme.getTypographyByTag(\"ol\")?.id;\n if (id) {\n return id;\n }\n // fallback to ul list styles\n return theme.getTypographyByTag(\"ul\")?.id;\n };\n\n const formatNumberedList = () => {\n if (!isNumbered) {\n const styleId = getStyleId();\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, { themeStyleId: styleId });\n } else {\n editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n }\n };\n\n return (\n <button\n onClick={() => formatNumberedList()}\n className={\"popup-item spaced \" + (isNumbered ? \"active\" : \"\")}\n aria-label=\"Format text as numbered list\"\n >\n <i className=\"icon numbered-list\" />\n </button>\n );\n};\n"],"names":["NumberedListAction","element","useCurrentElement","editor","theme","useRichTextEditor","isList","$isListNode","isNumbered","getStyleId","id","formatNumberedList","REMOVE_LIST_COMMAND","undefined","styleId","INSERT_ORDERED_LIST_COMMAND"],"mappings":";;;;;AAOO,MAAMA,qBAAqB;IAC9B,MAAM,EAAEC,OAAO,EAAE,GAAGC;IACpB,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAGC;IAC1B,MAAMC,SAASC,YAAYN;IAC3B,MAAMO,aAAaF,UAAWL,AAAuC,aAAvCA,QAAqB,WAAW;IAE9D,MAAMQ,aAAa;QAEf,MAAMC,KAAKN,MAAM,kBAAkB,CAAC,OAAO;QAC3C,IAAIM,IACA,OAAOA;QAGX,OAAON,MAAM,kBAAkB,CAAC,OAAO;IAC3C;IAEA,MAAMO,qBAAqB;QACvB,IAAKH,YAIDL,OAAO,eAAe,CAACS,qBAAqBC;aAJ/B;YACb,MAAMC,UAAUL;YAChBN,OAAO,eAAe,CAACY,6BAA6B;gBAAE,cAAcD;YAAQ;QAChF;IAGJ;IAEA,OAAO,WAAP,GACI,oBAAC;QACG,SAAS,IAAMH;QACf,WAAW,uBAAwBH,CAAAA,aAAa,WAAW,EAAC;QAC5D,cAAW;qBAEX,oBAAC;QAAE,WAAU;;AAGzB"}
|
|
@@ -1,33 +1,28 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { $isQuoteNode,
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { $isQuoteNode, formatToParagraph, formatToQuote } from "@webiny/lexical-nodes";
|
|
3
3
|
import { useRichTextEditor } from "../../hooks/useRichTextEditor.js";
|
|
4
4
|
import { useCurrentElement } from "../../hooks/useCurrentElement.js";
|
|
5
5
|
const QUOTE_TAG = "quote";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
onClick: formatText,
|
|
26
|
-
className: "popup-item " + (isQuote ? "active" : ""),
|
|
27
|
-
"aria-label": "Format text as quote"
|
|
28
|
-
}, /*#__PURE__*/React.createElement("i", {
|
|
29
|
-
className: "icon quote"
|
|
30
|
-
}));
|
|
6
|
+
const QuoteAction = ()=>{
|
|
7
|
+
const { editor, theme } = useRichTextEditor();
|
|
8
|
+
const { element } = useCurrentElement();
|
|
9
|
+
const isQuote = $isQuoteNode(element);
|
|
10
|
+
const formatText = ()=>{
|
|
11
|
+
if (!isQuote) {
|
|
12
|
+
const hasQuoteStyles = theme.getTypographyByTag(QUOTE_TAG);
|
|
13
|
+
formatToQuote(editor, hasQuoteStyles ? QUOTE_TAG : void 0);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
formatToParagraph(editor);
|
|
17
|
+
};
|
|
18
|
+
return /*#__PURE__*/ react.createElement("button", {
|
|
19
|
+
onClick: formatText,
|
|
20
|
+
className: "popup-item " + (isQuote ? "active" : ""),
|
|
21
|
+
"aria-label": "Format text as quote"
|
|
22
|
+
}, /*#__PURE__*/ react.createElement("i", {
|
|
23
|
+
className: "icon quote"
|
|
24
|
+
}));
|
|
31
25
|
};
|
|
26
|
+
export { QuoteAction };
|
|
32
27
|
|
|
33
28
|
//# sourceMappingURL=QuoteAction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"components/ToolbarActions/QuoteAction.js","sources":["../../../src/components/ToolbarActions/QuoteAction.tsx"],"sourcesContent":["import React from \"react\";\nimport { $isQuoteNode, formatToQuote, formatToParagraph } from \"@webiny/lexical-nodes\";\nimport { useRichTextEditor } from \"~/hooks/useRichTextEditor.js\";\nimport { useCurrentElement } from \"~/hooks/useCurrentElement.js\";\n\nconst QUOTE_TAG = \"quote\";\n\nexport const QuoteAction = () => {\n const { editor, theme } = useRichTextEditor();\n const { element } = useCurrentElement();\n const isQuote = $isQuoteNode(element);\n\n const formatText = () => {\n if (!isQuote) {\n // Try to set default quote style, when the action button is clicked for first time\n const hasQuoteStyles = theme.getTypographyByTag(QUOTE_TAG);\n formatToQuote(editor, hasQuoteStyles ? QUOTE_TAG : undefined);\n return;\n }\n formatToParagraph(editor);\n };\n\n return (\n <button\n onClick={formatText}\n className={\"popup-item \" + (isQuote ? \"active\" : \"\")}\n aria-label=\"Format text as quote\"\n >\n <i className=\"icon quote\" />\n </button>\n );\n};\n"],"names":["QUOTE_TAG","QuoteAction","editor","theme","useRichTextEditor","element","useCurrentElement","isQuote","$isQuoteNode","formatText","hasQuoteStyles","formatToQuote","undefined","formatToParagraph"],"mappings":";;;;AAKA,MAAMA,YAAY;AAEX,MAAMC,cAAc;IACvB,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAGC;IAC1B,MAAM,EAAEC,OAAO,EAAE,GAAGC;IACpB,MAAMC,UAAUC,aAAaH;IAE7B,MAAMI,aAAa;QACf,IAAI,CAACF,SAAS;YAEV,MAAMG,iBAAiBP,MAAM,kBAAkB,CAACH;YAChDW,cAAcT,QAAQQ,iBAAiBV,YAAYY;YACnD;QACJ;QACAC,kBAAkBX;IACtB;IAEA,OAAO,WAAP,GACI,oBAAC;QACG,SAASO;QACT,WAAW,gBAAiBF,CAAAA,UAAU,WAAW,EAAC;QAClD,cAAW;qBAEX,oBAAC;QAAE,WAAU;;AAGzB"}
|
|
@@ -1,61 +1,49 @@
|
|
|
1
|
-
import
|
|
1
|
+
import react, { useEffect, useMemo } from "react";
|
|
2
2
|
import { FORMAT_ELEMENT_COMMAND, INDENT_CONTENT_COMMAND, OUTDENT_CONTENT_COMMAND } from "lexical";
|
|
3
3
|
import { Compose, makeDecoratable } from "@webiny/react-composition";
|
|
4
4
|
import { TextAlignmentActionContext } from "../../context/TextAlignmentActionContextProps.js";
|
|
5
5
|
import { useDeriveValueFromSelection } from "../../hooks/useCurrentSelection.js";
|
|
6
6
|
import { getSelectedNode } from "../../utils/getSelectedNode.js";
|
|
7
7
|
import { useRichTextEditor } from "../../hooks/index.js";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
export const BaseTextAlignmentDropDown = makeDecoratable("BaseTextAlignmentDropDown", () => {
|
|
14
|
-
useEffect(() => {
|
|
15
|
-
console.log("Default BaseTextAlignmentDropDown, please add your own component");
|
|
16
|
-
}, []);
|
|
17
|
-
return null;
|
|
8
|
+
const BaseTextAlignmentDropDown = makeDecoratable("BaseTextAlignmentDropDown", ()=>{
|
|
9
|
+
useEffect(()=>{
|
|
10
|
+
console.log("Default BaseTextAlignmentDropDown, please add your own component");
|
|
11
|
+
}, []);
|
|
12
|
+
return null;
|
|
18
13
|
});
|
|
19
|
-
const TextAlignmentActionDropDown = ({
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
value: alignmentValue,
|
|
51
|
-
applyTextAlignment,
|
|
52
|
-
outdentText,
|
|
53
|
-
indentText
|
|
54
|
-
}), [alignmentValue]);
|
|
55
|
-
return /*#__PURE__*/React.createElement(TextAlignmentActionContext.Provider, {
|
|
56
|
-
value: context
|
|
57
|
-
}, /*#__PURE__*/React.createElement(BaseTextAlignmentDropDown, null));
|
|
14
|
+
const TextAlignmentActionDropDown = ({ element })=>/*#__PURE__*/ react.createElement(Compose, {
|
|
15
|
+
component: BaseTextAlignmentDropDown,
|
|
16
|
+
with: ()=>()=>element
|
|
17
|
+
});
|
|
18
|
+
const TextAlignmentAction = ()=>{
|
|
19
|
+
const { editor } = useRichTextEditor();
|
|
20
|
+
const alignmentValue = useDeriveValueFromSelection(({ rangeSelection })=>{
|
|
21
|
+
const node = rangeSelection ? getSelectedNode(rangeSelection) : null;
|
|
22
|
+
if (node) return node.getParent()?.getFormatType() || "";
|
|
23
|
+
return "";
|
|
24
|
+
});
|
|
25
|
+
const applyTextAlignment = (value)=>{
|
|
26
|
+
editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, value);
|
|
27
|
+
};
|
|
28
|
+
const outdentText = ()=>{
|
|
29
|
+
editor.dispatchCommand(OUTDENT_CONTENT_COMMAND, void 0);
|
|
30
|
+
};
|
|
31
|
+
const indentText = ()=>{
|
|
32
|
+
editor.dispatchCommand(INDENT_CONTENT_COMMAND, void 0);
|
|
33
|
+
};
|
|
34
|
+
const context = useMemo(()=>({
|
|
35
|
+
value: alignmentValue,
|
|
36
|
+
applyTextAlignment,
|
|
37
|
+
outdentText,
|
|
38
|
+
indentText
|
|
39
|
+
}), [
|
|
40
|
+
alignmentValue
|
|
41
|
+
]);
|
|
42
|
+
return /*#__PURE__*/ react.createElement(TextAlignmentActionContext.Provider, {
|
|
43
|
+
value: context
|
|
44
|
+
}, /*#__PURE__*/ react.createElement(BaseTextAlignmentDropDown, null));
|
|
58
45
|
};
|
|
59
46
|
TextAlignmentAction.TextAlignmentDropDown = TextAlignmentActionDropDown;
|
|
47
|
+
export { BaseTextAlignmentDropDown, TextAlignmentAction };
|
|
60
48
|
|
|
61
49
|
//# sourceMappingURL=TextAlignmentAction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"components/ToolbarActions/TextAlignmentAction.js","sources":["../../../src/components/ToolbarActions/TextAlignmentAction.tsx"],"sourcesContent":["import React, { useEffect, useMemo } from \"react\";\nimport type { ElementFormatType } from \"lexical\";\nimport { FORMAT_ELEMENT_COMMAND, INDENT_CONTENT_COMMAND, OUTDENT_CONTENT_COMMAND } from \"lexical\";\nimport { Compose, makeDecoratable } from \"@webiny/react-composition\";\nimport { TextAlignmentActionContext } from \"~/context/TextAlignmentActionContextProps.js\";\nimport { useDeriveValueFromSelection } from \"~/hooks/useCurrentSelection.js\";\nimport { getSelectedNode } from \"~/utils/getSelectedNode.js\";\nimport { useRichTextEditor } from \"~/hooks/index.js\";\n\n/*\n * Base text alignment dropdown composable component.\n * Note: To add a custom dropdown component use @see LexicalEditorConfig API.\n */\nexport const BaseTextAlignmentDropDown = makeDecoratable(\n \"BaseTextAlignmentDropDown\",\n (): React.JSX.Element | null => {\n useEffect(() => {\n console.log(\"Default BaseTextAlignmentDropDown, please add your own component\");\n }, []);\n return null;\n }\n);\n\ninterface TextAlignmentActionDropdownProps {\n element: React.JSX.Element;\n}\n\nconst TextAlignmentActionDropDown = ({\n element\n}: TextAlignmentActionDropdownProps): React.JSX.Element => {\n return <Compose component={BaseTextAlignmentDropDown} with={() => () => element} />;\n};\n\nexport type TextAlignmentAction = React.ComponentType<unknown> & {\n TextAlignmentDropDown: typeof TextAlignmentActionDropDown;\n};\n\nexport const TextAlignmentAction: TextAlignmentAction = () => {\n const { editor } = useRichTextEditor();\n const alignmentValue: ElementFormatType = useDeriveValueFromSelection(({ rangeSelection }) => {\n const node = rangeSelection ? getSelectedNode(rangeSelection) : null;\n if (node) {\n return node.getParent()?.getFormatType() || \"\";\n }\n return \"\";\n });\n\n const applyTextAlignment = (value: ElementFormatType) => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, value);\n };\n\n const outdentText = () => {\n editor.dispatchCommand(OUTDENT_CONTENT_COMMAND, undefined);\n };\n\n const indentText = () => {\n editor.dispatchCommand(INDENT_CONTENT_COMMAND, undefined);\n };\n\n const context = useMemo(\n () => ({\n value: alignmentValue,\n applyTextAlignment,\n outdentText,\n indentText\n }),\n [alignmentValue]\n );\n\n return (\n <TextAlignmentActionContext.Provider value={context}>\n <BaseTextAlignmentDropDown />\n </TextAlignmentActionContext.Provider>\n );\n};\n\nTextAlignmentAction.TextAlignmentDropDown = TextAlignmentActionDropDown;\n"],"names":["BaseTextAlignmentDropDown","makeDecoratable","useEffect","console","TextAlignmentActionDropDown","element","Compose","TextAlignmentAction","editor","useRichTextEditor","alignmentValue","useDeriveValueFromSelection","rangeSelection","node","getSelectedNode","applyTextAlignment","value","FORMAT_ELEMENT_COMMAND","outdentText","OUTDENT_CONTENT_COMMAND","undefined","indentText","INDENT_CONTENT_COMMAND","context","useMemo","TextAlignmentActionContext"],"mappings":";;;;;;;AAaO,MAAMA,4BAA4BC,gBACrC,6BACA;IACIC,UAAU;QACNC,QAAQ,GAAG,CAAC;IAChB,GAAG,EAAE;IACL,OAAO;AACX;AAOJ,MAAMC,8BAA8B,CAAC,EACjCC,OAAO,EACwB,GACxB,WAAP,GAAO,oBAACC,SAAOA;QAAC,WAAWN;QAA2B,MAAM,IAAM,IAAMK;;AAOrE,MAAME,sBAA2C;IACpD,MAAM,EAAEC,MAAM,EAAE,GAAGC;IACnB,MAAMC,iBAAoCC,4BAA4B,CAAC,EAAEC,cAAc,EAAE;QACrF,MAAMC,OAAOD,iBAAiBE,gBAAgBF,kBAAkB;QAChE,IAAIC,MACA,OAAOA,KAAK,SAAS,IAAI,mBAAmB;QAEhD,OAAO;IACX;IAEA,MAAME,qBAAqB,CAACC;QACxBR,OAAO,eAAe,CAACS,wBAAwBD;IACnD;IAEA,MAAME,cAAc;QAChBV,OAAO,eAAe,CAACW,yBAAyBC;IACpD;IAEA,MAAMC,aAAa;QACfb,OAAO,eAAe,CAACc,wBAAwBF;IACnD;IAEA,MAAMG,UAAUC,QACZ,IAAO;YACH,OAAOd;YACPK;YACAG;YACAG;QACJ,IACA;QAACX;KAAe;IAGpB,OAAO,WAAP,GACI,oBAACe,2BAA2B,QAAQ;QAAC,OAAOF;qBACxC,oBAACvB,2BAAyBA;AAGtC;AAEAO,oBAAoB,qBAAqB,GAAGH"}
|