@payloadcms/richtext-lexical 3.68.0-internal-debug.2eb12b9 → 3.68.0-internal-debug.dafc24d
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/dist/cell/rscEntry.js +13 -5
- package/dist/cell/rscEntry.js.map +1 -1
- package/dist/features/blocks/client/component/BlockContent.js +29 -9
- package/dist/features/blocks/client/component/BlockContent.js.map +1 -1
- package/dist/features/blocks/client/component/components/BlockCollapsible.js +7 -3
- package/dist/features/blocks/client/component/components/BlockCollapsible.js.map +1 -1
- package/dist/features/blocks/client/component/components/BlockEditButton.js +6 -2
- package/dist/features/blocks/client/component/components/BlockEditButton.js.map +1 -1
- package/dist/features/blocks/client/component/components/BlockRemoveButton.js +6 -2
- package/dist/features/blocks/client/component/components/BlockRemoveButton.js.map +1 -1
- package/dist/features/blocks/client/component/index.js +124 -43
- package/dist/features/blocks/client/component/index.js.map +1 -1
- package/dist/features/blocks/client/component/index.scss +188 -0
- package/dist/features/blocks/client/componentInline/components/InlineBlockContainer.js +7 -3
- package/dist/features/blocks/client/componentInline/components/InlineBlockContainer.js.map +1 -1
- package/dist/features/blocks/client/componentInline/components/InlineBlockEditButton.js +6 -2
- package/dist/features/blocks/client/componentInline/components/InlineBlockEditButton.js.map +1 -1
- package/dist/features/blocks/client/componentInline/components/InlineBlockLabel.js +6 -2
- package/dist/features/blocks/client/componentInline/components/InlineBlockLabel.js.map +1 -1
- package/dist/features/blocks/client/componentInline/components/InlineBlockRemoveButton.js +6 -2
- package/dist/features/blocks/client/componentInline/components/InlineBlockRemoveButton.js.map +1 -1
- package/dist/features/blocks/client/componentInline/index.js +118 -37
- package/dist/features/blocks/client/componentInline/index.js.map +1 -1
- package/dist/features/blocks/client/componentInline/index.scss +90 -0
- package/dist/features/blocks/client/getBlockImageComponent.js +7 -3
- package/dist/features/blocks/client/getBlockImageComponent.js.map +1 -1
- package/dist/features/blocks/client/markdown/markdownTransformer.js +1 -0
- package/dist/features/blocks/client/markdown/markdownTransformer.js.map +1 -1
- package/dist/features/blocks/client/nodes/BlocksNode.js +7 -3
- package/dist/features/blocks/client/nodes/BlocksNode.js.map +1 -1
- package/dist/features/blocks/client/nodes/InlineBlocksNode.js +7 -3
- package/dist/features/blocks/client/nodes/InlineBlocksNode.js.map +1 -1
- package/dist/features/blocks/premade/CodeBlock/Component/Block.js +88 -27
- package/dist/features/blocks/premade/CodeBlock/Component/Block.js.map +1 -1
- package/dist/features/blocks/premade/CodeBlock/Component/Code.js +7 -3
- package/dist/features/blocks/premade/CodeBlock/Component/Code.js.map +1 -1
- package/dist/features/blocks/premade/CodeBlock/Component/Collapse/index.js +13 -4
- package/dist/features/blocks/premade/CodeBlock/Component/Collapse/index.js.map +1 -1
- package/dist/features/blocks/premade/CodeBlock/Component/Collapse/index.scss +6 -0
- package/dist/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.js +19 -6
- package/dist/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.js.map +1 -1
- package/dist/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.scss +29 -0
- package/dist/features/blocks/premade/CodeBlock/Component/index.scss +97 -0
- package/dist/features/blocks/server/markdown/markdownTransformer.js +1 -0
- package/dist/features/blocks/server/markdown/markdownTransformer.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/Component/index.js +9 -5
- package/dist/features/converters/lexicalToJSX/Component/index.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/blockquote.js +7 -3
- package/dist/features/converters/lexicalToJSX/converter/converters/blockquote.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/heading.js +7 -3
- package/dist/features/converters/lexicalToJSX/converter/converters/heading.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/horizontalRule.js +6 -2
- package/dist/features/converters/lexicalToJSX/converter/converters/horizontalRule.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/linebreak.js +6 -2
- package/dist/features/converters/lexicalToJSX/converter/converters/linebreak.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/link.js +13 -5
- package/dist/features/converters/lexicalToJSX/converter/converters/link.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/list.js +38 -14
- package/dist/features/converters/lexicalToJSX/converter/converters/list.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/paragraph.js +18 -6
- package/dist/features/converters/lexicalToJSX/converter/converters/paragraph.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/table.js +31 -11
- package/dist/features/converters/lexicalToJSX/converter/converters/table.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/text.js +43 -15
- package/dist/features/converters/lexicalToJSX/converter/converters/text.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/upload.js +31 -11
- package/dist/features/converters/lexicalToJSX/converter/converters/upload.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/index.js +8 -4
- package/dist/features/converters/lexicalToJSX/converter/index.js.map +1 -1
- package/dist/features/debug/jsxConverter/client/plugin/index.js +14 -5
- package/dist/features/debug/jsxConverter/client/plugin/index.js.map +1 -1
- package/dist/features/debug/jsxConverter/client/plugin/style.scss +12 -0
- package/dist/features/debug/testRecorder/client/plugin/index.js +62 -21
- package/dist/features/debug/testRecorder/client/plugin/index.js.map +1 -1
- package/dist/features/debug/testRecorder/client/plugin/index.scss +53 -0
- package/dist/features/debug/treeView/client/plugin/index.js +8 -3
- package/dist/features/debug/treeView/client/plugin/index.js.map +1 -1
- package/dist/features/debug/treeView/client/plugin/index.scss +80 -0
- package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js +225 -72
- package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js.map +1 -1
- package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.scss +87 -0
- package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.js +32 -11
- package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.js.map +1 -1
- package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.scss +11 -0
- package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js +21 -9
- package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js.map +1 -1
- package/dist/features/experimental_table/client/plugins/TablePlugin/index.js +26 -9
- package/dist/features/experimental_table/client/plugins/TablePlugin/index.js.map +1 -1
- package/dist/features/experimental_table/client/plugins/TablePlugin/index.scss +233 -0
- package/dist/features/horizontalRule/client/plugin/index.js +1 -0
- package/dist/features/horizontalRule/client/plugin/index.js.map +1 -1
- package/dist/features/horizontalRule/client/plugin/index.scss +23 -0
- package/dist/features/indent/client/IndentPlugin.js +6 -2
- package/dist/features/indent/client/IndentPlugin.js.map +1 -1
- package/dist/features/link/client/plugins/autoLink/index.js +3 -0
- package/dist/features/link/client/plugins/autoLink/index.js.map +1 -1
- package/dist/features/link/client/plugins/clickableLink/index.js +6 -2
- package/dist/features/link/client/plugins/clickableLink/index.js.map +1 -1
- package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js +76 -24
- package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
- package/dist/features/link/client/plugins/floatingLinkEditor/index.js +8 -3
- package/dist/features/link/client/plugins/floatingLinkEditor/index.js.map +1 -1
- package/dist/features/link/client/plugins/floatingLinkEditor/index.scss +92 -0
- package/dist/features/link/server/baseFields.js +1 -0
- package/dist/features/link/server/baseFields.js.map +1 -1
- package/dist/features/lists/checklist/client/plugin/index.js +6 -2
- package/dist/features/lists/checklist/client/plugin/index.js.map +1 -1
- package/dist/features/lists/plugin/index.js +6 -2
- package/dist/features/lists/plugin/index.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/Component.js +14 -5
- package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/Component.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js +7 -3
- package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.scss +16 -0
- package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/Component.js +14 -5
- package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/Component.js.map +1 -1
- package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.js +7 -3
- package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
- package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.scss +16 -0
- package/dist/features/relationship/client/components/RelationshipComponent.js +56 -19
- package/dist/features/relationship/client/components/RelationshipComponent.js.map +1 -1
- package/dist/features/relationship/client/components/index.scss +95 -0
- package/dist/features/relationship/client/drawer/index.js +18 -6
- package/dist/features/relationship/client/drawer/index.js.map +1 -1
- package/dist/features/relationship/client/nodes/RelationshipNode.js +7 -3
- package/dist/features/relationship/client/nodes/RelationshipNode.js.map +1 -1
- package/dist/features/relationship/client/plugins/index.js +7 -3
- package/dist/features/relationship/client/plugins/index.js.map +1 -1
- package/dist/features/textState/feature.client.js +18 -6
- package/dist/features/textState/feature.client.js.map +1 -1
- package/dist/features/toolbars/fixed/client/Toolbar/index.js +72 -23
- package/dist/features/toolbars/fixed/client/Toolbar/index.js.map +1 -1
- package/dist/features/toolbars/fixed/client/Toolbar/index.scss +113 -0
- package/dist/features/toolbars/inline/client/Toolbar/index.js +72 -23
- package/dist/features/toolbars/inline/client/Toolbar/index.js.map +1 -1
- package/dist/features/toolbars/inline/client/Toolbar/index.scss +58 -0
- package/dist/features/toolbars/shared/ToolbarButton/index.js +8 -3
- package/dist/features/toolbars/shared/ToolbarButton/index.js.map +1 -1
- package/dist/features/toolbars/shared/ToolbarButton/index.scss +46 -0
- package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js +60 -20
- package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js.map +1 -1
- package/dist/features/toolbars/shared/ToolbarDropdown/index.js +37 -12
- package/dist/features/toolbars/shared/ToolbarDropdown/index.js.map +1 -1
- package/dist/features/toolbars/shared/ToolbarDropdown/index.scss +129 -0
- package/dist/features/upload/client/component/index.js +92 -31
- package/dist/features/upload/client/component/index.js.map +1 -1
- package/dist/features/upload/client/component/index.scss +191 -0
- package/dist/features/upload/client/component/pending/index.js +14 -5
- package/dist/features/upload/client/component/pending/index.js.map +1 -1
- package/dist/features/upload/client/drawer/index.js +18 -6
- package/dist/features/upload/client/drawer/index.js.map +1 -1
- package/dist/features/upload/client/nodes/UploadNode.js +12 -4
- package/dist/features/upload/client/nodes/UploadNode.js.map +1 -1
- package/dist/features/upload/client/plugin/index.js +7 -3
- package/dist/features/upload/client/plugin/index.js.map +1 -1
- package/dist/field/Diff/converters/listitem/index.js +37 -12
- package/dist/field/Diff/converters/listitem/index.js.map +1 -1
- package/dist/field/Diff/converters/listitem/index.scss +47 -0
- package/dist/field/Diff/converters/relationship/index.js +37 -12
- package/dist/field/Diff/converters/relationship/index.js.map +1 -1
- package/dist/field/Diff/converters/relationship/index.scss +73 -0
- package/dist/field/Diff/converters/unknown/index.js +31 -10
- package/dist/field/Diff/converters/unknown/index.js.map +1 -1
- package/dist/field/Diff/converters/unknown/index.scss +40 -0
- package/dist/field/Diff/converters/upload/index.js +60 -19
- package/dist/field/Diff/converters/upload/index.js.map +1 -1
- package/dist/field/Diff/converters/upload/index.scss +115 -0
- package/dist/field/Diff/index.js +8 -3
- package/dist/field/Diff/index.js.map +1 -1
- package/dist/field/Diff/index.scss +102 -0
- package/dist/field/Field.js +81 -27
- package/dist/field/Field.js.map +1 -1
- package/dist/field/RenderLexical/index.js +36 -12
- package/dist/field/RenderLexical/index.js.map +1 -1
- package/dist/field/index.js +19 -7
- package/dist/field/index.js.map +1 -1
- package/dist/field/index.scss +41 -0
- package/dist/field/rscEntry.js +7 -3
- package/dist/field/rscEntry.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lexical/EditorPlugin.js +13 -5
- package/dist/lexical/EditorPlugin.js.map +1 -1
- package/dist/lexical/LexicalEditor.js +163 -50
- package/dist/lexical/LexicalEditor.js.map +1 -1
- package/dist/lexical/LexicalEditor.scss +54 -0
- package/dist/lexical/LexicalProvider.js +49 -17
- package/dist/lexical/LexicalProvider.js.map +1 -1
- package/dist/lexical/config/client/EditorConfigProvider.js +7 -3
- package/dist/lexical/config/client/EditorConfigProvider.js.map +1 -1
- package/dist/lexical/plugins/DecoratorPlugin/index.js +1 -0
- package/dist/lexical/plugins/DecoratorPlugin/index.js.map +1 -1
- package/dist/lexical/plugins/DecoratorPlugin/index.scss +13 -0
- package/dist/lexical/plugins/InsertParagraphAtEnd/index.js +20 -7
- package/dist/lexical/plugins/InsertParagraphAtEnd/index.js.map +1 -1
- package/dist/lexical/plugins/InsertParagraphAtEnd/index.scss +54 -0
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js +2 -0
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js +7 -3
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/index.js +50 -16
- package/dist/lexical/plugins/SlashMenu/index.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/index.scss +68 -0
- package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js +20 -7
- package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js.map +1 -1
- package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.scss +35 -0
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js +32 -11
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js.map +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.scss +80 -0
- package/dist/lexical/theme/EditorTheme.scss +357 -0
- package/dist/lexical/ui/ContentEditable.js +14 -5
- package/dist/lexical/ui/ContentEditable.js.map +1 -1
- package/dist/lexical/ui/ContentEditable.scss +105 -0
- package/dist/lexical/ui/icons/AI/index.js +37 -13
- package/dist/lexical/ui/icons/AI/index.js.map +1 -1
- package/dist/lexical/ui/icons/Add/index.js +19 -7
- package/dist/lexical/ui/icons/Add/index.js.map +1 -1
- package/dist/lexical/ui/icons/AlignCenter/index.js +25 -9
- package/dist/lexical/ui/icons/AlignCenter/index.js.map +1 -1
- package/dist/lexical/ui/icons/AlignJustify/index.js +25 -9
- package/dist/lexical/ui/icons/AlignJustify/index.js.map +1 -1
- package/dist/lexical/ui/icons/AlignLeft/index.js +25 -9
- package/dist/lexical/ui/icons/AlignLeft/index.js.map +1 -1
- package/dist/lexical/ui/icons/AlignRight/index.js +25 -9
- package/dist/lexical/ui/icons/AlignRight/index.js.map +1 -1
- package/dist/lexical/ui/icons/Block/index.js +25 -9
- package/dist/lexical/ui/icons/Block/index.js.map +1 -1
- package/dist/lexical/ui/icons/Blockquote/index.js +13 -5
- package/dist/lexical/ui/icons/Blockquote/index.js.map +1 -1
- package/dist/lexical/ui/icons/Bold/index.js +13 -5
- package/dist/lexical/ui/icons/Bold/index.js.map +1 -1
- package/dist/lexical/ui/icons/Checklist/index.js +19 -7
- package/dist/lexical/ui/icons/Checklist/index.js.map +1 -1
- package/dist/lexical/ui/icons/Code/index.js +19 -7
- package/dist/lexical/ui/icons/Code/index.js.map +1 -1
- package/dist/lexical/ui/icons/CodeBlock/index.js +13 -5
- package/dist/lexical/ui/icons/CodeBlock/index.js.map +1 -1
- package/dist/lexical/ui/icons/Collapse/index.js +13 -5
- package/dist/lexical/ui/icons/Collapse/index.js.map +1 -1
- package/dist/lexical/ui/icons/H1/index.js +13 -5
- package/dist/lexical/ui/icons/H1/index.js.map +1 -1
- package/dist/lexical/ui/icons/H2/index.js +13 -5
- package/dist/lexical/ui/icons/H2/index.js.map +1 -1
- package/dist/lexical/ui/icons/H3/index.js +13 -5
- package/dist/lexical/ui/icons/H3/index.js.map +1 -1
- package/dist/lexical/ui/icons/H4/index.js +13 -5
- package/dist/lexical/ui/icons/H4/index.js.map +1 -1
- package/dist/lexical/ui/icons/H5/index.js +13 -5
- package/dist/lexical/ui/icons/H5/index.js.map +1 -1
- package/dist/lexical/ui/icons/H6/index.js +13 -5
- package/dist/lexical/ui/icons/H6/index.js.map +1 -1
- package/dist/lexical/ui/icons/HorizontalRule/index.js +13 -5
- package/dist/lexical/ui/icons/HorizontalRule/index.js.map +1 -1
- package/dist/lexical/ui/icons/IndentDecrease/index.js +31 -11
- package/dist/lexical/ui/icons/IndentDecrease/index.js.map +1 -1
- package/dist/lexical/ui/icons/IndentIncrease/index.js +31 -11
- package/dist/lexical/ui/icons/IndentIncrease/index.js.map +1 -1
- package/dist/lexical/ui/icons/InlineBlocks/index.js +13 -5
- package/dist/lexical/ui/icons/InlineBlocks/index.js.map +1 -1
- package/dist/lexical/ui/icons/Italic/index.js +13 -5
- package/dist/lexical/ui/icons/Italic/index.js.map +1 -1
- package/dist/lexical/ui/icons/Link/index.js +13 -5
- package/dist/lexical/ui/icons/Link/index.js.map +1 -1
- package/dist/lexical/ui/icons/Meatballs/index.js +25 -9
- package/dist/lexical/ui/icons/Meatballs/index.js.map +1 -1
- package/dist/lexical/ui/icons/OrderedList/index.js +37 -13
- package/dist/lexical/ui/icons/OrderedList/index.js.map +1 -1
- package/dist/lexical/ui/icons/Relationship/index.js +37 -13
- package/dist/lexical/ui/icons/Relationship/index.js.map +1 -1
- package/dist/lexical/ui/icons/Strikethrough/index.js +19 -7
- package/dist/lexical/ui/icons/Strikethrough/index.js.map +1 -1
- package/dist/lexical/ui/icons/Subscript/index.js +13 -5
- package/dist/lexical/ui/icons/Subscript/index.js.map +1 -1
- package/dist/lexical/ui/icons/Superscript/index.js +13 -5
- package/dist/lexical/ui/icons/Superscript/index.js.map +1 -1
- package/dist/lexical/ui/icons/Table/index.js +13 -5
- package/dist/lexical/ui/icons/Table/index.js.map +1 -1
- package/dist/lexical/ui/icons/Text/index.js +13 -5
- package/dist/lexical/ui/icons/Text/index.js.map +1 -1
- package/dist/lexical/ui/icons/TextState/index.js +7 -3
- package/dist/lexical/ui/icons/TextState/index.js.map +1 -1
- package/dist/lexical/ui/icons/Underline/index.js +19 -7
- package/dist/lexical/ui/icons/Underline/index.js.map +1 -1
- package/dist/lexical/ui/icons/UnorderedList/index.js +43 -15
- package/dist/lexical/ui/icons/UnorderedList/index.js.map +1 -1
- package/dist/lexical/ui/icons/Upload/index.js +25 -9
- package/dist/lexical/ui/icons/Upload/index.js.map +1 -1
- package/dist/packages/@lexical/markdown/MarkdownShortcuts.js +2 -0
- package/dist/packages/@lexical/markdown/MarkdownShortcuts.js.map +1 -1
- package/dist/packages/@lexical/markdown/importTextFormatTransformer.js +2 -0
- package/dist/packages/@lexical/markdown/importTextFormatTransformer.js.map +1 -1
- package/dist/packages/@lexical/markdown/importTextMatchTransformer.js +2 -0
- package/dist/packages/@lexical/markdown/importTextMatchTransformer.js.map +1 -1
- package/dist/utilities/fieldsDrawer/Drawer.js +19 -7
- package/dist/utilities/fieldsDrawer/Drawer.js.map +1 -1
- package/dist/utilities/fieldsDrawer/DrawerContent.js +19 -7
- package/dist/utilities/fieldsDrawer/DrawerContent.js.map +1 -1
- package/dist/utilities/fieldsDrawer/useLexicalDocumentDrawer.js +7 -3
- package/dist/utilities/fieldsDrawer/useLexicalDocumentDrawer.js.map +1 -1
- package/dist/utilities/fieldsDrawer/useLexicalListDrawer.js +7 -3
- package/dist/utilities/fieldsDrawer/useLexicalListDrawer.js.map +1 -1
- package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.js +2 -0
- package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.js.map +1 -1
- package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.js +2 -0
- package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.js.map +1 -1
- package/package.json +8 -7
|
@@ -3,6 +3,7 @@ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext
|
|
|
3
3
|
import { $findMatchingParent, mergeRegister } from '@lexical/utils';
|
|
4
4
|
import { $createNodeSelection, $getEditor, $getNearestNodeFromDOMNode, $getSelection, $isDecoratorNode, $isElementNode, $isLineBreakNode, $isNodeSelection, $isRangeSelection, $isRootOrShadowRoot, $isTextNode, $setSelection, CLICK_COMMAND, COMMAND_PRIORITY_LOW, KEY_ARROW_DOWN_COMMAND, KEY_ARROW_UP_COMMAND, KEY_BACKSPACE_COMMAND, KEY_DELETE_COMMAND, SELECTION_CHANGE_COMMAND } from 'lexical';
|
|
5
5
|
import { useEffect } from 'react';
|
|
6
|
+
import './index.scss';
|
|
6
7
|
// TODO: This should ideally be fixed in Lexical. See
|
|
7
8
|
// https://github.com/facebook/lexical/pull/7072
|
|
8
9
|
export function DecoratorPlugin() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lexical/plugins/DecoratorPlugin/index.tsx"],"sourcesContent":["'use client'\n\nimport type { DecoratorNode, ElementNode, LexicalNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport {\n $createNodeSelection,\n $getEditor,\n $getNearestNodeFromDOMNode,\n $getSelection,\n $isDecoratorNode,\n $isElementNode,\n $isLineBreakNode,\n $isNodeSelection,\n $isRangeSelection,\n $isRootOrShadowRoot,\n $isTextNode,\n $setSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_LOW,\n KEY_ARROW_DOWN_COMMAND,\n KEY_ARROW_UP_COMMAND,\n KEY_BACKSPACE_COMMAND,\n KEY_DELETE_COMMAND,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport { useEffect } from 'react'\n\nimport './index.scss'\n\n// TODO: This should ideally be fixed in Lexical. See\n// https://github.com/facebook/lexical/pull/7072\nexport function DecoratorPlugin() {\n const [editor] = useLexicalComposerContext()\n\n const $onDelete = (event: KeyboardEvent) => {\n const selection = $getSelection()\n if (!$isNodeSelection(selection)) {\n return false\n }\n event.preventDefault()\n selection.getNodes().forEach((node) => {\n node.remove()\n })\n return true\n }\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n CLICK_COMMAND,\n (event) => {\n document.querySelector('.decorator-selected')?.classList.remove('decorator-selected')\n const decorator = $getDecoratorByMouseEvent(event)\n if (!decorator) {\n return true\n }\n const { target } = event\n const isInteractive =\n !(target instanceof HTMLElement) ||\n target.isContentEditable ||\n target.closest(\n 'button, textarea, input, .react-select, .code-editor, .no-select-decorator, [role=\"button\"]',\n )\n if (isInteractive) {\n $setSelection(null)\n } else {\n $selectDecorator(decorator)\n }\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(KEY_DELETE_COMMAND, $onDelete, COMMAND_PRIORITY_LOW),\n editor.registerCommand(KEY_BACKSPACE_COMMAND, $onDelete, COMMAND_PRIORITY_LOW),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n const decorator = $getSelectedDecorator()\n document.querySelector('.decorator-selected')?.classList.remove('decorator-selected')\n if (decorator) {\n decorator.element?.classList.add('decorator-selected')\n return true\n }\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ARROW_UP_COMMAND,\n (event) => {\n // CASE 1: Node selection\n const selection = $getSelection()\n if ($isNodeSelection(selection)) {\n const prevSibling = selection.getNodes()[0]?.getPreviousSibling()\n if ($isDecoratorNode(prevSibling)) {\n const element = $getEditor().getElementByKey(prevSibling.getKey())\n if (element) {\n $selectDecorator({ element, node: prevSibling })\n event.preventDefault()\n return true\n }\n return false\n }\n if (!$isElementNode(prevSibling)) {\n return false\n }\n const lastDescendant = prevSibling.getLastDescendant() ?? prevSibling\n if (!lastDescendant) {\n return false\n }\n const block = $findMatchingParent(lastDescendant, INTERNAL_$isBlock)\n block?.selectStart()\n event.preventDefault()\n return true\n }\n if (!$isRangeSelection(selection)) {\n return false\n }\n\n // CASE 2: Range selection\n // Get first selected block\n const firstPoint = selection.isBackward() ? selection.anchor : selection.focus\n const firstNode = firstPoint.getNode()\n const firstSelectedBlock = $findMatchingParent(firstNode, (node) => {\n return findFirstSiblingBlock(node) !== null\n })\n const prevBlock = firstSelectedBlock?.getPreviousSibling()\n if (!firstSelectedBlock || prevBlock !== findFirstSiblingBlock(firstSelectedBlock)) {\n return false\n }\n\n if ($isDecoratorNode(prevBlock)) {\n const prevBlockElement = $getEditor().getElementByKey(prevBlock.getKey())\n if (prevBlockElement) {\n $selectDecorator({ element: prevBlockElement, node: prevBlock })\n event.preventDefault()\n return true\n }\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ARROW_DOWN_COMMAND,\n (event) => {\n // CASE 1: Node selection\n const selection = $getSelection()\n if ($isNodeSelection(selection)) {\n event.preventDefault()\n const nextSibling = selection.getNodes()[0]?.getNextSibling()\n if ($isDecoratorNode(nextSibling)) {\n const element = $getEditor().getElementByKey(nextSibling.getKey())\n if (element) {\n $selectDecorator({ element, node: nextSibling })\n }\n return true\n }\n if (!$isElementNode(nextSibling)) {\n return true\n }\n const firstDescendant = nextSibling.getFirstDescendant() ?? nextSibling\n if (!firstDescendant) {\n return true\n }\n const block = $findMatchingParent(firstDescendant, INTERNAL_$isBlock)\n block?.selectEnd()\n event.preventDefault()\n return true\n }\n if (!$isRangeSelection(selection)) {\n return false\n }\n\n // CASE 2: Range selection\n // Get last selected block\n const lastPoint = selection.isBackward() ? selection.anchor : selection.focus\n const lastNode = lastPoint.getNode()\n const lastSelectedBlock = $findMatchingParent(lastNode, (node) => {\n return findLaterSiblingBlock(node) !== null\n })\n const nextBlock = lastSelectedBlock?.getNextSibling()\n if (!lastSelectedBlock || nextBlock !== findLaterSiblingBlock(lastSelectedBlock)) {\n return false\n }\n\n if ($isDecoratorNode(nextBlock)) {\n const nextBlockElement = $getEditor().getElementByKey(nextBlock.getKey())\n if (nextBlockElement) {\n $selectDecorator({ element: nextBlockElement, node: nextBlock })\n event.preventDefault()\n return true\n }\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor])\n\n return null\n}\n\nfunction $getDecoratorByMouseEvent(\n event: MouseEvent,\n): { element: HTMLElement; node: DecoratorNode<unknown> } | undefined {\n if (!(event.target instanceof HTMLElement)) {\n return undefined\n }\n const element = event.target.closest('[data-lexical-decorator=\"true\"]')\n if (!(element instanceof HTMLElement)) {\n return undefined\n }\n const node = $getNearestNodeFromDOMNode(element)\n return $isDecoratorNode(node) ? { element, node } : undefined\n}\n\nfunction $getSelectedDecorator() {\n const selection = $getSelection()\n if (!$isNodeSelection(selection)) {\n return undefined\n }\n const nodes = selection.getNodes()\n if (nodes.length !== 1) {\n return undefined\n }\n const node = nodes[0]\n return $isDecoratorNode(node)\n ? {\n decorator: node,\n element: $getEditor().getElementByKey(node.getKey()),\n }\n : undefined\n}\n\nfunction $selectDecorator({\n element,\n node,\n}: {\n element: HTMLElement\n node: DecoratorNode<unknown>\n}) {\n document.querySelector('.decorator-selected')?.classList.remove('decorator-selected')\n const selection = $createNodeSelection()\n selection.add(node.getKey())\n $setSelection(selection)\n element.scrollIntoView({ behavior: 'smooth', block: 'nearest' })\n element.classList.add('decorator-selected')\n}\n\n/**\n * Copied from https://github.com/facebook/lexical/blob/main/packages/lexical/src/LexicalUtils.ts\n *\n * This function returns true for a DecoratorNode that is not inline OR\n * an ElementNode that is:\n * - not a root or shadow root\n * - not inline\n * - can't be empty\n * - has no children or an inline first child\n */\nexport function INTERNAL_$isBlock(node: LexicalNode): node is DecoratorNode<unknown> | ElementNode {\n if ($isDecoratorNode(node) && !node.isInline()) {\n return true\n }\n if (!$isElementNode(node) || $isRootOrShadowRoot(node)) {\n return false\n }\n\n const firstChild = node.getFirstChild()\n const isLeafElement =\n firstChild === null ||\n $isLineBreakNode(firstChild) ||\n $isTextNode(firstChild) ||\n firstChild.isInline()\n\n return !node.isInline() && node.canBeEmpty() !== false && isLeafElement\n}\n\nfunction findLaterSiblingBlock(node: LexicalNode): LexicalNode | null {\n let current = node.getNextSibling()\n while (current !== null) {\n if (INTERNAL_$isBlock(current)) {\n return current\n }\n current = current.getNextSibling()\n }\n return null\n}\n\nfunction findFirstSiblingBlock(node: LexicalNode): LexicalNode | null {\n let current = node.getPreviousSibling()\n while (current !== null) {\n if (INTERNAL_$isBlock(current)) {\n return current\n }\n current = current.getPreviousSibling()\n }\n return null\n}\n"],"names":["useLexicalComposerContext","$findMatchingParent","mergeRegister","$createNodeSelection","$getEditor","$getNearestNodeFromDOMNode","$getSelection","$isDecoratorNode","$isElementNode","$isLineBreakNode","$isNodeSelection","$isRangeSelection","$isRootOrShadowRoot","$isTextNode","$setSelection","CLICK_COMMAND","COMMAND_PRIORITY_LOW","KEY_ARROW_DOWN_COMMAND","KEY_ARROW_UP_COMMAND","KEY_BACKSPACE_COMMAND","KEY_DELETE_COMMAND","SELECTION_CHANGE_COMMAND","useEffect","DecoratorPlugin","editor","$onDelete","event","selection","preventDefault","getNodes","forEach","node","remove","registerCommand","document","querySelector","classList","decorator","$getDecoratorByMouseEvent","target","isInteractive","HTMLElement","isContentEditable","closest","$selectDecorator","$getSelectedDecorator","element","add","prevSibling","getPreviousSibling","getElementByKey","getKey","lastDescendant","getLastDescendant","block","INTERNAL_$isBlock","selectStart","firstPoint","isBackward","anchor","focus","firstNode","getNode","firstSelectedBlock","findFirstSiblingBlock","prevBlock","prevBlockElement","nextSibling","getNextSibling","firstDescendant","getFirstDescendant","selectEnd","lastPoint","lastNode","lastSelectedBlock","findLaterSiblingBlock","nextBlock","nextBlockElement","undefined","nodes","length","scrollIntoView","behavior","isInline","firstChild","getFirstChild","isLeafElement","canBeEmpty","current"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lexical/plugins/DecoratorPlugin/index.tsx"],"sourcesContent":["'use client'\n\nimport type { DecoratorNode, ElementNode, LexicalNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport {\n $createNodeSelection,\n $getEditor,\n $getNearestNodeFromDOMNode,\n $getSelection,\n $isDecoratorNode,\n $isElementNode,\n $isLineBreakNode,\n $isNodeSelection,\n $isRangeSelection,\n $isRootOrShadowRoot,\n $isTextNode,\n $setSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_LOW,\n KEY_ARROW_DOWN_COMMAND,\n KEY_ARROW_UP_COMMAND,\n KEY_BACKSPACE_COMMAND,\n KEY_DELETE_COMMAND,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport { useEffect } from 'react'\n\nimport './index.scss'\n\n// TODO: This should ideally be fixed in Lexical. See\n// https://github.com/facebook/lexical/pull/7072\nexport function DecoratorPlugin() {\n const [editor] = useLexicalComposerContext()\n\n const $onDelete = (event: KeyboardEvent) => {\n const selection = $getSelection()\n if (!$isNodeSelection(selection)) {\n return false\n }\n event.preventDefault()\n selection.getNodes().forEach((node) => {\n node.remove()\n })\n return true\n }\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n CLICK_COMMAND,\n (event) => {\n document.querySelector('.decorator-selected')?.classList.remove('decorator-selected')\n const decorator = $getDecoratorByMouseEvent(event)\n if (!decorator) {\n return true\n }\n const { target } = event\n const isInteractive =\n !(target instanceof HTMLElement) ||\n target.isContentEditable ||\n target.closest(\n 'button, textarea, input, .react-select, .code-editor, .no-select-decorator, [role=\"button\"]',\n )\n if (isInteractive) {\n $setSelection(null)\n } else {\n $selectDecorator(decorator)\n }\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(KEY_DELETE_COMMAND, $onDelete, COMMAND_PRIORITY_LOW),\n editor.registerCommand(KEY_BACKSPACE_COMMAND, $onDelete, COMMAND_PRIORITY_LOW),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n const decorator = $getSelectedDecorator()\n document.querySelector('.decorator-selected')?.classList.remove('decorator-selected')\n if (decorator) {\n decorator.element?.classList.add('decorator-selected')\n return true\n }\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ARROW_UP_COMMAND,\n (event) => {\n // CASE 1: Node selection\n const selection = $getSelection()\n if ($isNodeSelection(selection)) {\n const prevSibling = selection.getNodes()[0]?.getPreviousSibling()\n if ($isDecoratorNode(prevSibling)) {\n const element = $getEditor().getElementByKey(prevSibling.getKey())\n if (element) {\n $selectDecorator({ element, node: prevSibling })\n event.preventDefault()\n return true\n }\n return false\n }\n if (!$isElementNode(prevSibling)) {\n return false\n }\n const lastDescendant = prevSibling.getLastDescendant() ?? prevSibling\n if (!lastDescendant) {\n return false\n }\n const block = $findMatchingParent(lastDescendant, INTERNAL_$isBlock)\n block?.selectStart()\n event.preventDefault()\n return true\n }\n if (!$isRangeSelection(selection)) {\n return false\n }\n\n // CASE 2: Range selection\n // Get first selected block\n const firstPoint = selection.isBackward() ? selection.anchor : selection.focus\n const firstNode = firstPoint.getNode()\n const firstSelectedBlock = $findMatchingParent(firstNode, (node) => {\n return findFirstSiblingBlock(node) !== null\n })\n const prevBlock = firstSelectedBlock?.getPreviousSibling()\n if (!firstSelectedBlock || prevBlock !== findFirstSiblingBlock(firstSelectedBlock)) {\n return false\n }\n\n if ($isDecoratorNode(prevBlock)) {\n const prevBlockElement = $getEditor().getElementByKey(prevBlock.getKey())\n if (prevBlockElement) {\n $selectDecorator({ element: prevBlockElement, node: prevBlock })\n event.preventDefault()\n return true\n }\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ARROW_DOWN_COMMAND,\n (event) => {\n // CASE 1: Node selection\n const selection = $getSelection()\n if ($isNodeSelection(selection)) {\n event.preventDefault()\n const nextSibling = selection.getNodes()[0]?.getNextSibling()\n if ($isDecoratorNode(nextSibling)) {\n const element = $getEditor().getElementByKey(nextSibling.getKey())\n if (element) {\n $selectDecorator({ element, node: nextSibling })\n }\n return true\n }\n if (!$isElementNode(nextSibling)) {\n return true\n }\n const firstDescendant = nextSibling.getFirstDescendant() ?? nextSibling\n if (!firstDescendant) {\n return true\n }\n const block = $findMatchingParent(firstDescendant, INTERNAL_$isBlock)\n block?.selectEnd()\n event.preventDefault()\n return true\n }\n if (!$isRangeSelection(selection)) {\n return false\n }\n\n // CASE 2: Range selection\n // Get last selected block\n const lastPoint = selection.isBackward() ? selection.anchor : selection.focus\n const lastNode = lastPoint.getNode()\n const lastSelectedBlock = $findMatchingParent(lastNode, (node) => {\n return findLaterSiblingBlock(node) !== null\n })\n const nextBlock = lastSelectedBlock?.getNextSibling()\n if (!lastSelectedBlock || nextBlock !== findLaterSiblingBlock(lastSelectedBlock)) {\n return false\n }\n\n if ($isDecoratorNode(nextBlock)) {\n const nextBlockElement = $getEditor().getElementByKey(nextBlock.getKey())\n if (nextBlockElement) {\n $selectDecorator({ element: nextBlockElement, node: nextBlock })\n event.preventDefault()\n return true\n }\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor])\n\n return null\n}\n\nfunction $getDecoratorByMouseEvent(\n event: MouseEvent,\n): { element: HTMLElement; node: DecoratorNode<unknown> } | undefined {\n if (!(event.target instanceof HTMLElement)) {\n return undefined\n }\n const element = event.target.closest('[data-lexical-decorator=\"true\"]')\n if (!(element instanceof HTMLElement)) {\n return undefined\n }\n const node = $getNearestNodeFromDOMNode(element)\n return $isDecoratorNode(node) ? { element, node } : undefined\n}\n\nfunction $getSelectedDecorator() {\n const selection = $getSelection()\n if (!$isNodeSelection(selection)) {\n return undefined\n }\n const nodes = selection.getNodes()\n if (nodes.length !== 1) {\n return undefined\n }\n const node = nodes[0]\n return $isDecoratorNode(node)\n ? {\n decorator: node,\n element: $getEditor().getElementByKey(node.getKey()),\n }\n : undefined\n}\n\nfunction $selectDecorator({\n element,\n node,\n}: {\n element: HTMLElement\n node: DecoratorNode<unknown>\n}) {\n document.querySelector('.decorator-selected')?.classList.remove('decorator-selected')\n const selection = $createNodeSelection()\n selection.add(node.getKey())\n $setSelection(selection)\n element.scrollIntoView({ behavior: 'smooth', block: 'nearest' })\n element.classList.add('decorator-selected')\n}\n\n/**\n * Copied from https://github.com/facebook/lexical/blob/main/packages/lexical/src/LexicalUtils.ts\n *\n * This function returns true for a DecoratorNode that is not inline OR\n * an ElementNode that is:\n * - not a root or shadow root\n * - not inline\n * - can't be empty\n * - has no children or an inline first child\n */\nexport function INTERNAL_$isBlock(node: LexicalNode): node is DecoratorNode<unknown> | ElementNode {\n if ($isDecoratorNode(node) && !node.isInline()) {\n return true\n }\n if (!$isElementNode(node) || $isRootOrShadowRoot(node)) {\n return false\n }\n\n const firstChild = node.getFirstChild()\n const isLeafElement =\n firstChild === null ||\n $isLineBreakNode(firstChild) ||\n $isTextNode(firstChild) ||\n firstChild.isInline()\n\n return !node.isInline() && node.canBeEmpty() !== false && isLeafElement\n}\n\nfunction findLaterSiblingBlock(node: LexicalNode): LexicalNode | null {\n let current = node.getNextSibling()\n while (current !== null) {\n if (INTERNAL_$isBlock(current)) {\n return current\n }\n current = current.getNextSibling()\n }\n return null\n}\n\nfunction findFirstSiblingBlock(node: LexicalNode): LexicalNode | null {\n let current = node.getPreviousSibling()\n while (current !== null) {\n if (INTERNAL_$isBlock(current)) {\n return current\n }\n current = current.getPreviousSibling()\n }\n return null\n}\n"],"names":["useLexicalComposerContext","$findMatchingParent","mergeRegister","$createNodeSelection","$getEditor","$getNearestNodeFromDOMNode","$getSelection","$isDecoratorNode","$isElementNode","$isLineBreakNode","$isNodeSelection","$isRangeSelection","$isRootOrShadowRoot","$isTextNode","$setSelection","CLICK_COMMAND","COMMAND_PRIORITY_LOW","KEY_ARROW_DOWN_COMMAND","KEY_ARROW_UP_COMMAND","KEY_BACKSPACE_COMMAND","KEY_DELETE_COMMAND","SELECTION_CHANGE_COMMAND","useEffect","DecoratorPlugin","editor","$onDelete","event","selection","preventDefault","getNodes","forEach","node","remove","registerCommand","document","querySelector","classList","decorator","$getDecoratorByMouseEvent","target","isInteractive","HTMLElement","isContentEditable","closest","$selectDecorator","$getSelectedDecorator","element","add","prevSibling","getPreviousSibling","getElementByKey","getKey","lastDescendant","getLastDescendant","block","INTERNAL_$isBlock","selectStart","firstPoint","isBackward","anchor","focus","firstNode","getNode","firstSelectedBlock","findFirstSiblingBlock","prevBlock","prevBlockElement","nextSibling","getNextSibling","firstDescendant","getFirstDescendant","selectEnd","lastPoint","lastNode","lastSelectedBlock","findLaterSiblingBlock","nextBlock","nextBlockElement","undefined","nodes","length","scrollIntoView","behavior","isInline","firstChild","getFirstChild","isLeafElement","canBeEmpty","current"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
@import '~@payloadcms/ui/scss';
|
|
2
|
+
|
|
3
|
+
@layer payload-default {
|
|
4
|
+
[data-lexical-decorator='true'] {
|
|
5
|
+
width: fit-content;
|
|
6
|
+
border-radius: $style-radius-m;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.decorator-selected {
|
|
10
|
+
box-shadow: $focus-box-shadow !important;
|
|
11
|
+
outline: none !important;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/* eslint-disable jsx-a11y/click-events-have-key-events */ 'use client';
|
|
2
|
-
import {
|
|
2
|
+
import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
|
|
3
3
|
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
|
|
4
4
|
import { $createParagraphNode, $getRoot } from 'lexical';
|
|
5
5
|
import React from 'react';
|
|
6
|
+
import './index.scss';
|
|
6
7
|
import { useEditorConfigContext } from '../../config/client/EditorConfigProvider.js';
|
|
7
8
|
const baseClass = 'insert-paragraph-at-end';
|
|
8
9
|
export const InsertParagraphAtEndPlugin = ()=>{
|
|
@@ -19,19 +20,31 @@ export const InsertParagraphAtEndPlugin = ()=>{
|
|
|
19
20
|
});
|
|
20
21
|
};
|
|
21
22
|
return(// TODO: convert to button
|
|
22
|
-
/*#__PURE__*/
|
|
23
|
+
/*#__PURE__*/ _jsxDEV("div", {
|
|
23
24
|
"aria-label": "Insert Paragraph",
|
|
24
25
|
className: baseClass,
|
|
25
26
|
onClick: onClick,
|
|
26
27
|
role: "button",
|
|
27
28
|
tabIndex: 0,
|
|
28
|
-
children: /*#__PURE__*/
|
|
29
|
+
children: /*#__PURE__*/ _jsxDEV("div", {
|
|
29
30
|
className: `${baseClass}-inside`,
|
|
30
|
-
children: /*#__PURE__*/
|
|
31
|
+
children: /*#__PURE__*/ _jsxDEV("span", {
|
|
31
32
|
children: "+"
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
}, void 0, false, {
|
|
34
|
+
fileName: "src/lexical/plugins/InsertParagraphAtEnd/index.tsx",
|
|
35
|
+
lineNumber: 38,
|
|
36
|
+
columnNumber: 9
|
|
37
|
+
}, this)
|
|
38
|
+
}, void 0, false, {
|
|
39
|
+
fileName: "src/lexical/plugins/InsertParagraphAtEnd/index.tsx",
|
|
40
|
+
lineNumber: 37,
|
|
41
|
+
columnNumber: 7
|
|
42
|
+
}, this)
|
|
43
|
+
}, void 0, false, {
|
|
44
|
+
fileName: "src/lexical/plugins/InsertParagraphAtEnd/index.tsx",
|
|
45
|
+
lineNumber: 30,
|
|
46
|
+
columnNumber: 5
|
|
47
|
+
}, this));
|
|
35
48
|
};
|
|
36
49
|
|
|
37
50
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lexical/plugins/InsertParagraphAtEnd/index.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/click-events-have-key-events */\n'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { $createParagraphNode, $getRoot } from 'lexical'\nimport React from 'react'\n\nimport './index.scss'\nimport { useEditorConfigContext } from '../../config/client/EditorConfigProvider.js'\nconst baseClass = 'insert-paragraph-at-end'\n\nexport const InsertParagraphAtEndPlugin: React.FC = () => {\n const [editor] = useLexicalComposerContext()\n const { editorConfig } = useEditorConfigContext()\n\n if (editorConfig?.admin?.hideInsertParagraphAtEnd) {\n return null\n }\n\n const onClick = () => {\n editor.update(() => {\n const paragraphNode = $createParagraphNode()\n $getRoot().append(paragraphNode)\n paragraphNode.select()\n })\n }\n\n return (\n // TODO: convert to button\n <div\n aria-label=\"Insert Paragraph\"\n className={baseClass}\n onClick={onClick}\n role=\"button\"\n tabIndex={0}\n >\n <div className={`${baseClass}-inside`}>\n <span>+</span>\n </div>\n </div>\n )\n}\n"],"names":["useLexicalComposerContext","$createParagraphNode","$getRoot","React","useEditorConfigContext","baseClass","InsertParagraphAtEndPlugin","editor","editorConfig","admin","hideInsertParagraphAtEnd","onClick","update","paragraphNode","append","select","div","aria-label","className","role","tabIndex","span"],"mappings":"AAAA,wDAAwD,GACxD;;AAEA,SAASA,yBAAyB,QAAQ,wCAAuC;AACjF,SAASC,oBAAoB,EAAEC,QAAQ,QAAQ,UAAS;AACxD,OAAOC,WAAW,QAAO;
|
|
1
|
+
{"version":3,"sources":["../../../../src/lexical/plugins/InsertParagraphAtEnd/index.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/click-events-have-key-events */\n'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { $createParagraphNode, $getRoot } from 'lexical'\nimport React from 'react'\n\nimport './index.scss'\nimport { useEditorConfigContext } from '../../config/client/EditorConfigProvider.js'\nconst baseClass = 'insert-paragraph-at-end'\n\nexport const InsertParagraphAtEndPlugin: React.FC = () => {\n const [editor] = useLexicalComposerContext()\n const { editorConfig } = useEditorConfigContext()\n\n if (editorConfig?.admin?.hideInsertParagraphAtEnd) {\n return null\n }\n\n const onClick = () => {\n editor.update(() => {\n const paragraphNode = $createParagraphNode()\n $getRoot().append(paragraphNode)\n paragraphNode.select()\n })\n }\n\n return (\n // TODO: convert to button\n <div\n aria-label=\"Insert Paragraph\"\n className={baseClass}\n onClick={onClick}\n role=\"button\"\n tabIndex={0}\n >\n <div className={`${baseClass}-inside`}>\n <span>+</span>\n </div>\n </div>\n )\n}\n"],"names":["useLexicalComposerContext","$createParagraphNode","$getRoot","React","useEditorConfigContext","baseClass","InsertParagraphAtEndPlugin","editor","editorConfig","admin","hideInsertParagraphAtEnd","onClick","update","paragraphNode","append","select","div","aria-label","className","role","tabIndex","span"],"mappings":"AAAA,wDAAwD,GACxD;;AAEA,SAASA,yBAAyB,QAAQ,wCAAuC;AACjF,SAASC,oBAAoB,EAAEC,QAAQ,QAAQ,UAAS;AACxD,OAAOC,WAAW,QAAO;AAEzB,OAAO,eAAc;AACrB,SAASC,sBAAsB,QAAQ,8CAA6C;AACpF,MAAMC,YAAY;AAElB,OAAO,MAAMC,6BAAuC;IAClD,MAAM,CAACC,OAAO,GAAGP;IACjB,MAAM,EAAEQ,YAAY,EAAE,GAAGJ;IAEzB,IAAII,cAAcC,OAAOC,0BAA0B;QACjD,OAAO;IACT;IAEA,MAAMC,UAAU;QACdJ,OAAOK,MAAM,CAAC;YACZ,MAAMC,gBAAgBZ;YACtBC,WAAWY,MAAM,CAACD;YAClBA,cAAcE,MAAM;QACtB;IACF;IAEA,OACE,0BAA0B;kBAC1B,QAACC;QACCC,cAAW;QACXC,WAAWb;QACXM,SAASA;QACTQ,MAAK;QACLC,UAAU;kBAEV,cAAA,QAACJ;YAAIE,WAAW,GAAGb,UAAU,OAAO,CAAC;sBACnC,cAAA,QAACgB;0BAAK;;;;;;;;;;;;;;;;AAId,EAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
@import '~@payloadcms/ui/scss';
|
|
2
|
+
|
|
3
|
+
@layer payload-default {
|
|
4
|
+
.rich-text-lexical--show-gutter {
|
|
5
|
+
.insert-paragraph-at-end {
|
|
6
|
+
padding: 4px 0px 2px 40px;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
.insert-paragraph-at-end {
|
|
10
|
+
height: 24px;
|
|
11
|
+
margin-top: -16px;
|
|
12
|
+
width: 100%;
|
|
13
|
+
z-index: 0;
|
|
14
|
+
position: relative;
|
|
15
|
+
padding: 4px 0px 2px 0px;
|
|
16
|
+
|
|
17
|
+
&-inside {
|
|
18
|
+
width: 100%;
|
|
19
|
+
height: 100%;
|
|
20
|
+
background-color: transparent;
|
|
21
|
+
transition: background-color 0.1s ease-in-out;
|
|
22
|
+
display: flex;
|
|
23
|
+
justify-content: center;
|
|
24
|
+
border-radius: $style-radius-s;
|
|
25
|
+
color: var(--theme-elevation-500);
|
|
26
|
+
|
|
27
|
+
span {
|
|
28
|
+
display: none;
|
|
29
|
+
justify-content: center;
|
|
30
|
+
align-items: center;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
&:hover {
|
|
35
|
+
cursor: pointer;
|
|
36
|
+
|
|
37
|
+
.insert-paragraph-at-end-inside {
|
|
38
|
+
background-color: var(--theme-elevation-100);
|
|
39
|
+
|
|
40
|
+
span {
|
|
41
|
+
display: flex;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
html[data-theme='dark'] {
|
|
48
|
+
.insert-paragraph-at-end:hover {
|
|
49
|
+
.insert-paragraph-at-end-inside {
|
|
50
|
+
background-color: var(--theme-elevation-50);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -63,8 +63,10 @@ const scrollIntoViewIfNeeded = (target)=>{
|
|
|
63
63
|
}
|
|
64
64
|
let newNode;
|
|
65
65
|
if (startOffset === 0) {
|
|
66
|
+
;
|
|
66
67
|
[newNode] = anchorNode.splitText(selectionOffset);
|
|
67
68
|
} else {
|
|
69
|
+
;
|
|
68
70
|
[, newNode] = anchorNode.splitText(startOffset, selectionOffset);
|
|
69
71
|
}
|
|
70
72
|
return newNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.tsx"],"sourcesContent":["'use client'\nimport type { BaseSelection, LexicalCommand, LexicalEditor, TextNode } from 'lexical'\nimport type { JSX, ReactPortal, RefObject } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n $setSelection,\n COMMAND_PRIORITY_LOW,\n COMMAND_PRIORITY_NORMAL,\n createCommand,\n KEY_ARROW_DOWN_COMMAND,\n KEY_ARROW_UP_COMMAND,\n KEY_ENTER_COMMAND,\n KEY_ESCAPE_COMMAND,\n KEY_TAB_COMMAND,\n} from 'lexical'\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\n\nimport type { MenuTextMatch } from '../useMenuTriggerMatch.js'\nimport type { SlashMenuGroupInternal, SlashMenuItem, SlashMenuItemInternal } from './types.js'\n\nimport { CAN_USE_DOM } from '../../../utils/canUseDOM.js'\n\nexport type MenuResolution = {\n getRect: () => DOMRect\n match?: MenuTextMatch\n}\n\nconst baseClass = 'slash-menu-popup'\n\nexport type MenuRenderFn = (\n anchorElementRef: RefObject<HTMLElement | null>,\n itemProps: {\n groups: Array<SlashMenuGroupInternal>\n selectedItemKey: null | string\n selectItemAndCleanUp: (selectedItem: SlashMenuItem) => void\n setSelectedItemKey: (itemKey: string) => void\n },\n matchingString: null | string,\n) => JSX.Element | null | ReactPortal\n\nconst scrollIntoViewIfNeeded = (target: HTMLElement) => {\n const typeaheadContainerNode = document.getElementById('slash-menu')\n if (!typeaheadContainerNode) {\n return\n }\n\n const typeaheadRect = typeaheadContainerNode.getBoundingClientRect()\n\n if (typeaheadRect.top + typeaheadRect.height > window.innerHeight) {\n typeaheadContainerNode.scrollIntoView({\n block: 'center',\n })\n }\n\n if (typeaheadRect.top < 0) {\n typeaheadContainerNode.scrollIntoView({\n block: 'center',\n })\n }\n\n target.scrollIntoView({ block: 'nearest' })\n}\n\n/**\n * Walk backwards along user input and forward through entity title to try\n * and replace more of the user's text with entity.\n */\nfunction getFullMatchOffset(documentText: string, entryText: string, offset: number) {\n let triggerOffset = offset\n for (let i = triggerOffset; i <= entryText.length; i++) {\n if (documentText.substring(documentText.length - i) === entryText.substring(0, i)) {\n triggerOffset = i\n }\n }\n return triggerOffset\n}\n\n/**\n * Split Lexical TextNode and return a new TextNode only containing matched text.\n * Common use cases include: removing the node, replacing with a new node.\n */\nfunction $splitNodeContainingQuery(match: MenuTextMatch): TextNode | undefined {\n const selection = $getSelection()\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return\n }\n const anchor = selection.anchor\n if (anchor.type !== 'text') {\n return\n }\n const anchorNode = anchor.getNode()\n if (!anchorNode.isSimpleText()) {\n return\n }\n const selectionOffset = anchor.offset\n const textContent = anchorNode.getTextContent().slice(0, selectionOffset)\n const characterOffset = match.replaceableString.length\n const queryOffset = getFullMatchOffset(textContent, match.matchingString, characterOffset)\n const startOffset = selectionOffset - queryOffset\n if (startOffset < 0) {\n return\n }\n let newNode\n if (startOffset === 0) {\n ;[newNode] = anchorNode.splitText(selectionOffset)\n } else {\n ;[, newNode] = anchorNode.splitText(startOffset, selectionOffset)\n }\n\n return newNode\n}\n\n// Got from https://stackoverflow.com/a/42543908/2013580\nexport function getScrollParent(\n element: HTMLElement,\n includeHidden: boolean,\n): HTMLBodyElement | HTMLElement {\n let style = getComputedStyle(element)\n const excludeStaticParent = style.position === 'absolute'\n const overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/\n if (style.position === 'fixed') {\n return document.body\n }\n for (let parent: HTMLElement | null = element; (parent = parent.parentElement); ) {\n style = getComputedStyle(parent)\n if (excludeStaticParent && style.position === 'static') {\n continue\n }\n if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) {\n return parent\n }\n }\n return document.body\n}\n\nfunction isTriggerVisibleInNearestScrollContainer(\n targetElement: HTMLElement,\n containerElement: HTMLElement,\n): boolean {\n const tRect = targetElement.getBoundingClientRect()\n const cRect = containerElement.getBoundingClientRect()\n return tRect.top > cRect.top && tRect.top < cRect.bottom\n}\n\n// Reposition the menu on scroll, window resize, and element resize.\nexport function useDynamicPositioning(\n resolution: MenuResolution | null,\n targetElementRef: RefObject<HTMLElement | null>,\n onReposition: () => void,\n onVisibilityChange?: (isInView: boolean) => void,\n) {\n const [editor] = useLexicalComposerContext()\n useEffect(() => {\n const targetElement = targetElementRef.current\n if (targetElement != null && resolution != null) {\n const rootElement = editor.getRootElement()\n const rootScrollParent =\n rootElement != null ? getScrollParent(rootElement, false) : document.body\n let ticking = false\n let previousIsInView = isTriggerVisibleInNearestScrollContainer(\n targetElement,\n rootScrollParent,\n )\n const handleScroll = function () {\n if (!ticking) {\n window.requestAnimationFrame(function () {\n onReposition()\n ticking = false\n })\n ticking = true\n }\n const isInView = isTriggerVisibleInNearestScrollContainer(targetElement, rootScrollParent)\n if (isInView !== previousIsInView) {\n previousIsInView = isInView\n if (onVisibilityChange != null) {\n onVisibilityChange(isInView)\n }\n }\n }\n const resizeObserver = new ResizeObserver(onReposition)\n window.addEventListener('resize', onReposition)\n document.addEventListener('scroll', handleScroll, {\n capture: true,\n passive: true,\n })\n resizeObserver.observe(targetElement)\n return () => {\n resizeObserver.disconnect()\n window.removeEventListener('resize', onReposition)\n document.removeEventListener('scroll', handleScroll, true)\n }\n }\n }, [editor, onVisibilityChange, onReposition, resolution, targetElementRef])\n}\n\nexport const SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND: LexicalCommand<{\n index: number\n item: SlashMenuItemInternal\n}> = createCommand('SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND')\n\nexport function LexicalMenu({\n anchorElementRef,\n close,\n editor,\n // groups filtering is already handled in SlashMenu/index.tsx. Thus, groups always contains the matching items.\n groups,\n menuRenderFn,\n resolution,\n shouldSplitNodeWithQuery = false,\n}: {\n anchorElementRef: RefObject<HTMLElement | null>\n close: () => void\n editor: LexicalEditor\n groups: Array<SlashMenuGroupInternal>\n menuRenderFn: MenuRenderFn\n resolution: MenuResolution\n shouldSplitNodeWithQuery?: boolean\n}): JSX.Element | null {\n const [selectedItemKey, setSelectedItemKey] = useState<null | string>(null)\n\n const matchingString = (resolution.match && resolution.match.matchingString) || ''\n\n const updateSelectedItem = useCallback(\n (item: SlashMenuItem) => {\n const rootElem = editor.getRootElement()\n if (rootElem !== null) {\n rootElem.setAttribute('aria-activedescendant', `${baseClass}__item-${item.key}`)\n setSelectedItemKey(item.key)\n }\n },\n [editor],\n )\n\n const setSelectedItemKeyToFirstMatchingItem = useCallback(() => {\n // set selected item to the first of the matching ones\n if (groups !== null && matchingString != null) {\n // groups filtering is already handled in SlashMenu/index.tsx. Thus, groups always contains the matching items.\n const allItems = groups.flatMap((group) => group.items)\n\n if (allItems.length) {\n const firstMatchingItem = allItems[0]!\n updateSelectedItem(firstMatchingItem)\n }\n }\n }, [groups, updateSelectedItem, matchingString])\n\n useEffect(() => {\n setSelectedItemKeyToFirstMatchingItem()\n }, [matchingString, setSelectedItemKeyToFirstMatchingItem])\n\n const selectItemAndCleanUp = useCallback(\n (selectedItem: SlashMenuItem) => {\n close()\n\n editor.update(() => {\n const textNodeContainingQuery =\n resolution.match != null && shouldSplitNodeWithQuery\n ? $splitNodeContainingQuery(resolution.match)\n : null\n\n if (textNodeContainingQuery) {\n textNodeContainingQuery.remove()\n }\n })\n\n setTimeout(() => {\n // Needed in Firefox. See https://github.com/payloadcms/payload/issues/10724\n let selection: BaseSelection | undefined\n editor.read(() => {\n selection = $getSelection()?.clone()\n })\n editor.update(() => {\n if (selection) {\n $setSelection(selection)\n }\n })\n\n selectedItem.onSelect({\n editor,\n queryString: resolution.match ? resolution.match.matchingString : '',\n })\n }, 0)\n },\n [editor, shouldSplitNodeWithQuery, resolution.match, close],\n )\n\n useEffect(() => {\n return () => {\n const rootElem = editor.getRootElement()\n if (rootElem !== null) {\n rootElem.removeAttribute('aria-activedescendant')\n }\n }\n }, [editor])\n\n useLayoutEffect(() => {\n if (groups === null) {\n setSelectedItemKey(null)\n } else if (selectedItemKey === null) {\n setSelectedItemKeyToFirstMatchingItem()\n }\n }, [groups, selectedItemKey, updateSelectedItem, setSelectedItemKeyToFirstMatchingItem])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND,\n ({ item }) => {\n if (item.ref && item.ref.current != null) {\n scrollIntoViewIfNeeded(item.ref.current)\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, updateSelectedItem])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand<KeyboardEvent>(\n KEY_ARROW_DOWN_COMMAND,\n (payload) => {\n const event = payload\n if (groups !== null && groups.length && selectedItemKey !== null) {\n const allItems = groups.flatMap((group) => group.items)\n const selectedIndex = allItems.findIndex((item) => item.key === selectedItemKey)\n\n const newSelectedIndex = selectedIndex !== allItems.length - 1 ? selectedIndex + 1 : 0\n\n const newSelectedItem = allItems[newSelectedIndex]\n if (!newSelectedItem) {\n return false\n }\n\n updateSelectedItem(newSelectedItem)\n if (newSelectedItem.ref != null && newSelectedItem.ref.current) {\n editor.dispatchCommand(SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND, {\n index: newSelectedIndex,\n item: newSelectedItem,\n })\n }\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_ARROW_UP_COMMAND,\n (payload) => {\n const event = payload\n if (groups !== null && groups.length && selectedItemKey !== null) {\n const allItems = groups.flatMap((group) => group.items)\n const selectedIndex = allItems.findIndex((item) => item.key === selectedItemKey)\n\n const newSelectedIndex = selectedIndex !== 0 ? selectedIndex - 1 : allItems.length - 1\n\n const newSelectedItem = allItems[newSelectedIndex]\n if (!newSelectedItem) {\n return false\n }\n\n updateSelectedItem(newSelectedItem)\n if (newSelectedItem.ref != null && newSelectedItem.ref.current) {\n scrollIntoViewIfNeeded(newSelectedItem.ref.current)\n }\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_ESCAPE_COMMAND,\n (payload) => {\n const event = payload\n event.preventDefault()\n event.stopImmediatePropagation()\n close()\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_TAB_COMMAND,\n (payload) => {\n const event = payload\n\n if (groups === null || selectedItemKey === null) {\n return false\n }\n const allItems = groups.flatMap((group) => group.items)\n const selectedItem = allItems.find((item) => item.key === selectedItemKey)\n if (!selectedItem) {\n return false\n }\n\n event.preventDefault()\n event.stopImmediatePropagation()\n selectItemAndCleanUp(selectedItem)\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n editor.registerCommand(\n KEY_ENTER_COMMAND,\n (event: KeyboardEvent | null) => {\n if (groups === null || selectedItemKey === null) {\n return false\n }\n const allItems = groups.flatMap((group) => group.items)\n const selectedItem = allItems.find((item) => item.key === selectedItemKey)\n if (!selectedItem) {\n return false\n }\n\n if (event !== null) {\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n selectItemAndCleanUp(selectedItem)\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n )\n }, [selectItemAndCleanUp, close, editor, groups, selectedItemKey, updateSelectedItem])\n\n const listItemProps = useMemo(\n () => ({\n groups,\n selectedItemKey,\n selectItemAndCleanUp,\n setSelectedItemKey,\n }),\n [selectItemAndCleanUp, selectedItemKey, groups],\n )\n\n return menuRenderFn(\n anchorElementRef,\n listItemProps,\n resolution.match ? resolution.match.matchingString : '',\n )\n}\n\nfunction setContainerDivAttributes(containerDiv: HTMLElement, className?: string) {\n if (className != null) {\n containerDiv.className = className\n }\n containerDiv.setAttribute('aria-label', 'Slash menu')\n containerDiv.setAttribute('role', 'listbox')\n containerDiv.style.display = 'block'\n containerDiv.style.position = 'absolute'\n}\n\nexport function useMenuAnchorRef(\n anchorElem: HTMLElement,\n resolution: MenuResolution | null,\n setResolution: (r: MenuResolution | null) => void,\n className?: string,\n): RefObject<HTMLElement | null> {\n const [editor] = useLexicalComposerContext()\n const anchorElementRef = useRef<HTMLElement | null>(\n CAN_USE_DOM ? document.createElement('div') : null,\n )\n const positionMenu = useCallback(() => {\n if (anchorElementRef.current === null || parent === undefined) {\n return\n }\n const rootElement = editor.getRootElement()\n const containerDiv = anchorElementRef.current\n\n const VERTICAL_OFFSET = 32\n\n const menuEle = containerDiv.firstChild as Element\n if (rootElement !== null && resolution !== null) {\n const { height, width } = resolution.getRect()\n let { left, top } = resolution.getRect()\n\n const rawTop = top\n top -= anchorElem.getBoundingClientRect().top + window.scrollY\n left -= anchorElem.getBoundingClientRect().left + window.scrollX\n containerDiv.style.left = `${left + window.scrollX}px`\n containerDiv.style.height = `${height}px`\n containerDiv.style.width = `${width}px`\n if (menuEle !== null) {\n const menuRect = menuEle.getBoundingClientRect()\n const menuHeight = menuRect.height\n const menuWidth = menuRect.width\n\n const rootElementRect = rootElement.getBoundingClientRect()\n\n const isRTL = document.dir === 'rtl' || document.documentElement.dir === 'rtl'\n const anchorRect = anchorElem.getBoundingClientRect()\n const leftBoundary = Math.max(0, rootElementRect.left)\n\n if (!isRTL && left + menuWidth > rootElementRect.right) {\n containerDiv.style.left = `${rootElementRect.right - menuWidth + window.scrollX}px`\n } else if (isRTL && menuRect.left < leftBoundary) {\n const newLeft = leftBoundary + menuWidth - anchorRect.left\n containerDiv.style.left = `${newLeft + window.scrollX}px`\n }\n\n const wouldGoOffBottomOfScreen = rawTop + menuHeight + VERTICAL_OFFSET > window.innerHeight\n //const wouldGoOffBottomOfContainer = top + menuHeight > rootElementRect.bottom\n const wouldGoOffTopOfScreen = rawTop < 0\n\n // Position slash menu above the cursor instead of below (default) if it would otherwise go off the bottom of the screen.\n if (wouldGoOffBottomOfScreen && !wouldGoOffTopOfScreen) {\n const margin = 24\n containerDiv.style.top = `${\n top + VERTICAL_OFFSET - menuHeight + window.scrollY - (height + margin)\n }px`\n } else {\n containerDiv.style.top = `${top + window.scrollY + VERTICAL_OFFSET}px`\n }\n }\n\n if (!containerDiv.isConnected) {\n setContainerDivAttributes(containerDiv, className)\n anchorElem.append(containerDiv)\n }\n containerDiv.setAttribute('id', 'slash-menu')\n anchorElementRef.current = containerDiv\n rootElement.setAttribute('aria-controls', 'slash-menu')\n }\n }, [editor, resolution, className, anchorElem])\n\n useEffect(() => {\n const rootElement = editor.getRootElement()\n if (resolution !== null) {\n positionMenu()\n return () => {\n if (rootElement !== null) {\n rootElement.removeAttribute('aria-controls')\n }\n\n const containerDiv = anchorElementRef.current\n if (containerDiv !== null && containerDiv.isConnected) {\n containerDiv.remove()\n containerDiv.removeAttribute('id')\n }\n }\n }\n }, [editor, positionMenu, resolution])\n\n const onVisibilityChange = useCallback(\n (isInView: boolean) => {\n if (resolution !== null) {\n if (!isInView) {\n setResolution(null)\n }\n }\n },\n [resolution, setResolution],\n )\n\n useDynamicPositioning(resolution, anchorElementRef, positionMenu, onVisibilityChange)\n\n return anchorElementRef\n}\n"],"names":["useLexicalComposerContext","mergeRegister","$getSelection","$isRangeSelection","$setSelection","COMMAND_PRIORITY_LOW","COMMAND_PRIORITY_NORMAL","createCommand","KEY_ARROW_DOWN_COMMAND","KEY_ARROW_UP_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","KEY_TAB_COMMAND","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","CAN_USE_DOM","baseClass","scrollIntoViewIfNeeded","target","typeaheadContainerNode","document","getElementById","typeaheadRect","getBoundingClientRect","top","height","window","innerHeight","scrollIntoView","block","getFullMatchOffset","documentText","entryText","offset","triggerOffset","i","length","substring","$splitNodeContainingQuery","match","selection","isCollapsed","anchor","type","anchorNode","getNode","isSimpleText","selectionOffset","textContent","getTextContent","slice","characterOffset","replaceableString","queryOffset","matchingString","startOffset","newNode","splitText","getScrollParent","element","includeHidden","style","getComputedStyle","excludeStaticParent","position","overflowRegex","body","parent","parentElement","test","overflow","overflowY","overflowX","isTriggerVisibleInNearestScrollContainer","targetElement","containerElement","tRect","cRect","bottom","useDynamicPositioning","resolution","targetElementRef","onReposition","onVisibilityChange","editor","current","rootElement","getRootElement","rootScrollParent","ticking","previousIsInView","handleScroll","requestAnimationFrame","isInView","resizeObserver","ResizeObserver","addEventListener","capture","passive","observe","disconnect","removeEventListener","SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND","LexicalMenu","anchorElementRef","close","groups","menuRenderFn","shouldSplitNodeWithQuery","selectedItemKey","setSelectedItemKey","updateSelectedItem","item","rootElem","setAttribute","key","setSelectedItemKeyToFirstMatchingItem","allItems","flatMap","group","items","firstMatchingItem","selectItemAndCleanUp","selectedItem","update","textNodeContainingQuery","remove","setTimeout","read","clone","onSelect","queryString","removeAttribute","registerCommand","ref","payload","event","selectedIndex","findIndex","newSelectedIndex","newSelectedItem","dispatchCommand","index","preventDefault","stopImmediatePropagation","find","listItemProps","setContainerDivAttributes","containerDiv","className","display","useMenuAnchorRef","anchorElem","setResolution","createElement","positionMenu","undefined","VERTICAL_OFFSET","menuEle","firstChild","width","getRect","left","rawTop","scrollY","scrollX","menuRect","menuHeight","menuWidth","rootElementRect","isRTL","dir","documentElement","anchorRect","leftBoundary","Math","max","right","newLeft","wouldGoOffBottomOfScreen","wouldGoOffTopOfScreen","margin","isConnected","append"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.tsx"],"sourcesContent":["'use client'\nimport type { BaseSelection, LexicalCommand, LexicalEditor, TextNode } from 'lexical'\nimport type { JSX, ReactPortal, RefObject } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n $setSelection,\n COMMAND_PRIORITY_LOW,\n COMMAND_PRIORITY_NORMAL,\n createCommand,\n KEY_ARROW_DOWN_COMMAND,\n KEY_ARROW_UP_COMMAND,\n KEY_ENTER_COMMAND,\n KEY_ESCAPE_COMMAND,\n KEY_TAB_COMMAND,\n} from 'lexical'\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\n\nimport type { MenuTextMatch } from '../useMenuTriggerMatch.js'\nimport type { SlashMenuGroupInternal, SlashMenuItem, SlashMenuItemInternal } from './types.js'\n\nimport { CAN_USE_DOM } from '../../../utils/canUseDOM.js'\n\nexport type MenuResolution = {\n getRect: () => DOMRect\n match?: MenuTextMatch\n}\n\nconst baseClass = 'slash-menu-popup'\n\nexport type MenuRenderFn = (\n anchorElementRef: RefObject<HTMLElement | null>,\n itemProps: {\n groups: Array<SlashMenuGroupInternal>\n selectedItemKey: null | string\n selectItemAndCleanUp: (selectedItem: SlashMenuItem) => void\n setSelectedItemKey: (itemKey: string) => void\n },\n matchingString: null | string,\n) => JSX.Element | null | ReactPortal\n\nconst scrollIntoViewIfNeeded = (target: HTMLElement) => {\n const typeaheadContainerNode = document.getElementById('slash-menu')\n if (!typeaheadContainerNode) {\n return\n }\n\n const typeaheadRect = typeaheadContainerNode.getBoundingClientRect()\n\n if (typeaheadRect.top + typeaheadRect.height > window.innerHeight) {\n typeaheadContainerNode.scrollIntoView({\n block: 'center',\n })\n }\n\n if (typeaheadRect.top < 0) {\n typeaheadContainerNode.scrollIntoView({\n block: 'center',\n })\n }\n\n target.scrollIntoView({ block: 'nearest' })\n}\n\n/**\n * Walk backwards along user input and forward through entity title to try\n * and replace more of the user's text with entity.\n */\nfunction getFullMatchOffset(documentText: string, entryText: string, offset: number) {\n let triggerOffset = offset\n for (let i = triggerOffset; i <= entryText.length; i++) {\n if (documentText.substring(documentText.length - i) === entryText.substring(0, i)) {\n triggerOffset = i\n }\n }\n return triggerOffset\n}\n\n/**\n * Split Lexical TextNode and return a new TextNode only containing matched text.\n * Common use cases include: removing the node, replacing with a new node.\n */\nfunction $splitNodeContainingQuery(match: MenuTextMatch): TextNode | undefined {\n const selection = $getSelection()\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return\n }\n const anchor = selection.anchor\n if (anchor.type !== 'text') {\n return\n }\n const anchorNode = anchor.getNode()\n if (!anchorNode.isSimpleText()) {\n return\n }\n const selectionOffset = anchor.offset\n const textContent = anchorNode.getTextContent().slice(0, selectionOffset)\n const characterOffset = match.replaceableString.length\n const queryOffset = getFullMatchOffset(textContent, match.matchingString, characterOffset)\n const startOffset = selectionOffset - queryOffset\n if (startOffset < 0) {\n return\n }\n let newNode\n if (startOffset === 0) {\n ;[newNode] = anchorNode.splitText(selectionOffset)\n } else {\n ;[, newNode] = anchorNode.splitText(startOffset, selectionOffset)\n }\n\n return newNode\n}\n\n// Got from https://stackoverflow.com/a/42543908/2013580\nexport function getScrollParent(\n element: HTMLElement,\n includeHidden: boolean,\n): HTMLBodyElement | HTMLElement {\n let style = getComputedStyle(element)\n const excludeStaticParent = style.position === 'absolute'\n const overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/\n if (style.position === 'fixed') {\n return document.body\n }\n for (let parent: HTMLElement | null = element; (parent = parent.parentElement); ) {\n style = getComputedStyle(parent)\n if (excludeStaticParent && style.position === 'static') {\n continue\n }\n if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) {\n return parent\n }\n }\n return document.body\n}\n\nfunction isTriggerVisibleInNearestScrollContainer(\n targetElement: HTMLElement,\n containerElement: HTMLElement,\n): boolean {\n const tRect = targetElement.getBoundingClientRect()\n const cRect = containerElement.getBoundingClientRect()\n return tRect.top > cRect.top && tRect.top < cRect.bottom\n}\n\n// Reposition the menu on scroll, window resize, and element resize.\nexport function useDynamicPositioning(\n resolution: MenuResolution | null,\n targetElementRef: RefObject<HTMLElement | null>,\n onReposition: () => void,\n onVisibilityChange?: (isInView: boolean) => void,\n) {\n const [editor] = useLexicalComposerContext()\n useEffect(() => {\n const targetElement = targetElementRef.current\n if (targetElement != null && resolution != null) {\n const rootElement = editor.getRootElement()\n const rootScrollParent =\n rootElement != null ? getScrollParent(rootElement, false) : document.body\n let ticking = false\n let previousIsInView = isTriggerVisibleInNearestScrollContainer(\n targetElement,\n rootScrollParent,\n )\n const handleScroll = function () {\n if (!ticking) {\n window.requestAnimationFrame(function () {\n onReposition()\n ticking = false\n })\n ticking = true\n }\n const isInView = isTriggerVisibleInNearestScrollContainer(targetElement, rootScrollParent)\n if (isInView !== previousIsInView) {\n previousIsInView = isInView\n if (onVisibilityChange != null) {\n onVisibilityChange(isInView)\n }\n }\n }\n const resizeObserver = new ResizeObserver(onReposition)\n window.addEventListener('resize', onReposition)\n document.addEventListener('scroll', handleScroll, {\n capture: true,\n passive: true,\n })\n resizeObserver.observe(targetElement)\n return () => {\n resizeObserver.disconnect()\n window.removeEventListener('resize', onReposition)\n document.removeEventListener('scroll', handleScroll, true)\n }\n }\n }, [editor, onVisibilityChange, onReposition, resolution, targetElementRef])\n}\n\nexport const SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND: LexicalCommand<{\n index: number\n item: SlashMenuItemInternal\n}> = createCommand('SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND')\n\nexport function LexicalMenu({\n anchorElementRef,\n close,\n editor,\n // groups filtering is already handled in SlashMenu/index.tsx. Thus, groups always contains the matching items.\n groups,\n menuRenderFn,\n resolution,\n shouldSplitNodeWithQuery = false,\n}: {\n anchorElementRef: RefObject<HTMLElement | null>\n close: () => void\n editor: LexicalEditor\n groups: Array<SlashMenuGroupInternal>\n menuRenderFn: MenuRenderFn\n resolution: MenuResolution\n shouldSplitNodeWithQuery?: boolean\n}): JSX.Element | null {\n const [selectedItemKey, setSelectedItemKey] = useState<null | string>(null)\n\n const matchingString = (resolution.match && resolution.match.matchingString) || ''\n\n const updateSelectedItem = useCallback(\n (item: SlashMenuItem) => {\n const rootElem = editor.getRootElement()\n if (rootElem !== null) {\n rootElem.setAttribute('aria-activedescendant', `${baseClass}__item-${item.key}`)\n setSelectedItemKey(item.key)\n }\n },\n [editor],\n )\n\n const setSelectedItemKeyToFirstMatchingItem = useCallback(() => {\n // set selected item to the first of the matching ones\n if (groups !== null && matchingString != null) {\n // groups filtering is already handled in SlashMenu/index.tsx. Thus, groups always contains the matching items.\n const allItems = groups.flatMap((group) => group.items)\n\n if (allItems.length) {\n const firstMatchingItem = allItems[0]!\n updateSelectedItem(firstMatchingItem)\n }\n }\n }, [groups, updateSelectedItem, matchingString])\n\n useEffect(() => {\n setSelectedItemKeyToFirstMatchingItem()\n }, [matchingString, setSelectedItemKeyToFirstMatchingItem])\n\n const selectItemAndCleanUp = useCallback(\n (selectedItem: SlashMenuItem) => {\n close()\n\n editor.update(() => {\n const textNodeContainingQuery =\n resolution.match != null && shouldSplitNodeWithQuery\n ? $splitNodeContainingQuery(resolution.match)\n : null\n\n if (textNodeContainingQuery) {\n textNodeContainingQuery.remove()\n }\n })\n\n setTimeout(() => {\n // Needed in Firefox. See https://github.com/payloadcms/payload/issues/10724\n let selection: BaseSelection | undefined\n editor.read(() => {\n selection = $getSelection()?.clone()\n })\n editor.update(() => {\n if (selection) {\n $setSelection(selection)\n }\n })\n\n selectedItem.onSelect({\n editor,\n queryString: resolution.match ? resolution.match.matchingString : '',\n })\n }, 0)\n },\n [editor, shouldSplitNodeWithQuery, resolution.match, close],\n )\n\n useEffect(() => {\n return () => {\n const rootElem = editor.getRootElement()\n if (rootElem !== null) {\n rootElem.removeAttribute('aria-activedescendant')\n }\n }\n }, [editor])\n\n useLayoutEffect(() => {\n if (groups === null) {\n setSelectedItemKey(null)\n } else if (selectedItemKey === null) {\n setSelectedItemKeyToFirstMatchingItem()\n }\n }, [groups, selectedItemKey, updateSelectedItem, setSelectedItemKeyToFirstMatchingItem])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND,\n ({ item }) => {\n if (item.ref && item.ref.current != null) {\n scrollIntoViewIfNeeded(item.ref.current)\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, updateSelectedItem])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand<KeyboardEvent>(\n KEY_ARROW_DOWN_COMMAND,\n (payload) => {\n const event = payload\n if (groups !== null && groups.length && selectedItemKey !== null) {\n const allItems = groups.flatMap((group) => group.items)\n const selectedIndex = allItems.findIndex((item) => item.key === selectedItemKey)\n\n const newSelectedIndex = selectedIndex !== allItems.length - 1 ? selectedIndex + 1 : 0\n\n const newSelectedItem = allItems[newSelectedIndex]\n if (!newSelectedItem) {\n return false\n }\n\n updateSelectedItem(newSelectedItem)\n if (newSelectedItem.ref != null && newSelectedItem.ref.current) {\n editor.dispatchCommand(SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND, {\n index: newSelectedIndex,\n item: newSelectedItem,\n })\n }\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_ARROW_UP_COMMAND,\n (payload) => {\n const event = payload\n if (groups !== null && groups.length && selectedItemKey !== null) {\n const allItems = groups.flatMap((group) => group.items)\n const selectedIndex = allItems.findIndex((item) => item.key === selectedItemKey)\n\n const newSelectedIndex = selectedIndex !== 0 ? selectedIndex - 1 : allItems.length - 1\n\n const newSelectedItem = allItems[newSelectedIndex]\n if (!newSelectedItem) {\n return false\n }\n\n updateSelectedItem(newSelectedItem)\n if (newSelectedItem.ref != null && newSelectedItem.ref.current) {\n scrollIntoViewIfNeeded(newSelectedItem.ref.current)\n }\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_ESCAPE_COMMAND,\n (payload) => {\n const event = payload\n event.preventDefault()\n event.stopImmediatePropagation()\n close()\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_TAB_COMMAND,\n (payload) => {\n const event = payload\n\n if (groups === null || selectedItemKey === null) {\n return false\n }\n const allItems = groups.flatMap((group) => group.items)\n const selectedItem = allItems.find((item) => item.key === selectedItemKey)\n if (!selectedItem) {\n return false\n }\n\n event.preventDefault()\n event.stopImmediatePropagation()\n selectItemAndCleanUp(selectedItem)\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n editor.registerCommand(\n KEY_ENTER_COMMAND,\n (event: KeyboardEvent | null) => {\n if (groups === null || selectedItemKey === null) {\n return false\n }\n const allItems = groups.flatMap((group) => group.items)\n const selectedItem = allItems.find((item) => item.key === selectedItemKey)\n if (!selectedItem) {\n return false\n }\n\n if (event !== null) {\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n selectItemAndCleanUp(selectedItem)\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n )\n }, [selectItemAndCleanUp, close, editor, groups, selectedItemKey, updateSelectedItem])\n\n const listItemProps = useMemo(\n () => ({\n groups,\n selectedItemKey,\n selectItemAndCleanUp,\n setSelectedItemKey,\n }),\n [selectItemAndCleanUp, selectedItemKey, groups],\n )\n\n return menuRenderFn(\n anchorElementRef,\n listItemProps,\n resolution.match ? resolution.match.matchingString : '',\n )\n}\n\nfunction setContainerDivAttributes(containerDiv: HTMLElement, className?: string) {\n if (className != null) {\n containerDiv.className = className\n }\n containerDiv.setAttribute('aria-label', 'Slash menu')\n containerDiv.setAttribute('role', 'listbox')\n containerDiv.style.display = 'block'\n containerDiv.style.position = 'absolute'\n}\n\nexport function useMenuAnchorRef(\n anchorElem: HTMLElement,\n resolution: MenuResolution | null,\n setResolution: (r: MenuResolution | null) => void,\n className?: string,\n): RefObject<HTMLElement | null> {\n const [editor] = useLexicalComposerContext()\n const anchorElementRef = useRef<HTMLElement | null>(\n CAN_USE_DOM ? document.createElement('div') : null,\n )\n const positionMenu = useCallback(() => {\n if (anchorElementRef.current === null || parent === undefined) {\n return\n }\n const rootElement = editor.getRootElement()\n const containerDiv = anchorElementRef.current\n\n const VERTICAL_OFFSET = 32\n\n const menuEle = containerDiv.firstChild as Element\n if (rootElement !== null && resolution !== null) {\n const { height, width } = resolution.getRect()\n let { left, top } = resolution.getRect()\n\n const rawTop = top\n top -= anchorElem.getBoundingClientRect().top + window.scrollY\n left -= anchorElem.getBoundingClientRect().left + window.scrollX\n containerDiv.style.left = `${left + window.scrollX}px`\n containerDiv.style.height = `${height}px`\n containerDiv.style.width = `${width}px`\n if (menuEle !== null) {\n const menuRect = menuEle.getBoundingClientRect()\n const menuHeight = menuRect.height\n const menuWidth = menuRect.width\n\n const rootElementRect = rootElement.getBoundingClientRect()\n\n const isRTL = document.dir === 'rtl' || document.documentElement.dir === 'rtl'\n const anchorRect = anchorElem.getBoundingClientRect()\n const leftBoundary = Math.max(0, rootElementRect.left)\n\n if (!isRTL && left + menuWidth > rootElementRect.right) {\n containerDiv.style.left = `${rootElementRect.right - menuWidth + window.scrollX}px`\n } else if (isRTL && menuRect.left < leftBoundary) {\n const newLeft = leftBoundary + menuWidth - anchorRect.left\n containerDiv.style.left = `${newLeft + window.scrollX}px`\n }\n\n const wouldGoOffBottomOfScreen = rawTop + menuHeight + VERTICAL_OFFSET > window.innerHeight\n //const wouldGoOffBottomOfContainer = top + menuHeight > rootElementRect.bottom\n const wouldGoOffTopOfScreen = rawTop < 0\n\n // Position slash menu above the cursor instead of below (default) if it would otherwise go off the bottom of the screen.\n if (wouldGoOffBottomOfScreen && !wouldGoOffTopOfScreen) {\n const margin = 24\n containerDiv.style.top = `${\n top + VERTICAL_OFFSET - menuHeight + window.scrollY - (height + margin)\n }px`\n } else {\n containerDiv.style.top = `${top + window.scrollY + VERTICAL_OFFSET}px`\n }\n }\n\n if (!containerDiv.isConnected) {\n setContainerDivAttributes(containerDiv, className)\n anchorElem.append(containerDiv)\n }\n containerDiv.setAttribute('id', 'slash-menu')\n anchorElementRef.current = containerDiv\n rootElement.setAttribute('aria-controls', 'slash-menu')\n }\n }, [editor, resolution, className, anchorElem])\n\n useEffect(() => {\n const rootElement = editor.getRootElement()\n if (resolution !== null) {\n positionMenu()\n return () => {\n if (rootElement !== null) {\n rootElement.removeAttribute('aria-controls')\n }\n\n const containerDiv = anchorElementRef.current\n if (containerDiv !== null && containerDiv.isConnected) {\n containerDiv.remove()\n containerDiv.removeAttribute('id')\n }\n }\n }\n }, [editor, positionMenu, resolution])\n\n const onVisibilityChange = useCallback(\n (isInView: boolean) => {\n if (resolution !== null) {\n if (!isInView) {\n setResolution(null)\n }\n }\n },\n [resolution, setResolution],\n )\n\n useDynamicPositioning(resolution, anchorElementRef, positionMenu, onVisibilityChange)\n\n return anchorElementRef\n}\n"],"names":["useLexicalComposerContext","mergeRegister","$getSelection","$isRangeSelection","$setSelection","COMMAND_PRIORITY_LOW","COMMAND_PRIORITY_NORMAL","createCommand","KEY_ARROW_DOWN_COMMAND","KEY_ARROW_UP_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","KEY_TAB_COMMAND","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","CAN_USE_DOM","baseClass","scrollIntoViewIfNeeded","target","typeaheadContainerNode","document","getElementById","typeaheadRect","getBoundingClientRect","top","height","window","innerHeight","scrollIntoView","block","getFullMatchOffset","documentText","entryText","offset","triggerOffset","i","length","substring","$splitNodeContainingQuery","match","selection","isCollapsed","anchor","type","anchorNode","getNode","isSimpleText","selectionOffset","textContent","getTextContent","slice","characterOffset","replaceableString","queryOffset","matchingString","startOffset","newNode","splitText","getScrollParent","element","includeHidden","style","getComputedStyle","excludeStaticParent","position","overflowRegex","body","parent","parentElement","test","overflow","overflowY","overflowX","isTriggerVisibleInNearestScrollContainer","targetElement","containerElement","tRect","cRect","bottom","useDynamicPositioning","resolution","targetElementRef","onReposition","onVisibilityChange","editor","current","rootElement","getRootElement","rootScrollParent","ticking","previousIsInView","handleScroll","requestAnimationFrame","isInView","resizeObserver","ResizeObserver","addEventListener","capture","passive","observe","disconnect","removeEventListener","SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND","LexicalMenu","anchorElementRef","close","groups","menuRenderFn","shouldSplitNodeWithQuery","selectedItemKey","setSelectedItemKey","updateSelectedItem","item","rootElem","setAttribute","key","setSelectedItemKeyToFirstMatchingItem","allItems","flatMap","group","items","firstMatchingItem","selectItemAndCleanUp","selectedItem","update","textNodeContainingQuery","remove","setTimeout","read","clone","onSelect","queryString","removeAttribute","registerCommand","ref","payload","event","selectedIndex","findIndex","newSelectedIndex","newSelectedItem","dispatchCommand","index","preventDefault","stopImmediatePropagation","find","listItemProps","setContainerDivAttributes","containerDiv","className","display","useMenuAnchorRef","anchorElem","setResolution","createElement","positionMenu","undefined","VERTICAL_OFFSET","menuEle","firstChild","width","getRect","left","rawTop","scrollY","scrollX","menuRect","menuHeight","menuWidth","rootElementRect","isRTL","dir","documentElement","anchorRect","leftBoundary","Math","max","right","newLeft","wouldGoOffBottomOfScreen","wouldGoOffTopOfScreen","margin","isConnected","append"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import {
|
|
2
|
+
import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
|
|
3
3
|
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
|
|
4
4
|
import { mergeRegister } from '@lexical/utils';
|
|
5
5
|
import { $getSelection, $isRangeSelection, $isTextNode, COMMAND_PRIORITY_LOW, createCommand, getDOMSelection } from 'lexical';
|
|
@@ -171,7 +171,7 @@ export function LexicalTypeaheadMenuPlugin({ anchorClassName, anchorElem, groups
|
|
|
171
171
|
closeTypeahead,
|
|
172
172
|
openTypeahead
|
|
173
173
|
]);
|
|
174
|
-
return anchorElementRef.current === null || resolution === null || editor === null ? null : /*#__PURE__*/
|
|
174
|
+
return anchorElementRef.current === null || resolution === null || editor === null ? null : /*#__PURE__*/ _jsxDEV(LexicalMenu, {
|
|
175
175
|
anchorElementRef: anchorElementRef,
|
|
176
176
|
close: closeTypeahead,
|
|
177
177
|
editor: editor,
|
|
@@ -179,7 +179,11 @@ export function LexicalTypeaheadMenuPlugin({ anchorClassName, anchorElem, groups
|
|
|
179
179
|
menuRenderFn: menuRenderFn,
|
|
180
180
|
resolution: resolution,
|
|
181
181
|
shouldSplitNodeWithQuery: true
|
|
182
|
-
}
|
|
182
|
+
}, void 0, false, {
|
|
183
|
+
fileName: "src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.tsx",
|
|
184
|
+
lineNumber: 235,
|
|
185
|
+
columnNumber: 5
|
|
186
|
+
}, this);
|
|
183
187
|
}
|
|
184
188
|
|
|
185
189
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalCommand, LexicalEditor, ParagraphNode, RangeSelection } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n COMMAND_PRIORITY_LOW,\n createCommand,\n getDOMSelection,\n} from 'lexical'\nimport { type JSX, useCallback, useEffect, useState } from 'react'\nimport * as React from 'react'\n\nimport type { MenuTextMatch, TriggerFn } from '../useMenuTriggerMatch.js'\nimport type { MenuRenderFn, MenuResolution } from './LexicalMenu.js'\nimport type { SlashMenuGroupInternal } from './types.js'\n\nimport { LexicalMenu, useMenuAnchorRef } from './LexicalMenu.js'\n\nexport const PUNCTUATION = '\\\\.,\\\\+\\\\*\\\\?\\\\$\\\\@\\\\|#{}\\\\(\\\\)\\\\^\\\\-\\\\[\\\\]\\\\\\\\/!%\\'\"~=<>_:;'\n\nfunction getTextUpToAnchor(selection: RangeSelection): null | string {\n const anchor = selection.anchor\n if (anchor.type !== 'text') {\n return null\n }\n const anchorNode = anchor.getNode()\n if (!anchorNode.isSimpleText()) {\n return null\n }\n const anchorOffset = anchor.offset\n return anchorNode.getTextContent().slice(0, anchorOffset)\n}\n\nfunction tryToPositionRange(leadOffset: number, range: Range, editorWindow: Window): boolean {\n const domSelection = getDOMSelection(editorWindow)\n if (domSelection === null || !domSelection.isCollapsed) {\n return false\n }\n\n const anchorNode = domSelection.anchorNode\n const startOffset = leadOffset\n const endOffset = domSelection.anchorOffset\n\n if (anchorNode == null || endOffset == null) {\n return false\n }\n\n try {\n range.setStart(anchorNode, startOffset)\n // if endOffset is 0, positioning the range for when you click the plus button to open the slash menu will fial\n range.setEnd(anchorNode, endOffset > 1 ? endOffset : 1)\n } catch (error) {\n return false\n }\n\n return true\n}\n\nfunction getQueryTextForSearch(editor: LexicalEditor): string | undefined {\n let text\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n if (!$isRangeSelection(selection)) {\n return\n }\n text = getTextUpToAnchor(selection)\n })\n return text\n}\n\nfunction isSelectionOnEntityBoundary(editor: LexicalEditor, offset: number): boolean {\n if (offset !== 0) {\n return false\n }\n return editor.getEditorState().read(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n const anchor = selection.anchor\n const anchorNode = anchor.getNode()\n const prevSibling = anchorNode.getPreviousSibling()\n return $isTextNode(prevSibling) && prevSibling.isTextEntity()\n }\n return false\n })\n}\n\nfunction startTransition(callback: () => void) {\n if (React.startTransition) {\n React.startTransition(callback)\n } else {\n callback()\n }\n}\n\nexport { useDynamicPositioning } from './LexicalMenu.js'\n\nexport type TypeaheadMenuPluginProps = {\n anchorClassName?: string\n anchorElem: HTMLElement\n groups: Array<SlashMenuGroupInternal>\n menuRenderFn: MenuRenderFn\n onClose?: () => void\n onOpen?: (resolution: MenuResolution) => void\n onQueryChange: (matchingString: null | string) => void\n triggerFn: TriggerFn\n}\n\nexport const ENABLE_SLASH_MENU_COMMAND: LexicalCommand<{\n node: ParagraphNode\n}> = createCommand('ENABLE_SLASH_MENU_COMMAND')\n\nexport function LexicalTypeaheadMenuPlugin({\n anchorClassName,\n anchorElem,\n groups,\n menuRenderFn,\n onClose,\n onOpen,\n onQueryChange,\n triggerFn,\n}: TypeaheadMenuPluginProps): JSX.Element | null {\n const [editor] = useLexicalComposerContext()\n const [resolution, setResolution] = useState<MenuResolution | null>(null)\n const anchorElementRef = useMenuAnchorRef(anchorElem, resolution, setResolution, anchorClassName)\n\n const closeTypeahead = useCallback(() => {\n setResolution(null)\n if (onClose != null && resolution !== null) {\n onClose()\n }\n }, [onClose, resolution])\n\n const openTypeahead = useCallback(\n (res: MenuResolution) => {\n setResolution(res)\n if (onOpen != null && resolution === null) {\n onOpen(res)\n }\n },\n [onOpen, resolution],\n )\n\n // This is mainly used for the AddBlockHandlePlugin, so that the slash menu can be opened from there\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n ENABLE_SLASH_MENU_COMMAND,\n ({ node }) => {\n editor.getEditorState().read(() => {\n const match: MenuTextMatch = {\n leadOffset: 0,\n matchingString: '',\n replaceableString: '',\n }\n if (!isSelectionOnEntityBoundary(editor, match.leadOffset)) {\n if (node !== null) {\n const editorWindow = editor._window ?? window\n const range = editorWindow.document.createRange()\n\n const isRangePositioned = tryToPositionRange(match.leadOffset, range, editorWindow)\n if (isRangePositioned !== null) {\n startTransition(() =>\n openTypeahead({\n getRect: () => {\n return range.getBoundingClientRect()\n },\n match,\n }),\n )\n }\n\n return\n }\n }\n })\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, openTypeahead])\n\n useEffect(() => {\n const updateListener = () => {\n editor.getEditorState().read(() => {\n const editorWindow = editor._window ?? window\n const range = editorWindow.document.createRange()\n const selection = $getSelection()\n const text = getQueryTextForSearch(editor)\n\n if (\n !$isRangeSelection(selection) ||\n !selection.isCollapsed() ||\n text === undefined ||\n range === null\n ) {\n closeTypeahead()\n return\n }\n\n const match = triggerFn({ editor, query: text })\n onQueryChange(match ? match.matchingString : null)\n\n if (match !== null && !isSelectionOnEntityBoundary(editor, match.leadOffset)) {\n const isRangePositioned = tryToPositionRange(match.leadOffset, range, editorWindow)\n if (isRangePositioned !== null) {\n startTransition(() =>\n openTypeahead({\n getRect: () => {\n return range.getBoundingClientRect()\n },\n match,\n }),\n )\n return\n }\n }\n closeTypeahead()\n })\n }\n\n const removeUpdateListener = editor.registerUpdateListener(updateListener)\n\n return () => {\n removeUpdateListener()\n }\n }, [editor, triggerFn, onQueryChange, resolution, closeTypeahead, openTypeahead])\n\n return anchorElementRef.current === null || resolution === null || editor === null ? null : (\n <LexicalMenu\n anchorElementRef={anchorElementRef}\n close={closeTypeahead}\n editor={editor}\n groups={groups}\n menuRenderFn={menuRenderFn}\n resolution={resolution}\n shouldSplitNodeWithQuery\n />\n )\n}\n\nexport type { MenuRenderFn, MenuResolution, MenuTextMatch, TriggerFn }\n"],"names":["useLexicalComposerContext","mergeRegister","$getSelection","$isRangeSelection","$isTextNode","COMMAND_PRIORITY_LOW","createCommand","getDOMSelection","useCallback","useEffect","useState","React","LexicalMenu","useMenuAnchorRef","PUNCTUATION","getTextUpToAnchor","selection","anchor","type","anchorNode","getNode","isSimpleText","anchorOffset","offset","getTextContent","slice","tryToPositionRange","leadOffset","range","editorWindow","domSelection","isCollapsed","startOffset","endOffset","setStart","setEnd","error","getQueryTextForSearch","editor","text","getEditorState","read","isSelectionOnEntityBoundary","prevSibling","getPreviousSibling","isTextEntity","startTransition","callback","useDynamicPositioning","ENABLE_SLASH_MENU_COMMAND","LexicalTypeaheadMenuPlugin","anchorClassName","anchorElem","groups","menuRenderFn","onClose","onOpen","onQueryChange","triggerFn","resolution","setResolution","anchorElementRef","closeTypeahead","openTypeahead","res","registerCommand","node","match","matchingString","replaceableString","_window","window","document","createRange","isRangePositioned","getRect","getBoundingClientRect","updateListener","undefined","query","removeUpdateListener","registerUpdateListener","current","close","shouldSplitNodeWithQuery"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalCommand, LexicalEditor, ParagraphNode, RangeSelection } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n COMMAND_PRIORITY_LOW,\n createCommand,\n getDOMSelection,\n} from 'lexical'\nimport { type JSX, useCallback, useEffect, useState } from 'react'\nimport * as React from 'react'\n\nimport type { MenuTextMatch, TriggerFn } from '../useMenuTriggerMatch.js'\nimport type { MenuRenderFn, MenuResolution } from './LexicalMenu.js'\nimport type { SlashMenuGroupInternal } from './types.js'\n\nimport { LexicalMenu, useMenuAnchorRef } from './LexicalMenu.js'\n\nexport const PUNCTUATION = '\\\\.,\\\\+\\\\*\\\\?\\\\$\\\\@\\\\|#{}\\\\(\\\\)\\\\^\\\\-\\\\[\\\\]\\\\\\\\/!%\\'\"~=<>_:;'\n\nfunction getTextUpToAnchor(selection: RangeSelection): null | string {\n const anchor = selection.anchor\n if (anchor.type !== 'text') {\n return null\n }\n const anchorNode = anchor.getNode()\n if (!anchorNode.isSimpleText()) {\n return null\n }\n const anchorOffset = anchor.offset\n return anchorNode.getTextContent().slice(0, anchorOffset)\n}\n\nfunction tryToPositionRange(leadOffset: number, range: Range, editorWindow: Window): boolean {\n const domSelection = getDOMSelection(editorWindow)\n if (domSelection === null || !domSelection.isCollapsed) {\n return false\n }\n\n const anchorNode = domSelection.anchorNode\n const startOffset = leadOffset\n const endOffset = domSelection.anchorOffset\n\n if (anchorNode == null || endOffset == null) {\n return false\n }\n\n try {\n range.setStart(anchorNode, startOffset)\n // if endOffset is 0, positioning the range for when you click the plus button to open the slash menu will fial\n range.setEnd(anchorNode, endOffset > 1 ? endOffset : 1)\n } catch (error) {\n return false\n }\n\n return true\n}\n\nfunction getQueryTextForSearch(editor: LexicalEditor): string | undefined {\n let text\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n if (!$isRangeSelection(selection)) {\n return\n }\n text = getTextUpToAnchor(selection)\n })\n return text\n}\n\nfunction isSelectionOnEntityBoundary(editor: LexicalEditor, offset: number): boolean {\n if (offset !== 0) {\n return false\n }\n return editor.getEditorState().read(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n const anchor = selection.anchor\n const anchorNode = anchor.getNode()\n const prevSibling = anchorNode.getPreviousSibling()\n return $isTextNode(prevSibling) && prevSibling.isTextEntity()\n }\n return false\n })\n}\n\nfunction startTransition(callback: () => void) {\n if (React.startTransition) {\n React.startTransition(callback)\n } else {\n callback()\n }\n}\n\nexport { useDynamicPositioning } from './LexicalMenu.js'\n\nexport type TypeaheadMenuPluginProps = {\n anchorClassName?: string\n anchorElem: HTMLElement\n groups: Array<SlashMenuGroupInternal>\n menuRenderFn: MenuRenderFn\n onClose?: () => void\n onOpen?: (resolution: MenuResolution) => void\n onQueryChange: (matchingString: null | string) => void\n triggerFn: TriggerFn\n}\n\nexport const ENABLE_SLASH_MENU_COMMAND: LexicalCommand<{\n node: ParagraphNode\n}> = createCommand('ENABLE_SLASH_MENU_COMMAND')\n\nexport function LexicalTypeaheadMenuPlugin({\n anchorClassName,\n anchorElem,\n groups,\n menuRenderFn,\n onClose,\n onOpen,\n onQueryChange,\n triggerFn,\n}: TypeaheadMenuPluginProps): JSX.Element | null {\n const [editor] = useLexicalComposerContext()\n const [resolution, setResolution] = useState<MenuResolution | null>(null)\n const anchorElementRef = useMenuAnchorRef(anchorElem, resolution, setResolution, anchorClassName)\n\n const closeTypeahead = useCallback(() => {\n setResolution(null)\n if (onClose != null && resolution !== null) {\n onClose()\n }\n }, [onClose, resolution])\n\n const openTypeahead = useCallback(\n (res: MenuResolution) => {\n setResolution(res)\n if (onOpen != null && resolution === null) {\n onOpen(res)\n }\n },\n [onOpen, resolution],\n )\n\n // This is mainly used for the AddBlockHandlePlugin, so that the slash menu can be opened from there\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n ENABLE_SLASH_MENU_COMMAND,\n ({ node }) => {\n editor.getEditorState().read(() => {\n const match: MenuTextMatch = {\n leadOffset: 0,\n matchingString: '',\n replaceableString: '',\n }\n if (!isSelectionOnEntityBoundary(editor, match.leadOffset)) {\n if (node !== null) {\n const editorWindow = editor._window ?? window\n const range = editorWindow.document.createRange()\n\n const isRangePositioned = tryToPositionRange(match.leadOffset, range, editorWindow)\n if (isRangePositioned !== null) {\n startTransition(() =>\n openTypeahead({\n getRect: () => {\n return range.getBoundingClientRect()\n },\n match,\n }),\n )\n }\n\n return\n }\n }\n })\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, openTypeahead])\n\n useEffect(() => {\n const updateListener = () => {\n editor.getEditorState().read(() => {\n const editorWindow = editor._window ?? window\n const range = editorWindow.document.createRange()\n const selection = $getSelection()\n const text = getQueryTextForSearch(editor)\n\n if (\n !$isRangeSelection(selection) ||\n !selection.isCollapsed() ||\n text === undefined ||\n range === null\n ) {\n closeTypeahead()\n return\n }\n\n const match = triggerFn({ editor, query: text })\n onQueryChange(match ? match.matchingString : null)\n\n if (match !== null && !isSelectionOnEntityBoundary(editor, match.leadOffset)) {\n const isRangePositioned = tryToPositionRange(match.leadOffset, range, editorWindow)\n if (isRangePositioned !== null) {\n startTransition(() =>\n openTypeahead({\n getRect: () => {\n return range.getBoundingClientRect()\n },\n match,\n }),\n )\n return\n }\n }\n closeTypeahead()\n })\n }\n\n const removeUpdateListener = editor.registerUpdateListener(updateListener)\n\n return () => {\n removeUpdateListener()\n }\n }, [editor, triggerFn, onQueryChange, resolution, closeTypeahead, openTypeahead])\n\n return anchorElementRef.current === null || resolution === null || editor === null ? null : (\n <LexicalMenu\n anchorElementRef={anchorElementRef}\n close={closeTypeahead}\n editor={editor}\n groups={groups}\n menuRenderFn={menuRenderFn}\n resolution={resolution}\n shouldSplitNodeWithQuery\n />\n )\n}\n\nexport type { MenuRenderFn, MenuResolution, MenuTextMatch, TriggerFn }\n"],"names":["useLexicalComposerContext","mergeRegister","$getSelection","$isRangeSelection","$isTextNode","COMMAND_PRIORITY_LOW","createCommand","getDOMSelection","useCallback","useEffect","useState","React","LexicalMenu","useMenuAnchorRef","PUNCTUATION","getTextUpToAnchor","selection","anchor","type","anchorNode","getNode","isSimpleText","anchorOffset","offset","getTextContent","slice","tryToPositionRange","leadOffset","range","editorWindow","domSelection","isCollapsed","startOffset","endOffset","setStart","setEnd","error","getQueryTextForSearch","editor","text","getEditorState","read","isSelectionOnEntityBoundary","prevSibling","getPreviousSibling","isTextEntity","startTransition","callback","useDynamicPositioning","ENABLE_SLASH_MENU_COMMAND","LexicalTypeaheadMenuPlugin","anchorClassName","anchorElem","groups","menuRenderFn","onClose","onOpen","onQueryChange","triggerFn","resolution","setResolution","anchorElementRef","closeTypeahead","openTypeahead","res","registerCommand","node","match","matchingString","replaceableString","_window","window","document","createRange","isRangePositioned","getRect","getBoundingClientRect","updateListener","undefined","query","removeUpdateListener","registerUpdateListener","current","close","shouldSplitNodeWithQuery"],"mappings":"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"}
|