@ekz/lexical-react 0.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/@ekz/lexicalExtensionComponent.dev.js +53 -0
- package/@ekz/lexicalExtensionComponent.dev.mjs +51 -0
- package/@ekz/lexicalExtensionComponent.js +11 -0
- package/@ekz/lexicalExtensionComponent.mjs +12 -0
- package/@ekz/lexicalExtensionComponent.node.mjs +10 -0
- package/@ekz/lexicalExtensionComponent.prod.js +9 -0
- package/@ekz/lexicalExtensionComponent.prod.mjs +9 -0
- package/@ekz/lexicalReactExtension.dev.js +187 -0
- package/@ekz/lexicalReactExtension.dev.mjs +184 -0
- package/@ekz/lexicalReactExtension.js +11 -0
- package/@ekz/lexicalReactExtension.mjs +13 -0
- package/@ekz/lexicalReactExtension.node.mjs +11 -0
- package/@ekz/lexicalReactExtension.prod.js +9 -0
- package/@ekz/lexicalReactExtension.prod.mjs +9 -0
- package/@ekz/lexicalReactPluginHostExtension.dev.js +189 -0
- package/@ekz/lexicalReactPluginHostExtension.dev.mjs +181 -0
- package/@ekz/lexicalReactPluginHostExtension.js +11 -0
- package/@ekz/lexicalReactPluginHostExtension.mjs +18 -0
- package/@ekz/lexicalReactPluginHostExtension.node.mjs +16 -0
- package/@ekz/lexicalReactPluginHostExtension.prod.js +9 -0
- package/@ekz/lexicalReactPluginHostExtension.prod.mjs +9 -0
- package/@ekz/lexicalReactProviderExtension.dev.js +33 -0
- package/@ekz/lexicalReactProviderExtension.dev.mjs +31 -0
- package/@ekz/lexicalReactProviderExtension.js +11 -0
- package/@ekz/lexicalReactProviderExtension.mjs +12 -0
- package/@ekz/lexicalReactProviderExtension.node.mjs +10 -0
- package/@ekz/lexicalReactProviderExtension.prod.js +9 -0
- package/@ekz/lexicalReactProviderExtension.prod.mjs +9 -0
- package/@ekz/lexicalTreeViewExtension.dev.js +57 -0
- package/@ekz/lexicalTreeViewExtension.dev.mjs +54 -0
- package/@ekz/lexicalTreeViewExtension.js +11 -0
- package/@ekz/lexicalTreeViewExtension.mjs +13 -0
- package/@ekz/lexicalTreeViewExtension.node.mjs +11 -0
- package/@ekz/lexicalTreeViewExtension.prod.js +9 -0
- package/@ekz/lexicalTreeViewExtension.prod.mjs +9 -0
- package/ExtensionComponent.d.ts +42 -0
- package/LICENSE +21 -0
- package/LexicalAutoEmbedPlugin.d.ts +39 -0
- package/LexicalAutoEmbedPlugin.dev.js +146 -0
- package/LexicalAutoEmbedPlugin.dev.mjs +141 -0
- package/LexicalAutoEmbedPlugin.js +11 -0
- package/LexicalAutoEmbedPlugin.js.flow +64 -0
- package/LexicalAutoEmbedPlugin.mjs +15 -0
- package/LexicalAutoEmbedPlugin.node.mjs +13 -0
- package/LexicalAutoEmbedPlugin.prod.js +9 -0
- package/LexicalAutoEmbedPlugin.prod.mjs +9 -0
- package/LexicalAutoFocusPlugin.d.ts +12 -0
- package/LexicalAutoFocusPlugin.dev.js +47 -0
- package/LexicalAutoFocusPlugin.dev.mjs +45 -0
- package/LexicalAutoFocusPlugin.js +11 -0
- package/LexicalAutoFocusPlugin.js.flow +14 -0
- package/LexicalAutoFocusPlugin.mjs +12 -0
- package/LexicalAutoFocusPlugin.node.mjs +10 -0
- package/LexicalAutoFocusPlugin.prod.js +9 -0
- package/LexicalAutoFocusPlugin.prod.mjs +9 -0
- package/LexicalAutoLinkPlugin.d.ts +14 -0
- package/LexicalAutoLinkPlugin.dev.js +54 -0
- package/LexicalAutoLinkPlugin.dev.mjs +52 -0
- package/LexicalAutoLinkPlugin.js +11 -0
- package/LexicalAutoLinkPlugin.js.flow +18 -0
- package/LexicalAutoLinkPlugin.mjs +13 -0
- package/LexicalAutoLinkPlugin.node.mjs +11 -0
- package/LexicalAutoLinkPlugin.prod.js +9 -0
- package/LexicalAutoLinkPlugin.prod.mjs +9 -0
- package/LexicalBlockWithAlignableContents.d.ts +21 -0
- package/LexicalBlockWithAlignableContents.dev.js +81 -0
- package/LexicalBlockWithAlignableContents.dev.mjs +79 -0
- package/LexicalBlockWithAlignableContents.js +11 -0
- package/LexicalBlockWithAlignableContents.js.flow +28 -0
- package/LexicalBlockWithAlignableContents.mjs +12 -0
- package/LexicalBlockWithAlignableContents.node.mjs +10 -0
- package/LexicalBlockWithAlignableContents.prod.js +9 -0
- package/LexicalBlockWithAlignableContents.prod.mjs +9 -0
- package/LexicalCharacterLimitPlugin.d.ts +15 -0
- package/LexicalCharacterLimitPlugin.dev.js +292 -0
- package/LexicalCharacterLimitPlugin.dev.mjs +290 -0
- package/LexicalCharacterLimitPlugin.js +11 -0
- package/LexicalCharacterLimitPlugin.js.flow +12 -0
- package/LexicalCharacterLimitPlugin.mjs +12 -0
- package/LexicalCharacterLimitPlugin.node.mjs +10 -0
- package/LexicalCharacterLimitPlugin.prod.js +9 -0
- package/LexicalCharacterLimitPlugin.prod.mjs +9 -0
- package/LexicalCheckListPlugin.d.ts +8 -0
- package/LexicalCheckListPlugin.dev.js +31 -0
- package/LexicalCheckListPlugin.dev.mjs +29 -0
- package/LexicalCheckListPlugin.js +11 -0
- package/LexicalCheckListPlugin.js.flow +10 -0
- package/LexicalCheckListPlugin.mjs +12 -0
- package/LexicalCheckListPlugin.node.mjs +10 -0
- package/LexicalCheckListPlugin.prod.js +9 -0
- package/LexicalCheckListPlugin.prod.mjs +9 -0
- package/LexicalClearEditorPlugin.d.ts +13 -0
- package/LexicalClearEditorPlugin.dev.js +55 -0
- package/LexicalClearEditorPlugin.dev.mjs +53 -0
- package/LexicalClearEditorPlugin.js +11 -0
- package/LexicalClearEditorPlugin.js.flow +14 -0
- package/LexicalClearEditorPlugin.mjs +12 -0
- package/LexicalClearEditorPlugin.node.mjs +10 -0
- package/LexicalClearEditorPlugin.prod.js +9 -0
- package/LexicalClearEditorPlugin.prod.mjs +9 -0
- package/LexicalClickableLinkPlugin.d.ts +11 -0
- package/LexicalClickableLinkPlugin.dev.js +38 -0
- package/LexicalClickableLinkPlugin.dev.mjs +36 -0
- package/LexicalClickableLinkPlugin.js +11 -0
- package/LexicalClickableLinkPlugin.js.flow +12 -0
- package/LexicalClickableLinkPlugin.mjs +12 -0
- package/LexicalClickableLinkPlugin.node.mjs +10 -0
- package/LexicalClickableLinkPlugin.prod.js +9 -0
- package/LexicalClickableLinkPlugin.prod.mjs +9 -0
- package/LexicalCollaborationContext.d.ts +19 -0
- package/LexicalCollaborationContext.dev.js +69 -0
- package/LexicalCollaborationContext.dev.mjs +65 -0
- package/LexicalCollaborationContext.js +11 -0
- package/LexicalCollaborationContext.js.flow +22 -0
- package/LexicalCollaborationContext.mjs +14 -0
- package/LexicalCollaborationContext.node.mjs +12 -0
- package/LexicalCollaborationContext.prod.js +9 -0
- package/LexicalCollaborationContext.prod.mjs +9 -0
- package/LexicalCollaborationPlugin.d.ts +39 -0
- package/LexicalCollaborationPlugin.dev.js +584 -0
- package/LexicalCollaborationPlugin.dev.mjs +569 -0
- package/LexicalCollaborationPlugin.js +11 -0
- package/LexicalCollaborationPlugin.js.flow +50 -0
- package/LexicalCollaborationPlugin.mjs +13 -0
- package/LexicalCollaborationPlugin.node.mjs +11 -0
- package/LexicalCollaborationPlugin.prod.js +9 -0
- package/LexicalCollaborationPlugin.prod.mjs +9 -0
- package/LexicalComposer.d.ts +25 -0
- package/LexicalComposer.dev.js +134 -0
- package/LexicalComposer.dev.mjs +132 -0
- package/LexicalComposer.js +11 -0
- package/LexicalComposer.js.flow +40 -0
- package/LexicalComposer.mjs +12 -0
- package/LexicalComposer.node.mjs +10 -0
- package/LexicalComposer.prod.js +9 -0
- package/LexicalComposer.prod.mjs +9 -0
- package/LexicalComposerContext.d.ts +18 -0
- package/LexicalComposerContext.dev.js +55 -0
- package/LexicalComposerContext.dev.mjs +51 -0
- package/LexicalComposerContext.js +11 -0
- package/LexicalComposerContext.js.flow +27 -0
- package/LexicalComposerContext.mjs +14 -0
- package/LexicalComposerContext.node.mjs +12 -0
- package/LexicalComposerContext.prod.js +9 -0
- package/LexicalComposerContext.prod.mjs +9 -0
- package/LexicalContentEditable.d.ts +26 -0
- package/LexicalContentEditable.dev.js +242 -0
- package/LexicalContentEditable.dev.mjs +239 -0
- package/LexicalContentEditable.js +11 -0
- package/LexicalContentEditable.js.flow +80 -0
- package/LexicalContentEditable.mjs +13 -0
- package/LexicalContentEditable.node.mjs +11 -0
- package/LexicalContentEditable.prod.js +9 -0
- package/LexicalContentEditable.prod.mjs +9 -0
- package/LexicalContextMenuPlugin.d.ts +36 -0
- package/LexicalContextMenuPlugin.dev.js +524 -0
- package/LexicalContextMenuPlugin.dev.mjs +509 -0
- package/LexicalContextMenuPlugin.js +11 -0
- package/LexicalContextMenuPlugin.js.flow +13 -0
- package/LexicalContextMenuPlugin.mjs +13 -0
- package/LexicalContextMenuPlugin.node.mjs +11 -0
- package/LexicalContextMenuPlugin.prod.js +9 -0
- package/LexicalContextMenuPlugin.prod.mjs +9 -0
- package/LexicalDecoratorBlockNode.d.ts +25 -0
- package/LexicalDecoratorBlockNode.dev.js +59 -0
- package/LexicalDecoratorBlockNode.dev.mjs +56 -0
- package/LexicalDecoratorBlockNode.js +11 -0
- package/LexicalDecoratorBlockNode.js.flow +35 -0
- package/LexicalDecoratorBlockNode.mjs +13 -0
- package/LexicalDecoratorBlockNode.node.mjs +11 -0
- package/LexicalDecoratorBlockNode.prod.js +9 -0
- package/LexicalDecoratorBlockNode.prod.mjs +9 -0
- package/LexicalDraggableBlockPlugin.d.ts +18 -0
- package/LexicalDraggableBlockPlugin.dev.js +655 -0
- package/LexicalDraggableBlockPlugin.dev.mjs +653 -0
- package/LexicalDraggableBlockPlugin.js +11 -0
- package/LexicalDraggableBlockPlugin.js.flow +24 -0
- package/LexicalDraggableBlockPlugin.mjs +12 -0
- package/LexicalDraggableBlockPlugin.node.mjs +10 -0
- package/LexicalDraggableBlockPlugin.prod.js +9 -0
- package/LexicalDraggableBlockPlugin.prod.mjs +9 -0
- package/LexicalEditorRefPlugin.d.ts +20 -0
- package/LexicalEditorRefPlugin.dev.js +58 -0
- package/LexicalEditorRefPlugin.dev.mjs +43 -0
- package/LexicalEditorRefPlugin.js +11 -0
- package/LexicalEditorRefPlugin.js.flow +19 -0
- package/LexicalEditorRefPlugin.mjs +12 -0
- package/LexicalEditorRefPlugin.node.mjs +10 -0
- package/LexicalEditorRefPlugin.prod.js +9 -0
- package/LexicalEditorRefPlugin.prod.mjs +9 -0
- package/LexicalErrorBoundary.d.ts +13 -0
- package/LexicalErrorBoundary.dev.js +40 -0
- package/LexicalErrorBoundary.dev.mjs +38 -0
- package/LexicalErrorBoundary.js +11 -0
- package/LexicalErrorBoundary.js.flow +17 -0
- package/LexicalErrorBoundary.mjs +12 -0
- package/LexicalErrorBoundary.node.mjs +10 -0
- package/LexicalErrorBoundary.prod.js +9 -0
- package/LexicalErrorBoundary.prod.mjs +9 -0
- package/LexicalExtensionComponent.js.flow +12 -0
- package/LexicalExtensionComposer.d.ts +69 -0
- package/LexicalExtensionComposer.dev.js +105 -0
- package/LexicalExtensionComposer.dev.mjs +103 -0
- package/LexicalExtensionComposer.js +11 -0
- package/LexicalExtensionComposer.js.flow +20 -0
- package/LexicalExtensionComposer.mjs +12 -0
- package/LexicalExtensionComposer.node.mjs +10 -0
- package/LexicalExtensionComposer.prod.js +9 -0
- package/LexicalExtensionComposer.prod.mjs +9 -0
- package/LexicalHashtagPlugin.d.ts +9 -0
- package/LexicalHashtagPlugin.dev.js +34 -0
- package/LexicalHashtagPlugin.dev.mjs +32 -0
- package/LexicalHashtagPlugin.js +11 -0
- package/LexicalHashtagPlugin.js.flow +10 -0
- package/LexicalHashtagPlugin.mjs +12 -0
- package/LexicalHashtagPlugin.node.mjs +10 -0
- package/LexicalHashtagPlugin.prod.js +9 -0
- package/LexicalHashtagPlugin.prod.mjs +9 -0
- package/LexicalHistoryPlugin.d.ts +14 -0
- package/LexicalHistoryPlugin.dev.js +48 -0
- package/LexicalHistoryPlugin.dev.mjs +46 -0
- package/LexicalHistoryPlugin.js +11 -0
- package/LexicalHistoryPlugin.js.flow +28 -0
- package/LexicalHistoryPlugin.mjs +13 -0
- package/LexicalHistoryPlugin.node.mjs +11 -0
- package/LexicalHistoryPlugin.prod.js +9 -0
- package/LexicalHistoryPlugin.prod.mjs +9 -0
- package/LexicalHorizontalRuleNode.d.ts +25 -0
- package/LexicalHorizontalRuleNode.dev.js +102 -0
- package/LexicalHorizontalRuleNode.dev.mjs +98 -0
- package/LexicalHorizontalRuleNode.js +11 -0
- package/LexicalHorizontalRuleNode.js.flow +27 -0
- package/LexicalHorizontalRuleNode.mjs +15 -0
- package/LexicalHorizontalRuleNode.node.mjs +13 -0
- package/LexicalHorizontalRuleNode.prod.js +9 -0
- package/LexicalHorizontalRuleNode.prod.mjs +9 -0
- package/LexicalHorizontalRulePlugin.d.ts +8 -0
- package/LexicalHorizontalRulePlugin.dev.js +44 -0
- package/LexicalHorizontalRulePlugin.dev.mjs +42 -0
- package/LexicalHorizontalRulePlugin.js +11 -0
- package/LexicalHorizontalRulePlugin.js.flow +12 -0
- package/LexicalHorizontalRulePlugin.mjs +12 -0
- package/LexicalHorizontalRulePlugin.node.mjs +10 -0
- package/LexicalHorizontalRulePlugin.prod.js +9 -0
- package/LexicalHorizontalRulePlugin.prod.mjs +9 -0
- package/LexicalLinkPlugin.d.ts +14 -0
- package/LexicalLinkPlugin.dev.js +43 -0
- package/LexicalLinkPlugin.dev.mjs +41 -0
- package/LexicalLinkPlugin.js +11 -0
- package/LexicalLinkPlugin.js.flow +21 -0
- package/LexicalLinkPlugin.mjs +12 -0
- package/LexicalLinkPlugin.node.mjs +10 -0
- package/LexicalLinkPlugin.prod.js +9 -0
- package/LexicalLinkPlugin.prod.mjs +9 -0
- package/LexicalListPlugin.d.ts +20 -0
- package/LexicalListPlugin.dev.js +55 -0
- package/LexicalListPlugin.dev.mjs +53 -0
- package/LexicalListPlugin.js +11 -0
- package/LexicalListPlugin.js.flow +15 -0
- package/LexicalListPlugin.mjs +12 -0
- package/LexicalListPlugin.node.mjs +10 -0
- package/LexicalListPlugin.prod.js +9 -0
- package/LexicalListPlugin.prod.mjs +9 -0
- package/LexicalMarkdownShortcutPlugin.d.ts +12 -0
- package/LexicalMarkdownShortcutPlugin.dev.js +55 -0
- package/LexicalMarkdownShortcutPlugin.dev.mjs +52 -0
- package/LexicalMarkdownShortcutPlugin.js +11 -0
- package/LexicalMarkdownShortcutPlugin.js.flow +16 -0
- package/LexicalMarkdownShortcutPlugin.mjs +13 -0
- package/LexicalMarkdownShortcutPlugin.node.mjs +11 -0
- package/LexicalMarkdownShortcutPlugin.prod.js +9 -0
- package/LexicalMarkdownShortcutPlugin.prod.mjs +9 -0
- package/LexicalNestedComposer.d.ts +57 -0
- package/LexicalNestedComposer.dev.js +161 -0
- package/LexicalNestedComposer.dev.mjs +159 -0
- package/LexicalNestedComposer.js +11 -0
- package/LexicalNestedComposer.js.flow +26 -0
- package/LexicalNestedComposer.mjs +12 -0
- package/LexicalNestedComposer.node.mjs +10 -0
- package/LexicalNestedComposer.prod.js +9 -0
- package/LexicalNestedComposer.prod.mjs +9 -0
- package/LexicalNodeContextMenuPlugin.d.ts +46 -0
- package/LexicalNodeContextMenuPlugin.dev.js +257 -0
- package/LexicalNodeContextMenuPlugin.dev.mjs +253 -0
- package/LexicalNodeContextMenuPlugin.js +11 -0
- package/LexicalNodeContextMenuPlugin.js.flow +12 -0
- package/LexicalNodeContextMenuPlugin.mjs +14 -0
- package/LexicalNodeContextMenuPlugin.node.mjs +12 -0
- package/LexicalNodeContextMenuPlugin.prod.js +9 -0
- package/LexicalNodeContextMenuPlugin.prod.mjs +9 -0
- package/LexicalNodeEventPlugin.d.ts +13 -0
- package/LexicalNodeEventPlugin.dev.js +61 -0
- package/LexicalNodeEventPlugin.dev.mjs +59 -0
- package/LexicalNodeEventPlugin.js +11 -0
- package/LexicalNodeEventPlugin.js.flow +20 -0
- package/LexicalNodeEventPlugin.mjs +12 -0
- package/LexicalNodeEventPlugin.node.mjs +10 -0
- package/LexicalNodeEventPlugin.prod.js +9 -0
- package/LexicalNodeEventPlugin.prod.mjs +9 -0
- package/LexicalNodeMenuPlugin.d.ts +24 -0
- package/LexicalNodeMenuPlugin.dev.js +527 -0
- package/LexicalNodeMenuPlugin.dev.mjs +524 -0
- package/LexicalNodeMenuPlugin.js +11 -0
- package/LexicalNodeMenuPlugin.js.flow +64 -0
- package/LexicalNodeMenuPlugin.mjs +13 -0
- package/LexicalNodeMenuPlugin.node.mjs +11 -0
- package/LexicalNodeMenuPlugin.prod.js +9 -0
- package/LexicalNodeMenuPlugin.prod.mjs +9 -0
- package/LexicalOnChangePlugin.d.ts +13 -0
- package/LexicalOnChangePlugin.dev.js +72 -0
- package/LexicalOnChangePlugin.dev.mjs +70 -0
- package/LexicalOnChangePlugin.js +11 -0
- package/LexicalOnChangePlugin.js.flow +16 -0
- package/LexicalOnChangePlugin.mjs +12 -0
- package/LexicalOnChangePlugin.node.mjs +10 -0
- package/LexicalOnChangePlugin.prod.js +9 -0
- package/LexicalOnChangePlugin.prod.mjs +9 -0
- package/LexicalPlainTextPlugin.d.ts +14 -0
- package/LexicalPlainTextPlugin.dev.js +235 -0
- package/LexicalPlainTextPlugin.dev.mjs +233 -0
- package/LexicalPlainTextPlugin.js +11 -0
- package/LexicalPlainTextPlugin.js.flow +29 -0
- package/LexicalPlainTextPlugin.mjs +12 -0
- package/LexicalPlainTextPlugin.node.mjs +10 -0
- package/LexicalPlainTextPlugin.prod.js +9 -0
- package/LexicalPlainTextPlugin.prod.mjs +9 -0
- package/LexicalReactExtension.js.flow +68 -0
- package/LexicalReactPluginHostExtension.js.flow +84 -0
- package/LexicalReactProviderExtension.js.flow +12 -0
- package/LexicalRichTextPlugin.d.ts +14 -0
- package/LexicalRichTextPlugin.dev.js +235 -0
- package/LexicalRichTextPlugin.dev.mjs +233 -0
- package/LexicalRichTextPlugin.js +11 -0
- package/LexicalRichTextPlugin.js.flow +29 -0
- package/LexicalRichTextPlugin.mjs +12 -0
- package/LexicalRichTextPlugin.node.mjs +10 -0
- package/LexicalRichTextPlugin.prod.js +9 -0
- package/LexicalRichTextPlugin.prod.mjs +9 -0
- package/LexicalSelectionAlwaysOnDisplay.d.ts +12 -0
- package/LexicalSelectionAlwaysOnDisplay.dev.js +33 -0
- package/LexicalSelectionAlwaysOnDisplay.dev.mjs +31 -0
- package/LexicalSelectionAlwaysOnDisplay.js +11 -0
- package/LexicalSelectionAlwaysOnDisplay.js.flow +15 -0
- package/LexicalSelectionAlwaysOnDisplay.mjs +12 -0
- package/LexicalSelectionAlwaysOnDisplay.node.mjs +10 -0
- package/LexicalSelectionAlwaysOnDisplay.prod.js +9 -0
- package/LexicalSelectionAlwaysOnDisplay.prod.mjs +9 -0
- package/LexicalTabIndentationPlugin.d.ts +17 -0
- package/LexicalTabIndentationPlugin.dev.js +40 -0
- package/LexicalTabIndentationPlugin.dev.mjs +38 -0
- package/LexicalTabIndentationPlugin.js +11 -0
- package/LexicalTabIndentationPlugin.js.flow +21 -0
- package/LexicalTabIndentationPlugin.mjs +13 -0
- package/LexicalTabIndentationPlugin.node.mjs +11 -0
- package/LexicalTabIndentationPlugin.prod.js +9 -0
- package/LexicalTabIndentationPlugin.prod.mjs +9 -0
- package/LexicalTableOfContentsPlugin.d.ts +20 -0
- package/LexicalTableOfContentsPlugin.dev.js +209 -0
- package/LexicalTableOfContentsPlugin.dev.mjs +207 -0
- package/LexicalTableOfContentsPlugin.js +11 -0
- package/LexicalTableOfContentsPlugin.js.flow +18 -0
- package/LexicalTableOfContentsPlugin.mjs +12 -0
- package/LexicalTableOfContentsPlugin.node.mjs +10 -0
- package/LexicalTableOfContentsPlugin.prod.js +9 -0
- package/LexicalTableOfContentsPlugin.prod.mjs +9 -0
- package/LexicalTablePlugin.d.ts +46 -0
- package/LexicalTablePlugin.dev.js +81 -0
- package/LexicalTablePlugin.dev.mjs +79 -0
- package/LexicalTablePlugin.js +11 -0
- package/LexicalTablePlugin.js.flow +15 -0
- package/LexicalTablePlugin.mjs +12 -0
- package/LexicalTablePlugin.node.mjs +10 -0
- package/LexicalTablePlugin.prod.js +9 -0
- package/LexicalTablePlugin.prod.mjs +9 -0
- package/LexicalTreeView.d.ts +37 -0
- package/LexicalTreeView.dev.js +105 -0
- package/LexicalTreeView.dev.mjs +91 -0
- package/LexicalTreeView.js +11 -0
- package/LexicalTreeView.js.flow +21 -0
- package/LexicalTreeView.mjs +12 -0
- package/LexicalTreeView.node.mjs +10 -0
- package/LexicalTreeView.prod.js +9 -0
- package/LexicalTreeView.prod.mjs +9 -0
- package/LexicalTreeViewExtension.js.flow +12 -0
- package/LexicalTypeaheadMenuPlugin.d.ts +40 -0
- package/LexicalTypeaheadMenuPlugin.dev.js +654 -0
- package/LexicalTypeaheadMenuPlugin.dev.mjs +646 -0
- package/LexicalTypeaheadMenuPlugin.js +11 -0
- package/LexicalTypeaheadMenuPlugin.js.flow +83 -0
- package/LexicalTypeaheadMenuPlugin.mjs +18 -0
- package/LexicalTypeaheadMenuPlugin.node.mjs +16 -0
- package/LexicalTypeaheadMenuPlugin.prod.js +9 -0
- package/LexicalTypeaheadMenuPlugin.prod.mjs +9 -0
- package/README.md +90 -0
- package/ReactExtension.d.ts +41 -0
- package/ReactPluginHostExtension.d.ts +56 -0
- package/ReactProviderExtension.d.ts +9 -0
- package/TreeViewExtension.d.ts +18 -0
- package/package.json +1549 -0
- package/shared/LegacyDecorators.d.ts +23 -0
- package/shared/LexicalContentEditableElement.d.ts +43 -0
- package/shared/LexicalMenu.d.ts +52 -0
- package/shared/buildEditorComponent.d.ts +11 -0
- package/shared/mergeRefs.d.ts +9 -0
- package/shared/point.d.ts +21 -0
- package/shared/rect.d.ts +45 -0
- package/shared/types.d.ts +89 -0
- package/shared/useCanShowPlaceholder.d.ts +9 -0
- package/shared/useCharacterLimit.d.ts +16 -0
- package/shared/useDecorators.d.ts +17 -0
- package/shared/useHistory.d.ts +10 -0
- package/shared/useList.d.ts +9 -0
- package/shared/usePlainTextSetup.d.ts +9 -0
- package/shared/useReactDecorators.d.ts +12 -0
- package/shared/useRichTextSetup.d.ts +9 -0
- package/shared/useYjsCollaboration.d.ts +25 -0
- package/useExtensionComponent.d.ts +10 -0
- package/useLexicalEditable.d.ts +16 -0
- package/useLexicalEditable.dev.js +102 -0
- package/useLexicalEditable.dev.mjs +100 -0
- package/useLexicalEditable.js +11 -0
- package/useLexicalEditable.js.flow +12 -0
- package/useLexicalEditable.mjs +12 -0
- package/useLexicalEditable.node.mjs +10 -0
- package/useLexicalEditable.prod.js +9 -0
- package/useLexicalEditable.prod.mjs +9 -0
- package/useLexicalExtensionComponent.dev.js +37 -0
- package/useLexicalExtensionComponent.dev.mjs +34 -0
- package/useLexicalExtensionComponent.js +11 -0
- package/useLexicalExtensionComponent.js.flow +12 -0
- package/useLexicalExtensionComponent.mjs +13 -0
- package/useLexicalExtensionComponent.node.mjs +11 -0
- package/useLexicalExtensionComponent.prod.js +9 -0
- package/useLexicalExtensionComponent.prod.mjs +9 -0
- package/useLexicalIsTextContentEmpty.d.ts +9 -0
- package/useLexicalIsTextContentEmpty.dev.js +60 -0
- package/useLexicalIsTextContentEmpty.dev.mjs +58 -0
- package/useLexicalIsTextContentEmpty.js +11 -0
- package/useLexicalIsTextContentEmpty.js.flow +15 -0
- package/useLexicalIsTextContentEmpty.mjs +12 -0
- package/useLexicalIsTextContentEmpty.node.mjs +10 -0
- package/useLexicalIsTextContentEmpty.prod.js +9 -0
- package/useLexicalIsTextContentEmpty.prod.mjs +9 -0
- package/useLexicalNodeSelection.d.ts +24 -0
- package/useLexicalNodeSelection.dev.js +102 -0
- package/useLexicalNodeSelection.dev.mjs +100 -0
- package/useLexicalNodeSelection.js +11 -0
- package/useLexicalNodeSelection.js.flow +14 -0
- package/useLexicalNodeSelection.mjs +12 -0
- package/useLexicalNodeSelection.node.mjs +10 -0
- package/useLexicalNodeSelection.prod.js +9 -0
- package/useLexicalNodeSelection.prod.mjs +9 -0
- package/useLexicalSubscription.d.ts +17 -0
- package/useLexicalSubscription.dev.js +73 -0
- package/useLexicalSubscription.dev.mjs +71 -0
- package/useLexicalSubscription.js +11 -0
- package/useLexicalSubscription.js.flow +19 -0
- package/useLexicalSubscription.mjs +12 -0
- package/useLexicalSubscription.node.mjs +10 -0
- package/useLexicalSubscription.prod.js +9 -0
- package/useLexicalSubscription.prod.mjs +9 -0
- package/useLexicalTextEntity.d.ts +10 -0
- package/useLexicalTextEntity.dev.js +31 -0
- package/useLexicalTextEntity.dev.mjs +29 -0
- package/useLexicalTextEntity.js +11 -0
- package/useLexicalTextEntity.js.flow +18 -0
- package/useLexicalTextEntity.mjs +12 -0
- package/useLexicalTextEntity.node.mjs +10 -0
- package/useLexicalTextEntity.prod.js +9 -0
- package/useLexicalTextEntity.prod.mjs +9 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @flow strict
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* LexicalTreeViewExtension
|
|
12
|
+
*/
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
*/
|
|
8
|
+
import type { MenuRenderFn, MenuResolution, MenuTextMatch, TriggerFn } from './shared/LexicalMenu';
|
|
9
|
+
import type { JSX } from 'react';
|
|
10
|
+
import { CommandListenerPriority, LexicalCommand, TextNode } from '@ekz/lexical';
|
|
11
|
+
import { MenuOption } from './shared/LexicalMenu';
|
|
12
|
+
export declare const PUNCTUATION = "\\.,\\+\\*\\?\\$\\@\\|#{}\\(\\)\\^\\-\\[\\]\\\\/!%'\"~=<>_:;";
|
|
13
|
+
export declare function getScrollParent(element: HTMLElement, includeHidden: boolean): HTMLElement | HTMLBodyElement;
|
|
14
|
+
export { useDynamicPositioning } from './shared/LexicalMenu';
|
|
15
|
+
export declare const SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND: LexicalCommand<{
|
|
16
|
+
index: number;
|
|
17
|
+
option: MenuOption;
|
|
18
|
+
}>;
|
|
19
|
+
export declare function useBasicTypeaheadTriggerMatch(trigger: string, { minLength, maxLength, punctuation, allowWhitespace, }: {
|
|
20
|
+
minLength?: number;
|
|
21
|
+
maxLength?: number;
|
|
22
|
+
punctuation?: string;
|
|
23
|
+
allowWhitespace?: boolean;
|
|
24
|
+
}): TriggerFn;
|
|
25
|
+
export type TypeaheadMenuPluginProps<TOption extends MenuOption> = {
|
|
26
|
+
onQueryChange: (matchingString: string | null) => void;
|
|
27
|
+
onSelectOption: (option: TOption, textNodeContainingQuery: TextNode | null, closeMenu: () => void, matchingString: string) => void;
|
|
28
|
+
options: Array<TOption>;
|
|
29
|
+
menuRenderFn: MenuRenderFn<TOption>;
|
|
30
|
+
triggerFn: TriggerFn;
|
|
31
|
+
onOpen?: (resolution: MenuResolution) => void;
|
|
32
|
+
onClose?: () => void;
|
|
33
|
+
anchorClassName?: string;
|
|
34
|
+
commandPriority?: CommandListenerPriority;
|
|
35
|
+
parent?: HTMLElement;
|
|
36
|
+
preselectFirstItem?: boolean;
|
|
37
|
+
ignoreEntityBoundary?: boolean;
|
|
38
|
+
};
|
|
39
|
+
export declare function LexicalTypeaheadMenuPlugin<TOption extends MenuOption>({ options, onQueryChange, onSelectOption, onOpen, onClose, menuRenderFn, triggerFn, anchorClassName, commandPriority, parent, preselectFirstItem, ignoreEntityBoundary, }: TypeaheadMenuPluginProps<TOption>): JSX.Element | null;
|
|
40
|
+
export { MenuOption, MenuRenderFn, MenuResolution, MenuTextMatch, TriggerFn };
|
|
@@ -0,0 +1,654 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
var LexicalComposerContext = require('@ekz/lexical-react/LexicalComposerContext');
|
|
12
|
+
var lexical = require('@ekz/lexical');
|
|
13
|
+
var React = require('react');
|
|
14
|
+
var lexicalUtils = require('@ekz/lexical-utils');
|
|
15
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
19
|
+
*
|
|
20
|
+
* This source code is licensed under the MIT license found in the
|
|
21
|
+
* LICENSE file in the root directory of this source tree.
|
|
22
|
+
*
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
// Webpack + React 17 fails to compile on the usage of `React.startTransition` or
|
|
27
|
+
// `React["startTransition"]` even if it's behind a feature detection of
|
|
28
|
+
// `"startTransition" in React`. Moving this to a constant avoids the issue :/
|
|
29
|
+
const START_TRANSITION = 'startTransition';
|
|
30
|
+
function startTransition(callback) {
|
|
31
|
+
if (START_TRANSITION in React) {
|
|
32
|
+
React[START_TRANSITION](callback);
|
|
33
|
+
} else {
|
|
34
|
+
callback();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
40
|
+
*
|
|
41
|
+
* This source code is licensed under the MIT license found in the
|
|
42
|
+
* LICENSE file in the root directory of this source tree.
|
|
43
|
+
*
|
|
44
|
+
*/
|
|
45
|
+
|
|
46
|
+
const CAN_USE_DOM = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined';
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
50
|
+
*
|
|
51
|
+
* This source code is licensed under the MIT license found in the
|
|
52
|
+
* LICENSE file in the root directory of this source tree.
|
|
53
|
+
*
|
|
54
|
+
*/
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
// This workaround is no longer necessary in React 19,
|
|
58
|
+
// but we currently support React >=17.x
|
|
59
|
+
// https://github.com/facebook/react/pull/26395
|
|
60
|
+
const useLayoutEffectImpl = CAN_USE_DOM ? React.useLayoutEffect : React.useEffect;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
64
|
+
*
|
|
65
|
+
* This source code is licensed under the MIT license found in the
|
|
66
|
+
* LICENSE file in the root directory of this source tree.
|
|
67
|
+
*
|
|
68
|
+
*/
|
|
69
|
+
|
|
70
|
+
class MenuOption {
|
|
71
|
+
key;
|
|
72
|
+
ref;
|
|
73
|
+
constructor(key) {
|
|
74
|
+
this.key = key;
|
|
75
|
+
this.ref = {
|
|
76
|
+
current: null
|
|
77
|
+
};
|
|
78
|
+
this.setRefElement = this.setRefElement.bind(this);
|
|
79
|
+
}
|
|
80
|
+
setRefElement(element) {
|
|
81
|
+
this.ref = {
|
|
82
|
+
current: element
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const scrollIntoViewIfNeeded = target => {
|
|
87
|
+
const typeaheadContainerNode = document.getElementById('typeahead-menu');
|
|
88
|
+
if (!typeaheadContainerNode) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const typeaheadRect = typeaheadContainerNode.getBoundingClientRect();
|
|
92
|
+
if (typeaheadRect.top + typeaheadRect.height > window.innerHeight) {
|
|
93
|
+
typeaheadContainerNode.scrollIntoView({
|
|
94
|
+
block: 'center'
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
if (typeaheadRect.top < 0) {
|
|
98
|
+
typeaheadContainerNode.scrollIntoView({
|
|
99
|
+
block: 'center'
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
target.scrollIntoView({
|
|
103
|
+
block: 'nearest'
|
|
104
|
+
});
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Walk backwards along user input and forward through entity title to try
|
|
109
|
+
* and replace more of the user's text with entity.
|
|
110
|
+
*/
|
|
111
|
+
function getFullMatchOffset(documentText, entryText, offset) {
|
|
112
|
+
let triggerOffset = offset;
|
|
113
|
+
for (let i = triggerOffset; i <= entryText.length; i++) {
|
|
114
|
+
if (documentText.slice(-i) === entryText.substring(0, i)) {
|
|
115
|
+
triggerOffset = i;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return triggerOffset;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Split Lexical TextNode and return a new TextNode only containing matched text.
|
|
123
|
+
* Common use cases include: removing the node, replacing with a new node.
|
|
124
|
+
*/
|
|
125
|
+
function $splitNodeContainingQuery(match) {
|
|
126
|
+
const selection = lexical.$getSelection();
|
|
127
|
+
if (!lexical.$isRangeSelection(selection) || !selection.isCollapsed()) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
const anchor = selection.anchor;
|
|
131
|
+
if (anchor.type !== 'text') {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
const anchorNode = anchor.getNode();
|
|
135
|
+
if (!anchorNode.isSimpleText()) {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
const selectionOffset = anchor.offset;
|
|
139
|
+
const textContent = anchorNode.getTextContent().slice(0, selectionOffset);
|
|
140
|
+
const characterOffset = match.replaceableString.length;
|
|
141
|
+
const queryOffset = getFullMatchOffset(textContent, match.matchingString, characterOffset);
|
|
142
|
+
const startOffset = selectionOffset - queryOffset;
|
|
143
|
+
if (startOffset < 0) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
let newNode;
|
|
147
|
+
if (startOffset === 0) {
|
|
148
|
+
[newNode] = anchorNode.splitText(selectionOffset);
|
|
149
|
+
} else {
|
|
150
|
+
[, newNode] = anchorNode.splitText(startOffset, selectionOffset);
|
|
151
|
+
}
|
|
152
|
+
return newNode;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Got from https://stackoverflow.com/a/42543908/2013580
|
|
156
|
+
function getScrollParent$1(element, includeHidden) {
|
|
157
|
+
let style = getComputedStyle(element);
|
|
158
|
+
const excludeStaticParent = style.position === 'absolute';
|
|
159
|
+
const overflowRegex = /(auto|scroll)/;
|
|
160
|
+
if (style.position === 'fixed') {
|
|
161
|
+
return document.body;
|
|
162
|
+
}
|
|
163
|
+
for (let parent = element; parent = parent.parentElement;) {
|
|
164
|
+
style = getComputedStyle(parent);
|
|
165
|
+
if (excludeStaticParent && style.position === 'static') {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) {
|
|
169
|
+
return parent;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return document.body;
|
|
173
|
+
}
|
|
174
|
+
function isTriggerVisibleInNearestScrollContainer(targetElement, containerElement) {
|
|
175
|
+
const tRect = targetElement.getBoundingClientRect();
|
|
176
|
+
const cRect = containerElement.getBoundingClientRect();
|
|
177
|
+
const VISIBILITY_MARGIN_PX = 6;
|
|
178
|
+
return tRect.top >= cRect.top - VISIBILITY_MARGIN_PX && tRect.top <= cRect.bottom + VISIBILITY_MARGIN_PX;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Reposition the menu on scroll, window resize, and element resize.
|
|
182
|
+
function useDynamicPositioning(resolution, targetElement, onReposition, onVisibilityChange) {
|
|
183
|
+
const [editor] = LexicalComposerContext.useLexicalComposerContext();
|
|
184
|
+
React.useEffect(() => {
|
|
185
|
+
if (targetElement != null && resolution != null) {
|
|
186
|
+
const rootElement = editor.getRootElement();
|
|
187
|
+
const rootScrollParent = rootElement != null ? getScrollParent$1(rootElement) : document.body;
|
|
188
|
+
let ticking = false;
|
|
189
|
+
let previousIsInView = isTriggerVisibleInNearestScrollContainer(targetElement, rootScrollParent);
|
|
190
|
+
const handleScroll = function () {
|
|
191
|
+
if (!ticking) {
|
|
192
|
+
window.requestAnimationFrame(function () {
|
|
193
|
+
onReposition();
|
|
194
|
+
ticking = false;
|
|
195
|
+
});
|
|
196
|
+
ticking = true;
|
|
197
|
+
}
|
|
198
|
+
const isInView = isTriggerVisibleInNearestScrollContainer(targetElement, rootScrollParent);
|
|
199
|
+
if (isInView !== previousIsInView) {
|
|
200
|
+
previousIsInView = isInView;
|
|
201
|
+
if (onVisibilityChange != null) {
|
|
202
|
+
onVisibilityChange(isInView);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
const resizeObserver = new ResizeObserver(onReposition);
|
|
207
|
+
window.addEventListener('resize', onReposition);
|
|
208
|
+
document.addEventListener('scroll', handleScroll, {
|
|
209
|
+
capture: true,
|
|
210
|
+
passive: true
|
|
211
|
+
});
|
|
212
|
+
resizeObserver.observe(targetElement);
|
|
213
|
+
return () => {
|
|
214
|
+
resizeObserver.unobserve(targetElement);
|
|
215
|
+
window.removeEventListener('resize', onReposition);
|
|
216
|
+
document.removeEventListener('scroll', handleScroll, true);
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
}, [targetElement, editor, onVisibilityChange, onReposition, resolution]);
|
|
220
|
+
}
|
|
221
|
+
const SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND$1 = lexical.createCommand('SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND');
|
|
222
|
+
function LexicalMenu({
|
|
223
|
+
close,
|
|
224
|
+
editor,
|
|
225
|
+
anchorElementRef,
|
|
226
|
+
resolution,
|
|
227
|
+
options,
|
|
228
|
+
menuRenderFn,
|
|
229
|
+
onSelectOption,
|
|
230
|
+
shouldSplitNodeWithQuery = false,
|
|
231
|
+
commandPriority = lexical.COMMAND_PRIORITY_LOW,
|
|
232
|
+
preselectFirstItem = true
|
|
233
|
+
}) {
|
|
234
|
+
const [rawSelectedIndex, setHighlightedIndex] = React.useState(null);
|
|
235
|
+
// Clamp highlighted index if options list shrinks
|
|
236
|
+
const selectedIndex = rawSelectedIndex !== null ? Math.min(options.length - 1, rawSelectedIndex) : null;
|
|
237
|
+
const matchingString = resolution.match && resolution.match.matchingString;
|
|
238
|
+
React.useEffect(() => {
|
|
239
|
+
if (preselectFirstItem) {
|
|
240
|
+
setHighlightedIndex(0);
|
|
241
|
+
}
|
|
242
|
+
}, [matchingString, preselectFirstItem]);
|
|
243
|
+
const selectOptionAndCleanUp = React.useCallback(selectedEntry => {
|
|
244
|
+
editor.update(() => {
|
|
245
|
+
const textNodeContainingQuery = resolution.match != null && shouldSplitNodeWithQuery ? $splitNodeContainingQuery(resolution.match) : null;
|
|
246
|
+
onSelectOption(selectedEntry, textNodeContainingQuery, close, resolution.match ? resolution.match.matchingString : '');
|
|
247
|
+
});
|
|
248
|
+
}, [editor, shouldSplitNodeWithQuery, resolution.match, onSelectOption, close]);
|
|
249
|
+
const updateSelectedIndex = React.useCallback(index => {
|
|
250
|
+
const rootElem = editor.getRootElement();
|
|
251
|
+
if (rootElem !== null) {
|
|
252
|
+
rootElem.setAttribute('aria-activedescendant', 'typeahead-item-' + index);
|
|
253
|
+
setHighlightedIndex(index);
|
|
254
|
+
}
|
|
255
|
+
}, [editor]);
|
|
256
|
+
React.useEffect(() => {
|
|
257
|
+
return () => {
|
|
258
|
+
const rootElem = editor.getRootElement();
|
|
259
|
+
if (rootElem !== null) {
|
|
260
|
+
rootElem.removeAttribute('aria-activedescendant');
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
}, [editor]);
|
|
264
|
+
useLayoutEffectImpl(() => {
|
|
265
|
+
if (options === null) {
|
|
266
|
+
setHighlightedIndex(null);
|
|
267
|
+
} else if (selectedIndex === null && preselectFirstItem) {
|
|
268
|
+
updateSelectedIndex(0);
|
|
269
|
+
}
|
|
270
|
+
}, [options, selectedIndex, updateSelectedIndex, preselectFirstItem]);
|
|
271
|
+
React.useEffect(() => {
|
|
272
|
+
return lexicalUtils.mergeRegister(editor.registerCommand(SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND$1, ({
|
|
273
|
+
option
|
|
274
|
+
}) => {
|
|
275
|
+
if (option.ref && option.ref.current != null) {
|
|
276
|
+
scrollIntoViewIfNeeded(option.ref.current);
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
279
|
+
return false;
|
|
280
|
+
}, commandPriority));
|
|
281
|
+
}, [editor, updateSelectedIndex, commandPriority]);
|
|
282
|
+
React.useEffect(() => {
|
|
283
|
+
return lexicalUtils.mergeRegister(editor.registerCommand(lexical.KEY_ARROW_DOWN_COMMAND, payload => {
|
|
284
|
+
const event = payload;
|
|
285
|
+
if (options !== null && options.length) {
|
|
286
|
+
const newSelectedIndex = selectedIndex === null ? 0 : selectedIndex !== options.length - 1 ? selectedIndex + 1 : 0;
|
|
287
|
+
updateSelectedIndex(newSelectedIndex);
|
|
288
|
+
const option = options[newSelectedIndex];
|
|
289
|
+
if (!option) {
|
|
290
|
+
updateSelectedIndex(-1);
|
|
291
|
+
event.preventDefault();
|
|
292
|
+
event.stopImmediatePropagation();
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
if (option.ref && option.ref.current) {
|
|
296
|
+
editor.dispatchCommand(SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND$1, {
|
|
297
|
+
index: newSelectedIndex,
|
|
298
|
+
option
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
event.preventDefault();
|
|
302
|
+
event.stopImmediatePropagation();
|
|
303
|
+
}
|
|
304
|
+
return true;
|
|
305
|
+
}, commandPriority), editor.registerCommand(lexical.KEY_ARROW_UP_COMMAND, payload => {
|
|
306
|
+
const event = payload;
|
|
307
|
+
if (options !== null && options.length) {
|
|
308
|
+
const newSelectedIndex = selectedIndex === null ? options.length - 1 : selectedIndex !== 0 ? selectedIndex - 1 : options.length - 1;
|
|
309
|
+
updateSelectedIndex(newSelectedIndex);
|
|
310
|
+
const option = options[newSelectedIndex];
|
|
311
|
+
if (!option) {
|
|
312
|
+
updateSelectedIndex(-1);
|
|
313
|
+
event.preventDefault();
|
|
314
|
+
event.stopImmediatePropagation();
|
|
315
|
+
return true;
|
|
316
|
+
}
|
|
317
|
+
if (option.ref && option.ref.current) {
|
|
318
|
+
scrollIntoViewIfNeeded(option.ref.current);
|
|
319
|
+
}
|
|
320
|
+
event.preventDefault();
|
|
321
|
+
event.stopImmediatePropagation();
|
|
322
|
+
}
|
|
323
|
+
return true;
|
|
324
|
+
}, commandPriority), editor.registerCommand(lexical.KEY_ESCAPE_COMMAND, payload => {
|
|
325
|
+
const event = payload;
|
|
326
|
+
event.preventDefault();
|
|
327
|
+
event.stopImmediatePropagation();
|
|
328
|
+
close();
|
|
329
|
+
return true;
|
|
330
|
+
}, commandPriority), editor.registerCommand(lexical.KEY_TAB_COMMAND, payload => {
|
|
331
|
+
const event = payload;
|
|
332
|
+
if (options === null || selectedIndex === null || options[selectedIndex] == null) {
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
event.preventDefault();
|
|
336
|
+
event.stopImmediatePropagation();
|
|
337
|
+
selectOptionAndCleanUp(options[selectedIndex]);
|
|
338
|
+
return true;
|
|
339
|
+
}, commandPriority), editor.registerCommand(lexical.KEY_ENTER_COMMAND, event => {
|
|
340
|
+
if (options === null || selectedIndex === null || options[selectedIndex] == null) {
|
|
341
|
+
return false;
|
|
342
|
+
}
|
|
343
|
+
if (event !== null) {
|
|
344
|
+
event.preventDefault();
|
|
345
|
+
event.stopImmediatePropagation();
|
|
346
|
+
}
|
|
347
|
+
selectOptionAndCleanUp(options[selectedIndex]);
|
|
348
|
+
return true;
|
|
349
|
+
}, commandPriority));
|
|
350
|
+
}, [selectOptionAndCleanUp, close, editor, options, selectedIndex, updateSelectedIndex, commandPriority]);
|
|
351
|
+
const listItemProps = React.useMemo(() => ({
|
|
352
|
+
options,
|
|
353
|
+
selectOptionAndCleanUp,
|
|
354
|
+
selectedIndex,
|
|
355
|
+
setHighlightedIndex
|
|
356
|
+
}), [selectOptionAndCleanUp, selectedIndex, options]);
|
|
357
|
+
return menuRenderFn(anchorElementRef, listItemProps, resolution.match ? resolution.match.matchingString : '');
|
|
358
|
+
}
|
|
359
|
+
function setContainerDivAttributes(containerDiv, className) {
|
|
360
|
+
if (className != null) {
|
|
361
|
+
containerDiv.className = className;
|
|
362
|
+
}
|
|
363
|
+
containerDiv.setAttribute('aria-label', 'Typeahead menu');
|
|
364
|
+
containerDiv.setAttribute('role', 'listbox');
|
|
365
|
+
containerDiv.style.display = 'block';
|
|
366
|
+
containerDiv.style.position = 'absolute';
|
|
367
|
+
}
|
|
368
|
+
function useMenuAnchorRef(resolution, setResolution, className, parent = CAN_USE_DOM ? document.body : undefined, shouldIncludePageYOffset__EXPERIMENTAL = true) {
|
|
369
|
+
const [editor] = LexicalComposerContext.useLexicalComposerContext();
|
|
370
|
+
const initialAnchorElement = CAN_USE_DOM ? document.createElement('div') : null;
|
|
371
|
+
const anchorElementRef = React.useRef(initialAnchorElement);
|
|
372
|
+
const positionMenu = React.useCallback(() => {
|
|
373
|
+
if (anchorElementRef.current === null || parent === undefined) {
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
anchorElementRef.current.style.top = anchorElementRef.current.style.bottom;
|
|
377
|
+
const rootElement = editor.getRootElement();
|
|
378
|
+
const containerDiv = anchorElementRef.current;
|
|
379
|
+
const menuEle = containerDiv.firstChild;
|
|
380
|
+
if (rootElement !== null && resolution !== null) {
|
|
381
|
+
const {
|
|
382
|
+
left,
|
|
383
|
+
top,
|
|
384
|
+
width,
|
|
385
|
+
height
|
|
386
|
+
} = resolution.getRect();
|
|
387
|
+
const anchorHeight = anchorElementRef.current.offsetHeight; // use to position under anchor
|
|
388
|
+
containerDiv.style.top = `${top + anchorHeight + 3 + (shouldIncludePageYOffset__EXPERIMENTAL ? window.pageYOffset : 0)}px`;
|
|
389
|
+
containerDiv.style.left = `${left + window.pageXOffset}px`;
|
|
390
|
+
containerDiv.style.height = `${height}px`;
|
|
391
|
+
containerDiv.style.width = `${width}px`;
|
|
392
|
+
if (menuEle !== null) {
|
|
393
|
+
menuEle.style.top = `${top}`;
|
|
394
|
+
const menuRect = menuEle.getBoundingClientRect();
|
|
395
|
+
const menuHeight = menuRect.height;
|
|
396
|
+
const menuWidth = menuRect.width;
|
|
397
|
+
const rootElementRect = rootElement.getBoundingClientRect();
|
|
398
|
+
if (left + menuWidth > rootElementRect.right) {
|
|
399
|
+
containerDiv.style.left = `${rootElementRect.right - menuWidth + window.pageXOffset}px`;
|
|
400
|
+
}
|
|
401
|
+
if ((top + menuHeight > window.innerHeight || top + menuHeight > rootElementRect.bottom) && top - rootElementRect.top > menuHeight + height) {
|
|
402
|
+
containerDiv.style.top = `${top - menuHeight - height + (shouldIncludePageYOffset__EXPERIMENTAL ? window.pageYOffset : 0)}px`;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
if (!containerDiv.isConnected) {
|
|
406
|
+
setContainerDivAttributes(containerDiv, className);
|
|
407
|
+
parent.append(containerDiv);
|
|
408
|
+
}
|
|
409
|
+
containerDiv.setAttribute('id', 'typeahead-menu');
|
|
410
|
+
rootElement.setAttribute('aria-controls', 'typeahead-menu');
|
|
411
|
+
}
|
|
412
|
+
}, [editor, resolution, shouldIncludePageYOffset__EXPERIMENTAL, className, parent]);
|
|
413
|
+
React.useEffect(() => {
|
|
414
|
+
const rootElement = editor.getRootElement();
|
|
415
|
+
if (resolution !== null) {
|
|
416
|
+
positionMenu();
|
|
417
|
+
}
|
|
418
|
+
return () => {
|
|
419
|
+
if (rootElement !== null) {
|
|
420
|
+
rootElement.removeAttribute('aria-controls');
|
|
421
|
+
}
|
|
422
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
423
|
+
const containerDiv = anchorElementRef.current;
|
|
424
|
+
if (containerDiv !== null && containerDiv.isConnected) {
|
|
425
|
+
containerDiv.remove();
|
|
426
|
+
containerDiv.removeAttribute('id');
|
|
427
|
+
}
|
|
428
|
+
};
|
|
429
|
+
}, [editor, positionMenu, resolution]);
|
|
430
|
+
const onVisibilityChange = React.useCallback(isInView => {
|
|
431
|
+
if (resolution !== null) {
|
|
432
|
+
if (!isInView) {
|
|
433
|
+
setResolution(null);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}, [resolution, setResolution]);
|
|
437
|
+
useDynamicPositioning(resolution, anchorElementRef.current, positionMenu, onVisibilityChange);
|
|
438
|
+
|
|
439
|
+
// Append the context for the menu immediately
|
|
440
|
+
if (initialAnchorElement != null && initialAnchorElement === anchorElementRef.current) {
|
|
441
|
+
setContainerDivAttributes(initialAnchorElement, className);
|
|
442
|
+
if (parent != null) {
|
|
443
|
+
parent.append(initialAnchorElement);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
return anchorElementRef;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
/**
|
|
450
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
451
|
+
*
|
|
452
|
+
* This source code is licensed under the MIT license found in the
|
|
453
|
+
* LICENSE file in the root directory of this source tree.
|
|
454
|
+
*
|
|
455
|
+
*/
|
|
456
|
+
|
|
457
|
+
const PUNCTUATION = '\\.,\\+\\*\\?\\$\\@\\|#{}\\(\\)\\^\\-\\[\\]\\\\/!%\'"~=<>_:;';
|
|
458
|
+
function getTextUpToAnchor(selection) {
|
|
459
|
+
const anchor = selection.anchor;
|
|
460
|
+
if (anchor.type !== 'text') {
|
|
461
|
+
return null;
|
|
462
|
+
}
|
|
463
|
+
const anchorNode = anchor.getNode();
|
|
464
|
+
if (!anchorNode.isSimpleText()) {
|
|
465
|
+
return null;
|
|
466
|
+
}
|
|
467
|
+
const anchorOffset = anchor.offset;
|
|
468
|
+
return anchorNode.getTextContent().slice(0, anchorOffset);
|
|
469
|
+
}
|
|
470
|
+
function tryToPositionRange(leadOffset, range, editor) {
|
|
471
|
+
const domSelection = lexical.getDOMSelectionForEditor(editor);
|
|
472
|
+
if (domSelection === null || !domSelection.isCollapsed) {
|
|
473
|
+
return false;
|
|
474
|
+
}
|
|
475
|
+
const anchorNode = domSelection.anchorNode;
|
|
476
|
+
const startOffset = leadOffset;
|
|
477
|
+
const endOffset = domSelection.anchorOffset;
|
|
478
|
+
if (anchorNode == null || endOffset == null) {
|
|
479
|
+
return false;
|
|
480
|
+
}
|
|
481
|
+
try {
|
|
482
|
+
range.setStart(anchorNode, startOffset);
|
|
483
|
+
range.setEnd(anchorNode, endOffset);
|
|
484
|
+
} catch (_error) {
|
|
485
|
+
return false;
|
|
486
|
+
}
|
|
487
|
+
return true;
|
|
488
|
+
}
|
|
489
|
+
function getQueryTextForSearch(editor) {
|
|
490
|
+
let text = null;
|
|
491
|
+
editor.getEditorState().read(() => {
|
|
492
|
+
const selection = lexical.$getSelection();
|
|
493
|
+
if (!lexical.$isRangeSelection(selection)) {
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
text = getTextUpToAnchor(selection);
|
|
497
|
+
});
|
|
498
|
+
return text;
|
|
499
|
+
}
|
|
500
|
+
function isSelectionOnEntityBoundary(editor, offset) {
|
|
501
|
+
if (offset !== 0) {
|
|
502
|
+
return false;
|
|
503
|
+
}
|
|
504
|
+
return editor.getEditorState().read(() => {
|
|
505
|
+
const selection = lexical.$getSelection();
|
|
506
|
+
if (lexical.$isRangeSelection(selection)) {
|
|
507
|
+
const anchor = selection.anchor;
|
|
508
|
+
const anchorNode = anchor.getNode();
|
|
509
|
+
const prevSibling = anchorNode.getPreviousSibling();
|
|
510
|
+
return lexical.$isTextNode(prevSibling) && prevSibling.isTextEntity();
|
|
511
|
+
}
|
|
512
|
+
return false;
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
// Got from https://stackoverflow.com/a/42543908/2013580
|
|
517
|
+
function getScrollParent(element, includeHidden) {
|
|
518
|
+
let style = getComputedStyle(element);
|
|
519
|
+
const excludeStaticParent = style.position === 'absolute';
|
|
520
|
+
const overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/;
|
|
521
|
+
if (style.position === 'fixed') {
|
|
522
|
+
return document.body;
|
|
523
|
+
}
|
|
524
|
+
for (let parent = element; parent = parent.parentElement;) {
|
|
525
|
+
style = getComputedStyle(parent);
|
|
526
|
+
if (excludeStaticParent && style.position === 'static') {
|
|
527
|
+
continue;
|
|
528
|
+
}
|
|
529
|
+
if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) {
|
|
530
|
+
return parent;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
return document.body;
|
|
534
|
+
}
|
|
535
|
+
const SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND = lexical.createCommand('SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND');
|
|
536
|
+
function useBasicTypeaheadTriggerMatch(trigger, {
|
|
537
|
+
minLength = 1,
|
|
538
|
+
maxLength = 75,
|
|
539
|
+
punctuation = PUNCTUATION,
|
|
540
|
+
allowWhitespace = false
|
|
541
|
+
}) {
|
|
542
|
+
return React.useCallback(text => {
|
|
543
|
+
const validCharsSuffix = allowWhitespace ? '' : '\\s';
|
|
544
|
+
const validChars = '[^' + trigger + punctuation + validCharsSuffix + ']';
|
|
545
|
+
const TypeaheadTriggerRegex = new RegExp('(^|\\s|\\()(' + '[' + trigger + ']' + '((?:' + validChars + '){0,' + maxLength + '})' + ')$');
|
|
546
|
+
const match = TypeaheadTriggerRegex.exec(text);
|
|
547
|
+
if (match !== null) {
|
|
548
|
+
const maybeLeadingWhitespace = match[1];
|
|
549
|
+
const matchingString = match[3];
|
|
550
|
+
if (matchingString.length >= minLength) {
|
|
551
|
+
return {
|
|
552
|
+
leadOffset: match.index + maybeLeadingWhitespace.length,
|
|
553
|
+
matchingString,
|
|
554
|
+
replaceableString: match[2]
|
|
555
|
+
};
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
return null;
|
|
559
|
+
}, [allowWhitespace, trigger, punctuation, maxLength, minLength]);
|
|
560
|
+
}
|
|
561
|
+
function LexicalTypeaheadMenuPlugin({
|
|
562
|
+
options,
|
|
563
|
+
onQueryChange,
|
|
564
|
+
onSelectOption,
|
|
565
|
+
onOpen,
|
|
566
|
+
onClose,
|
|
567
|
+
menuRenderFn,
|
|
568
|
+
triggerFn,
|
|
569
|
+
anchorClassName,
|
|
570
|
+
commandPriority = lexical.COMMAND_PRIORITY_LOW,
|
|
571
|
+
parent,
|
|
572
|
+
preselectFirstItem = true,
|
|
573
|
+
ignoreEntityBoundary = false
|
|
574
|
+
}) {
|
|
575
|
+
const [editor] = LexicalComposerContext.useLexicalComposerContext();
|
|
576
|
+
const [resolution, setResolution] = React.useState(null);
|
|
577
|
+
const anchorElementRef = useMenuAnchorRef(resolution, setResolution, anchorClassName, parent);
|
|
578
|
+
const closeTypeahead = React.useCallback(() => {
|
|
579
|
+
setResolution(null);
|
|
580
|
+
if (onClose != null && resolution !== null) {
|
|
581
|
+
onClose();
|
|
582
|
+
}
|
|
583
|
+
}, [onClose, resolution]);
|
|
584
|
+
const openTypeahead = React.useCallback(res => {
|
|
585
|
+
setResolution(res);
|
|
586
|
+
if (onOpen != null && resolution === null) {
|
|
587
|
+
onOpen(res);
|
|
588
|
+
}
|
|
589
|
+
}, [onOpen, resolution]);
|
|
590
|
+
React.useEffect(() => {
|
|
591
|
+
const updateListener = () => {
|
|
592
|
+
editor.getEditorState().read(() => {
|
|
593
|
+
// Check if editor is in read-only mode
|
|
594
|
+
if (!editor.isEditable()) {
|
|
595
|
+
closeTypeahead();
|
|
596
|
+
return;
|
|
597
|
+
}
|
|
598
|
+
if (editor.isComposing()) {
|
|
599
|
+
return;
|
|
600
|
+
}
|
|
601
|
+
const editorWindow = editor._window || window;
|
|
602
|
+
const range = editorWindow.document.createRange();
|
|
603
|
+
const selection = lexical.$getSelection();
|
|
604
|
+
const text = getQueryTextForSearch(editor);
|
|
605
|
+
if (!lexical.$isRangeSelection(selection) || !selection.isCollapsed() || text === null || range === null) {
|
|
606
|
+
closeTypeahead();
|
|
607
|
+
return;
|
|
608
|
+
}
|
|
609
|
+
const match = triggerFn(text, editor);
|
|
610
|
+
onQueryChange(match ? match.matchingString : null);
|
|
611
|
+
if (match !== null && (ignoreEntityBoundary || !isSelectionOnEntityBoundary(editor, match.leadOffset))) {
|
|
612
|
+
const isRangePositioned = tryToPositionRange(match.leadOffset, range, editor);
|
|
613
|
+
if (isRangePositioned !== null) {
|
|
614
|
+
startTransition(() => openTypeahead({
|
|
615
|
+
getRect: () => range.getBoundingClientRect(),
|
|
616
|
+
match
|
|
617
|
+
}));
|
|
618
|
+
return;
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
closeTypeahead();
|
|
622
|
+
});
|
|
623
|
+
};
|
|
624
|
+
const removeUpdateListener = editor.registerUpdateListener(updateListener);
|
|
625
|
+
return () => {
|
|
626
|
+
removeUpdateListener();
|
|
627
|
+
};
|
|
628
|
+
}, [editor, triggerFn, onQueryChange, resolution, closeTypeahead, openTypeahead, ignoreEntityBoundary]);
|
|
629
|
+
React.useEffect(() => editor.registerEditableListener(isEditable => {
|
|
630
|
+
if (!isEditable) {
|
|
631
|
+
closeTypeahead();
|
|
632
|
+
}
|
|
633
|
+
}), [editor, closeTypeahead]);
|
|
634
|
+
return resolution === null || editor === null || anchorElementRef.current === null ? null : /*#__PURE__*/jsxRuntime.jsx(LexicalMenu, {
|
|
635
|
+
close: closeTypeahead,
|
|
636
|
+
resolution: resolution,
|
|
637
|
+
editor: editor,
|
|
638
|
+
anchorElementRef: anchorElementRef,
|
|
639
|
+
options: options,
|
|
640
|
+
menuRenderFn: menuRenderFn,
|
|
641
|
+
shouldSplitNodeWithQuery: true,
|
|
642
|
+
onSelectOption: onSelectOption,
|
|
643
|
+
commandPriority: commandPriority,
|
|
644
|
+
preselectFirstItem: preselectFirstItem
|
|
645
|
+
});
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
exports.LexicalTypeaheadMenuPlugin = LexicalTypeaheadMenuPlugin;
|
|
649
|
+
exports.MenuOption = MenuOption;
|
|
650
|
+
exports.PUNCTUATION = PUNCTUATION;
|
|
651
|
+
exports.SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND = SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND;
|
|
652
|
+
exports.getScrollParent = getScrollParent;
|
|
653
|
+
exports.useBasicTypeaheadTriggerMatch = useBasicTypeaheadTriggerMatch;
|
|
654
|
+
exports.useDynamicPositioning = useDynamicPositioning;
|