@datalayer/lexical-loro 0.1.0 → 0.2.2
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/README.md +1 -1
- package/package.json +7 -7
- package/lib/App.d.ts +0 -2
- package/lib/App.js +0 -141
- package/lib/Editor.d.ts +0 -2
- package/lib/Editor.js +0 -111
- package/lib/Settings.d.ts +0 -2
- package/lib/Settings.js +0 -57
- package/lib/appSettings.d.ts +0 -36
- package/lib/appSettings.js +0 -44
- package/lib/collab/loro/Bindings.d.ts +0 -41
- package/lib/collab/loro/Bindings.js +0 -95
- package/lib/collab/loro/Debug.d.ts +0 -33
- package/lib/collab/loro/Debug.js +0 -448
- package/lib/collab/loro/LexicalCollaborationContext.d.ts +0 -19
- package/lib/collab/loro/LexicalCollaborationContext.js +0 -48
- package/lib/collab/loro/LexicalCollaborationPlugin.d.ts +0 -24
- package/lib/collab/loro/LexicalCollaborationPlugin.js +0 -83
- package/lib/collab/loro/State.d.ts +0 -53
- package/lib/collab/loro/State.js +0 -90
- package/lib/collab/loro/components/LoroCollaborationUI.d.ts +0 -13
- package/lib/collab/loro/components/LoroCollaborationUI.js +0 -9
- package/lib/collab/loro/components/LoroCollaborators.d.ts +0 -8
- package/lib/collab/loro/components/LoroCollaborators.js +0 -97
- package/lib/collab/loro/components/index.d.ts +0 -2
- package/lib/collab/loro/components/index.js +0 -2
- package/lib/collab/loro/index.d.ts +0 -6
- package/lib/collab/loro/index.js +0 -6
- package/lib/collab/loro/integrators/BaseIntegrator.d.ts +0 -14
- package/lib/collab/loro/integrators/BaseIntegrator.js +0 -1
- package/lib/collab/loro/integrators/CounterIntegrator.d.ts +0 -23
- package/lib/collab/loro/integrators/CounterIntegrator.js +0 -40
- package/lib/collab/loro/integrators/ListIntegrator.d.ts +0 -23
- package/lib/collab/loro/integrators/ListIntegrator.js +0 -49
- package/lib/collab/loro/integrators/MapIntegrator.d.ts +0 -24
- package/lib/collab/loro/integrators/MapIntegrator.js +0 -177
- package/lib/collab/loro/integrators/TextIntegrator.d.ts +0 -25
- package/lib/collab/loro/integrators/TextIntegrator.js +0 -51
- package/lib/collab/loro/integrators/TreeIntegrator.d.ts +0 -25
- package/lib/collab/loro/integrators/TreeIntegrator.js +0 -201
- package/lib/collab/loro/nodes/NodeFactory.d.ts +0 -8
- package/lib/collab/loro/nodes/NodeFactory.js +0 -105
- package/lib/collab/loro/nodes/NodesMapper.d.ts +0 -111
- package/lib/collab/loro/nodes/NodesMapper.js +0 -258
- package/lib/collab/loro/propagators/DecoratorNodePropagator.d.ts +0 -60
- package/lib/collab/loro/propagators/DecoratorNodePropagator.js +0 -302
- package/lib/collab/loro/propagators/ElementNodePropagator.d.ts +0 -62
- package/lib/collab/loro/propagators/ElementNodePropagator.js +0 -335
- package/lib/collab/loro/propagators/LineBreakNodePropagator.d.ts +0 -57
- package/lib/collab/loro/propagators/LineBreakNodePropagator.js +0 -196
- package/lib/collab/loro/propagators/RootNodePropagator.d.ts +0 -55
- package/lib/collab/loro/propagators/RootNodePropagator.js +0 -168
- package/lib/collab/loro/propagators/TextNodePropagator.d.ts +0 -60
- package/lib/collab/loro/propagators/TextNodePropagator.js +0 -434
- package/lib/collab/loro/propagators/index.d.ts +0 -49
- package/lib/collab/loro/propagators/index.js +0 -32
- package/lib/collab/loro/provider/websocket.d.ts +0 -116
- package/lib/collab/loro/provider/websocket.js +0 -907
- package/lib/collab/loro/servers/index.d.ts +0 -0
- package/lib/collab/loro/servers/index.js +0 -0
- package/lib/collab/loro/servers/ws/callback.d.ts +0 -5
- package/lib/collab/loro/servers/ws/callback.js +0 -85
- package/lib/collab/loro/servers/ws/server.d.ts +0 -2
- package/lib/collab/loro/servers/ws/server.js +0 -25
- package/lib/collab/loro/servers/ws/utils.d.ts +0 -40
- package/lib/collab/loro/servers/ws/utils.js +0 -513
- package/lib/collab/loro/sync/SyncCursors.d.ts +0 -32
- package/lib/collab/loro/sync/SyncCursors.js +0 -435
- package/lib/collab/loro/sync/SyncLexicalToLoro.d.ts +0 -4
- package/lib/collab/loro/sync/SyncLexicalToLoro.js +0 -80
- package/lib/collab/loro/sync/SyncLoroToLexical.d.ts +0 -5
- package/lib/collab/loro/sync/SyncLoroToLexical.js +0 -96
- package/lib/collab/loro/types/LexicalNodeData.d.ts +0 -32
- package/lib/collab/loro/types/LexicalNodeData.js +0 -71
- package/lib/collab/loro/useCollaboration.d.ts +0 -12
- package/lib/collab/loro/useCollaboration.js +0 -248
- package/lib/collab/loro/utils/InitialContent.d.ts +0 -64
- package/lib/collab/loro/utils/InitialContent.js +0 -109
- package/lib/collab/loro/utils/LexicalToLoro.d.ts +0 -18
- package/lib/collab/loro/utils/LexicalToLoro.js +0 -96
- package/lib/collab/loro/utils/Utils.d.ts +0 -44
- package/lib/collab/loro/utils/Utils.js +0 -153
- package/lib/collab/loro/wsProvider.d.ts +0 -8
- package/lib/collab/loro/wsProvider.js +0 -31
- package/lib/collab/utils/invariant.d.ts +0 -1
- package/lib/collab/utils/invariant.js +0 -11
- package/lib/collab/utils/simpleDiffWithCursor.d.ts +0 -5
- package/lib/collab/utils/simpleDiffWithCursor.js +0 -31
- package/lib/collab/yjs/Bindings.d.ts +0 -23
- package/lib/collab/yjs/Bindings.js +0 -26
- package/lib/collab/yjs/Debug.d.ts +0 -23
- package/lib/collab/yjs/Debug.js +0 -213
- package/lib/collab/yjs/LexicalCollaborationContext.d.ts +0 -10
- package/lib/collab/yjs/LexicalCollaborationContext.js +0 -37
- package/lib/collab/yjs/LexicalCollaborationPlugin.d.ts +0 -21
- package/lib/collab/yjs/LexicalCollaborationPlugin.js +0 -63
- package/lib/collab/yjs/State.d.ts +0 -51
- package/lib/collab/yjs/State.js +0 -35
- package/lib/collab/yjs/nodes/AnyCollabNode.d.ts +0 -5
- package/lib/collab/yjs/nodes/AnyCollabNode.js +0 -1
- package/lib/collab/yjs/nodes/CollabDecoratorNode.d.ts +0 -22
- package/lib/collab/yjs/nodes/CollabDecoratorNode.js +0 -64
- package/lib/collab/yjs/nodes/CollabElementNode.d.ts +0 -40
- package/lib/collab/yjs/nodes/CollabElementNode.js +0 -462
- package/lib/collab/yjs/nodes/CollabLineBreakNode.d.ts +0 -19
- package/lib/collab/yjs/nodes/CollabLineBreakNode.js +0 -44
- package/lib/collab/yjs/nodes/CollabTextNode.d.ts +0 -25
- package/lib/collab/yjs/nodes/CollabTextNode.js +0 -103
- package/lib/collab/yjs/provider/websocket.d.ts +0 -88
- package/lib/collab/yjs/provider/websocket.js +0 -415
- package/lib/collab/yjs/servers/index.d.ts +0 -0
- package/lib/collab/yjs/servers/index.js +0 -0
- package/lib/collab/yjs/servers/ws/callback.d.ts +0 -5
- package/lib/collab/yjs/servers/ws/callback.js +0 -72
- package/lib/collab/yjs/servers/ws/server.d.ts +0 -2
- package/lib/collab/yjs/servers/ws/server.js +0 -25
- package/lib/collab/yjs/servers/ws/utils.d.ts +0 -49
- package/lib/collab/yjs/servers/ws/utils.js +0 -284
- package/lib/collab/yjs/sync/SyncCursors.d.ts +0 -39
- package/lib/collab/yjs/sync/SyncCursors.js +0 -351
- package/lib/collab/yjs/sync/SyncEditorStates.d.ts +0 -10
- package/lib/collab/yjs/sync/SyncEditorStates.js +0 -200
- package/lib/collab/yjs/useCollaboration.d.ts +0 -12
- package/lib/collab/yjs/useCollaboration.js +0 -255
- package/lib/collab/yjs/utils/Utils.d.ts +0 -25
- package/lib/collab/yjs/utils/Utils.js +0 -402
- package/lib/collab/yjs/wsProvider.d.ts +0 -3
- package/lib/collab/yjs/wsProvider.js +0 -21
- package/lib/commenting/index.d.ts +0 -41
- package/lib/commenting/index.js +0 -324
- package/lib/context/FlashMessageContext.d.ts +0 -7
- package/lib/context/FlashMessageContext.js +0 -24
- package/lib/context/SettingsContext.d.ts +0 -12
- package/lib/context/SettingsContext.js +0 -38
- package/lib/context/SharedHistoryContext.d.ts +0 -11
- package/lib/context/SharedHistoryContext.js +0 -11
- package/lib/context/ToolbarContext.d.ts +0 -65
- package/lib/context/ToolbarContext.js +0 -84
- package/lib/demo.d.ts +0 -12
- package/lib/demo.js +0 -41
- package/lib/hooks/useFlashMessage.d.ts +0 -2
- package/lib/hooks/useFlashMessage.js +0 -4
- package/lib/hooks/useModal.d.ts +0 -5
- package/lib/hooks/useModal.js +0 -26
- package/lib/hooks/useReport.d.ts +0 -1
- package/lib/hooks/useReport.js +0 -46
- package/lib/index.d.ts +0 -1
- package/lib/index.js +0 -1
- package/lib/nodes/AutocompleteNode.d.ts +0 -27
- package/lib/nodes/AutocompleteNode.js +0 -56
- package/lib/nodes/CounterComponent.d.ts +0 -6
- package/lib/nodes/CounterComponent.js +0 -137
- package/lib/nodes/CounterNode.d.ts +0 -23
- package/lib/nodes/CounterNode.js +0 -47
- package/lib/nodes/DateTimeNode/DateTimeComponent.d.ts +0 -8
- package/lib/nodes/DateTimeNode/DateTimeComponent.js +0 -119
- package/lib/nodes/DateTimeNode/DateTimeNode.d.ts +0 -27
- package/lib/nodes/DateTimeNode/DateTimeNode.js +0 -82
- package/lib/nodes/EmojiNode.d.ts +0 -18
- package/lib/nodes/EmojiNode.js +0 -50
- package/lib/nodes/EquationComponent.d.ts +0 -9
- package/lib/nodes/EquationComponent.js +0 -75
- package/lib/nodes/EquationNode.d.ts +0 -26
- package/lib/nodes/EquationNode.js +0 -109
- package/lib/nodes/ExcalidrawNode/ExcalidrawComponent.d.ts +0 -8
- package/lib/nodes/ExcalidrawNode/ExcalidrawComponent.js +0 -110
- package/lib/nodes/ExcalidrawNode/ExcalidrawImage.d.ts +0 -50
- package/lib/nodes/ExcalidrawNode/ExcalidrawImage.js +0 -55
- package/lib/nodes/ExcalidrawNode/index.d.ts +0 -32
- package/lib/nodes/ExcalidrawNode/index.js +0 -117
- package/lib/nodes/FigmaNode.d.ts +0 -20
- package/lib/nodes/FigmaNode.js +0 -52
- package/lib/nodes/ImageComponent.d.ts +0 -16
- package/lib/nodes/ImageComponent.js +0 -272
- package/lib/nodes/ImageNode.d.ts +0 -50
- package/lib/nodes/ImageNode.js +0 -151
- package/lib/nodes/InlineImageNode/InlineImageComponent.d.ts +0 -26
- package/lib/nodes/InlineImageNode/InlineImageComponent.js +0 -161
- package/lib/nodes/InlineImageNode/InlineImageNode.d.ts +0 -59
- package/lib/nodes/InlineImageNode/InlineImageNode.js +0 -162
- package/lib/nodes/KeywordNode.d.ts +0 -14
- package/lib/nodes/KeywordNode.js +0 -33
- package/lib/nodes/LayoutContainerNode.d.ts +0 -24
- package/lib/nodes/LayoutContainerNode.js +0 -91
- package/lib/nodes/LayoutItemNode.d.ts +0 -16
- package/lib/nodes/LayoutItemNode.js +0 -65
- package/lib/nodes/MentionNode.d.ts +0 -20
- package/lib/nodes/MentionNode.js +0 -81
- package/lib/nodes/PageBreakNode/index.d.ts +0 -17
- package/lib/nodes/PageBreakNode/index.js +0 -83
- package/lib/nodes/PlaygroundNodes.d.ts +0 -3
- package/lib/nodes/PlaygroundNodes.js +0 -71
- package/lib/nodes/PollComponent.d.ts +0 -9
- package/lib/nodes/PollComponent.js +0 -85
- package/lib/nodes/PollNode.d.ts +0 -43
- package/lib/nodes/PollNode.js +0 -153
- package/lib/nodes/SpecialTextNode.d.ts +0 -24
- package/lib/nodes/SpecialTextNode.js +0 -50
- package/lib/nodes/StickyComponent.d.ts +0 -10
- package/lib/nodes/StickyComponent.js +0 -162
- package/lib/nodes/StickyNode.d.ts +0 -31
- package/lib/nodes/StickyNode.js +0 -76
- package/lib/nodes/TweetNode.d.ts +0 -21
- package/lib/nodes/TweetNode.js +0 -119
- package/lib/nodes/YouTubeNode.d.ts +0 -22
- package/lib/nodes/YouTubeNode.js +0 -84
- package/lib/plugins/ActionsPlugin/index.d.ts +0 -5
- package/lib/plugins/ActionsPlugin/index.js +0 -168
- package/lib/plugins/AutoEmbedPlugin/index.d.ts +0 -19
- package/lib/plugins/AutoEmbedPlugin/index.js +0 -158
- package/lib/plugins/AutoLinkPlugin/index.d.ts +0 -2
- package/lib/plugins/AutoLinkPlugin/index.js +0 -15
- package/lib/plugins/AutocompletePlugin/index.d.ts +0 -10
- package/lib/plugins/AutocompletePlugin/index.js +0 -2473
- package/lib/plugins/CodeActionMenuPlugin/components/CopyButton/index.d.ts +0 -7
- package/lib/plugins/CodeActionMenuPlugin/components/CopyButton/index.js +0 -42
- package/lib/plugins/CodeActionMenuPlugin/components/PrettierButton/index.d.ts +0 -17
- package/lib/plugins/CodeActionMenuPlugin/components/PrettierButton/index.js +0 -111
- package/lib/plugins/CodeActionMenuPlugin/index.d.ts +0 -5
- package/lib/plugins/CodeActionMenuPlugin/index.js +0 -104
- package/lib/plugins/CodeActionMenuPlugin/utils.d.ts +0 -1
- package/lib/plugins/CodeActionMenuPlugin/utils.js +0 -18
- package/lib/plugins/CodeHighlightPrismPlugin/index.d.ts +0 -2
- package/lib/plugins/CodeHighlightPrismPlugin/index.js +0 -10
- package/lib/plugins/CodeHighlightShikiPlugin/index.d.ts +0 -2
- package/lib/plugins/CodeHighlightShikiPlugin/index.js +0 -10
- package/lib/plugins/CollapsiblePlugin/CollapsibleContainerNode.d.ts +0 -25
- package/lib/plugins/CollapsiblePlugin/CollapsibleContainerNode.js +0 -131
- package/lib/plugins/CollapsiblePlugin/CollapsibleContentNode.d.ts +0 -16
- package/lib/plugins/CollapsiblePlugin/CollapsibleContentNode.js +0 -79
- package/lib/plugins/CollapsiblePlugin/CollapsibleTitleNode.d.ts +0 -16
- package/lib/plugins/CollapsiblePlugin/CollapsibleTitleNode.js +0 -81
- package/lib/plugins/CollapsiblePlugin/CollapsibleUtils.d.ts +0 -2
- package/lib/plugins/CollapsiblePlugin/CollapsibleUtils.js +0 -8
- package/lib/plugins/CollapsiblePlugin/index.d.ts +0 -3
- package/lib/plugins/CollapsiblePlugin/index.js +0 -128
- package/lib/plugins/CommentPlugin/index.d.ts +0 -9
- package/lib/plugins/CommentPlugin/index.js +0 -460
- package/lib/plugins/ComponentPickerPlugin/index.d.ts +0 -2
- package/lib/plugins/ComponentPickerPlugin/index.js +0 -276
- package/lib/plugins/ContextMenuPlugin/index.d.ts +0 -2
- package/lib/plugins/ContextMenuPlugin/index.js +0 -112
- package/lib/plugins/CounterPlugin/index.d.ts +0 -3
- package/lib/plugins/CounterPlugin/index.js +0 -20
- package/lib/plugins/DatalayerPlugin/index.d.ts +0 -2
- package/lib/plugins/DatalayerPlugin/index.js +0 -218
- package/lib/plugins/DateTimePlugin/index.d.ts +0 -8
- package/lib/plugins/DateTimePlugin/index.js +0 -24
- package/lib/plugins/DocsPlugin/index.d.ts +0 -2
- package/lib/plugins/DocsPlugin/index.js +0 -4
- package/lib/plugins/DragDropPastePlugin/index.d.ts +0 -1
- package/lib/plugins/DragDropPastePlugin/index.js +0 -33
- package/lib/plugins/DraggableBlockPlugin/index.d.ts +0 -12
- package/lib/plugins/DraggableBlockPlugin/index.js +0 -36
- package/lib/plugins/EmojiPickerPlugin/index.d.ts +0 -1
- package/lib/plugins/EmojiPickerPlugin/index.js +0 -80
- package/lib/plugins/EmojisPlugin/index.d.ts +0 -2
- package/lib/plugins/EmojisPlugin/index.js +0 -52
- package/lib/plugins/EquationsPlugin/index.d.ts +0 -14
- package/lib/plugins/EquationsPlugin/index.js +0 -34
- package/lib/plugins/ExcalidrawPlugin/index.d.ts +0 -5
- package/lib/plugins/ExcalidrawPlugin/index.js +0 -44
- package/lib/plugins/FigmaPlugin/index.d.ts +0 -4
- package/lib/plugins/FigmaPlugin/index.js +0 -20
- package/lib/plugins/FloatingLinkEditorPlugin/index.d.ts +0 -15
- package/lib/plugins/FloatingLinkEditorPlugin/index.js +0 -280
- package/lib/plugins/FloatingTextFormatToolbarPlugin/index.d.ts +0 -7
- package/lib/plugins/FloatingTextFormatToolbarPlugin/index.js +0 -219
- package/lib/plugins/ImagesPlugin/index.d.ts +0 -24
- package/lib/plugins/ImagesPlugin/index.js +0 -195
- package/lib/plugins/InlineImagePlugin/index.d.ts +0 -17
- package/lib/plugins/InlineImagePlugin/index.js +0 -180
- package/lib/plugins/KeywordsPlugin/index.d.ts +0 -2
- package/lib/plugins/KeywordsPlugin/index.js +0 -31
- package/lib/plugins/LayoutPlugin/InsertLayoutDialog.d.ts +0 -6
- package/lib/plugins/LayoutPlugin/InsertLayoutDialog.js +0 -21
- package/lib/plugins/LayoutPlugin/LayoutPlugin.d.ts +0 -7
- package/lib/plugins/LayoutPlugin/LayoutPlugin.js +0 -131
- package/lib/plugins/LinkPlugin/index.d.ts +0 -6
- package/lib/plugins/LinkPlugin/index.js +0 -11
- package/lib/plugins/MarkdownShortcutPlugin/index.d.ts +0 -2
- package/lib/plugins/MarkdownShortcutPlugin/index.js +0 -6
- package/lib/plugins/MarkdownTransformers/index.d.ts +0 -8
- package/lib/plugins/MarkdownTransformers/index.js +0 -234
- package/lib/plugins/MaxLengthPlugin/index.d.ts +0 -3
- package/lib/plugins/MaxLengthPlugin/index.js +0 -37
- package/lib/plugins/MentionsPlugin/index.d.ts +0 -2
- package/lib/plugins/MentionsPlugin/index.js +0 -564
- package/lib/plugins/PageBreakPlugin/index.d.ts +0 -4
- package/lib/plugins/PageBreakPlugin/index.js +0 -27
- package/lib/plugins/PasteLogPlugin/index.d.ts +0 -2
- package/lib/plugins/PasteLogPlugin/index.js +0 -27
- package/lib/plugins/PollPlugin/index.d.ts +0 -8
- package/lib/plugins/PollPlugin/index.js +0 -38
- package/lib/plugins/ShortcutsPlugin/index.d.ts +0 -6
- package/lib/plugins/ShortcutsPlugin/index.js +0 -112
- package/lib/plugins/ShortcutsPlugin/shortcuts.d.ts +0 -59
- package/lib/plugins/ShortcutsPlugin/shortcuts.js +0 -169
- package/lib/plugins/SpecialTextPlugin/index.d.ts +0 -2
- package/lib/plugins/SpecialTextPlugin/index.js +0 -46
- package/lib/plugins/SpeechToTextPlugin/index.d.ts +0 -5
- package/lib/plugins/SpeechToTextPlugin/index.js +0 -82
- package/lib/plugins/StickyPlugin/index.d.ts +0 -2
- package/lib/plugins/StickyPlugin/index.js +0 -12
- package/lib/plugins/TabFocusPlugin/index.d.ts +0 -1
- package/lib/plugins/TabFocusPlugin/index.js +0 -34
- package/lib/plugins/TableActionMenuPlugin/index.d.ts +0 -5
- package/lib/plugins/TableActionMenuPlugin/index.js +0 -492
- package/lib/plugins/TableCellResizer/index.d.ts +0 -3
- package/lib/plugins/TableCellResizer/index.js +0 -297
- package/lib/plugins/TableHoverActionsPlugin/index.d.ts +0 -4
- package/lib/plugins/TableHoverActionsPlugin/index.js +0 -188
- package/lib/plugins/TableOfContentsPlugin/index.d.ts +0 -2
- package/lib/plugins/TableOfContentsPlugin/index.js +0 -116
- package/lib/plugins/TablePlugin.d.ts +0 -31
- package/lib/plugins/TablePlugin.js +0 -63
- package/lib/plugins/TestRecorderPlugin/index.d.ts +0 -3
- package/lib/plugins/TestRecorderPlugin/index.js +0 -346
- package/lib/plugins/ToolbarPlugin/fontSize.d.ts +0 -9
- package/lib/plugins/ToolbarPlugin/fontSize.js +0 -80
- package/lib/plugins/ToolbarPlugin/index.d.ts +0 -9
- package/lib/plugins/ToolbarPlugin/index.js +0 -500
- package/lib/plugins/ToolbarPlugin/utils.d.ts +0 -26
- package/lib/plugins/ToolbarPlugin/utils.js +0 -243
- package/lib/plugins/TreeViewPlugin/index.d.ts +0 -2
- package/lib/plugins/TreeViewPlugin/index.js +0 -7
- package/lib/plugins/TwitterPlugin/index.d.ts +0 -4
- package/lib/plugins/TwitterPlugin/index.js +0 -20
- package/lib/plugins/TypingPerfPlugin/index.d.ts +0 -2
- package/lib/plugins/TypingPerfPlugin/index.js +0 -93
- package/lib/plugins/YouTubePlugin/index.d.ts +0 -4
- package/lib/plugins/YouTubePlugin/index.js +0 -20
- package/lib/server/validation.d.ts +0 -1
- package/lib/server/validation.js +0 -111
- package/lib/setupEnv.d.ts +0 -2
- package/lib/setupEnv.js +0 -25
- package/lib/themes/CommentEditorTheme.d.ts +0 -4
- package/lib/themes/CommentEditorTheme.js +0 -7
- package/lib/themes/PlaygroundEditorTheme.d.ts +0 -4
- package/lib/themes/PlaygroundEditorTheme.js +0 -120
- package/lib/themes/StickyEditorTheme.d.ts +0 -4
- package/lib/themes/StickyEditorTheme.js +0 -7
- package/lib/tyes.dt.d.ts +0 -12
- package/lib/tyes.dt.js +0 -0
- package/lib/ui/Button.d.ts +0 -12
- package/lib/ui/Button.js +0 -6
- package/lib/ui/ColorPicker.d.ts +0 -14
- package/lib/ui/ColorPicker.js +0 -219
- package/lib/ui/ContentEditable.d.ts +0 -9
- package/lib/ui/ContentEditable.js +0 -6
- package/lib/ui/Dialog.d.ts +0 -10
- package/lib/ui/Dialog.js +0 -8
- package/lib/ui/DropDown.d.ts +0 -18
- package/lib/ui/DropDown.js +0 -133
- package/lib/ui/DropdownColorPicker.d.ts +0 -13
- package/lib/ui/DropdownColorPicker.js +0 -6
- package/lib/ui/EquationEditor.d.ts +0 -8
- package/lib/ui/EquationEditor.js +0 -11
- package/lib/ui/ExcalidrawModal.d.ts +0 -42
- package/lib/ui/ExcalidrawModal.js +0 -103
- package/lib/ui/FileInput.d.ts +0 -10
- package/lib/ui/FileInput.js +0 -5
- package/lib/ui/FlashMessage.d.ts +0 -7
- package/lib/ui/FlashMessage.js +0 -6
- package/lib/ui/ImageResizer.d.ts +0 -17
- package/lib/ui/ImageResizer.js +0 -171
- package/lib/ui/KatexEquationAlterer.d.ts +0 -8
- package/lib/ui/KatexEquationAlterer.js +0 -23
- package/lib/ui/KatexRenderer.d.ts +0 -6
- package/lib/ui/KatexRenderer.js +0 -24
- package/lib/ui/Modal.d.ts +0 -9
- package/lib/ui/Modal.js +0 -48
- package/lib/ui/Select.d.ts +0 -8
- package/lib/ui/Select.js +0 -5
- package/lib/ui/Switch.d.ts +0 -8
- package/lib/ui/Switch.js +0 -6
- package/lib/ui/TextInput.d.ts +0 -13
- package/lib/ui/TextInput.js +0 -7
- package/lib/utils/docSerialization.d.ts +0 -3
- package/lib/utils/docSerialization.js +0 -56
- package/lib/utils/emoji-list.d.ts +0 -20
- package/lib/utils/emoji-list.js +0 -16605
- package/lib/utils/getDOMRangeRect.d.ts +0 -8
- package/lib/utils/getDOMRangeRect.js +0 -22
- package/lib/utils/getSelectedNode.d.ts +0 -2
- package/lib/utils/getSelectedNode.js +0 -24
- package/lib/utils/getThemeSelector.d.ts +0 -2
- package/lib/utils/getThemeSelector.js +0 -10
- package/lib/utils/isMobileWidth.d.ts +0 -7
- package/lib/utils/isMobileWidth.js +0 -7
- package/lib/utils/joinClasses.d.ts +0 -1
- package/lib/utils/joinClasses.js +0 -3
- package/lib/utils/setFloatingElemPosition.d.ts +0 -1
- package/lib/utils/setFloatingElemPosition.js +0 -55
- package/lib/utils/setFloatingElemPositionForLinkEditor.d.ts +0 -1
- package/lib/utils/setFloatingElemPositionForLinkEditor.js +0 -32
- package/lib/utils/swipe.d.ts +0 -4
- package/lib/utils/swipe.js +0 -90
- package/lib/utils/url.d.ts +0 -2
- package/lib/utils/url.js +0 -27
|
@@ -1,335 +0,0 @@
|
|
|
1
|
-
import { $createParagraphNode, $isElementNode } from 'lexical';
|
|
2
|
-
import { getNodeMapper } from '../nodes/NodesMapper';
|
|
3
|
-
/**
|
|
4
|
-
* Create ElementNode in Loro tree
|
|
5
|
-
*/
|
|
6
|
-
export function createElementNodeInLoro(nodeKey, elementType, // 'paragraph', 'heading', 'quote', 'link', etc.
|
|
7
|
-
parentId, index, metadata, lexicalNodeJSON, // JSON object from exportJSON()
|
|
8
|
-
options) {
|
|
9
|
-
const mapper = getNodeMapper();
|
|
10
|
-
// Use mapper to get or create the tree node (don't pass lexicalNode to avoid context issues)
|
|
11
|
-
const treeNode = mapper.getLoroNodeByLexicalKey(nodeKey, undefined, parentId, index);
|
|
12
|
-
// Store complete lexical node data as JSON object (without the key) if provided
|
|
13
|
-
if (lexicalNodeJSON) {
|
|
14
|
-
// Remove all key-related fields from lexical node data and store the cleaned object
|
|
15
|
-
const { key, __key, lexicalKey, ...cleanedLexicalData } = lexicalNodeJSON;
|
|
16
|
-
treeNode.data.set('lexical', cleanedLexicalData);
|
|
17
|
-
}
|
|
18
|
-
// Store only essential metadata (elementType for debug panel)
|
|
19
|
-
treeNode.data.set('elementType', elementType);
|
|
20
|
-
treeNode.data.set('createdAt', Date.now());
|
|
21
|
-
// Return the TreeID from the node's ID
|
|
22
|
-
return treeNode.id;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Update ElementNode in Loro tree
|
|
26
|
-
*/
|
|
27
|
-
export function updateElementNodeInLoro(nodeKey, elementType, parentId, index, metadata, lexicalNodeJSON, // JSON object from exportJSON()
|
|
28
|
-
options) {
|
|
29
|
-
const mapper = getNodeMapper();
|
|
30
|
-
// Get the existing tree node using the mapper (don't pass lexicalNode to avoid context issues)
|
|
31
|
-
const treeNode = mapper.getLoroNodeByLexicalKey(nodeKey, undefined);
|
|
32
|
-
// Store the lexical node data if provided
|
|
33
|
-
if (lexicalNodeJSON) {
|
|
34
|
-
const { key, __key, lexicalKey, ...cleanedLexicalData } = lexicalNodeJSON;
|
|
35
|
-
treeNode.data.set('lexical', cleanedLexicalData);
|
|
36
|
-
}
|
|
37
|
-
// Update only essential metadata
|
|
38
|
-
if (elementType !== undefined) {
|
|
39
|
-
treeNode.data.set('elementType', elementType);
|
|
40
|
-
}
|
|
41
|
-
// Move the node if parent or position changed
|
|
42
|
-
if (parentId !== undefined || index !== undefined) {
|
|
43
|
-
// Note: For moving, we need access to tree - this might need to be propagated differently
|
|
44
|
-
const { tree } = options;
|
|
45
|
-
// CRITICAL: Prevent cycle moves - a node cannot be its own parent
|
|
46
|
-
if (parentId && treeNode.id === parentId) {
|
|
47
|
-
console.warn(`🚨 CYCLE MOVE DETECTED: Node ${treeNode.id} cannot be its own parent! Skipping move operation.`);
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
// Debug: Check if the parent exists and its children count
|
|
51
|
-
const parentNode = parentId ? tree.getNodeByID(parentId) : null;
|
|
52
|
-
const parentChildCount = parentNode ? parentNode.children.length : tree.roots().length;
|
|
53
|
-
// Check if the node is already a child of the target parent
|
|
54
|
-
const currentParent = treeNode.parent();
|
|
55
|
-
const isAlreadyChild = currentParent?.id === parentId;
|
|
56
|
-
if (index !== undefined) {
|
|
57
|
-
let adjustedIndex = index;
|
|
58
|
-
if (!isAlreadyChild) {
|
|
59
|
-
// Moving to a new parent - check bounds against current child count
|
|
60
|
-
if (index > parentChildCount) {
|
|
61
|
-
adjustedIndex = parentChildCount;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
tree.move(treeNode.id, parentId, adjustedIndex);
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
// No specific index, append to end
|
|
68
|
-
tree.move(treeNode.id, parentId, parentChildCount);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
// The exported Lexical node data is already propagated by the mapper
|
|
72
|
-
// No additional JSON export needed since mapper propagates exportJSON automatically
|
|
73
|
-
try {
|
|
74
|
-
treeNode.data.set('lastUpdated', Date.now());
|
|
75
|
-
}
|
|
76
|
-
catch (error) {
|
|
77
|
-
console.warn(`🔄 ElementNode ${treeNode.id} container deleted during timestamp update (normal during operations):`, error.message);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Delete ElementNode from Loro tree
|
|
82
|
-
*/
|
|
83
|
-
export function deleteElementNodeInLoro(nodeKey, options) {
|
|
84
|
-
const mapper = getNodeMapper();
|
|
85
|
-
mapper.deleteMapping(nodeKey);
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Create ElementNode in Lexical from Loro tree data
|
|
89
|
-
*/
|
|
90
|
-
export function createElementNodeFromLoro(treeId, parentNode, // The Lexical parent node where this should be inserted
|
|
91
|
-
index, options) {
|
|
92
|
-
const { tree } = options;
|
|
93
|
-
if (!tree.has(treeId)) {
|
|
94
|
-
return null;
|
|
95
|
-
}
|
|
96
|
-
const treeNode = tree.getNodeByID(treeId);
|
|
97
|
-
if (!treeNode) {
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
// Get LexicalNodeData (JSON object format only)
|
|
101
|
-
const lexicalData = treeNode.data.get('lexical');
|
|
102
|
-
let elementNode;
|
|
103
|
-
if (lexicalData && typeof lexicalData === 'object') {
|
|
104
|
-
try {
|
|
105
|
-
// lexicalData is a direct JSON object, create the appropriate node type
|
|
106
|
-
const lexicalDataObj = lexicalData;
|
|
107
|
-
const nodeType = lexicalDataObj.type || lexicalDataObj.__type;
|
|
108
|
-
if (nodeType === 'paragraph') {
|
|
109
|
-
elementNode = $createParagraphNode();
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
// For other node types, fall back to paragraph for now
|
|
113
|
-
console.warn(`Unsupported ElementNode type: ${nodeType}, creating paragraph instead`);
|
|
114
|
-
elementNode = $createParagraphNode();
|
|
115
|
-
}
|
|
116
|
-
// Apply formatting if available
|
|
117
|
-
if (lexicalDataObj.format || lexicalDataObj.__format) {
|
|
118
|
-
elementNode.setFormat(lexicalDataObj.format || lexicalDataObj.__format);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
catch (error) {
|
|
122
|
-
console.warn('Failed to create ElementNode from JSON data for TreeID:', treeId, error);
|
|
123
|
-
return null;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
// No lexical JSON data found - cannot create ElementNode
|
|
128
|
-
console.warn('No lexical JSON data found for ElementNode TreeID:', treeId);
|
|
129
|
-
return null;
|
|
130
|
-
}
|
|
131
|
-
// Insert into the parent at the specified index
|
|
132
|
-
if (index !== undefined && index >= 0) {
|
|
133
|
-
parentNode.splice(index, 0, [elementNode]);
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
parentNode.append(elementNode);
|
|
137
|
-
}
|
|
138
|
-
return elementNode;
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Update ElementNode in Lexical from Loro tree data
|
|
142
|
-
*/
|
|
143
|
-
export function updateElementNodeFromLoro(treeId, lexicalNode, newParentNode, newIndex, options) {
|
|
144
|
-
const { tree } = options;
|
|
145
|
-
if (!tree.has(treeId)) {
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
const treeNode = tree.getNodeByID(treeId);
|
|
149
|
-
if (!treeNode || treeNode.data.get('nodeType') !== 'element') {
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
// Update formatting if it has changed
|
|
153
|
-
const format = treeNode.data.get('format');
|
|
154
|
-
if (format !== undefined && typeof lexicalNode.setFormat === 'function' && typeof format === 'number') {
|
|
155
|
-
lexicalNode.setFormat(format);
|
|
156
|
-
}
|
|
157
|
-
const style = treeNode.data.get('style');
|
|
158
|
-
if (style !== undefined && typeof lexicalNode.setStyle === 'function' && typeof style === 'string') {
|
|
159
|
-
lexicalNode.setStyle(style);
|
|
160
|
-
}
|
|
161
|
-
const direction = treeNode.data.get('direction');
|
|
162
|
-
if (direction !== undefined && typeof lexicalNode.setDirection === 'function' &&
|
|
163
|
-
(direction === 'ltr' || direction === 'rtl')) {
|
|
164
|
-
lexicalNode.setDirection(direction);
|
|
165
|
-
}
|
|
166
|
-
// If parent or position changed, move the node
|
|
167
|
-
if (newParentNode && newIndex !== undefined) {
|
|
168
|
-
// Remove from current location
|
|
169
|
-
lexicalNode.remove();
|
|
170
|
-
// Insert at new location
|
|
171
|
-
newParentNode.splice(newIndex, 0, [lexicalNode]);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Delete ElementNode from Lexical
|
|
176
|
-
*/
|
|
177
|
-
export function deleteElementNodeFromLoro(treeId, lexicalNode, options) {
|
|
178
|
-
if ($isElementNode(lexicalNode)) {
|
|
179
|
-
lexicalNode.remove();
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Utility to check if a tree node represents an ElementNode
|
|
184
|
-
*/
|
|
185
|
-
export function isElementNodeInTree(treeId, tree) {
|
|
186
|
-
if (!tree.has(treeId)) {
|
|
187
|
-
return false;
|
|
188
|
-
}
|
|
189
|
-
const treeNode = tree.getNodeByID(treeId);
|
|
190
|
-
return treeNode?.data.get('nodeType') === 'element';
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Get ElementNode data from Loro tree
|
|
194
|
-
*/
|
|
195
|
-
export function getElementNodeDataFromTree(treeId, tree) {
|
|
196
|
-
if (!tree.has(treeId)) {
|
|
197
|
-
return null;
|
|
198
|
-
}
|
|
199
|
-
const treeNode = tree.getNodeByID(treeId);
|
|
200
|
-
if (!treeNode || treeNode.data.get('nodeType') !== 'element') {
|
|
201
|
-
return null;
|
|
202
|
-
}
|
|
203
|
-
return {
|
|
204
|
-
nodeType: 'element',
|
|
205
|
-
elementType: treeNode.data.get('elementType'),
|
|
206
|
-
format: treeNode.data.get('format'),
|
|
207
|
-
style: treeNode.data.get('style'),
|
|
208
|
-
direction: treeNode.data.get('direction'),
|
|
209
|
-
level: treeNode.data.get('level'), // For headings
|
|
210
|
-
createdAt: treeNode.data.get('createdAt'),
|
|
211
|
-
lastUpdated: treeNode.data.get('lastUpdated'),
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* Sync ElementNode children relationships in Loro tree
|
|
216
|
-
*/
|
|
217
|
-
export function syncElementNodeChildrenInLoro(nodeKey, childKeys, options) {
|
|
218
|
-
const mapper = getNodeMapper();
|
|
219
|
-
const { tree } = options;
|
|
220
|
-
// Get the existing Loro node from the mapper
|
|
221
|
-
const treeNode = mapper.getLoroNodeByLexicalKey(nodeKey);
|
|
222
|
-
if (!treeNode || treeNode.data.get('nodeType') !== 'element') {
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
|
-
// Store children relationships for collaborative editing
|
|
226
|
-
treeNode.data.set('childKeys', childKeys);
|
|
227
|
-
treeNode.data.set('childrenLastUpdated', Date.now());
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Main propagate method for ElementNode - propagates all mutation types
|
|
231
|
-
*/
|
|
232
|
-
export function propagateElementNode(update, mutation, nodeKey, options) {
|
|
233
|
-
const { tree, peerId } = options;
|
|
234
|
-
switch (mutation) {
|
|
235
|
-
case 'created': {
|
|
236
|
-
const currentNode = update.editorState._nodeMap.get(nodeKey);
|
|
237
|
-
if (currentNode && $isElementNode(currentNode)) {
|
|
238
|
-
// Export node data and collect metadata within editor context
|
|
239
|
-
let parent, parentId, index;
|
|
240
|
-
let elementType;
|
|
241
|
-
const metadata = {};
|
|
242
|
-
let lexicalNodeJSON;
|
|
243
|
-
update.editorState.read(() => {
|
|
244
|
-
// Get parent and index for proper positioning within editor state context
|
|
245
|
-
parent = currentNode.getParent();
|
|
246
|
-
// Get parentId from the mapper instead of constructing it manually
|
|
247
|
-
const mapper = getNodeMapper();
|
|
248
|
-
parentId = parent ? mapper.getTreeIDByLexicalKey(parent.getKey()) : undefined;
|
|
249
|
-
index = currentNode.getIndexWithinParent();
|
|
250
|
-
if (parentId) {
|
|
251
|
-
const ownTreeID = mapper.getTreeIDByLexicalKey(nodeKey);
|
|
252
|
-
if (ownTreeID === parentId) {
|
|
253
|
-
parentId = undefined; // Prevent cycle
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
// Determine element type
|
|
257
|
-
elementType = currentNode.getType(); // 'paragraph', 'heading', etc.
|
|
258
|
-
// If parent exists but doesn't have mapping yet, defer parent assignment
|
|
259
|
-
if (parent && !parentId) {
|
|
260
|
-
// Store the node creation but defer parent assignment
|
|
261
|
-
parentId = undefined; // Create as orphan temporarily
|
|
262
|
-
}
|
|
263
|
-
// Collect metadata (format, style, direction, etc.)
|
|
264
|
-
if (typeof currentNode.getFormat === 'function') {
|
|
265
|
-
metadata.format = currentNode.getFormat();
|
|
266
|
-
}
|
|
267
|
-
if (typeof currentNode.getStyle === 'function') {
|
|
268
|
-
metadata.style = currentNode.getStyle();
|
|
269
|
-
}
|
|
270
|
-
if (typeof currentNode.getDirection === 'function') {
|
|
271
|
-
metadata.direction = currentNode.getDirection();
|
|
272
|
-
}
|
|
273
|
-
// Export node data within editor context where node methods are available
|
|
274
|
-
lexicalNodeJSON = currentNode.exportJSON();
|
|
275
|
-
});
|
|
276
|
-
// Create the node in Loro after safely reading from editor state
|
|
277
|
-
createElementNodeInLoro(nodeKey, elementType, parentId, index, metadata, lexicalNodeJSON, options);
|
|
278
|
-
// If this node was created without a parent, schedule a retry to fix parent assignment
|
|
279
|
-
if (parent && !parentId) {
|
|
280
|
-
setTimeout(() => {
|
|
281
|
-
const mapper = getNodeMapper();
|
|
282
|
-
const retryParentId = mapper.getTreeIDByLexicalKey(parent.getKey());
|
|
283
|
-
if (retryParentId) {
|
|
284
|
-
// Move the node to its correct parent now that the parent exists
|
|
285
|
-
const loroNode = mapper.getLoroNodeByLexicalKey(nodeKey);
|
|
286
|
-
if (loroNode && tree.has(loroNode.id)) {
|
|
287
|
-
tree.move(loroNode.id, retryParentId, index);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
}, 10); // Small delay to allow parent to be created
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
break;
|
|
294
|
-
}
|
|
295
|
-
case 'updated': {
|
|
296
|
-
const currentNode = update.editorState._nodeMap.get(nodeKey);
|
|
297
|
-
if (currentNode && $isElementNode(currentNode)) {
|
|
298
|
-
// Use editorState.read() to safely access node methods
|
|
299
|
-
let parent, parentId, index;
|
|
300
|
-
let elementType;
|
|
301
|
-
const metadata = {};
|
|
302
|
-
// Export node data and collect metadata within editor context
|
|
303
|
-
let lexicalNodeJSON;
|
|
304
|
-
update.editorState.read(() => {
|
|
305
|
-
// Get current position within editor state context
|
|
306
|
-
parent = currentNode.getParent();
|
|
307
|
-
// Get parentId from the mapper instead of constructing it manually
|
|
308
|
-
const mapper = getNodeMapper();
|
|
309
|
-
parentId = parent ? mapper.getTreeIDByLexicalKey(parent.getKey()) : undefined;
|
|
310
|
-
index = currentNode.getIndexWithinParent();
|
|
311
|
-
// Get element type and metadata
|
|
312
|
-
elementType = currentNode.getType();
|
|
313
|
-
if (typeof currentNode.getFormat === 'function') {
|
|
314
|
-
metadata.format = currentNode.getFormat();
|
|
315
|
-
}
|
|
316
|
-
if (typeof currentNode.getStyle === 'function') {
|
|
317
|
-
metadata.style = currentNode.getStyle();
|
|
318
|
-
}
|
|
319
|
-
if (typeof currentNode.getDirection === 'function') {
|
|
320
|
-
metadata.direction = currentNode.getDirection();
|
|
321
|
-
}
|
|
322
|
-
// Export node data within editor context where node methods are available
|
|
323
|
-
lexicalNodeJSON = currentNode.exportJSON();
|
|
324
|
-
});
|
|
325
|
-
// Update the node in Loro after safely reading from editor state
|
|
326
|
-
updateElementNodeInLoro(nodeKey, elementType, parentId, index, metadata, lexicalNodeJSON, options);
|
|
327
|
-
}
|
|
328
|
-
break;
|
|
329
|
-
}
|
|
330
|
-
case 'destroyed': {
|
|
331
|
-
deleteElementNodeInLoro(nodeKey, options);
|
|
332
|
-
break;
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { TreeID, LoroTree } from 'loro-crdt';
|
|
2
|
-
import { LineBreakNode, UpdateListenerPayload, NodeKey, ElementNode } from 'lexical';
|
|
3
|
-
import { Binding } from '../Bindings';
|
|
4
|
-
/**
|
|
5
|
-
* LineBreakNode Propagator for Loro Tree Collaboration
|
|
6
|
-
*
|
|
7
|
-
* LineBreakNode characteristics:
|
|
8
|
-
* - Represents '\n' characters in the editor
|
|
9
|
-
* - Should never have '\n' in text nodes, use LineBreakNode instead
|
|
10
|
-
* - Works consistently across browsers and operating systems
|
|
11
|
-
* - Is a leaf node (cannot have children)
|
|
12
|
-
* - Cannot be extended/subclassed
|
|
13
|
-
*/
|
|
14
|
-
export interface LineBreakNodeMutatorOptions {
|
|
15
|
-
binding: Binding;
|
|
16
|
-
tree: LoroTree;
|
|
17
|
-
peerId: number;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Create LineBreakNode in Loro tree
|
|
21
|
-
*/
|
|
22
|
-
export declare function createLineBreakNodeInLoro(nodeKey: NodeKey, parentId?: TreeID, index?: number, lexicalNodeJSON?: any, // JSON object from exportJSON()
|
|
23
|
-
options?: LineBreakNodeMutatorOptions): TreeID;
|
|
24
|
-
/**
|
|
25
|
-
* Update LineBreakNode in Loro tree
|
|
26
|
-
* Note: LineBreakNodes typically don't change much since they represent '\n'
|
|
27
|
-
*/
|
|
28
|
-
export declare function updateLineBreakNodeInLoro(nodeKey: NodeKey, parentId?: TreeID, index?: number, lexicalNodeJSON?: any, // JSON object from exportJSON()
|
|
29
|
-
options?: LineBreakNodeMutatorOptions): void;
|
|
30
|
-
/**
|
|
31
|
-
* Delete LineBreakNode from Loro tree
|
|
32
|
-
*/
|
|
33
|
-
export declare function deleteLineBreakNodeInLoro(nodeKey: NodeKey, options: LineBreakNodeMutatorOptions): void;
|
|
34
|
-
/**
|
|
35
|
-
* Create LineBreakNode in Lexical from Loro tree data
|
|
36
|
-
*/
|
|
37
|
-
export declare function createLineBreakNodeFromLoro(treeId: TreeID, parentNode: ElementNode, index?: number, options?: LineBreakNodeMutatorOptions): LineBreakNode;
|
|
38
|
-
/**
|
|
39
|
-
* Update LineBreakNode in Lexical from Loro tree data
|
|
40
|
-
*/
|
|
41
|
-
export declare function updateLineBreakNodeFromLoro(treeId: TreeID, lexicalNode: LineBreakNode, newParentNode?: ElementNode, newIndex?: number, options?: LineBreakNodeMutatorOptions): void;
|
|
42
|
-
/**
|
|
43
|
-
* Delete LineBreakNode from Lexical
|
|
44
|
-
*/
|
|
45
|
-
export declare function deleteLineBreakNodeFromLoro(treeId: TreeID, lexicalNode: LineBreakNode, options?: LineBreakNodeMutatorOptions): void;
|
|
46
|
-
/**
|
|
47
|
-
* Utility to check if a tree node represents a LineBreakNode
|
|
48
|
-
*/
|
|
49
|
-
export declare function isLineBreakNodeInTree(treeId: TreeID, tree: LoroTree): boolean;
|
|
50
|
-
/**
|
|
51
|
-
* Get LineBreakNode data from Loro tree
|
|
52
|
-
*/
|
|
53
|
-
export declare function getLineBreakNodeDataFromTree(treeId: TreeID, tree: LoroTree): any;
|
|
54
|
-
/**
|
|
55
|
-
* Main propagate method for LineBreakNode - propagates all mutation types
|
|
56
|
-
*/
|
|
57
|
-
export declare function propagateLineBreakNode(update: UpdateListenerPayload, mutation: 'created' | 'updated' | 'destroyed', nodeKey: NodeKey, options: LineBreakNodeMutatorOptions): void;
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
import { $createLineBreakNode, $isLineBreakNode } from 'lexical';
|
|
2
|
-
import { getNodeMapper } from '../nodes/NodesMapper';
|
|
3
|
-
/**
|
|
4
|
-
* Create LineBreakNode in Loro tree
|
|
5
|
-
*/
|
|
6
|
-
export function createLineBreakNodeInLoro(nodeKey, parentId, index, lexicalNodeJSON, // JSON object from exportJSON()
|
|
7
|
-
options) {
|
|
8
|
-
const mapper = getNodeMapper();
|
|
9
|
-
// Use mapper to get or create the tree node (don't pass lexicalNode to avoid context issues)
|
|
10
|
-
const treeNode = mapper.getLoroNodeByLexicalKey(nodeKey, undefined, // don't pass lexicalNode to avoid context issues
|
|
11
|
-
parentId, index);
|
|
12
|
-
// Store complete lexical node data as clean JSON if provided
|
|
13
|
-
if (lexicalNodeJSON) {
|
|
14
|
-
// Store complete lexical JSON without all key-related fields
|
|
15
|
-
const { key, __key, lexicalKey, ...cleanedData } = lexicalNodeJSON;
|
|
16
|
-
treeNode.data.set('lexical', cleanedData);
|
|
17
|
-
}
|
|
18
|
-
// Store only essential metadata
|
|
19
|
-
treeNode.data.set('elementType', 'linebreak');
|
|
20
|
-
treeNode.data.set('createdAt', Date.now());
|
|
21
|
-
// The exported Lexical node data is already propagated by the mapper
|
|
22
|
-
// Return the TreeID from the node's ID
|
|
23
|
-
return treeNode.id;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Update LineBreakNode in Loro tree
|
|
27
|
-
* Note: LineBreakNodes typically don't change much since they represent '\n'
|
|
28
|
-
*/
|
|
29
|
-
export function updateLineBreakNodeInLoro(nodeKey, parentId, index, lexicalNodeJSON, // JSON object from exportJSON()
|
|
30
|
-
options) {
|
|
31
|
-
const mapper = getNodeMapper();
|
|
32
|
-
const { tree } = options;
|
|
33
|
-
// Get the existing Loro node from the mapper
|
|
34
|
-
const treeNode = mapper.getLoroNodeByLexicalKey(nodeKey, undefined);
|
|
35
|
-
if (!treeNode) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
const treeId = treeNode.id;
|
|
39
|
-
// Store complete lexical node data as clean JSON if provided
|
|
40
|
-
if (lexicalNodeJSON) {
|
|
41
|
-
// Store complete lexical JSON without all key-related fields
|
|
42
|
-
const { key, __key, lexicalKey, ...cleanedData } = lexicalNodeJSON;
|
|
43
|
-
treeNode.data.set('lexical', cleanedData);
|
|
44
|
-
}
|
|
45
|
-
// Move the node if parent or position changed
|
|
46
|
-
if (parentId !== undefined || index !== undefined) {
|
|
47
|
-
tree.move(treeId, parentId, index);
|
|
48
|
-
}
|
|
49
|
-
// Update only essential metadata
|
|
50
|
-
treeNode.data.set('elementType', 'linebreak');
|
|
51
|
-
treeNode.data.set('lastUpdated', Date.now());
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Delete LineBreakNode from Loro tree
|
|
55
|
-
*/
|
|
56
|
-
export function deleteLineBreakNodeInLoro(nodeKey, options) {
|
|
57
|
-
const mapper = getNodeMapper();
|
|
58
|
-
// Use the mapper's delete method which propagates TreeID lookup internally
|
|
59
|
-
mapper.deleteMapping(nodeKey);
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Create LineBreakNode in Lexical from Loro tree data
|
|
63
|
-
*/
|
|
64
|
-
export function createLineBreakNodeFromLoro(treeId, parentNode, index, options) {
|
|
65
|
-
const { tree } = options;
|
|
66
|
-
if (!tree.has(treeId)) {
|
|
67
|
-
return $createLineBreakNode(); // Fallback to empty line break
|
|
68
|
-
}
|
|
69
|
-
const treeNode = tree.getNodeByID(treeId);
|
|
70
|
-
let lineBreakNode;
|
|
71
|
-
// Get LexicalNodeData (JSON object format only)
|
|
72
|
-
const lexicalData = treeNode?.data.get('lexical');
|
|
73
|
-
if (lexicalData && typeof lexicalData === 'object') {
|
|
74
|
-
// lexicalData is a direct JSON object - LineBreak nodes are simple
|
|
75
|
-
lineBreakNode = $createLineBreakNode();
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
// No lexical data - just create a new line break node
|
|
79
|
-
lineBreakNode = $createLineBreakNode();
|
|
80
|
-
}
|
|
81
|
-
// Insert into the parent at the specified index
|
|
82
|
-
if (index !== undefined && index >= 0) {
|
|
83
|
-
parentNode.splice(index, 0, [lineBreakNode]);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
parentNode.append(lineBreakNode);
|
|
87
|
-
}
|
|
88
|
-
return lineBreakNode;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Update LineBreakNode in Lexical from Loro tree data
|
|
92
|
-
*/
|
|
93
|
-
export function updateLineBreakNodeFromLoro(treeId, lexicalNode, newParentNode, newIndex, options) {
|
|
94
|
-
// If parent or position changed, move the node
|
|
95
|
-
if (newParentNode && newIndex !== undefined) {
|
|
96
|
-
// Remove from current location
|
|
97
|
-
lexicalNode.remove();
|
|
98
|
-
// Insert at new location
|
|
99
|
-
newParentNode.splice(newIndex, 0, [lexicalNode]);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Delete LineBreakNode from Lexical
|
|
104
|
-
*/
|
|
105
|
-
export function deleteLineBreakNodeFromLoro(treeId, lexicalNode, options) {
|
|
106
|
-
if ($isLineBreakNode(lexicalNode)) {
|
|
107
|
-
lexicalNode.remove();
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Utility to check if a tree node represents a LineBreakNode
|
|
112
|
-
*/
|
|
113
|
-
export function isLineBreakNodeInTree(treeId, tree) {
|
|
114
|
-
if (!tree.has(treeId)) {
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
const treeNode = tree.getNodeByID(treeId);
|
|
118
|
-
return treeNode?.data.get('nodeType') === 'linebreak';
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Get LineBreakNode data from Loro tree
|
|
122
|
-
*/
|
|
123
|
-
export function getLineBreakNodeDataFromTree(treeId, tree) {
|
|
124
|
-
if (!tree.has(treeId)) {
|
|
125
|
-
return null;
|
|
126
|
-
}
|
|
127
|
-
const treeNode = tree.getNodeByID(treeId);
|
|
128
|
-
if (!treeNode || treeNode.data.get('nodeType') !== 'linebreak') {
|
|
129
|
-
return null;
|
|
130
|
-
}
|
|
131
|
-
return {
|
|
132
|
-
nodeType: 'linebreak',
|
|
133
|
-
createdAt: treeNode.data.get('createdAt'),
|
|
134
|
-
lastUpdated: treeNode.data.get('lastUpdated'),
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Main propagate method for LineBreakNode - propagates all mutation types
|
|
139
|
-
*/
|
|
140
|
-
export function propagateLineBreakNode(update, mutation, nodeKey, options) {
|
|
141
|
-
const { tree, peerId } = options;
|
|
142
|
-
switch (mutation) {
|
|
143
|
-
case 'created': {
|
|
144
|
-
const currentNode = update.editorState._nodeMap.get(nodeKey);
|
|
145
|
-
if (currentNode && $isLineBreakNode(currentNode)) {
|
|
146
|
-
// Get parent, positioning, and JSON data using editor state context
|
|
147
|
-
const { parentId, index, lexicalNodeJSON } = update.editorState.read(() => {
|
|
148
|
-
const parent = currentNode.getParent();
|
|
149
|
-
// Get parentId from the mapper instead of constructing it manually
|
|
150
|
-
const mapper = getNodeMapper();
|
|
151
|
-
const parentId = parent ? mapper.getTreeIDByLexicalKey(parent.getKey()) : undefined;
|
|
152
|
-
const index = currentNode.getIndexWithinParent();
|
|
153
|
-
// Export node data as JSON object within editor context where node methods are available
|
|
154
|
-
let lexicalNodeJSON = undefined;
|
|
155
|
-
try {
|
|
156
|
-
lexicalNodeJSON = currentNode.exportJSON();
|
|
157
|
-
}
|
|
158
|
-
catch (error) {
|
|
159
|
-
console.warn('Failed to export node JSON in propagateLineBreakNode created:', error);
|
|
160
|
-
}
|
|
161
|
-
return { parentId, index, lexicalNodeJSON };
|
|
162
|
-
});
|
|
163
|
-
createLineBreakNodeInLoro(nodeKey, parentId, index, lexicalNodeJSON, options);
|
|
164
|
-
}
|
|
165
|
-
break;
|
|
166
|
-
}
|
|
167
|
-
case 'updated': {
|
|
168
|
-
const currentNode = update.editorState._nodeMap.get(nodeKey);
|
|
169
|
-
if (currentNode && $isLineBreakNode(currentNode)) {
|
|
170
|
-
// Check if position changed and export data using editor state context
|
|
171
|
-
const { parentId, index, lexicalNodeJSON } = update.editorState.read(() => {
|
|
172
|
-
const parent = currentNode.getParent();
|
|
173
|
-
// Get parentId from the mapper instead of constructing it manually
|
|
174
|
-
const mapper = getNodeMapper();
|
|
175
|
-
const parentId = parent ? mapper.getTreeIDByLexicalKey(parent.getKey()) : undefined;
|
|
176
|
-
const index = currentNode.getIndexWithinParent();
|
|
177
|
-
// Export node data within editor context where node methods are available
|
|
178
|
-
let lexicalNodeJSON = undefined;
|
|
179
|
-
try {
|
|
180
|
-
lexicalNodeJSON = currentNode.exportJSON();
|
|
181
|
-
}
|
|
182
|
-
catch (error) {
|
|
183
|
-
console.warn('Failed to export node data in propagateLineBreakNode updated:', error);
|
|
184
|
-
}
|
|
185
|
-
return { parentId, index, lexicalNodeJSON };
|
|
186
|
-
});
|
|
187
|
-
updateLineBreakNodeInLoro(nodeKey, parentId, index, lexicalNodeJSON, options);
|
|
188
|
-
}
|
|
189
|
-
break;
|
|
190
|
-
}
|
|
191
|
-
case 'destroyed': {
|
|
192
|
-
deleteLineBreakNodeInLoro(nodeKey, options);
|
|
193
|
-
break;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { TreeID, LoroTree } from 'loro-crdt';
|
|
2
|
-
import { UpdateListenerPayload, NodeKey, RootNode } from 'lexical';
|
|
3
|
-
import { Binding } from '../Bindings';
|
|
4
|
-
/**
|
|
5
|
-
* RootNode Propagator for Loro Tree Collaboration
|
|
6
|
-
*
|
|
7
|
-
* The RootNode is special in Lexical:
|
|
8
|
-
* - Only one RootNode exists per EditorState
|
|
9
|
-
* - Cannot be subclassed or replaced
|
|
10
|
-
* - Represents the contenteditable element itself
|
|
11
|
-
* - Does not participate in mutation listeners
|
|
12
|
-
* - Has no parent or siblings
|
|
13
|
-
*
|
|
14
|
-
* Note: RootNode typically doesn't need mutation handling since it's
|
|
15
|
-
* always present and doesn't change structure, but we include it for completeness
|
|
16
|
-
*/
|
|
17
|
-
export interface RootNodeMutatorOptions {
|
|
18
|
-
binding: Binding;
|
|
19
|
-
tree: LoroTree;
|
|
20
|
-
peerId: number;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Handle RootNode creation (typically only happens once during initialization)
|
|
24
|
-
*/
|
|
25
|
-
export declare function createRootNodeInLoro(nodeKey: NodeKey, lexicalNodeJSON?: any, // JSON object from exportJSON()
|
|
26
|
-
options?: RootNodeMutatorOptions): TreeID;
|
|
27
|
-
/**
|
|
28
|
-
* Handle RootNode updates (rarely needed since root doesn't change much)
|
|
29
|
-
*/
|
|
30
|
-
export declare function updateRootNodeInLoro(nodeKey: NodeKey, lexicalNodeJSON?: any, // JSON object from exportJSON()
|
|
31
|
-
options?: RootNodeMutatorOptions): void;
|
|
32
|
-
/**
|
|
33
|
-
* Handle RootNode deletion (should rarely happen, but included for completeness)
|
|
34
|
-
*/
|
|
35
|
-
export declare function deleteRootNodeInLoro(nodeKey: NodeKey, options: RootNodeMutatorOptions): void;
|
|
36
|
-
/**
|
|
37
|
-
* Create RootNode in Lexical from Loro tree data
|
|
38
|
-
*/
|
|
39
|
-
export declare function createRootNodeFromLoro(treeId: TreeID, options: RootNodeMutatorOptions): RootNode | null;
|
|
40
|
-
/**
|
|
41
|
-
* Update RootNode in Lexical from Loro tree data
|
|
42
|
-
*/
|
|
43
|
-
export declare function updateRootNodeFromLoro(treeId: TreeID, options: RootNodeMutatorOptions): void;
|
|
44
|
-
/**
|
|
45
|
-
* Delete RootNode in Lexical (should not happen in normal operation)
|
|
46
|
-
*/
|
|
47
|
-
export declare function deleteRootNodeFromLoro(treeId: TreeID, options: RootNodeMutatorOptions): void;
|
|
48
|
-
/**
|
|
49
|
-
* Utility to check if a tree node represents a RootNode
|
|
50
|
-
*/
|
|
51
|
-
export declare function isRootNodeInTree(treeId: TreeID, tree: LoroTree): boolean;
|
|
52
|
-
/**
|
|
53
|
-
* Main propagate method for RootNode - propagates all mutation types
|
|
54
|
-
*/
|
|
55
|
-
export declare function propagateRootNode(update: UpdateListenerPayload, mutation: 'created' | 'updated' | 'destroyed', nodeKey: NodeKey, options: RootNodeMutatorOptions): void;
|