@payloadcms/richtext-lexical 3.0.0-beta.53 → 3.0.0-beta.55
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/index.d.ts.map +1 -1
- package/dist/cell/index.js +1 -1
- package/dist/cell/index.js.map +1 -1
- package/dist/exports/client/Field-XBUN6QOM.js +2 -0
- package/dist/exports/client/Field-XBUN6QOM.js.map +7 -0
- package/dist/exports/client/{RelationshipComponent-5OU5HATX.js → RelationshipComponent-AFXEJMZQ.js} +2 -2
- package/dist/exports/client/bundled.css +1 -1
- package/dist/exports/client/{chunk-QU5MKT75.js → chunk-5RJS5YZT.js} +2 -2
- package/dist/exports/client/chunk-5RJS5YZT.js.map +7 -0
- package/dist/exports/client/chunk-JIP5PWU3.js +2 -0
- package/dist/exports/client/chunk-JIP5PWU3.js.map +7 -0
- package/dist/exports/client/{chunk-MLIITFAS.js → chunk-Q5DYR7MH.js} +2 -2
- package/dist/exports/client/chunk-Q5DYR7MH.js.map +7 -0
- package/dist/exports/client/{chunk-OSR74ZNW.js → chunk-YL52LJO3.js} +2 -2
- package/dist/exports/client/chunk-YL52LJO3.js.map +7 -0
- package/dist/exports/client/{component-E2NHAHBC.js → component-F6V63OLD.js} +2 -2
- package/dist/exports/client/component-F6V63OLD.js.map +7 -0
- package/dist/exports/client/component-PEFMKIXI.js +2 -0
- package/dist/exports/client/component-PEFMKIXI.js.map +7 -0
- package/dist/exports/client/{component-QWIGEOVD.js → component-VM36FRT2.js} +2 -2
- package/dist/exports/client/index.d.ts +37 -27
- package/dist/exports/client/index.d.ts.map +1 -1
- package/dist/exports/client/index.js +7 -5
- package/dist/exports/client/index.js.map +4 -4
- package/dist/features/align/feature.client.d.ts +1 -2
- package/dist/features/align/feature.client.d.ts.map +1 -1
- package/dist/features/align/feature.client.js +9 -16
- package/dist/features/align/feature.client.js.map +1 -1
- package/dist/features/align/feature.server.d.ts +1 -2
- package/dist/features/align/feature.server.d.ts.map +1 -1
- package/dist/features/align/feature.server.js +9 -15
- package/dist/features/align/feature.server.js.map +1 -1
- package/dist/features/align/i18n.js.map +1 -1
- package/dist/features/align/toolbarAlignGroup.js.map +1 -1
- package/dist/features/blockquote/feature.client.d.ts +1 -2
- package/dist/features/blockquote/feature.client.d.ts.map +1 -1
- package/dist/features/blockquote/feature.client.js +37 -44
- package/dist/features/blockquote/feature.client.js.map +1 -1
- package/dist/features/blockquote/feature.server.d.ts +6 -2
- package/dist/features/blockquote/feature.server.d.ts.map +1 -1
- package/dist/features/blockquote/feature.server.js +35 -40
- package/dist/features/blockquote/feature.server.js.map +1 -1
- package/dist/features/blockquote/i18n.js.map +1 -1
- package/dist/features/blockquote/markdownTransformer.js.map +1 -1
- package/dist/features/blocks/component/BlockContent.js +2 -2
- package/dist/features/blocks/component/BlockContent.js.map +1 -1
- package/dist/features/blocks/component/FormSavePlugin.js.map +1 -1
- package/dist/features/blocks/component/index.js +1 -1
- package/dist/features/blocks/component/index.js.map +1 -1
- package/dist/features/blocks/component/removeEmptyArrayValues.js.map +1 -1
- package/dist/features/blocks/drawer/index.js +1 -1
- package/dist/features/blocks/drawer/index.js.map +1 -1
- package/dist/features/blocks/feature.client.d.ts +1 -2
- package/dist/features/blocks/feature.client.d.ts.map +1 -1
- package/dist/features/blocks/feature.client.js +74 -80
- package/dist/features/blocks/feature.client.js.map +1 -1
- package/dist/features/blocks/feature.server.d.ts +1 -2
- package/dist/features/blocks/feature.server.d.ts.map +1 -1
- package/dist/features/blocks/feature.server.js +88 -90
- package/dist/features/blocks/feature.server.js.map +1 -1
- package/dist/features/blocks/graphQLPopulationPromise.d.ts +1 -1
- package/dist/features/blocks/graphQLPopulationPromise.d.ts.map +1 -1
- package/dist/features/blocks/graphQLPopulationPromise.js.map +1 -1
- package/dist/features/blocks/i18n.js.map +1 -1
- package/dist/features/blocks/nodes/BlocksNode.d.ts +2 -0
- package/dist/features/blocks/nodes/BlocksNode.d.ts.map +1 -1
- package/dist/features/blocks/nodes/BlocksNode.js +1 -1
- package/dist/features/blocks/nodes/BlocksNode.js.map +1 -1
- package/dist/features/blocks/plugin/commands.js.map +1 -1
- package/dist/features/blocks/plugin/index.d.ts +1 -1
- package/dist/features/blocks/plugin/index.d.ts.map +1 -1
- package/dist/features/blocks/plugin/index.js.map +1 -1
- package/dist/features/blocks/validate.d.ts +1 -1
- package/dist/features/blocks/validate.d.ts.map +1 -1
- package/dist/features/blocks/validate.js.map +1 -1
- package/dist/features/converters/html/converter/converters/linebreak.js.map +1 -1
- package/dist/features/converters/html/converter/converters/paragraph.js.map +1 -1
- package/dist/features/converters/html/converter/converters/text.js.map +1 -1
- package/dist/features/converters/html/converter/defaultConverters.js.map +1 -1
- package/dist/features/converters/html/converter/index.js.map +1 -1
- package/dist/features/converters/html/converter/types.js.map +1 -1
- package/dist/features/converters/html/feature.server.d.ts +1 -2
- package/dist/features/converters/html/feature.server.d.ts.map +1 -1
- package/dist/features/converters/html/feature.server.js +6 -12
- package/dist/features/converters/html/feature.server.js.map +1 -1
- package/dist/features/converters/html/field/index.js +1 -1
- package/dist/features/converters/html/field/index.js.map +1 -1
- package/dist/features/createClientComponent.d.ts +3 -2
- package/dist/features/createClientComponent.d.ts.map +1 -1
- package/dist/features/createClientComponent.js.map +1 -1
- package/dist/features/createFeaturePropComponent.d.ts.map +1 -1
- package/dist/features/createFeaturePropComponent.js.map +1 -1
- package/dist/features/debug/testRecorder/feature.client.d.ts +1 -2
- package/dist/features/debug/testRecorder/feature.client.d.ts.map +1 -1
- package/dist/features/debug/testRecorder/feature.client.js +9 -16
- package/dist/features/debug/testRecorder/feature.client.js.map +1 -1
- package/dist/features/debug/testRecorder/feature.server.d.ts +1 -2
- package/dist/features/debug/testRecorder/feature.server.d.ts.map +1 -1
- package/dist/features/debug/testRecorder/feature.server.js +8 -13
- package/dist/features/debug/testRecorder/feature.server.js.map +1 -1
- package/dist/features/debug/testRecorder/plugin/index.d.ts +1 -1
- package/dist/features/debug/testRecorder/plugin/index.d.ts.map +1 -1
- package/dist/features/debug/testRecorder/plugin/index.js.map +1 -1
- package/dist/features/debug/treeView/feature.client.d.ts +1 -2
- package/dist/features/debug/treeView/feature.client.d.ts.map +1 -1
- package/dist/features/debug/treeView/feature.client.js +9 -16
- package/dist/features/debug/treeView/feature.client.js.map +1 -1
- package/dist/features/debug/treeView/feature.server.d.ts +1 -2
- package/dist/features/debug/treeView/feature.server.d.ts.map +1 -1
- package/dist/features/debug/treeView/feature.server.js +8 -13
- package/dist/features/debug/treeView/feature.server.js.map +1 -1
- package/dist/features/debug/treeView/plugin/index.d.ts +1 -1
- package/dist/features/debug/treeView/plugin/index.d.ts.map +1 -1
- package/dist/features/debug/treeView/plugin/index.js.map +1 -1
- package/dist/features/format/bold/feature.client.d.ts +1 -2
- package/dist/features/format/bold/feature.client.d.ts.map +1 -1
- package/dist/features/format/bold/feature.client.js +16 -23
- package/dist/features/format/bold/feature.client.js.map +1 -1
- package/dist/features/format/bold/feature.server.d.ts +1 -2
- package/dist/features/format/bold/feature.server.d.ts.map +1 -1
- package/dist/features/format/bold/feature.server.js +21 -24
- package/dist/features/format/bold/feature.server.js.map +1 -1
- package/dist/features/format/bold/markdownTransformers.js.map +1 -1
- package/dist/features/format/inlineCode/feature.client.d.ts +1 -2
- package/dist/features/format/inlineCode/feature.client.d.ts.map +1 -1
- package/dist/features/format/inlineCode/feature.client.js +12 -21
- package/dist/features/format/inlineCode/feature.client.js.map +1 -1
- package/dist/features/format/inlineCode/feature.server.d.ts +1 -2
- package/dist/features/format/inlineCode/feature.server.d.ts.map +1 -1
- package/dist/features/format/inlineCode/feature.server.js +11 -16
- package/dist/features/format/inlineCode/feature.server.js.map +1 -1
- package/dist/features/format/inlineCode/markdownTransformers.js.map +1 -1
- package/dist/features/format/italic/feature.client.d.ts +1 -2
- package/dist/features/format/italic/feature.client.d.ts.map +1 -1
- package/dist/features/format/italic/feature.client.js +13 -22
- package/dist/features/format/italic/feature.client.js.map +1 -1
- package/dist/features/format/italic/feature.server.d.ts +1 -2
- package/dist/features/format/italic/feature.server.d.ts.map +1 -1
- package/dist/features/format/italic/feature.server.js +12 -17
- package/dist/features/format/italic/feature.server.js.map +1 -1
- package/dist/features/format/italic/markdownTransformers.js.map +1 -1
- package/dist/features/format/shared/toolbarFormatGroup.js.map +1 -1
- package/dist/features/format/strikethrough/feature.client.d.ts +1 -2
- package/dist/features/format/strikethrough/feature.client.d.ts.map +1 -1
- package/dist/features/format/strikethrough/feature.client.js +12 -21
- package/dist/features/format/strikethrough/feature.client.js.map +1 -1
- package/dist/features/format/strikethrough/feature.server.d.ts +1 -2
- package/dist/features/format/strikethrough/feature.server.d.ts.map +1 -1
- package/dist/features/format/strikethrough/feature.server.js +11 -16
- package/dist/features/format/strikethrough/feature.server.js.map +1 -1
- package/dist/features/format/strikethrough/markdownTransformers.js.map +1 -1
- package/dist/features/format/subscript/feature.client.d.ts +1 -2
- package/dist/features/format/subscript/feature.client.d.ts.map +1 -1
- package/dist/features/format/subscript/feature.client.js +9 -18
- package/dist/features/format/subscript/feature.client.js.map +1 -1
- package/dist/features/format/subscript/feature.server.d.ts +1 -2
- package/dist/features/format/subscript/feature.server.d.ts.map +1 -1
- package/dist/features/format/subscript/feature.server.js +8 -13
- package/dist/features/format/subscript/feature.server.js.map +1 -1
- package/dist/features/format/superscript/feature.client.d.ts +1 -2
- package/dist/features/format/superscript/feature.client.d.ts.map +1 -1
- package/dist/features/format/superscript/feature.client.js +9 -18
- package/dist/features/format/superscript/feature.client.js.map +1 -1
- package/dist/features/format/superscript/feature.server.d.ts +1 -2
- package/dist/features/format/superscript/feature.server.d.ts.map +1 -1
- package/dist/features/format/superscript/feature.server.js +8 -13
- package/dist/features/format/superscript/feature.server.js.map +1 -1
- package/dist/features/format/underline/feature.client.d.ts +1 -2
- package/dist/features/format/underline/feature.client.d.ts.map +1 -1
- package/dist/features/format/underline/feature.client.js +9 -18
- package/dist/features/format/underline/feature.client.js.map +1 -1
- package/dist/features/format/underline/feature.server.d.ts +1 -2
- package/dist/features/format/underline/feature.server.d.ts.map +1 -1
- package/dist/features/format/underline/feature.server.js +8 -13
- package/dist/features/format/underline/feature.server.js.map +1 -1
- package/dist/features/heading/feature.client.d.ts +1 -2
- package/dist/features/heading/feature.client.d.ts.map +1 -1
- package/dist/features/heading/feature.client.js +70 -76
- package/dist/features/heading/feature.client.js.map +1 -1
- package/dist/features/heading/feature.server.d.ts +1 -2
- package/dist/features/heading/feature.server.d.ts.map +1 -1
- package/dist/features/heading/feature.server.js +51 -53
- package/dist/features/heading/feature.server.js.map +1 -1
- package/dist/features/heading/i18n.js +2 -2
- package/dist/features/heading/i18n.js.map +1 -1
- package/dist/features/heading/markdownTransformer.js.map +1 -1
- package/dist/features/horizontalRule/component/index.js.map +1 -1
- package/dist/features/horizontalRule/feature.client.d.ts +1 -2
- package/dist/features/horizontalRule/feature.client.d.ts.map +1 -1
- package/dist/features/horizontalRule/feature.client.js +58 -65
- package/dist/features/horizontalRule/feature.client.js.map +1 -1
- package/dist/features/horizontalRule/feature.server.d.ts +1 -2
- package/dist/features/horizontalRule/feature.server.d.ts.map +1 -1
- package/dist/features/horizontalRule/feature.server.js +26 -31
- package/dist/features/horizontalRule/feature.server.js.map +1 -1
- package/dist/features/horizontalRule/i18n.js.map +1 -1
- package/dist/features/horizontalRule/markdownTransformer.js.map +1 -1
- package/dist/features/horizontalRule/nodes/HorizontalRuleNode.d.ts +5 -2
- package/dist/features/horizontalRule/nodes/HorizontalRuleNode.d.ts.map +1 -1
- package/dist/features/horizontalRule/nodes/HorizontalRuleNode.js.map +1 -1
- package/dist/features/horizontalRule/plugin/index.d.ts +1 -1
- package/dist/features/horizontalRule/plugin/index.d.ts.map +1 -1
- package/dist/features/horizontalRule/plugin/index.js.map +1 -1
- package/dist/features/indent/feature.client.d.ts +1 -2
- package/dist/features/indent/feature.client.d.ts.map +1 -1
- package/dist/features/indent/feature.client.js +9 -16
- package/dist/features/indent/feature.client.js.map +1 -1
- package/dist/features/indent/feature.server.d.ts +1 -2
- package/dist/features/indent/feature.server.d.ts.map +1 -1
- package/dist/features/indent/feature.server.js +9 -15
- package/dist/features/indent/feature.server.js.map +1 -1
- package/dist/features/indent/i18n.js.map +1 -1
- package/dist/features/indent/toolbarIndentGroup.js.map +1 -1
- package/dist/features/link/drawer/baseFields.d.ts +2 -2
- package/dist/features/link/drawer/baseFields.d.ts.map +1 -1
- package/dist/features/link/drawer/baseFields.js.map +1 -1
- package/dist/features/link/drawer/index.js.map +1 -1
- package/dist/features/link/drawer/types.js.map +1 -1
- package/dist/features/link/feature.client.d.ts +3 -4
- package/dist/features/link/feature.client.d.ts.map +1 -1
- package/dist/features/link/feature.client.js +34 -41
- package/dist/features/link/feature.client.js.map +1 -1
- package/dist/features/link/feature.server.d.ts +4 -6
- package/dist/features/link/feature.server.d.ts.map +1 -1
- package/dist/features/link/feature.server.js +123 -125
- package/dist/features/link/feature.server.js.map +1 -1
- package/dist/features/link/graphQLPopulationPromise.d.ts +1 -1
- package/dist/features/link/graphQLPopulationPromise.d.ts.map +1 -1
- package/dist/features/link/graphQLPopulationPromise.js.map +1 -1
- package/dist/features/link/i18n.js.map +1 -1
- package/dist/features/link/markdownTransformer.js.map +1 -1
- package/dist/features/link/nodes/AutoLinkNode.d.ts.map +1 -1
- package/dist/features/link/nodes/AutoLinkNode.js +7 -1
- package/dist/features/link/nodes/AutoLinkNode.js.map +1 -1
- package/dist/features/link/nodes/LinkNode.js +1 -1
- package/dist/features/link/nodes/LinkNode.js.map +1 -1
- package/dist/features/link/nodes/types.d.ts +7 -4
- package/dist/features/link/nodes/types.d.ts.map +1 -1
- package/dist/features/link/nodes/types.js.map +1 -1
- package/dist/features/link/plugins/autoLink/index.d.ts +1 -1
- package/dist/features/link/plugins/autoLink/index.d.ts.map +1 -1
- package/dist/features/link/plugins/autoLink/index.js.map +1 -1
- package/dist/features/link/plugins/clickableLink/index.d.ts +1 -1
- package/dist/features/link/plugins/clickableLink/index.d.ts.map +1 -1
- package/dist/features/link/plugins/clickableLink/index.js.map +1 -1
- package/dist/features/link/plugins/floatingLinkEditor/LinkEditor/commands.js.map +1 -1
- package/dist/features/link/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
- package/dist/features/link/plugins/floatingLinkEditor/index.d.ts +1 -1
- package/dist/features/link/plugins/floatingLinkEditor/index.d.ts.map +1 -1
- package/dist/features/link/plugins/floatingLinkEditor/index.js.map +1 -1
- package/dist/features/link/plugins/floatingLinkEditor/types.js.map +1 -1
- package/dist/features/link/plugins/floatingLinkEditor/utilities.d.ts +2 -2
- package/dist/features/link/plugins/floatingLinkEditor/utilities.d.ts.map +1 -1
- package/dist/features/link/plugins/floatingLinkEditor/utilities.js.map +1 -1
- package/dist/features/link/plugins/link/index.d.ts +1 -1
- package/dist/features/link/plugins/link/index.d.ts.map +1 -1
- package/dist/features/link/plugins/link/index.js.map +1 -1
- package/dist/features/link/validate.d.ts +1 -1
- package/dist/features/link/validate.d.ts.map +1 -1
- package/dist/features/link/validate.js.map +1 -1
- package/dist/features/lists/checklist/feature.client.d.ts +1 -2
- package/dist/features/lists/checklist/feature.client.d.ts.map +1 -1
- package/dist/features/lists/checklist/feature.client.js +50 -57
- package/dist/features/lists/checklist/feature.client.js.map +1 -1
- package/dist/features/lists/checklist/feature.server.d.ts +1 -2
- package/dist/features/lists/checklist/feature.server.d.ts.map +1 -1
- package/dist/features/lists/checklist/feature.server.js +28 -31
- package/dist/features/lists/checklist/feature.server.js.map +1 -1
- package/dist/features/lists/checklist/i18n.js.map +1 -1
- package/dist/features/lists/checklist/markdownTransformers.js.map +1 -1
- package/dist/features/lists/checklist/plugin/index.d.ts +1 -1
- package/dist/features/lists/checklist/plugin/index.d.ts.map +1 -1
- package/dist/features/lists/checklist/plugin/index.js.map +1 -1
- package/dist/features/lists/htmlConverter.d.ts +1 -1
- package/dist/features/lists/htmlConverter.d.ts.map +1 -1
- package/dist/features/lists/htmlConverter.js.map +1 -1
- package/dist/features/lists/orderedList/feature.client.d.ts +1 -2
- package/dist/features/lists/orderedList/feature.client.d.ts.map +1 -1
- package/dist/features/lists/orderedList/feature.client.js +39 -46
- package/dist/features/lists/orderedList/feature.client.js.map +1 -1
- package/dist/features/lists/orderedList/feature.server.d.ts +1 -2
- package/dist/features/lists/orderedList/feature.server.d.ts.map +1 -1
- package/dist/features/lists/orderedList/feature.server.js +28 -31
- package/dist/features/lists/orderedList/feature.server.js.map +1 -1
- package/dist/features/lists/orderedList/i18n.js.map +1 -1
- package/dist/features/lists/orderedList/markdownTransformer.js.map +1 -1
- package/dist/features/lists/plugin/index.d.ts +11 -1
- package/dist/features/lists/plugin/index.d.ts.map +1 -1
- package/dist/features/lists/plugin/index.js.map +1 -1
- package/dist/features/lists/shared/markdown.d.ts +1 -1
- package/dist/features/lists/shared/markdown.js.map +1 -1
- package/dist/features/lists/shared/slashMenuListGroup.js.map +1 -1
- package/dist/features/lists/unorderedList/feature.client.d.ts +1 -2
- package/dist/features/lists/unorderedList/feature.client.d.ts.map +1 -1
- package/dist/features/lists/unorderedList/feature.client.js +40 -49
- package/dist/features/lists/unorderedList/feature.client.js.map +1 -1
- package/dist/features/lists/unorderedList/feature.server.d.ts +1 -2
- package/dist/features/lists/unorderedList/feature.server.d.ts.map +1 -1
- package/dist/features/lists/unorderedList/feature.server.js +26 -31
- package/dist/features/lists/unorderedList/feature.server.js.map +1 -1
- package/dist/features/lists/unorderedList/i18n.js.map +1 -1
- package/dist/features/lists/unorderedList/markdownTransformer.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/heading/client.d.ts +0 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/heading/client.d.ts.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/heading/client.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/heading/converter.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/heading/index.js +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/heading/index.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/link/client.d.ts +0 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/link/client.d.ts.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/link/client.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/link/converter.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/link/index.js +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/link/index.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/list/client.d.ts +0 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/list/client.d.ts.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/list/client.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/list/converter.d.ts.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/list/converter.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/list/index.js +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/list/index.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/listItem/client.d.ts +0 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/listItem/client.d.ts.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/listItem/client.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/listItem/converter.d.ts.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/listItem/converter.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/listItem/index.js +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/listItem/index.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/quote/client.d.ts +0 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/quote/client.d.ts.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/quote/client.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/quote/converter.d.ts.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/quote/converter.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/quote/index.js +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/quote/index.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/unknown/client.d.ts +0 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/unknown/client.d.ts.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/unknown/client.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/unknown/converter.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/unknown/index.js +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/unknown/index.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/upload/client.d.ts +0 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/upload/client.d.ts.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/upload/client.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/upload/converter.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/upload/index.js +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/converters/upload/index.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/defaultConverters.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/index.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/types.d.ts +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/types.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/feature.client.d.ts +1 -2
- package/dist/features/migrations/lexicalPluginToLexical/feature.client.d.ts.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/feature.client.js +20 -27
- package/dist/features/migrations/lexicalPluginToLexical/feature.client.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/feature.server.d.ts +1 -2
- package/dist/features/migrations/lexicalPluginToLexical/feature.server.d.ts.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/feature.server.js +39 -42
- package/dist/features/migrations/lexicalPluginToLexical/feature.server.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/Component.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/blockquote/client.d.ts +0 -1
- package/dist/features/migrations/slateToLexical/converter/converters/blockquote/client.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/blockquote/client.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/blockquote/converter.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/blockquote/converter.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/blockquote/index.js +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/blockquote/index.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/heading/client.d.ts +0 -1
- package/dist/features/migrations/slateToLexical/converter/converters/heading/client.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/heading/client.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/heading/converter.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/heading/index.js +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/heading/index.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/indent/client.d.ts +0 -1
- package/dist/features/migrations/slateToLexical/converter/converters/indent/client.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/indent/client.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/indent/converter.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/indent/index.js +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/indent/index.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/link/client.d.ts +0 -1
- package/dist/features/migrations/slateToLexical/converter/converters/link/client.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/link/client.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/link/converter.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/link/index.js +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/link/index.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/listItem/client.d.ts +0 -1
- package/dist/features/migrations/slateToLexical/converter/converters/listItem/client.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/listItem/client.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/listItem/converter.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/listItem/converter.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/listItem/index.js +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/listItem/index.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/orderedList/client.d.ts +0 -1
- package/dist/features/migrations/slateToLexical/converter/converters/orderedList/client.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/orderedList/client.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/orderedList/converter.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/orderedList/converter.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/orderedList/index.js +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/orderedList/index.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/relationship/client.d.ts +0 -1
- package/dist/features/migrations/slateToLexical/converter/converters/relationship/client.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/relationship/client.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/relationship/converter.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/relationship/index.js +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/relationship/index.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/unknown/client.d.ts +0 -1
- package/dist/features/migrations/slateToLexical/converter/converters/unknown/client.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/unknown/client.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/unknown/converter.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/unknown/index.js +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/unknown/index.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/unorderedList/client.d.ts +0 -1
- package/dist/features/migrations/slateToLexical/converter/converters/unorderedList/client.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/unorderedList/client.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/unorderedList/converter.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/unorderedList/converter.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/unorderedList/index.js +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/unorderedList/index.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/upload/client.d.ts +0 -1
- package/dist/features/migrations/slateToLexical/converter/converters/upload/client.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/upload/client.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/upload/converter.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/upload/index.js +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/upload/index.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/defaultConverters.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/index.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/types.d.ts +1 -1
- package/dist/features/migrations/slateToLexical/converter/types.js.map +1 -1
- package/dist/features/migrations/slateToLexical/feature.client.d.ts +1 -2
- package/dist/features/migrations/slateToLexical/feature.client.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/feature.client.js +20 -27
- package/dist/features/migrations/slateToLexical/feature.client.js.map +1 -1
- package/dist/features/migrations/slateToLexical/feature.server.d.ts +3 -2
- package/dist/features/migrations/slateToLexical/feature.server.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/feature.server.js +41 -42
- package/dist/features/migrations/slateToLexical/feature.server.js.map +1 -1
- package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/Component.js.map +1 -1
- package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
- package/dist/features/paragraph/feature.client.d.ts +1 -2
- package/dist/features/paragraph/feature.client.d.ts.map +1 -1
- package/dist/features/paragraph/feature.client.js +33 -40
- package/dist/features/paragraph/feature.client.js.map +1 -1
- package/dist/features/paragraph/feature.server.d.ts +1 -2
- package/dist/features/paragraph/feature.server.d.ts.map +1 -1
- package/dist/features/paragraph/feature.server.js +10 -15
- package/dist/features/paragraph/feature.server.js.map +1 -1
- package/dist/features/paragraph/i18n.js.map +1 -1
- package/dist/features/relationship/drawer/commands.js.map +1 -1
- package/dist/features/relationship/drawer/index.d.ts.map +1 -1
- package/dist/features/relationship/drawer/index.js.map +1 -1
- package/dist/features/relationship/feature.client.d.ts +3 -4
- package/dist/features/relationship/feature.client.d.ts.map +1 -1
- package/dist/features/relationship/feature.client.js +60 -67
- package/dist/features/relationship/feature.client.js.map +1 -1
- package/dist/features/relationship/feature.server.d.ts +4 -4
- package/dist/features/relationship/feature.server.d.ts.map +1 -1
- package/dist/features/relationship/feature.server.js +45 -51
- package/dist/features/relationship/feature.server.js.map +1 -1
- package/dist/features/relationship/graphQLPopulationPromise.d.ts +1 -1
- package/dist/features/relationship/graphQLPopulationPromise.d.ts.map +1 -1
- package/dist/features/relationship/graphQLPopulationPromise.js.map +1 -1
- package/dist/features/relationship/i18n.js.map +1 -1
- package/dist/features/relationship/nodes/RelationshipNode.d.ts +6 -2
- package/dist/features/relationship/nodes/RelationshipNode.d.ts.map +1 -1
- package/dist/features/relationship/nodes/RelationshipNode.js +1 -1
- package/dist/features/relationship/nodes/RelationshipNode.js.map +1 -1
- package/dist/features/relationship/nodes/components/RelationshipComponent.d.ts.map +1 -1
- package/dist/features/relationship/nodes/components/RelationshipComponent.js.map +1 -1
- package/dist/features/relationship/plugins/index.d.ts +1 -1
- package/dist/features/relationship/plugins/index.d.ts.map +1 -1
- package/dist/features/relationship/plugins/index.js.map +1 -1
- package/dist/features/relationship/utils/EnabledRelationshipsCondition.js.map +1 -1
- package/dist/features/shared/slashMenu/basicGroup.js.map +1 -1
- package/dist/features/shared/toolbar/addDropdownGroup.js.map +1 -1
- package/dist/features/shared/toolbar/featureButtonsGroup.js.map +1 -1
- package/dist/features/shared/toolbar/textDropdownGroup.js.map +1 -1
- package/dist/features/toolbars/fixed/Toolbar/index.d.ts +1 -1
- package/dist/features/toolbars/fixed/Toolbar/index.d.ts.map +1 -1
- package/dist/features/toolbars/fixed/Toolbar/index.js.map +1 -1
- package/dist/features/toolbars/fixed/feature.client.d.ts +1 -2
- package/dist/features/toolbars/fixed/feature.client.d.ts.map +1 -1
- package/dist/features/toolbars/fixed/feature.client.js +9 -16
- package/dist/features/toolbars/fixed/feature.client.js.map +1 -1
- package/dist/features/toolbars/fixed/feature.server.d.ts +1 -2
- package/dist/features/toolbars/fixed/feature.server.d.ts.map +1 -1
- package/dist/features/toolbars/fixed/feature.server.js +16 -18
- package/dist/features/toolbars/fixed/feature.server.js.map +1 -1
- package/dist/features/toolbars/inline/Toolbar/index.d.ts +1 -1
- package/dist/features/toolbars/inline/Toolbar/index.d.ts.map +1 -1
- package/dist/features/toolbars/inline/Toolbar/index.js.map +1 -1
- package/dist/features/toolbars/inline/feature.client.d.ts +1 -2
- package/dist/features/toolbars/inline/feature.client.d.ts.map +1 -1
- package/dist/features/toolbars/inline/feature.client.js +9 -16
- package/dist/features/toolbars/inline/feature.client.js.map +1 -1
- package/dist/features/toolbars/inline/feature.server.d.ts +1 -2
- package/dist/features/toolbars/inline/feature.server.d.ts.map +1 -1
- package/dist/features/toolbars/inline/feature.server.js +8 -13
- package/dist/features/toolbars/inline/feature.server.js.map +1 -1
- package/dist/features/toolbars/shared/ToolbarButton/index.d.ts.map +1 -1
- package/dist/features/toolbars/shared/ToolbarButton/index.js.map +1 -1
- package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js.map +1 -1
- package/dist/features/toolbars/shared/ToolbarDropdown/index.d.ts.map +1 -1
- package/dist/features/toolbars/shared/ToolbarDropdown/index.js.map +1 -1
- package/dist/features/toolbars/types.d.ts +37 -5
- package/dist/features/toolbars/types.d.ts.map +1 -1
- package/dist/features/toolbars/types.js.map +1 -1
- package/dist/features/typeUtilities.d.ts +1 -1
- package/dist/features/typeUtilities.d.ts.map +1 -1
- package/dist/features/typeUtilities.js.map +1 -1
- package/dist/features/typesClient.d.ts +182 -0
- package/dist/features/typesClient.d.ts.map +1 -0
- package/dist/features/typesClient.js +3 -0
- package/dist/features/typesClient.js.map +1 -0
- package/dist/features/{types.d.ts → typesServer.d.ts} +40 -193
- package/dist/features/typesServer.d.ts.map +1 -0
- package/dist/features/typesServer.js +3 -0
- package/dist/features/typesServer.js.map +1 -0
- package/dist/features/upload/component/ExtraFieldsDrawer/index.js.map +1 -1
- package/dist/features/upload/component/index.d.ts.map +1 -1
- package/dist/features/upload/component/index.js +1 -1
- package/dist/features/upload/component/index.js.map +1 -1
- package/dist/features/upload/drawer/commands.js.map +1 -1
- package/dist/features/upload/drawer/index.d.ts.map +1 -1
- package/dist/features/upload/drawer/index.js.map +1 -1
- package/dist/features/upload/feature.client.d.ts +1 -2
- package/dist/features/upload/feature.client.d.ts.map +1 -1
- package/dist/features/upload/feature.client.js +62 -69
- package/dist/features/upload/feature.client.js.map +1 -1
- package/dist/features/upload/feature.server.d.ts +3 -4
- package/dist/features/upload/feature.server.d.ts.map +1 -1
- package/dist/features/upload/feature.server.js +166 -168
- package/dist/features/upload/feature.server.js.map +1 -1
- package/dist/features/upload/graphQLPopulationPromise.d.ts +1 -1
- package/dist/features/upload/graphQLPopulationPromise.d.ts.map +1 -1
- package/dist/features/upload/graphQLPopulationPromise.js.map +1 -1
- package/dist/features/upload/i18n.js.map +1 -1
- package/dist/features/upload/nodes/UploadNode.d.ts +6 -2
- package/dist/features/upload/nodes/UploadNode.d.ts.map +1 -1
- package/dist/features/upload/nodes/UploadNode.js +1 -1
- package/dist/features/upload/nodes/UploadNode.js.map +1 -1
- package/dist/features/upload/plugin/index.d.ts +1 -1
- package/dist/features/upload/plugin/index.d.ts.map +1 -1
- package/dist/features/upload/plugin/index.js.map +1 -1
- package/dist/features/upload/validate.d.ts +1 -1
- package/dist/features/upload/validate.d.ts.map +1 -1
- package/dist/features/upload/validate.js.map +1 -1
- package/dist/field/Field.d.ts.map +1 -1
- package/dist/field/Field.js.map +1 -1
- package/dist/field/index.d.ts.map +1 -1
- package/dist/field/index.js +9 -7
- package/dist/field/index.js.map +1 -1
- package/dist/i18n.js.map +1 -1
- package/dist/index.d.ts +12 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -17
- package/dist/index.js.map +1 -1
- package/dist/lexical/EditorPlugin.d.ts +1 -1
- package/dist/lexical/EditorPlugin.d.ts.map +1 -1
- package/dist/lexical/EditorPlugin.js.map +1 -1
- package/dist/lexical/LexicalEditor.js.map +1 -1
- package/dist/lexical/LexicalProvider.js.map +1 -1
- package/dist/lexical/config/client/EditorConfigProvider.d.ts.map +1 -1
- package/dist/lexical/config/client/EditorConfigProvider.js.map +1 -1
- package/dist/lexical/config/client/default.js.map +1 -1
- package/dist/lexical/config/client/loader.d.ts +1 -1
- package/dist/lexical/config/client/loader.d.ts.map +1 -1
- package/dist/lexical/config/client/loader.js +2 -2
- package/dist/lexical/config/client/loader.js.map +1 -1
- package/dist/lexical/config/client/sanitize.d.ts +1 -1
- package/dist/lexical/config/client/sanitize.d.ts.map +1 -1
- package/dist/lexical/config/client/sanitize.js +1 -1
- package/dist/lexical/config/client/sanitize.js.map +1 -1
- package/dist/lexical/config/server/default.d.ts +2 -2
- package/dist/lexical/config/server/default.d.ts.map +1 -1
- package/dist/lexical/config/server/default.js.map +1 -1
- package/dist/lexical/config/server/loader.d.ts +2 -2
- package/dist/lexical/config/server/loader.d.ts.map +1 -1
- package/dist/lexical/config/server/loader.js +2 -2
- package/dist/lexical/config/server/loader.js.map +1 -1
- package/dist/lexical/config/server/sanitize.d.ts +1 -1
- package/dist/lexical/config/server/sanitize.d.ts.map +1 -1
- package/dist/lexical/config/server/sanitize.js.map +1 -1
- package/dist/lexical/config/types.d.ts +4 -3
- package/dist/lexical/config/types.d.ts.map +1 -1
- package/dist/lexical/config/types.js.map +1 -1
- package/dist/lexical/nodes/index.js.map +1 -1
- package/dist/lexical/plugins/MarkdownShortcut/index.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.d.ts +16 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.d.ts.map +1 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/index.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/useMenuTriggerMatch.js.map +1 -1
- package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js.map +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/debounce.js.map +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/getBoundingRectWithoutTransform.js.map +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/highlightElemOriginalPosition.js.map +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js.map +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/setTargetLine.d.ts +0 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/setTargetLine.d.ts.map +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/setTargetLine.js.map +1 -1
- package/dist/lexical/plugins/handles/utils/calculateDistanceFromScrollerElem.js.map +1 -1
- package/dist/lexical/plugins/handles/utils/doesLineHeightAffectElement.js.map +1 -1
- package/dist/lexical/plugins/handles/utils/getCollapsedMargins.js.map +1 -1
- package/dist/lexical/plugins/handles/utils/getNodeCloseToPoint.js.map +1 -1
- package/dist/lexical/plugins/handles/utils/getTopLevelNodeKeys.js.map +1 -1
- package/dist/lexical/plugins/handles/utils/isOnHandleElement.js.map +1 -1
- package/dist/lexical/plugins/handles/utils/setHandlePosition.js.map +1 -1
- package/dist/lexical/theme/EditorTheme.js.map +1 -1
- package/dist/lexical/ui/ContentEditable.js.map +1 -1
- package/dist/lexical/ui/icons/AI/index.js.map +1 -1
- package/dist/lexical/ui/icons/Add/index.js.map +1 -1
- package/dist/lexical/ui/icons/AlignCenter/index.js.map +1 -1
- package/dist/lexical/ui/icons/AlignJustify/index.js.map +1 -1
- package/dist/lexical/ui/icons/AlignLeft/index.js.map +1 -1
- package/dist/lexical/ui/icons/AlignRight/index.js.map +1 -1
- package/dist/lexical/ui/icons/Block/index.js.map +1 -1
- package/dist/lexical/ui/icons/Blockquote/index.js.map +1 -1
- package/dist/lexical/ui/icons/Bold/index.js.map +1 -1
- package/dist/lexical/ui/icons/Checklist/index.js.map +1 -1
- package/dist/lexical/ui/icons/Code/index.js.map +1 -1
- package/dist/lexical/ui/icons/CodeBlock/index.js.map +1 -1
- package/dist/lexical/ui/icons/H1/index.js.map +1 -1
- package/dist/lexical/ui/icons/H2/index.js.map +1 -1
- package/dist/lexical/ui/icons/H3/index.js.map +1 -1
- package/dist/lexical/ui/icons/H4/index.js.map +1 -1
- package/dist/lexical/ui/icons/H5/index.js.map +1 -1
- package/dist/lexical/ui/icons/H6/index.js.map +1 -1
- package/dist/lexical/ui/icons/HorizontalRule/index.js.map +1 -1
- package/dist/lexical/ui/icons/IndentDecrease/index.js.map +1 -1
- package/dist/lexical/ui/icons/IndentIncrease/index.js.map +1 -1
- package/dist/lexical/ui/icons/Italic/index.js.map +1 -1
- package/dist/lexical/ui/icons/Link/index.js.map +1 -1
- package/dist/lexical/ui/icons/OrderedList/index.js.map +1 -1
- package/dist/lexical/ui/icons/Relationship/index.js.map +1 -1
- package/dist/lexical/ui/icons/Strikethrough/index.js.map +1 -1
- package/dist/lexical/ui/icons/Subscript/index.js.map +1 -1
- package/dist/lexical/ui/icons/Superscript/index.js.map +1 -1
- package/dist/lexical/ui/icons/Text/index.js.map +1 -1
- package/dist/lexical/ui/icons/Underline/index.js.map +1 -1
- package/dist/lexical/ui/icons/UnorderedList/index.js.map +1 -1
- package/dist/lexical/ui/icons/Upload/index.js.map +1 -1
- package/dist/lexical/utils/canUseDOM.js.map +1 -1
- package/dist/lexical/utils/cloneDeep.js.map +1 -1
- package/dist/lexical/utils/environment.js.map +1 -1
- package/dist/lexical/utils/getDOMRangeRect.js.map +1 -1
- package/dist/lexical/utils/getSelectedNode.js.map +1 -1
- package/dist/lexical/utils/guard.js.map +1 -1
- package/dist/lexical/utils/invariant.js.map +1 -1
- package/dist/lexical/utils/joinClasses.js.map +1 -1
- package/dist/lexical/utils/markdown/createBlockNode.d.ts +1 -1
- package/dist/lexical/utils/markdown/createBlockNode.d.ts.map +1 -1
- package/dist/lexical/utils/markdown/createBlockNode.js.map +1 -1
- package/dist/lexical/utils/nodeFormat.js.map +1 -1
- package/dist/lexical/utils/point.js.map +1 -1
- package/dist/lexical/utils/rect.js.map +1 -1
- package/dist/lexical/utils/setFloatingElemPosition.js.map +1 -1
- package/dist/lexical/utils/setFloatingElemPositionForLinkEditor.js.map +1 -1
- package/dist/lexical/utils/swipe.js.map +1 -1
- package/dist/lexical/utils/url.js.map +1 -1
- package/dist/nodeTypes.d.ts +27 -0
- package/dist/nodeTypes.d.ts.map +1 -0
- package/dist/nodeTypes.js +3 -0
- package/dist/nodeTypes.js.map +1 -0
- package/dist/populateGraphQL/defaultValue.js.map +1 -1
- package/dist/populateGraphQL/populate.d.ts.map +1 -1
- package/dist/populateGraphQL/populate.js.map +1 -1
- package/dist/populateGraphQL/populateLexicalPopulationPromises.d.ts +1 -1
- package/dist/populateGraphQL/populateLexicalPopulationPromises.d.ts.map +1 -1
- package/dist/populateGraphQL/populateLexicalPopulationPromises.js.map +1 -1
- package/dist/populateGraphQL/recursivelyPopulateFieldsForGraphQL.d.ts +1 -1
- package/dist/populateGraphQL/recursivelyPopulateFieldsForGraphQL.d.ts.map +1 -1
- package/dist/populateGraphQL/recursivelyPopulateFieldsForGraphQL.js.map +1 -1
- package/dist/types.d.ts +7 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/createClientFeature.d.ts +13 -0
- package/dist/utilities/createClientFeature.d.ts.map +1 -0
- package/dist/utilities/createClientFeature.js +30 -0
- package/dist/utilities/createClientFeature.js.map +1 -0
- package/dist/utilities/createServerFeature.d.ts +16 -0
- package/dist/utilities/createServerFeature.d.ts.map +1 -0
- package/dist/utilities/createServerFeature.js +34 -0
- package/dist/utilities/createServerFeature.js.map +1 -0
- package/dist/utilities/forEachNodeRecursively.js.map +1 -1
- package/dist/utilities/generateComponentMap.d.ts +2 -2
- package/dist/utilities/generateComponentMap.d.ts.map +1 -1
- package/dist/utilities/generateComponentMap.js +4 -4
- package/dist/utilities/generateComponentMap.js.map +1 -1
- package/dist/utilities/generateSchemaMap.d.ts +2 -2
- package/dist/utilities/generateSchemaMap.d.ts.map +1 -1
- package/dist/utilities/generateSchemaMap.js +1 -1
- package/dist/utilities/generateSchemaMap.js.map +1 -1
- package/dist/utilities/migrateSlateToLexical/index.d.ts +15 -0
- package/dist/utilities/migrateSlateToLexical/index.d.ts.map +1 -0
- package/dist/utilities/migrateSlateToLexical/index.js +105 -0
- package/dist/utilities/migrateSlateToLexical/index.js.map +1 -0
- package/dist/utilities/migrateSlateToLexical/recurse.d.ts +9 -0
- package/dist/utilities/migrateSlateToLexical/recurse.d.ts.map +1 -0
- package/dist/utilities/migrateSlateToLexical/recurse.js +77 -0
- package/dist/utilities/migrateSlateToLexical/recurse.js.map +1 -0
- package/dist/utilities/recurseNodeTree.js.map +1 -1
- package/dist/utilities/useLexicalFeature.d.ts +1 -1
- package/dist/utilities/useLexicalFeature.d.ts.map +1 -1
- package/dist/utilities/useLexicalFeature.js.map +1 -1
- package/dist/validate/index.js.map +1 -1
- package/dist/validate/validateNodes.d.ts +1 -1
- package/dist/validate/validateNodes.d.ts.map +1 -1
- package/dist/validate/validateNodes.js.map +1 -1
- package/package.json +10 -10
- package/dist/exports/client/Field-YMWNSE3A.js +0 -2
- package/dist/exports/client/Field-YMWNSE3A.js.map +0 -7
- package/dist/exports/client/chunk-MLIITFAS.js.map +0 -7
- package/dist/exports/client/chunk-OSR74ZNW.js.map +0 -7
- package/dist/exports/client/chunk-QU5MKT75.js.map +0 -7
- package/dist/exports/client/chunk-ZITHDR53.js +0 -2
- package/dist/exports/client/chunk-ZITHDR53.js.map +0 -7
- package/dist/exports/client/component-E2NHAHBC.js.map +0 -7
- package/dist/exports/client/component-X4LSLSWF.js +0 -2
- package/dist/exports/client/component-X4LSLSWF.js.map +0 -7
- package/dist/features/types.d.ts.map +0 -1
- package/dist/features/types.js +0 -3
- package/dist/features/types.js.map +0 -1
- /package/dist/exports/client/{RelationshipComponent-5OU5HATX.js.map → RelationshipComponent-AFXEJMZQ.js.map} +0 -0
- /package/dist/exports/client/{component-QWIGEOVD.js.map → component-VM36FRT2.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.tsx"],"sourcesContent":["'use client'\nimport type { LexicalCommand, LexicalEditor, TextNode } from 'lexical'\nimport type { JSX, MutableRefObject, ReactPortal } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n COMMAND_PRIORITY_LOW,\n KEY_ARROW_DOWN_COMMAND,\n KEY_ARROW_UP_COMMAND,\n KEY_ENTER_COMMAND,\n KEY_ESCAPE_COMMAND,\n KEY_TAB_COMMAND,\n createCommand,\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\nexport type MenuResolution = {\n getRect: () => DOMRect\n match?: MenuTextMatch\n}\n\nconst baseClass = 'slash-menu-popup'\n\nexport type MenuRenderFn = (\n anchorElementRef: MutableRefObject<HTMLElement | null>,\n itemProps: {\n groups: Array<SlashMenuGroupInternal>\n selectItemAndCleanUp: (selectedItem: SlashMenuItem) => void\n selectedItemKey: null | string\n setSelectedItemKey: (itemKey: string) => void\n },\n matchingString: null | string,\n) => JSX.Element | ReactPortal | null\n\nconst scrollIntoViewIfNeeded = (target: HTMLElement) => {\n const typeaheadContainerNode = document.getElementById('slash-menu')\n if (!typeaheadContainerNode) return\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 | null {\n const selection = $getSelection()\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return null\n }\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 selectionOffset = anchor.offset\n const textContent = anchorNode.getTextContent().slice(0, selectionOffset)\n // eslint-disable-next-line react/destructuring-assignment\n const characterOffset = match.replaceableString.length\n // eslint-disable-next-line react/destructuring-assignment\n const queryOffset = getFullMatchOffset(textContent, match.matchingString, characterOffset)\n const startOffset = selectionOffset - queryOffset\n if (startOffset < 0) {\n return null\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 targetElement: HTMLElement | null,\n onReposition: () => void,\n onVisibilityChange?: (isInView: boolean) => void,\n) {\n const [editor] = useLexicalComposerContext()\n useEffect(() => {\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.unobserve(targetElement)\n window.removeEventListener('resize', onReposition)\n document.removeEventListener('scroll', handleScroll, true)\n }\n }\n }, [targetElement, editor, onVisibilityChange, onReposition, resolution])\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 onSelectItem,\n resolution,\n shouldSplitNodeWithQuery = false,\n}: {\n anchorElementRef: MutableRefObject<HTMLElement>\n close: () => void\n editor: LexicalEditor\n groups: Array<SlashMenuGroupInternal>\n menuRenderFn: MenuRenderFn\n onSelectItem: (\n item: SlashMenuItem,\n textNodeContainingQuery: TextNode | null,\n closeMenu: () => void,\n matchingString: string,\n ) => void\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 editor.update(() => {\n const textNodeContainingQuery =\n resolution.match != null && shouldSplitNodeWithQuery\n ? $splitNodeContainingQuery(resolution.match)\n : null\n\n onSelectItem(\n selectedItem,\n textNodeContainingQuery,\n close,\n resolution.match ? resolution.match.matchingString : '',\n )\n })\n },\n [editor, shouldSplitNodeWithQuery, resolution.match, onSelectItem, 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\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_LOW,\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\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_LOW,\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_LOW,\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_LOW,\n ),\n )\n }, [selectItemAndCleanUp, close, editor, groups, selectedItemKey, updateSelectedItem])\n\n const listItemProps = useMemo(\n () => ({\n groups,\n selectItemAndCleanUp,\n selectedItemKey,\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\nexport function useMenuAnchorRef(\n anchorElem: HTMLElement,\n resolution: MenuResolution | null,\n setResolution: (r: MenuResolution | null) => void,\n className?: string,\n): MutableRefObject<HTMLElement> {\n const [editor] = useLexicalComposerContext()\n const anchorElementRef = useRef<HTMLElement>(document.createElement('div'))\n const positionMenu = useCallback(() => {\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 if (left + menuWidth > rootElementRect.right) {\n containerDiv.style.left = `${rootElementRect.right - menuWidth + 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 if (className != null) {\n containerDiv.className = className\n }\n containerDiv.setAttribute('aria-label', 'Slash menu')\n containerDiv.setAttribute('id', 'slash-menu')\n containerDiv.setAttribute('role', 'listbox')\n containerDiv.style.display = 'block'\n containerDiv.style.position = 'absolute'\n anchorElem.append(containerDiv)\n }\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 }\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.current, positionMenu, onVisibilityChange)\n\n return anchorElementRef\n}\n"],"names":["useLexicalComposerContext","mergeRegister","$getSelection","$isRangeSelection","COMMAND_PRIORITY_LOW","KEY_ARROW_DOWN_COMMAND","KEY_ARROW_UP_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","KEY_TAB_COMMAND","createCommand","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","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","onReposition","onVisibilityChange","editor","rootElement","getRootElement","rootScrollParent","ticking","previousIsInView","handleScroll","requestAnimationFrame","isInView","resizeObserver","ResizeObserver","addEventListener","capture","passive","observe","unobserve","removeEventListener","SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND","LexicalMenu","anchorElementRef","close","groups","menuRenderFn","onSelectItem","shouldSplitNodeWithQuery","selectedItemKey","setSelectedItemKey","updateSelectedItem","item","rootElem","setAttribute","key","setSelectedItemKeyToFirstMatchingItem","allItems","flatMap","group","items","firstMatchingItem","selectItemAndCleanUp","selectedItem","update","textNodeContainingQuery","removeAttribute","registerCommand","ref","current","payload","event","selectedIndex","findIndex","newSelectedIndex","newSelectedItem","dispatchCommand","index","preventDefault","stopImmediatePropagation","find","listItemProps","useMenuAnchorRef","anchorElem","setResolution","className","createElement","positionMenu","containerDiv","VERTICAL_OFFSET","menuEle","firstChild","width","getRect","left","rawTop","scrollY","scrollX","menuRect","menuHeight","menuWidth","rootElementRect","right","wouldGoOffBottomOfScreen","wouldGoOffTopOfScreen","margin","isConnected","display","append","remove"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.tsx"],"sourcesContent":["'use client'\nimport type { LexicalCommand, LexicalEditor, TextNode } from 'lexical'\nimport type { JSX, MutableRefObject, ReactPortal } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n COMMAND_PRIORITY_LOW,\n KEY_ARROW_DOWN_COMMAND,\n KEY_ARROW_UP_COMMAND,\n KEY_ENTER_COMMAND,\n KEY_ESCAPE_COMMAND,\n KEY_TAB_COMMAND,\n createCommand,\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\nexport type MenuResolution = {\n getRect: () => DOMRect\n match?: MenuTextMatch\n}\n\nconst baseClass = 'slash-menu-popup'\n\nexport type MenuRenderFn = (\n anchorElementRef: MutableRefObject<HTMLElement | null>,\n itemProps: {\n groups: Array<SlashMenuGroupInternal>\n selectItemAndCleanUp: (selectedItem: SlashMenuItem) => void\n selectedItemKey: null | string\n setSelectedItemKey: (itemKey: string) => void\n },\n matchingString: null | string,\n) => JSX.Element | ReactPortal | null\n\nconst scrollIntoViewIfNeeded = (target: HTMLElement) => {\n const typeaheadContainerNode = document.getElementById('slash-menu')\n if (!typeaheadContainerNode) return\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 | null {\n const selection = $getSelection()\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return null\n }\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 selectionOffset = anchor.offset\n const textContent = anchorNode.getTextContent().slice(0, selectionOffset)\n // eslint-disable-next-line react/destructuring-assignment\n const characterOffset = match.replaceableString.length\n // eslint-disable-next-line react/destructuring-assignment\n const queryOffset = getFullMatchOffset(textContent, match.matchingString, characterOffset)\n const startOffset = selectionOffset - queryOffset\n if (startOffset < 0) {\n return null\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 targetElement: HTMLElement | null,\n onReposition: () => void,\n onVisibilityChange?: (isInView: boolean) => void,\n) {\n const [editor] = useLexicalComposerContext()\n useEffect(() => {\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.unobserve(targetElement)\n window.removeEventListener('resize', onReposition)\n document.removeEventListener('scroll', handleScroll, true)\n }\n }\n }, [targetElement, editor, onVisibilityChange, onReposition, resolution])\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 onSelectItem,\n resolution,\n shouldSplitNodeWithQuery = false,\n}: {\n anchorElementRef: MutableRefObject<HTMLElement>\n close: () => void\n editor: LexicalEditor\n groups: Array<SlashMenuGroupInternal>\n menuRenderFn: MenuRenderFn\n onSelectItem: (\n item: SlashMenuItem,\n textNodeContainingQuery: TextNode | null,\n closeMenu: () => void,\n matchingString: string,\n ) => void\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 editor.update(() => {\n const textNodeContainingQuery =\n resolution.match != null && shouldSplitNodeWithQuery\n ? $splitNodeContainingQuery(resolution.match)\n : null\n\n onSelectItem(\n selectedItem,\n textNodeContainingQuery,\n close,\n resolution.match ? resolution.match.matchingString : '',\n )\n })\n },\n [editor, shouldSplitNodeWithQuery, resolution.match, onSelectItem, 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\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_LOW,\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\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_LOW,\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_LOW,\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_LOW,\n ),\n )\n }, [selectItemAndCleanUp, close, editor, groups, selectedItemKey, updateSelectedItem])\n\n const listItemProps = useMemo(\n () => ({\n groups,\n selectItemAndCleanUp,\n selectedItemKey,\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\nexport function useMenuAnchorRef(\n anchorElem: HTMLElement,\n resolution: MenuResolution | null,\n setResolution: (r: MenuResolution | null) => void,\n className?: string,\n): MutableRefObject<HTMLElement> {\n const [editor] = useLexicalComposerContext()\n const anchorElementRef = useRef<HTMLElement>(document.createElement('div'))\n const positionMenu = useCallback(() => {\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 if (left + menuWidth > rootElementRect.right) {\n containerDiv.style.left = `${rootElementRect.right - menuWidth + 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 if (className != null) {\n containerDiv.className = className\n }\n containerDiv.setAttribute('aria-label', 'Slash menu')\n containerDiv.setAttribute('id', 'slash-menu')\n containerDiv.setAttribute('role', 'listbox')\n containerDiv.style.display = 'block'\n containerDiv.style.position = 'absolute'\n anchorElem.append(containerDiv)\n }\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 }\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.current, positionMenu, onVisibilityChange)\n\n return anchorElementRef\n}\n"],"names":["useLexicalComposerContext","mergeRegister","$getSelection","$isRangeSelection","COMMAND_PRIORITY_LOW","KEY_ARROW_DOWN_COMMAND","KEY_ARROW_UP_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","KEY_TAB_COMMAND","createCommand","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","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","onReposition","onVisibilityChange","editor","rootElement","getRootElement","rootScrollParent","ticking","previousIsInView","handleScroll","requestAnimationFrame","isInView","resizeObserver","ResizeObserver","addEventListener","capture","passive","observe","unobserve","removeEventListener","SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND","LexicalMenu","anchorElementRef","close","groups","menuRenderFn","onSelectItem","shouldSplitNodeWithQuery","selectedItemKey","setSelectedItemKey","updateSelectedItem","item","rootElem","setAttribute","key","setSelectedItemKeyToFirstMatchingItem","allItems","flatMap","group","items","firstMatchingItem","selectItemAndCleanUp","selectedItem","update","textNodeContainingQuery","removeAttribute","registerCommand","ref","current","payload","event","selectedIndex","findIndex","newSelectedIndex","newSelectedItem","dispatchCommand","index","preventDefault","stopImmediatePropagation","find","listItemProps","useMenuAnchorRef","anchorElem","setResolution","className","createElement","positionMenu","containerDiv","VERTICAL_OFFSET","menuEle","firstChild","width","getRect","left","rawTop","scrollY","scrollX","menuRect","menuHeight","menuWidth","rootElementRect","right","wouldGoOffBottomOfScreen","wouldGoOffTopOfScreen","margin","isConnected","display","append","remove"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.tsx"],"sourcesContent":["'use client'\nimport type {\n LexicalCommand,\n LexicalEditor,\n ParagraphNode,\n RangeSelection,\n TextNode,\n} 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} 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 { SlashMenuGroup, SlashMenuGroupInternal, SlashMenuItem } 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 = editorWindow.getSelection()\n if (domSelection === null || !domSelection.isCollapsed) {\n return false\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): null | string {\n let text = null\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\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\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 onSelectItem: (\n item: SlashMenuItem,\n textNodeContainingQuery: TextNode | null,\n closeMenu: () => void,\n matchingString: string,\n ) => 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 onSelectItem,\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 (match !== null && !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 === null ||\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 resolution === null || editor === null ? null : (\n <LexicalMenu\n anchorElementRef={anchorElementRef}\n close={closeTypeahead}\n editor={editor}\n groups={groups}\n menuRenderFn={menuRenderFn}\n onSelectItem={onSelectItem}\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","useCallback","useEffect","useState","React","LexicalMenu","useMenuAnchorRef","PUNCTUATION","getTextUpToAnchor","selection","anchor","type","anchorNode","getNode","isSimpleText","anchorOffset","offset","getTextContent","slice","tryToPositionRange","leadOffset","range","editorWindow","domSelection","getSelection","isCollapsed","startOffset","endOffset","setStart","setEnd","error","getQueryTextForSearch","editor","text","getEditorState","read","isSelectionOnEntityBoundary","prevSibling","getPreviousSibling","isTextEntity","startTransition","callback","getScrollParent","element","includeHidden","style","getComputedStyle","excludeStaticParent","position","overflowRegex","document","body","parent","parentElement","test","overflow","overflowY","overflowX","useDynamicPositioning","ENABLE_SLASH_MENU_COMMAND","LexicalTypeaheadMenuPlugin","anchorClassName","anchorElem","groups","menuRenderFn","onClose","onOpen","onQueryChange","onSelectItem","triggerFn","resolution","setResolution","anchorElementRef","closeTypeahead","openTypeahead","res","registerCommand","node","match","matchingString","replaceableString","_window","window","createRange","isRangePositioned","getRect","getBoundingClientRect","updateListener","query","removeUpdateListener","registerUpdateListener","close","shouldSplitNodeWithQuery"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.tsx"],"sourcesContent":["'use client'\nimport type {\n LexicalCommand,\n LexicalEditor,\n ParagraphNode,\n RangeSelection,\n TextNode,\n} 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} 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 { SlashMenuGroup, SlashMenuGroupInternal, SlashMenuItem } 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 = editorWindow.getSelection()\n if (domSelection === null || !domSelection.isCollapsed) {\n return false\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): null | string {\n let text = null\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\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\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 onSelectItem: (\n item: SlashMenuItem,\n textNodeContainingQuery: TextNode | null,\n closeMenu: () => void,\n matchingString: string,\n ) => 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 onSelectItem,\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 (match !== null && !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 === null ||\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 resolution === null || editor === null ? null : (\n <LexicalMenu\n anchorElementRef={anchorElementRef}\n close={closeTypeahead}\n editor={editor}\n groups={groups}\n menuRenderFn={menuRenderFn}\n onSelectItem={onSelectItem}\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","useCallback","useEffect","useState","React","LexicalMenu","useMenuAnchorRef","PUNCTUATION","getTextUpToAnchor","selection","anchor","type","anchorNode","getNode","isSimpleText","anchorOffset","offset","getTextContent","slice","tryToPositionRange","leadOffset","range","editorWindow","domSelection","getSelection","isCollapsed","startOffset","endOffset","setStart","setEnd","error","getQueryTextForSearch","editor","text","getEditorState","read","isSelectionOnEntityBoundary","prevSibling","getPreviousSibling","isTextEntity","startTransition","callback","getScrollParent","element","includeHidden","style","getComputedStyle","excludeStaticParent","position","overflowRegex","document","body","parent","parentElement","test","overflow","overflowY","overflowX","useDynamicPositioning","ENABLE_SLASH_MENU_COMMAND","LexicalTypeaheadMenuPlugin","anchorClassName","anchorElem","groups","menuRenderFn","onClose","onOpen","onQueryChange","onSelectItem","triggerFn","resolution","setResolution","anchorElementRef","closeTypeahead","openTypeahead","res","registerCommand","node","match","matchingString","replaceableString","_window","window","createRange","isRangePositioned","getRect","getBoundingClientRect","updateListener","query","removeUpdateListener","registerUpdateListener","close","shouldSplitNodeWithQuery"],"mappings":"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"}
|
|
@@ -3,21 +3,36 @@ import type { LexicalEditor } from 'lexical';
|
|
|
3
3
|
import type { MutableRefObject } from 'react';
|
|
4
4
|
import type React from 'react';
|
|
5
5
|
export type SlashMenuItem = {
|
|
6
|
+
/** The icon which is rendered in your slash menu item. */
|
|
6
7
|
Icon: React.FC;
|
|
8
|
+
/** Each slash menu item needs to have a unique key. The key will be matched when typing, displayed if no `label` property is set, and used for classNames. */
|
|
7
9
|
key: string;
|
|
8
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Keywords are used to match the item for different texts typed after the '/'.
|
|
12
|
+
* E.g. you might want to show a horizontal rule item if you type both /hr, /separator, /horizontal etc.
|
|
13
|
+
* In addition to the keywords, the label and key will be used to find the right slash menu item.
|
|
14
|
+
*/
|
|
9
15
|
keywords?: Array<string>;
|
|
16
|
+
/** The label will be displayed in your slash menu item. In order to make use of i18n, this can be a function. */
|
|
10
17
|
label?: (({ i18n }: {
|
|
11
18
|
i18n: I18nClient<{}, string>;
|
|
12
19
|
}) => string) | string;
|
|
20
|
+
/** A function which is called when the slash menu item is selected. */
|
|
13
21
|
onSelect: ({ editor, queryString }: {
|
|
14
22
|
editor: LexicalEditor;
|
|
15
23
|
queryString: string;
|
|
16
24
|
}) => void;
|
|
17
25
|
};
|
|
18
26
|
export type SlashMenuGroup = {
|
|
27
|
+
/**
|
|
28
|
+
* An array of `SlashMenuItem`'s which will be displayed in the slash menu.
|
|
29
|
+
*/
|
|
19
30
|
items: Array<SlashMenuItem>;
|
|
31
|
+
/**
|
|
32
|
+
* Used for class names and, if label is not provided, for display. Slash menus with the same key will have their items merged together.
|
|
33
|
+
*/
|
|
20
34
|
key: string;
|
|
35
|
+
/** The label will be displayed before your Slash Menu group. In order to make use of i18n, this can be a function. */
|
|
21
36
|
label?: (({ i18n }: {
|
|
22
37
|
i18n: I18nClient<{}, string>;
|
|
23
38
|
}) => string) | string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAA;AAC7C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,MAAM,MAAM,aAAa,GAAG;IAC1B,0DAA0D;IAC1D,IAAI,EAAE,KAAK,CAAC,EAAE,CAAA;IACd,8JAA8J;IAC9J,GAAG,EAAE,MAAM,CAAA;IACX;;;;OAIG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IACxB,iHAAiH;IACjH,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;KAAE,KAAK,MAAM,CAAC,GAAG,MAAM,CAAA;IACzE,uEAAuE;IACvE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE;QAAE,MAAM,EAAE,aAAa,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;CAC5F,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B;;OAEG;IACH,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,CAAA;IAC3B;;OAEG;IACH,GAAG,EAAE,MAAM,CAAA;IACX,sHAAsH;IACtH,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;KAAE,KAAK,MAAM,CAAC,GAAG,MAAM,CAAA;CAC1E,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG,aAAa,GAAG;IAClD,GAAG,EAAE,gBAAgB,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;CAChD,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,cAAc,GAAG;IACpD,KAAK,EAAE,KAAK,CAAC,qBAAqB,CAAC,CAAA;CACpC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.ts"],"sourcesContent":["import type { I18nClient } from '@payloadcms/translations'\nimport type { LexicalEditor } from 'lexical'\nimport type { MutableRefObject } from 'react'\nimport type React from 'react'\n\nexport type SlashMenuItem = {\n /** The icon which is rendered in your slash menu item. */\n Icon: React.FC\n /** Each slash menu item needs to have a unique key. The key will be matched when typing, displayed if no `label` property is set, and used for classNames. */\n key: string\n /**\n * Keywords are used to match the item for different texts typed after the '/'.\n * E.g. you might want to show a horizontal rule item if you type both /hr, /separator, /horizontal etc.\n * In addition to the keywords, the label and key will be used to find the right slash menu item.\n */\n keywords?: Array<string>\n /** The label will be displayed in your slash menu item. In order to make use of i18n, this can be a function. */\n label?: (({ i18n }: { i18n: I18nClient<{}, string> }) => string) | string\n /** A function which is called when the slash menu item is selected. */\n onSelect: ({ editor, queryString }: { editor: LexicalEditor; queryString: string }) => void\n}\n\nexport type SlashMenuGroup = {\n /**\n * An array of `SlashMenuItem`'s which will be displayed in the slash menu.\n */\n items: Array<SlashMenuItem>\n /**\n * Used for class names and, if label is not provided, for display. Slash menus with the same key will have their items merged together.\n */\n key: string\n /** The label will be displayed before your Slash Menu group. In order to make use of i18n, this can be a function. */\n label?: (({ i18n }: { i18n: I18nClient<{}, string> }) => string) | string\n}\n\nexport type SlashMenuItemInternal = SlashMenuItem & {\n ref: MutableRefObject<HTMLButtonElement | null>\n}\n\nexport type SlashMenuGroupInternal = SlashMenuGroup & {\n items: Array<SlashMenuItemInternal>\n}\n"],"names":[],"mappings":"AAuCA,WAEC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lexical/plugins/SlashMenu/index.tsx"],"sourcesContent":["'use client'\nimport type { TextNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useTranslation } from '@payloadcms/ui'\nimport { useCallback, useMemo, useState } from 'react'\nimport * as React from 'react'\nimport * as ReactDOM from 'react-dom'\n\nimport type {\n SlashMenuGroup,\n SlashMenuGroupInternal,\n SlashMenuItemInternal,\n SlashMenuItem as SlashMenuItemType,\n} from './LexicalTypeaheadMenuPlugin/types.js'\n\nimport { useEditorConfigContext } from '../../config/client/EditorConfigProvider.js'\nimport { LexicalTypeaheadMenuPlugin } from './LexicalTypeaheadMenuPlugin/index.js'\nimport './index.scss'\nimport { useMenuTriggerMatch } from './useMenuTriggerMatch.js'\n\nconst baseClass = 'slash-menu-popup'\n\nfunction SlashMenuItem({\n isSelected,\n item,\n onClick,\n onMouseEnter,\n}: {\n index: number\n isSelected: boolean\n item: SlashMenuItemInternal\n onClick: () => void\n onMouseEnter: () => void\n}) {\n const { i18n } = useTranslation()\n\n let className = `${baseClass}__item ${baseClass}__item-${item.key}`\n if (isSelected) {\n className += ` ${baseClass}__item--selected`\n }\n\n let title = item.key\n if (item.label) {\n title = typeof item.label === 'function' ? item.label({ i18n }) : item.label\n }\n // Crop title to max. 25 characters\n if (title.length > 25) {\n title = title.substring(0, 25) + '...'\n }\n\n return (\n <button\n aria-selected={isSelected}\n className={className}\n id={baseClass + '__item-' + item.key}\n key={item.key}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n ref={item.ref}\n role=\"option\"\n tabIndex={-1}\n type=\"button\"\n >\n {item?.Icon && <item.Icon />}\n\n <span className={`${baseClass}__item-text`}>{title}</span>\n </button>\n )\n}\n\nexport function SlashMenuPlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): React.ReactElement {\n const [editor] = useLexicalComposerContext()\n const [queryString, setQueryString] = useState<null | string>(null)\n const { editorConfig } = useEditorConfigContext()\n const { i18n } = useTranslation()\n\n const checkForTriggerMatch = useMenuTriggerMatch('/', {\n minLength: 0,\n })\n\n const getDynamicItems = useCallback(() => {\n let groupWithItems: Array<SlashMenuGroup> = []\n\n for (const dynamicItem of editorConfig.features.slashMenu.dynamicGroups) {\n const dynamicGroupWithItems = dynamicItem({\n editor,\n queryString,\n })\n groupWithItems = groupWithItems.concat(dynamicGroupWithItems)\n }\n\n return groupWithItems\n }, [editor, queryString, editorConfig?.features])\n\n const groups: SlashMenuGroup[] = useMemo(() => {\n let groupsWithItems: SlashMenuGroup[] = []\n for (const groupWithItem of editorConfig?.features.slashMenu.groups ?? []) {\n groupsWithItems.push(groupWithItem)\n }\n\n if (queryString) {\n // Filter current groups first\n groupsWithItems = groupsWithItems.map((group) => {\n const filteredItems = group.items.filter((item) => {\n let itemTitle = item.key\n if (item.label) {\n itemTitle = typeof item.label === 'function' ? item.label({ i18n }) : item.label\n }\n\n if (new RegExp(queryString, 'gi').exec(itemTitle)) {\n return true\n }\n if (item.keywords != null) {\n return item.keywords.some((keyword) => new RegExp(queryString, 'gi').exec(keyword))\n }\n return false\n })\n if (filteredItems.length) {\n return {\n ...group,\n items: filteredItems,\n }\n }\n return null\n })\n\n groupsWithItems = groupsWithItems.filter((group) => group != null)\n\n // Now add dynamic groups\n const dynamicItemGroups = getDynamicItems()\n\n // merge dynamic items into groups\n for (const dynamicGroup of dynamicItemGroups) {\n // 1. find the group with the same name or create new one\n let group = groupsWithItems.find((group) => group.key === dynamicGroup.key)\n if (!group) {\n group = {\n ...dynamicGroup,\n items: [],\n }\n } else {\n groupsWithItems = groupsWithItems.filter((group) => group.key !== dynamicGroup.key)\n }\n\n // 2. Add items to group items array and add to sanitized.slashMenu.groupsWithItems\n if (group?.items?.length) {\n group.items = group.items.concat(group.items)\n }\n groupsWithItems.push(group)\n }\n }\n\n return groupsWithItems\n }, [getDynamicItems, queryString, editorConfig?.features, i18n])\n\n const onSelectItem = useCallback(\n (\n selectedItem: SlashMenuItemType,\n nodeToRemove: TextNode | null,\n closeMenu: () => void,\n matchingString: string,\n ) => {\n if (nodeToRemove) {\n editor.update(() => {\n nodeToRemove.remove()\n })\n }\n selectedItem.onSelect({ editor, queryString: matchingString })\n\n closeMenu()\n },\n [editor],\n )\n\n return (\n <React.Fragment>\n <LexicalTypeaheadMenuPlugin\n anchorElem={anchorElem}\n groups={groups as SlashMenuGroupInternal[]}\n menuRenderFn={(\n anchorElementRef,\n { selectItemAndCleanUp, selectedItemKey, setSelectedItemKey },\n ) =>\n anchorElementRef.current && groups.length\n ? ReactDOM.createPortal(\n <div className={baseClass}>\n {groups.map((group) => {\n let groupTitle = group.key\n if (group.label) {\n groupTitle =\n typeof group.label === 'function' ? group.label({ i18n }) : group.label\n }\n\n return (\n <div\n className={`${baseClass}__group ${baseClass}__group-${group.key}`}\n key={group.key}\n >\n <div className={`${baseClass}__group-title`}>{groupTitle}</div>\n {group.items.map((item, oi: number) => (\n <SlashMenuItem\n index={oi}\n isSelected={selectedItemKey === item.key}\n item={item as SlashMenuItemInternal}\n key={item.key}\n onClick={() => {\n setSelectedItemKey(item.key)\n selectItemAndCleanUp(item)\n }}\n onMouseEnter={() => {\n setSelectedItemKey(item.key)\n }}\n />\n ))}\n </div>\n )\n })}\n </div>,\n anchorElementRef.current,\n )\n : null\n }\n onQueryChange={setQueryString}\n onSelectItem={onSelectItem}\n triggerFn={checkForTriggerMatch}\n />\n </React.Fragment>\n )\n}\n"],"names":["useLexicalComposerContext","useTranslation","useCallback","useMemo","useState","React","ReactDOM","useEditorConfigContext","LexicalTypeaheadMenuPlugin","useMenuTriggerMatch","baseClass","SlashMenuItem","isSelected","item","onClick","onMouseEnter","i18n","className","key","title","label","length","substring","button","aria-selected","id","ref","role","tabIndex","type","Icon","span","SlashMenuPlugin","anchorElem","document","body","editor","queryString","setQueryString","editorConfig","checkForTriggerMatch","minLength","getDynamicItems","groupWithItems","dynamicItem","features","slashMenu","dynamicGroups","dynamicGroupWithItems","concat","groups","groupsWithItems","groupWithItem","push","map","group","filteredItems","items","filter","itemTitle","RegExp","exec","keywords","some","keyword","dynamicItemGroups","dynamicGroup","find","onSelectItem","selectedItem","nodeToRemove","closeMenu","matchingString","update","remove","onSelect","Fragment","menuRenderFn","anchorElementRef","selectItemAndCleanUp","selectedItemKey","setSelectedItemKey","current","createPortal","div","groupTitle","oi","index","onQueryChange","triggerFn"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lexical/plugins/SlashMenu/index.tsx"],"sourcesContent":["'use client'\nimport type { TextNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useTranslation } from '@payloadcms/ui'\nimport { useCallback, useMemo, useState } from 'react'\nimport * as React from 'react'\nimport * as ReactDOM from 'react-dom'\n\nimport type {\n SlashMenuGroup,\n SlashMenuGroupInternal,\n SlashMenuItemInternal,\n SlashMenuItem as SlashMenuItemType,\n} from './LexicalTypeaheadMenuPlugin/types.js'\n\nimport { useEditorConfigContext } from '../../config/client/EditorConfigProvider.js'\nimport { LexicalTypeaheadMenuPlugin } from './LexicalTypeaheadMenuPlugin/index.js'\nimport './index.scss'\nimport { useMenuTriggerMatch } from './useMenuTriggerMatch.js'\n\nconst baseClass = 'slash-menu-popup'\n\nfunction SlashMenuItem({\n isSelected,\n item,\n onClick,\n onMouseEnter,\n}: {\n index: number\n isSelected: boolean\n item: SlashMenuItemInternal\n onClick: () => void\n onMouseEnter: () => void\n}) {\n const { i18n } = useTranslation()\n\n let className = `${baseClass}__item ${baseClass}__item-${item.key}`\n if (isSelected) {\n className += ` ${baseClass}__item--selected`\n }\n\n let title = item.key\n if (item.label) {\n title = typeof item.label === 'function' ? item.label({ i18n }) : item.label\n }\n // Crop title to max. 25 characters\n if (title.length > 25) {\n title = title.substring(0, 25) + '...'\n }\n\n return (\n <button\n aria-selected={isSelected}\n className={className}\n id={baseClass + '__item-' + item.key}\n key={item.key}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n ref={item.ref}\n role=\"option\"\n tabIndex={-1}\n type=\"button\"\n >\n {item?.Icon && <item.Icon />}\n\n <span className={`${baseClass}__item-text`}>{title}</span>\n </button>\n )\n}\n\nexport function SlashMenuPlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): React.ReactElement {\n const [editor] = useLexicalComposerContext()\n const [queryString, setQueryString] = useState<null | string>(null)\n const { editorConfig } = useEditorConfigContext()\n const { i18n } = useTranslation()\n\n const checkForTriggerMatch = useMenuTriggerMatch('/', {\n minLength: 0,\n })\n\n const getDynamicItems = useCallback(() => {\n let groupWithItems: Array<SlashMenuGroup> = []\n\n for (const dynamicItem of editorConfig.features.slashMenu.dynamicGroups) {\n const dynamicGroupWithItems = dynamicItem({\n editor,\n queryString,\n })\n groupWithItems = groupWithItems.concat(dynamicGroupWithItems)\n }\n\n return groupWithItems\n }, [editor, queryString, editorConfig?.features])\n\n const groups: SlashMenuGroup[] = useMemo(() => {\n let groupsWithItems: SlashMenuGroup[] = []\n for (const groupWithItem of editorConfig?.features.slashMenu.groups ?? []) {\n groupsWithItems.push(groupWithItem)\n }\n\n if (queryString) {\n // Filter current groups first\n groupsWithItems = groupsWithItems.map((group) => {\n const filteredItems = group.items.filter((item) => {\n let itemTitle = item.key\n if (item.label) {\n itemTitle = typeof item.label === 'function' ? item.label({ i18n }) : item.label\n }\n\n if (new RegExp(queryString, 'gi').exec(itemTitle)) {\n return true\n }\n if (item.keywords != null) {\n return item.keywords.some((keyword) => new RegExp(queryString, 'gi').exec(keyword))\n }\n return false\n })\n if (filteredItems.length) {\n return {\n ...group,\n items: filteredItems,\n }\n }\n return null\n })\n\n groupsWithItems = groupsWithItems.filter((group) => group != null)\n\n // Now add dynamic groups\n const dynamicItemGroups = getDynamicItems()\n\n // merge dynamic items into groups\n for (const dynamicGroup of dynamicItemGroups) {\n // 1. find the group with the same name or create new one\n let group = groupsWithItems.find((group) => group.key === dynamicGroup.key)\n if (!group) {\n group = {\n ...dynamicGroup,\n items: [],\n }\n } else {\n groupsWithItems = groupsWithItems.filter((group) => group.key !== dynamicGroup.key)\n }\n\n // 2. Add items to group items array and add to sanitized.slashMenu.groupsWithItems\n if (group?.items?.length) {\n group.items = group.items.concat(group.items)\n }\n groupsWithItems.push(group)\n }\n }\n\n return groupsWithItems\n }, [getDynamicItems, queryString, editorConfig?.features, i18n])\n\n const onSelectItem = useCallback(\n (\n selectedItem: SlashMenuItemType,\n nodeToRemove: TextNode | null,\n closeMenu: () => void,\n matchingString: string,\n ) => {\n if (nodeToRemove) {\n editor.update(() => {\n nodeToRemove.remove()\n })\n }\n selectedItem.onSelect({ editor, queryString: matchingString })\n\n closeMenu()\n },\n [editor],\n )\n\n return (\n <React.Fragment>\n <LexicalTypeaheadMenuPlugin\n anchorElem={anchorElem}\n groups={groups as SlashMenuGroupInternal[]}\n menuRenderFn={(\n anchorElementRef,\n { selectItemAndCleanUp, selectedItemKey, setSelectedItemKey },\n ) =>\n anchorElementRef.current && groups.length\n ? ReactDOM.createPortal(\n <div className={baseClass}>\n {groups.map((group) => {\n let groupTitle = group.key\n if (group.label) {\n groupTitle =\n typeof group.label === 'function' ? group.label({ i18n }) : group.label\n }\n\n return (\n <div\n className={`${baseClass}__group ${baseClass}__group-${group.key}`}\n key={group.key}\n >\n <div className={`${baseClass}__group-title`}>{groupTitle}</div>\n {group.items.map((item, oi: number) => (\n <SlashMenuItem\n index={oi}\n isSelected={selectedItemKey === item.key}\n item={item as SlashMenuItemInternal}\n key={item.key}\n onClick={() => {\n setSelectedItemKey(item.key)\n selectItemAndCleanUp(item)\n }}\n onMouseEnter={() => {\n setSelectedItemKey(item.key)\n }}\n />\n ))}\n </div>\n )\n })}\n </div>,\n anchorElementRef.current,\n )\n : null\n }\n onQueryChange={setQueryString}\n onSelectItem={onSelectItem}\n triggerFn={checkForTriggerMatch}\n />\n </React.Fragment>\n )\n}\n"],"names":["useLexicalComposerContext","useTranslation","useCallback","useMemo","useState","React","ReactDOM","useEditorConfigContext","LexicalTypeaheadMenuPlugin","useMenuTriggerMatch","baseClass","SlashMenuItem","isSelected","item","onClick","onMouseEnter","i18n","className","key","title","label","length","substring","button","aria-selected","id","ref","role","tabIndex","type","Icon","span","SlashMenuPlugin","anchorElem","document","body","editor","queryString","setQueryString","editorConfig","checkForTriggerMatch","minLength","getDynamicItems","groupWithItems","dynamicItem","features","slashMenu","dynamicGroups","dynamicGroupWithItems","concat","groups","groupsWithItems","groupWithItem","push","map","group","filteredItems","items","filter","itemTitle","RegExp","exec","keywords","some","keyword","dynamicItemGroups","dynamicGroup","find","onSelectItem","selectedItem","nodeToRemove","closeMenu","matchingString","update","remove","onSelect","Fragment","menuRenderFn","anchorElementRef","selectItemAndCleanUp","selectedItemKey","setSelectedItemKey","current","createPortal","div","groupTitle","oi","index","onQueryChange","triggerFn"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lexical/plugins/SlashMenu/useMenuTriggerMatch.ts"],"sourcesContent":["import type { LexicalEditor } from 'lexical'\n\nimport { useCallback } from 'react'\n\nimport { PUNCTUATION } from './LexicalTypeaheadMenuPlugin/index.js'\n\nexport type TriggerFn = ({\n editor,\n query,\n}: {\n editor: LexicalEditor\n /** The query string is the POTENTIAL trigger AND the text after the trigger text. */\n query: string\n}) => MenuTextMatch | null\n\nexport type MenuTextMatch = {\n leadOffset: number\n matchingString: string\n replaceableString: string\n}\n\n/**\n * Returns a function which checks if the trigger (e.g. '/') is present in the query and, if so, returns the matching string (text after the trigger)\n */\nexport function useMenuTriggerMatch(\n /**\n * Text which triggers the menu. Everything after this text will be used as the query.\n */\n trigger: string,\n { maxLength = 75, minLength = 1 }: { maxLength?: number; minLength?: number },\n): TriggerFn {\n return useCallback(\n ({ query }) => {\n const validChars = '[^' + trigger + PUNCTUATION + '\\\\s]'\n const TypeaheadTriggerRegex = new RegExp(\n '(^|\\\\s|\\\\()(' +\n '[' +\n trigger +\n ']' +\n '((?:' +\n validChars +\n '){0,' +\n maxLength +\n '})' +\n ')$',\n )\n const match = TypeaheadTriggerRegex.exec(query)\n if (match !== null) {\n const maybeLeadingWhitespace = match[1]\n\n /**\n * matchingString is only the text AFTER the trigger text. (So everything after the /)\n */\n const matchingString = match[3]\n\n if (matchingString.length >= minLength) {\n return {\n leadOffset: match.index + maybeLeadingWhitespace.length,\n matchingString,\n replaceableString: match[2], // replaceableString is the trigger text + the matching string\n }\n }\n }\n return null\n },\n [maxLength, minLength, trigger],\n )\n}\n"],"names":["useCallback","PUNCTUATION","useMenuTriggerMatch","trigger","maxLength","minLength","query","validChars","TypeaheadTriggerRegex","RegExp","match","exec","maybeLeadingWhitespace","matchingString","length","leadOffset","index","replaceableString"],"
|
|
1
|
+
{"version":3,"sources":["../../../../src/lexical/plugins/SlashMenu/useMenuTriggerMatch.ts"],"sourcesContent":["import type { LexicalEditor } from 'lexical'\n\nimport { useCallback } from 'react'\n\nimport { PUNCTUATION } from './LexicalTypeaheadMenuPlugin/index.js'\n\nexport type TriggerFn = ({\n editor,\n query,\n}: {\n editor: LexicalEditor\n /** The query string is the POTENTIAL trigger AND the text after the trigger text. */\n query: string\n}) => MenuTextMatch | null\n\nexport type MenuTextMatch = {\n leadOffset: number\n matchingString: string\n replaceableString: string\n}\n\n/**\n * Returns a function which checks if the trigger (e.g. '/') is present in the query and, if so, returns the matching string (text after the trigger)\n */\nexport function useMenuTriggerMatch(\n /**\n * Text which triggers the menu. Everything after this text will be used as the query.\n */\n trigger: string,\n { maxLength = 75, minLength = 1 }: { maxLength?: number; minLength?: number },\n): TriggerFn {\n return useCallback(\n ({ query }) => {\n const validChars = '[^' + trigger + PUNCTUATION + '\\\\s]'\n const TypeaheadTriggerRegex = new RegExp(\n '(^|\\\\s|\\\\()(' +\n '[' +\n trigger +\n ']' +\n '((?:' +\n validChars +\n '){0,' +\n maxLength +\n '})' +\n ')$',\n )\n const match = TypeaheadTriggerRegex.exec(query)\n if (match !== null) {\n const maybeLeadingWhitespace = match[1]\n\n /**\n * matchingString is only the text AFTER the trigger text. (So everything after the /)\n */\n const matchingString = match[3]\n\n if (matchingString.length >= minLength) {\n return {\n leadOffset: match.index + maybeLeadingWhitespace.length,\n matchingString,\n replaceableString: match[2], // replaceableString is the trigger text + the matching string\n }\n }\n }\n return null\n },\n [maxLength, minLength, trigger],\n )\n}\n"],"names":["useCallback","PUNCTUATION","useMenuTriggerMatch","trigger","maxLength","minLength","query","validChars","TypeaheadTriggerRegex","RegExp","match","exec","maybeLeadingWhitespace","matchingString","length","leadOffset","index","replaceableString"],"mappings":"AAEA,SAASA,WAAW,QAAQ,QAAO;AAEnC,SAASC,WAAW,QAAQ,wCAAuC;AAiBnE;;CAEC,GACD,OAAO,SAASC,oBACd;;GAEC,GACDC,OAAe,EACf,EAAEC,YAAY,EAAE,EAAEC,YAAY,CAAC,EAA8C;IAE7E,OAAOL,YACL,CAAC,EAAEM,KAAK,EAAE;QACR,MAAMC,aAAa,OAAOJ,UAAUF,cAAc;QAClD,MAAMO,wBAAwB,IAAIC,OAChC,iBACE,MACAN,UACA,MACA,SACAI,aACA,SACAH,YACA,OACA;QAEJ,MAAMM,QAAQF,sBAAsBG,IAAI,CAACL;QACzC,IAAII,UAAU,MAAM;YAClB,MAAME,yBAAyBF,KAAK,CAAC,EAAE;YAEvC;;SAEC,GACD,MAAMG,iBAAiBH,KAAK,CAAC,EAAE;YAE/B,IAAIG,eAAeC,MAAM,IAAIT,WAAW;gBACtC,OAAO;oBACLU,YAAYL,MAAMM,KAAK,GAAGJ,uBAAuBE,MAAM;oBACvDD;oBACAI,mBAAmBP,KAAK,CAAC,EAAE;gBAC7B;YACF;QACF;QACA,OAAO;IACT,GACA;QAACN;QAAWC;QAAWF;KAAQ;AAEnC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lexical/plugins/handles/AddBlockHandlePlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalEditor, LexicalNode, ParagraphNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $createParagraphNode } from 'lexical'\nimport * as React from 'react'\nimport { type JSX, useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useEditorConfigContext } from '../../../config/client/EditorConfigProvider.js'\nimport { isHTMLElement } from '../../../utils/guard.js'\nimport { Point } from '../../../utils/point.js'\nimport { ENABLE_SLASH_MENU_COMMAND } from '../../SlashMenu/LexicalTypeaheadMenuPlugin/index.js'\nimport { calculateDistanceFromScrollerElem } from '../utils/calculateDistanceFromScrollerElem.js'\nimport { getNodeCloseToPoint } from '../utils/getNodeCloseToPoint.js'\nimport { getTopLevelNodeKeys } from '../utils/getTopLevelNodeKeys.js'\nimport { isOnHandleElement } from '../utils/isOnHandleElement.js'\nimport { setHandlePosition } from '../utils/setHandlePosition.js'\nimport './index.scss'\n\nconst ADD_BLOCK_MENU_CLASSNAME = 'add-block-menu'\n\nlet prevIndex = Infinity\n\nfunction getCurrentIndex(keysLength: number): number {\n if (keysLength === 0) {\n return Infinity\n }\n if (prevIndex >= 0 && prevIndex < keysLength) {\n return prevIndex\n }\n\n return Math.floor(keysLength / 2)\n}\n\nfunction useAddBlockHandle(\n editor: LexicalEditor,\n anchorElem: HTMLElement,\n isEditable: boolean,\n): React.ReactElement {\n const scrollerElem = anchorElem.parentElement\n\n const { editorConfig } = useEditorConfigContext()\n const blockHandleHorizontalOffset = editorConfig?.admin?.hideGutter ? -24 : 12\n\n const menuRef = useRef<HTMLButtonElement>(null)\n const [hoveredElement, setHoveredElement] = useState<{\n elem: HTMLElement\n node: LexicalNode\n } | null>(null)\n\n useEffect(() => {\n function onDocumentMouseMove(event: MouseEvent) {\n const target = event.target\n if (!isHTMLElement(target)) {\n return\n }\n\n const distanceFromScrollerElem = calculateDistanceFromScrollerElem(\n scrollerElem,\n event.pageX,\n event.pageY,\n target,\n )\n\n if (distanceFromScrollerElem === -1) {\n setHoveredElement(null)\n return\n }\n\n if (isOnHandleElement(target, ADD_BLOCK_MENU_CLASSNAME)) {\n return\n }\n const topLevelNodeKeys = getTopLevelNodeKeys(editor)\n\n const {\n blockElem: _emptyBlockElem,\n blockNode,\n foundAtIndex,\n } = getNodeCloseToPoint({\n anchorElem,\n cache_threshold: 0,\n editor,\n horizontalOffset: -distanceFromScrollerElem,\n point: new Point(event.x, event.y),\n returnEmptyParagraphs: true,\n startIndex: getCurrentIndex(topLevelNodeKeys.length),\n useEdgeAsDefault: false,\n })\n\n prevIndex = foundAtIndex\n\n if (!_emptyBlockElem) {\n return\n }\n if (hoveredElement?.node !== blockNode || hoveredElement?.elem !== _emptyBlockElem) {\n setHoveredElement({\n elem: _emptyBlockElem,\n node: blockNode,\n })\n }\n }\n\n // Since the draggableBlockElem is outside the actual editor, we need to listen to the document\n // to be able to detect when the mouse is outside the editor and respect a buffer around\n // the scrollerElem to avoid the draggableBlockElem disappearing too early.\n document?.addEventListener('mousemove', onDocumentMouseMove)\n\n return () => {\n document?.removeEventListener('mousemove', onDocumentMouseMove)\n }\n }, [scrollerElem, anchorElem, editor, hoveredElement])\n\n useEffect(() => {\n if (menuRef.current && hoveredElement?.node) {\n setHandlePosition(\n hoveredElement?.elem,\n menuRef.current,\n anchorElem,\n blockHandleHorizontalOffset,\n )\n }\n }, [anchorElem, hoveredElement, blockHandleHorizontalOffset])\n\n const handleAddClick = useCallback(\n (event) => {\n let hoveredElementToUse = hoveredElement\n if (!hoveredElementToUse?.node) {\n return\n }\n\n // 1. Update hoveredElement.node to a new paragraph node if the hoveredElement.node is not a paragraph node\n editor.update(() => {\n // Check if blockNode is an empty text node\n let isEmptyParagraph = true\n if (\n hoveredElementToUse.node.getType() !== 'paragraph' ||\n hoveredElementToUse.node.getTextContent() !== ''\n ) {\n isEmptyParagraph = false\n }\n\n if (!isEmptyParagraph) {\n const newParagraph = $createParagraphNode()\n hoveredElementToUse.node.insertAfter(newParagraph)\n\n setTimeout(() => {\n hoveredElementToUse = {\n elem: editor.getElementByKey(newParagraph.getKey()),\n node: newParagraph,\n }\n setHoveredElement(hoveredElementToUse)\n }, 0)\n }\n })\n\n // 2. Focus on the new paragraph node\n setTimeout(() => {\n editor.update(() => {\n editor.focus()\n\n if (\n hoveredElementToUse.node &&\n 'select' in hoveredElementToUse.node &&\n typeof hoveredElementToUse.node.select === 'function'\n ) {\n hoveredElementToUse.node.select()\n }\n })\n }, 1)\n\n // Make sure this is called AFTER the focusing has been processed by the browser\n // Otherwise, this won't work\n setTimeout(() => {\n editor.dispatchCommand(ENABLE_SLASH_MENU_COMMAND, {\n node: hoveredElementToUse.node as ParagraphNode,\n })\n }, 2)\n\n event.stopPropagation()\n event.preventDefault()\n },\n [editor, hoveredElement],\n )\n\n return createPortal(\n <React.Fragment>\n <button\n className=\"icon add-block-menu\"\n onClick={(event) => {\n handleAddClick(event)\n }}\n ref={menuRef}\n type=\"button\"\n >\n <div className={isEditable ? 'icon' : ''} />\n </button>\n </React.Fragment>,\n anchorElem,\n )\n}\n\nexport function AddBlockHandlePlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): React.ReactElement {\n const [editor] = useLexicalComposerContext()\n return useAddBlockHandle(editor, anchorElem, editor._editable)\n}\n"],"names":["useLexicalComposerContext","$createParagraphNode","React","useCallback","useEffect","useRef","useState","createPortal","useEditorConfigContext","isHTMLElement","Point","ENABLE_SLASH_MENU_COMMAND","calculateDistanceFromScrollerElem","getNodeCloseToPoint","getTopLevelNodeKeys","isOnHandleElement","setHandlePosition","ADD_BLOCK_MENU_CLASSNAME","prevIndex","Infinity","getCurrentIndex","keysLength","Math","floor","useAddBlockHandle","editor","anchorElem","isEditable","scrollerElem","parentElement","editorConfig","blockHandleHorizontalOffset","admin","hideGutter","menuRef","hoveredElement","setHoveredElement","onDocumentMouseMove","event","target","distanceFromScrollerElem","pageX","pageY","topLevelNodeKeys","blockElem","_emptyBlockElem","blockNode","foundAtIndex","cache_threshold","horizontalOffset","point","x","y","returnEmptyParagraphs","startIndex","length","useEdgeAsDefault","node","elem","document","addEventListener","removeEventListener","current","handleAddClick","hoveredElementToUse","update","isEmptyParagraph","getType","getTextContent","newParagraph","insertAfter","setTimeout","getElementByKey","getKey","focus","select","dispatchCommand","stopPropagation","preventDefault","Fragment","button","className","onClick","ref","type","div","AddBlockHandlePlugin","body","_editable"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA;;AAGA,SAASA,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,oBAAoB,QAAQ,UAAS;AAC9C,YAAYC,WAAW,QAAO;AAC9B,SAAmBC,WAAW,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAC1E,SAASC,YAAY,QAAQ,YAAW;AAExC,SAASC,sBAAsB,QAAQ,iDAAgD;AACvF,SAASC,aAAa,QAAQ,0BAAyB;AACvD,SAASC,KAAK,QAAQ,0BAAyB;AAC/C,SAASC,yBAAyB,QAAQ,sDAAqD;AAC/F,SAASC,iCAAiC,QAAQ,gDAA+C;AACjG,SAASC,mBAAmB,QAAQ,kCAAiC;AACrE,SAASC,mBAAmB,QAAQ,kCAAiC;AACrE,SAASC,iBAAiB,QAAQ,gCAA+B;AACjE,SAASC,iBAAiB,QAAQ,gCAA+B;AAGjE,MAAMC,2BAA2B;AAEjC,IAAIC,YAAYC;AAEhB,SAASC,gBAAgBC,UAAkB;IACzC,IAAIA,eAAe,GAAG;QACpB,OAAOF;IACT;IACA,IAAID,aAAa,KAAKA,YAAYG,YAAY;QAC5C,OAAOH;IACT;IAEA,OAAOI,KAAKC,KAAK,CAACF,aAAa;AACjC;AAEA,SAASG,kBACPC,MAAqB,EACrBC,UAAuB,EACvBC,UAAmB;IAEnB,MAAMC,eAAeF,WAAWG,aAAa;IAE7C,MAAM,EAAEC,YAAY,EAAE,GAAGtB;IACzB,MAAMuB,8BAA8BD,cAAcE,OAAOC,aAAa,CAAC,KAAK;IAE5E,MAAMC,UAAU7B,OAA0B;IAC1C,MAAM,CAAC8B,gBAAgBC,kBAAkB,GAAG9B,SAGlC;IAEVF,UAAU;QACR,SAASiC,oBAAoBC,KAAiB;YAC5C,MAAMC,SAASD,MAAMC,MAAM;YAC3B,IAAI,CAAC9B,cAAc8B,SAAS;gBAC1B;YACF;YAEA,MAAMC,2BAA2B5B,kCAC/BgB,cACAU,MAAMG,KAAK,EACXH,MAAMI,KAAK,EACXH;YAGF,IAAIC,6BAA6B,CAAC,GAAG;gBACnCJ,kBAAkB;gBAClB;YACF;YAEA,IAAIrB,kBAAkBwB,QAAQtB,2BAA2B;gBACvD;YACF;YACA,MAAM0B,mBAAmB7B,oBAAoBW;YAE7C,MAAM,EACJmB,WAAWC,eAAe,EAC1BC,SAAS,EACTC,YAAY,EACb,GAAGlC,oBAAoB;gBACtBa;gBACAsB,iBAAiB;gBACjBvB;gBACAwB,kBAAkB,CAACT;gBACnBU,OAAO,IAAIxC,MAAM4B,MAAMa,CAAC,EAAEb,MAAMc,CAAC;gBACjCC,uBAAuB;gBACvBC,YAAYlC,gBAAgBuB,iBAAiBY,MAAM;gBACnDC,kBAAkB;YACpB;YAEAtC,YAAY6B;YAEZ,IAAI,CAACF,iBAAiB;gBACpB;YACF;YACA,IAAIV,gBAAgBsB,SAASX,aAAaX,gBAAgBuB,SAASb,iBAAiB;gBAClFT,kBAAkB;oBAChBsB,MAAMb;oBACNY,MAAMX;gBACR;YACF;QACF;QAEA,+FAA+F;QAC/F,wFAAwF;QACxF,2EAA2E;QAC3Ea,UAAUC,iBAAiB,aAAavB;QAExC,OAAO;YACLsB,UAAUE,oBAAoB,aAAaxB;QAC7C;IACF,GAAG;QAACT;QAAcF;QAAYD;QAAQU;KAAe;IAErD/B,UAAU;QACR,IAAI8B,QAAQ4B,OAAO,IAAI3B,gBAAgBsB,MAAM;YAC3CzC,kBACEmB,gBAAgBuB,MAChBxB,QAAQ4B,OAAO,EACfpC,YACAK;QAEJ;IACF,GAAG;QAACL;QAAYS;QAAgBJ;KAA4B;IAE5D,MAAMgC,iBAAiB5D,YACrB,CAACmC;QACC,IAAI0B,sBAAsB7B;QAC1B,IAAI,CAAC6B,qBAAqBP,MAAM;YAC9B;QACF;QAEA,2GAA2G;QAC3GhC,OAAOwC,MAAM,CAAC;YACZ,2CAA2C;YAC3C,IAAIC,mBAAmB;YACvB,IACEF,oBAAoBP,IAAI,CAACU,OAAO,OAAO,eACvCH,oBAAoBP,IAAI,CAACW,cAAc,OAAO,IAC9C;gBACAF,mBAAmB;YACrB;YAEA,IAAI,CAACA,kBAAkB;gBACrB,MAAMG,eAAepE;gBACrB+D,oBAAoBP,IAAI,CAACa,WAAW,CAACD;gBAErCE,WAAW;oBACTP,sBAAsB;wBACpBN,MAAMjC,OAAO+C,eAAe,CAACH,aAAaI,MAAM;wBAChDhB,MAAMY;oBACR;oBACAjC,kBAAkB4B;gBACpB,GAAG;YACL;QACF;QAEA,qCAAqC;QACrCO,WAAW;YACT9C,OAAOwC,MAAM,CAAC;gBACZxC,OAAOiD,KAAK;gBAEZ,IACEV,oBAAoBP,IAAI,IACxB,YAAYO,oBAAoBP,IAAI,IACpC,OAAOO,oBAAoBP,IAAI,CAACkB,MAAM,KAAK,YAC3C;oBACAX,oBAAoBP,IAAI,CAACkB,MAAM;gBACjC;YACF;QACF,GAAG;QAEH,gFAAgF;QAChF,6BAA6B;QAC7BJ,WAAW;YACT9C,OAAOmD,eAAe,CAACjE,2BAA2B;gBAChD8C,MAAMO,oBAAoBP,IAAI;YAChC;QACF,GAAG;QAEHnB,MAAMuC,eAAe;QACrBvC,MAAMwC,cAAc;IACtB,GACA;QAACrD;QAAQU;KAAe;IAG1B,qBAAO5B,2BACL,KAACL,MAAM6E,QAAQ;kBACb,cAAA,KAACC;YACCC,WAAU;YACVC,SAAS,CAAC5C;gBACRyB,eAAezB;YACjB;YACA6C,KAAKjD;YACLkD,MAAK;sBAEL,cAAA,KAACC;gBAAIJ,WAAWtD,aAAa,SAAS;;;QAG1CD;AAEJ;AAEA,OAAO,SAAS4D,qBAAqB,EACnC5D,aAAaiC,SAAS4B,IAAI,EAG3B;IACC,MAAM,CAAC9D,OAAO,GAAGzB;IACjB,OAAOwB,kBAAkBC,QAAQC,YAAYD,OAAO+D,SAAS;AAC/D"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lexical/plugins/handles/AddBlockHandlePlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalEditor, LexicalNode, ParagraphNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $createParagraphNode } from 'lexical'\nimport * as React from 'react'\nimport { type JSX, useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useEditorConfigContext } from '../../../config/client/EditorConfigProvider.js'\nimport { isHTMLElement } from '../../../utils/guard.js'\nimport { Point } from '../../../utils/point.js'\nimport { ENABLE_SLASH_MENU_COMMAND } from '../../SlashMenu/LexicalTypeaheadMenuPlugin/index.js'\nimport { calculateDistanceFromScrollerElem } from '../utils/calculateDistanceFromScrollerElem.js'\nimport { getNodeCloseToPoint } from '../utils/getNodeCloseToPoint.js'\nimport { getTopLevelNodeKeys } from '../utils/getTopLevelNodeKeys.js'\nimport { isOnHandleElement } from '../utils/isOnHandleElement.js'\nimport { setHandlePosition } from '../utils/setHandlePosition.js'\nimport './index.scss'\n\nconst ADD_BLOCK_MENU_CLASSNAME = 'add-block-menu'\n\nlet prevIndex = Infinity\n\nfunction getCurrentIndex(keysLength: number): number {\n if (keysLength === 0) {\n return Infinity\n }\n if (prevIndex >= 0 && prevIndex < keysLength) {\n return prevIndex\n }\n\n return Math.floor(keysLength / 2)\n}\n\nfunction useAddBlockHandle(\n editor: LexicalEditor,\n anchorElem: HTMLElement,\n isEditable: boolean,\n): React.ReactElement {\n const scrollerElem = anchorElem.parentElement\n\n const { editorConfig } = useEditorConfigContext()\n const blockHandleHorizontalOffset = editorConfig?.admin?.hideGutter ? -24 : 12\n\n const menuRef = useRef<HTMLButtonElement>(null)\n const [hoveredElement, setHoveredElement] = useState<{\n elem: HTMLElement\n node: LexicalNode\n } | null>(null)\n\n useEffect(() => {\n function onDocumentMouseMove(event: MouseEvent) {\n const target = event.target\n if (!isHTMLElement(target)) {\n return\n }\n\n const distanceFromScrollerElem = calculateDistanceFromScrollerElem(\n scrollerElem,\n event.pageX,\n event.pageY,\n target,\n )\n\n if (distanceFromScrollerElem === -1) {\n setHoveredElement(null)\n return\n }\n\n if (isOnHandleElement(target, ADD_BLOCK_MENU_CLASSNAME)) {\n return\n }\n const topLevelNodeKeys = getTopLevelNodeKeys(editor)\n\n const {\n blockElem: _emptyBlockElem,\n blockNode,\n foundAtIndex,\n } = getNodeCloseToPoint({\n anchorElem,\n cache_threshold: 0,\n editor,\n horizontalOffset: -distanceFromScrollerElem,\n point: new Point(event.x, event.y),\n returnEmptyParagraphs: true,\n startIndex: getCurrentIndex(topLevelNodeKeys.length),\n useEdgeAsDefault: false,\n })\n\n prevIndex = foundAtIndex\n\n if (!_emptyBlockElem) {\n return\n }\n if (hoveredElement?.node !== blockNode || hoveredElement?.elem !== _emptyBlockElem) {\n setHoveredElement({\n elem: _emptyBlockElem,\n node: blockNode,\n })\n }\n }\n\n // Since the draggableBlockElem is outside the actual editor, we need to listen to the document\n // to be able to detect when the mouse is outside the editor and respect a buffer around\n // the scrollerElem to avoid the draggableBlockElem disappearing too early.\n document?.addEventListener('mousemove', onDocumentMouseMove)\n\n return () => {\n document?.removeEventListener('mousemove', onDocumentMouseMove)\n }\n }, [scrollerElem, anchorElem, editor, hoveredElement])\n\n useEffect(() => {\n if (menuRef.current && hoveredElement?.node) {\n setHandlePosition(\n hoveredElement?.elem,\n menuRef.current,\n anchorElem,\n blockHandleHorizontalOffset,\n )\n }\n }, [anchorElem, hoveredElement, blockHandleHorizontalOffset])\n\n const handleAddClick = useCallback(\n (event) => {\n let hoveredElementToUse = hoveredElement\n if (!hoveredElementToUse?.node) {\n return\n }\n\n // 1. Update hoveredElement.node to a new paragraph node if the hoveredElement.node is not a paragraph node\n editor.update(() => {\n // Check if blockNode is an empty text node\n let isEmptyParagraph = true\n if (\n hoveredElementToUse.node.getType() !== 'paragraph' ||\n hoveredElementToUse.node.getTextContent() !== ''\n ) {\n isEmptyParagraph = false\n }\n\n if (!isEmptyParagraph) {\n const newParagraph = $createParagraphNode()\n hoveredElementToUse.node.insertAfter(newParagraph)\n\n setTimeout(() => {\n hoveredElementToUse = {\n elem: editor.getElementByKey(newParagraph.getKey()),\n node: newParagraph,\n }\n setHoveredElement(hoveredElementToUse)\n }, 0)\n }\n })\n\n // 2. Focus on the new paragraph node\n setTimeout(() => {\n editor.update(() => {\n editor.focus()\n\n if (\n hoveredElementToUse.node &&\n 'select' in hoveredElementToUse.node &&\n typeof hoveredElementToUse.node.select === 'function'\n ) {\n hoveredElementToUse.node.select()\n }\n })\n }, 1)\n\n // Make sure this is called AFTER the focusing has been processed by the browser\n // Otherwise, this won't work\n setTimeout(() => {\n editor.dispatchCommand(ENABLE_SLASH_MENU_COMMAND, {\n node: hoveredElementToUse.node as ParagraphNode,\n })\n }, 2)\n\n event.stopPropagation()\n event.preventDefault()\n },\n [editor, hoveredElement],\n )\n\n return createPortal(\n <React.Fragment>\n <button\n className=\"icon add-block-menu\"\n onClick={(event) => {\n handleAddClick(event)\n }}\n ref={menuRef}\n type=\"button\"\n >\n <div className={isEditable ? 'icon' : ''} />\n </button>\n </React.Fragment>,\n anchorElem,\n )\n}\n\nexport function AddBlockHandlePlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): React.ReactElement {\n const [editor] = useLexicalComposerContext()\n return useAddBlockHandle(editor, anchorElem, editor._editable)\n}\n"],"names":["useLexicalComposerContext","$createParagraphNode","React","useCallback","useEffect","useRef","useState","createPortal","useEditorConfigContext","isHTMLElement","Point","ENABLE_SLASH_MENU_COMMAND","calculateDistanceFromScrollerElem","getNodeCloseToPoint","getTopLevelNodeKeys","isOnHandleElement","setHandlePosition","ADD_BLOCK_MENU_CLASSNAME","prevIndex","Infinity","getCurrentIndex","keysLength","Math","floor","useAddBlockHandle","editor","anchorElem","isEditable","scrollerElem","parentElement","editorConfig","blockHandleHorizontalOffset","admin","hideGutter","menuRef","hoveredElement","setHoveredElement","onDocumentMouseMove","event","target","distanceFromScrollerElem","pageX","pageY","topLevelNodeKeys","blockElem","_emptyBlockElem","blockNode","foundAtIndex","cache_threshold","horizontalOffset","point","x","y","returnEmptyParagraphs","startIndex","length","useEdgeAsDefault","node","elem","document","addEventListener","removeEventListener","current","handleAddClick","hoveredElementToUse","update","isEmptyParagraph","getType","getTextContent","newParagraph","insertAfter","setTimeout","getElementByKey","getKey","focus","select","dispatchCommand","stopPropagation","preventDefault","Fragment","button","className","onClick","ref","type","div","AddBlockHandlePlugin","body","_editable"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lexical/plugins/handles/DraggableBlockPlugin/debounce.ts"],"sourcesContent":["export function debounce(func: Function, wait: number) {\n let timeout: null | number = null\n return function (...args: any[]) {\n const later = () => {\n clearTimeout(timeout)\n timeout = null\n func(...args)\n }\n\n clearTimeout(timeout)\n timeout = window.setTimeout(later, wait)\n }\n}\n"],"names":["debounce","func","wait","timeout","args","later","clearTimeout","window","setTimeout"],"
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lexical/plugins/handles/DraggableBlockPlugin/debounce.ts"],"sourcesContent":["export function debounce(func: Function, wait: number) {\n let timeout: null | number = null\n return function (...args: any[]) {\n const later = () => {\n clearTimeout(timeout)\n timeout = null\n func(...args)\n }\n\n clearTimeout(timeout)\n timeout = window.setTimeout(later, wait)\n }\n}\n"],"names":["debounce","func","wait","timeout","args","later","clearTimeout","window","setTimeout"],"mappings":"AAAA,OAAO,SAASA,SAASC,IAAc,EAAEC,IAAY;IACnD,IAAIC,UAAyB;IAC7B,OAAO,SAAU,GAAGC,IAAW;QAC7B,MAAMC,QAAQ;YACZC,aAAaH;YACbA,UAAU;YACVF,QAAQG;QACV;QAEAE,aAAaH;QACbA,UAAUI,OAAOC,UAAU,CAACH,OAAOH;IACrC;AACF"}
|
package/dist/lexical/plugins/handles/DraggableBlockPlugin/getBoundingRectWithoutTransform.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lexical/plugins/handles/DraggableBlockPlugin/getBoundingRectWithoutTransform.ts"],"sourcesContent":["export function getBoundingClientRectWithoutTransform(elem: HTMLElement): DOMRect {\n const rect = elem.getBoundingClientRect()\n\n // Extract the translation value from the transform style\n const transformValue = getComputedStyle(elem).getPropertyValue('transform')\n if (!transformValue || transformValue === 'none') {\n return rect\n }\n\n const lastNumberOfTransformValue = transformValue.split(',').pop()\n rect.y = rect.y - Number(lastNumberOfTransformValue.replace(')', ''))\n\n // Return the original bounding rect if no translation is applied\n return rect\n}\n"],"names":["getBoundingClientRectWithoutTransform","elem","rect","getBoundingClientRect","transformValue","getComputedStyle","getPropertyValue","lastNumberOfTransformValue","split","pop","y","Number","replace"],"
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lexical/plugins/handles/DraggableBlockPlugin/getBoundingRectWithoutTransform.ts"],"sourcesContent":["export function getBoundingClientRectWithoutTransform(elem: HTMLElement): DOMRect {\n const rect = elem.getBoundingClientRect()\n\n // Extract the translation value from the transform style\n const transformValue = getComputedStyle(elem).getPropertyValue('transform')\n if (!transformValue || transformValue === 'none') {\n return rect\n }\n\n const lastNumberOfTransformValue = transformValue.split(',').pop()\n rect.y = rect.y - Number(lastNumberOfTransformValue.replace(')', ''))\n\n // Return the original bounding rect if no translation is applied\n return rect\n}\n"],"names":["getBoundingClientRectWithoutTransform","elem","rect","getBoundingClientRect","transformValue","getComputedStyle","getPropertyValue","lastNumberOfTransformValue","split","pop","y","Number","replace"],"mappings":"AAAA,OAAO,SAASA,sCAAsCC,IAAiB;IACrE,MAAMC,OAAOD,KAAKE,qBAAqB;IAEvC,yDAAyD;IACzD,MAAMC,iBAAiBC,iBAAiBJ,MAAMK,gBAAgB,CAAC;IAC/D,IAAI,CAACF,kBAAkBA,mBAAmB,QAAQ;QAChD,OAAOF;IACT;IAEA,MAAMK,6BAA6BH,eAAeI,KAAK,CAAC,KAAKC,GAAG;IAChEP,KAAKQ,CAAC,GAAGR,KAAKQ,CAAC,GAAGC,OAAOJ,2BAA2BK,OAAO,CAAC,KAAK;IAEjE,iEAAiE;IACjE,OAAOV;AACT"}
|
package/dist/lexical/plugins/handles/DraggableBlockPlugin/highlightElemOriginalPosition.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lexical/plugins/handles/DraggableBlockPlugin/highlightElemOriginalPosition.ts"],"sourcesContent":["import type React from 'react'\n\nimport { getBoundingClientRectWithoutTransform } from './getBoundingRectWithoutTransform.js'\n\nexport function highlightElemOriginalPosition(\n debugHighlightRef: React.RefObject<HTMLDivElement | null>,\n htmlElem: HTMLElement,\n anchorElem: HTMLElement,\n) {\n if (!debugHighlightRef.current) {\n // If the ref doesn't point to an existing element, we can't set styles\n return\n }\n\n const { left: anchorLeft, top: anchorTop } = anchorElem.getBoundingClientRect()\n\n // Get computed styles of the given element\n const boundingRect = getBoundingClientRectWithoutTransform(htmlElem)\n\n // Extract necessary styles (ignoring transform)\n const width = boundingRect.width\n const height = boundingRect.height\n const top = boundingRect.top - anchorTop\n const left = boundingRect.left - anchorLeft\n\n debugHighlightRef.current.style.border = '2px solid green'\n debugHighlightRef.current.style.boxSizing = 'border-box'\n debugHighlightRef.current.style.height = height + 'px'\n debugHighlightRef.current.style.pointerEvents = 'none'\n debugHighlightRef.current.style.position = 'absolute'\n debugHighlightRef.current.style.top = top + 'px'\n debugHighlightRef.current.style.left = left + 'px'\n debugHighlightRef.current.style.width = width + 'px'\n debugHighlightRef.current.style.zIndex = '1000'\n debugHighlightRef.current.style.opacity = '0.5'\n}\n"],"names":["getBoundingClientRectWithoutTransform","highlightElemOriginalPosition","debugHighlightRef","htmlElem","anchorElem","current","left","anchorLeft","top","anchorTop","getBoundingClientRect","boundingRect","width","height","style","border","boxSizing","pointerEvents","position","zIndex","opacity"],"
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lexical/plugins/handles/DraggableBlockPlugin/highlightElemOriginalPosition.ts"],"sourcesContent":["import type React from 'react'\n\nimport { getBoundingClientRectWithoutTransform } from './getBoundingRectWithoutTransform.js'\n\nexport function highlightElemOriginalPosition(\n debugHighlightRef: React.RefObject<HTMLDivElement | null>,\n htmlElem: HTMLElement,\n anchorElem: HTMLElement,\n) {\n if (!debugHighlightRef.current) {\n // If the ref doesn't point to an existing element, we can't set styles\n return\n }\n\n const { left: anchorLeft, top: anchorTop } = anchorElem.getBoundingClientRect()\n\n // Get computed styles of the given element\n const boundingRect = getBoundingClientRectWithoutTransform(htmlElem)\n\n // Extract necessary styles (ignoring transform)\n const width = boundingRect.width\n const height = boundingRect.height\n const top = boundingRect.top - anchorTop\n const left = boundingRect.left - anchorLeft\n\n debugHighlightRef.current.style.border = '2px solid green'\n debugHighlightRef.current.style.boxSizing = 'border-box'\n debugHighlightRef.current.style.height = height + 'px'\n debugHighlightRef.current.style.pointerEvents = 'none'\n debugHighlightRef.current.style.position = 'absolute'\n debugHighlightRef.current.style.top = top + 'px'\n debugHighlightRef.current.style.left = left + 'px'\n debugHighlightRef.current.style.width = width + 'px'\n debugHighlightRef.current.style.zIndex = '1000'\n debugHighlightRef.current.style.opacity = '0.5'\n}\n"],"names":["getBoundingClientRectWithoutTransform","highlightElemOriginalPosition","debugHighlightRef","htmlElem","anchorElem","current","left","anchorLeft","top","anchorTop","getBoundingClientRect","boundingRect","width","height","style","border","boxSizing","pointerEvents","position","zIndex","opacity"],"mappings":"AAEA,SAASA,qCAAqC,QAAQ,uCAAsC;AAE5F,OAAO,SAASC,8BACdC,iBAAyD,EACzDC,QAAqB,EACrBC,UAAuB;IAEvB,IAAI,CAACF,kBAAkBG,OAAO,EAAE;QAC9B,uEAAuE;QACvE;IACF;IAEA,MAAM,EAAEC,MAAMC,UAAU,EAAEC,KAAKC,SAAS,EAAE,GAAGL,WAAWM,qBAAqB;IAE7E,2CAA2C;IAC3C,MAAMC,eAAeX,sCAAsCG;IAE3D,gDAAgD;IAChD,MAAMS,QAAQD,aAAaC,KAAK;IAChC,MAAMC,SAASF,aAAaE,MAAM;IAClC,MAAML,MAAMG,aAAaH,GAAG,GAAGC;IAC/B,MAAMH,OAAOK,aAAaL,IAAI,GAAGC;IAEjCL,kBAAkBG,OAAO,CAACS,KAAK,CAACC,MAAM,GAAG;IACzCb,kBAAkBG,OAAO,CAACS,KAAK,CAACE,SAAS,GAAG;IAC5Cd,kBAAkBG,OAAO,CAACS,KAAK,CAACD,MAAM,GAAGA,SAAS;IAClDX,kBAAkBG,OAAO,CAACS,KAAK,CAACG,aAAa,GAAG;IAChDf,kBAAkBG,OAAO,CAACS,KAAK,CAACI,QAAQ,GAAG;IAC3ChB,kBAAkBG,OAAO,CAACS,KAAK,CAACN,GAAG,GAAGA,MAAM;IAC5CN,kBAAkBG,OAAO,CAACS,KAAK,CAACR,IAAI,GAAGA,OAAO;IAC9CJ,kBAAkBG,OAAO,CAACS,KAAK,CAACF,KAAK,GAAGA,QAAQ;IAChDV,kBAAkBG,OAAO,CAACS,KAAK,CAACK,MAAM,GAAG;IACzCjB,kBAAkBG,OAAO,CAACS,KAAK,CAACM,OAAO,GAAG;AAC5C"}
|