@datalayer/lexical-loro 0.1.0 → 0.2.1
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,258 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bidirectional mapping between Lexical NodeKeys and Loro TreeIDs
|
|
3
|
-
*/
|
|
4
|
-
export class NodeMapper {
|
|
5
|
-
// Maps Lexical NodeKey to Loro TreeID
|
|
6
|
-
lexicalToLoro = new Map();
|
|
7
|
-
// Maps Loro TreeID to Lexical NodeKey
|
|
8
|
-
loroToLexical = new Map();
|
|
9
|
-
tree;
|
|
10
|
-
constructor(binding) {
|
|
11
|
-
this.tree = binding.tree;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Create a bidirectional mapping between Lexical NodeKey and Loro TreeID
|
|
15
|
-
*/
|
|
16
|
-
createMapping(nodeKey, treeId) {
|
|
17
|
-
this.lexicalToLoro.set(nodeKey, treeId);
|
|
18
|
-
this.loroToLexical.set(treeId, nodeKey);
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Remove bidirectional mapping
|
|
22
|
-
*/
|
|
23
|
-
removeMapping(nodeKey, treeId) {
|
|
24
|
-
this.lexicalToLoro.delete(nodeKey);
|
|
25
|
-
this.loroToLexical.delete(treeId);
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Get Loro TreeNode based on Lexical NodeKey
|
|
29
|
-
* If the node doesn't exist, create it with proper parent-child relationship
|
|
30
|
-
*/
|
|
31
|
-
getLoroNodeByLexicalKey(nodeKey, lexicalNode, parentTreeID, index) {
|
|
32
|
-
// Check if mapping already exists
|
|
33
|
-
const existingTreeID = this.lexicalToLoro.get(nodeKey);
|
|
34
|
-
if (existingTreeID && this.tree.has(existingTreeID)) {
|
|
35
|
-
return this.tree.getNodeByID(existingTreeID);
|
|
36
|
-
}
|
|
37
|
-
// Get parent TreeID from Lexical node if not provided
|
|
38
|
-
if (!parentTreeID && lexicalNode) {
|
|
39
|
-
const lexicalParent = lexicalNode.getParent();
|
|
40
|
-
if (lexicalParent) {
|
|
41
|
-
const parentKey = lexicalParent.getKey();
|
|
42
|
-
parentTreeID = this.lexicalToLoro.get(parentKey);
|
|
43
|
-
// If parent doesn't exist in Loro, create it first
|
|
44
|
-
if (!parentTreeID) {
|
|
45
|
-
const parentLoroNode = this.getLoroNodeByLexicalKey(parentKey, lexicalParent, undefined, undefined);
|
|
46
|
-
parentTreeID = parentLoroNode.id;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
// Get index from Lexical node if not provided
|
|
51
|
-
if (index === undefined && lexicalNode) {
|
|
52
|
-
index = lexicalNode.getIndexWithinParent();
|
|
53
|
-
}
|
|
54
|
-
// Create new tree node if it doesn't exist
|
|
55
|
-
const newTreeID = this.createLoroNode(nodeKey, lexicalNode, parentTreeID, index);
|
|
56
|
-
return this.tree.getNodeByID(newTreeID);
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Get Lexical NodeKey based on Loro TreeID
|
|
60
|
-
* If the node doesn't exist in Lexical, it needs to be created externally
|
|
61
|
-
*/
|
|
62
|
-
getLexicalKeyByLoroId(treeId) {
|
|
63
|
-
// Check if mapping exists
|
|
64
|
-
const existingNodeKey = this.loroToLexical.get(treeId);
|
|
65
|
-
if (existingNodeKey) {
|
|
66
|
-
return existingNodeKey;
|
|
67
|
-
}
|
|
68
|
-
// If no mapping exists, we can't create a Lexical node here
|
|
69
|
-
// The caller should integrate Lexical node creation
|
|
70
|
-
return null;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Get Lexical Node from EditorState based on Loro TreeID
|
|
74
|
-
*/
|
|
75
|
-
getLexicalNodeByLoroId(treeId, editorState) {
|
|
76
|
-
const nodeKey = this.getLexicalKeyByLoroId(treeId);
|
|
77
|
-
if (!nodeKey) {
|
|
78
|
-
return null;
|
|
79
|
-
}
|
|
80
|
-
return editorState._nodeMap.get(nodeKey) || null;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Get Lexical parent node key for a Loro TreeID
|
|
84
|
-
* Returns null if no parent or if parent not found in Lexical
|
|
85
|
-
* Note: This method needs the LoroTree API to be clarified for parent relationships
|
|
86
|
-
*/
|
|
87
|
-
getLexicalParentByLoroId(treeId, loroTree) {
|
|
88
|
-
// TODO: Implement once LoroTree parent API is confirmed
|
|
89
|
-
// For now, we'll rely on the bidirectional mapping without tree traversal
|
|
90
|
-
return null;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Manually set bidirectional mapping between Lexical NodeKey and Loro TreeID
|
|
94
|
-
*/
|
|
95
|
-
setMapping(nodeKey, treeId) {
|
|
96
|
-
this.lexicalToLoro.set(nodeKey, treeId);
|
|
97
|
-
this.loroToLexical.set(treeId, nodeKey);
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Create a new Loro TreeNode and establish mapping
|
|
101
|
-
*/
|
|
102
|
-
createLoroNode(nodeKey, lexicalNode, parentTreeID, index) {
|
|
103
|
-
// Create the tree node first
|
|
104
|
-
const treeNode = this.tree.createNode(parentTreeID, index);
|
|
105
|
-
// Get the TreeID from the created node
|
|
106
|
-
const treeId = treeNode.id;
|
|
107
|
-
// Debug logging for parent relationship issues
|
|
108
|
-
if (parentTreeID) {
|
|
109
|
-
const actualParent = treeNode.parent();
|
|
110
|
-
if (!actualParent || actualParent.id !== parentTreeID) {
|
|
111
|
-
console.warn(`⚠️ Parent relationship not set correctly for ${nodeKey}: expected ${parentTreeID}, got ${actualParent?.id || 'None'}`);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
// Store basic metadata
|
|
115
|
-
treeNode.data.set('createdAt', Date.now());
|
|
116
|
-
// Store complete lexical node data if lexical node is provided
|
|
117
|
-
if (lexicalNode) {
|
|
118
|
-
try {
|
|
119
|
-
const lexicalNodeJSON = lexicalNode.exportJSON();
|
|
120
|
-
// Remove all key-related fields to avoid duplication (TreeID serves as the key)
|
|
121
|
-
if ('key' in lexicalNodeJSON || '__key' in lexicalNodeJSON || 'lexicalKey' in lexicalNodeJSON) {
|
|
122
|
-
const { key, __key, lexicalKey, ...cleanedData } = lexicalNodeJSON;
|
|
123
|
-
treeNode.data.set('lexical', cleanedData);
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
treeNode.data.set('lexical', lexicalNodeJSON);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
catch (error) {
|
|
130
|
-
console.warn('Failed to export lexical node JSON in NodesMapper:', error);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
// Create bidirectional mapping
|
|
134
|
-
this.createMapping(nodeKey, treeId);
|
|
135
|
-
return treeId;
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Update the mapping when a node is moved or modified
|
|
139
|
-
*/
|
|
140
|
-
updateMapping(oldNodeKey, newNodeKey) {
|
|
141
|
-
const treeId = this.lexicalToLoro.get(oldNodeKey);
|
|
142
|
-
if (treeId) {
|
|
143
|
-
this.removeMapping(oldNodeKey, treeId);
|
|
144
|
-
this.createMapping(newNodeKey, treeId);
|
|
145
|
-
// Update timestamp in tree node data
|
|
146
|
-
const treeNode = this.tree.getNodeByID(treeId);
|
|
147
|
-
if (treeNode) {
|
|
148
|
-
treeNode.data.set('updatedAt', Date.now());
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Remove mapping when a node is deleted
|
|
154
|
-
*/
|
|
155
|
-
deleteMapping(nodeKey) {
|
|
156
|
-
const treeId = this.lexicalToLoro.get(nodeKey);
|
|
157
|
-
if (treeId) {
|
|
158
|
-
this.removeMapping(nodeKey, treeId);
|
|
159
|
-
// Delete the tree node
|
|
160
|
-
if (this.tree.has(treeId)) {
|
|
161
|
-
this.tree.delete(treeId);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Get TreeID by Lexical NodeKey (without creating if not found)
|
|
167
|
-
*/
|
|
168
|
-
getTreeIDByLexicalKey(nodeKey) {
|
|
169
|
-
return this.lexicalToLoro.get(nodeKey);
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* Check if a mapping exists for a Lexical NodeKey
|
|
173
|
-
*/
|
|
174
|
-
hasLexicalMapping(nodeKey) {
|
|
175
|
-
return this.lexicalToLoro.has(nodeKey);
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Check if a mapping exists for a Loro TreeID
|
|
179
|
-
*/
|
|
180
|
-
hasLoroMapping(treeId) {
|
|
181
|
-
return this.loroToLexical.has(treeId);
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Get all current mappings (for debugging)
|
|
185
|
-
*/
|
|
186
|
-
getAllMappings() {
|
|
187
|
-
return {
|
|
188
|
-
lexicalToLoro: new Map(this.lexicalToLoro),
|
|
189
|
-
loroToLexical: new Map(this.loroToLexical)
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Clear all mappings (useful for testing or reset)
|
|
194
|
-
*/
|
|
195
|
-
clearMappings() {
|
|
196
|
-
this.lexicalToLoro.clear();
|
|
197
|
-
this.loroToLexical.clear();
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Synchronize existing tree nodes with Lexical editor state
|
|
201
|
-
* This should be called during initialization to establish mappings
|
|
202
|
-
*
|
|
203
|
-
* Note: Since lexicalKey is no longer persisted in tree node data,
|
|
204
|
-
* this method now relies on the TreeIntegrator to create mappings
|
|
205
|
-
* as nodes are integrated from Loro tree operations.
|
|
206
|
-
*/
|
|
207
|
-
syncExistingNodes(editorState) {
|
|
208
|
-
// Since we no longer persist lexicalKey in tree node data,
|
|
209
|
-
// we cannot automatically establish mappings from existing tree nodes.
|
|
210
|
-
//
|
|
211
|
-
// Instead, mappings will be established through:
|
|
212
|
-
// 1. TreeIntegrator processing tree diffs during initialization
|
|
213
|
-
// 2. Normal collaboration flow as nodes are created/updated
|
|
214
|
-
//
|
|
215
|
-
// This method is kept for compatibility but is now a no-op.
|
|
216
|
-
console.log('📍 syncExistingNodes: Skipping sync - mappings established through TreeIntegrator');
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
// Global instance to be shared across the application
|
|
220
|
-
let globalNodeMapper = null;
|
|
221
|
-
/**
|
|
222
|
-
* Initialize the global node mapper
|
|
223
|
-
*/
|
|
224
|
-
export function initializeNodeMapper(binding) {
|
|
225
|
-
globalNodeMapper = new NodeMapper(binding);
|
|
226
|
-
return globalNodeMapper;
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Get the global node mapper instance
|
|
230
|
-
*/
|
|
231
|
-
export function getNodeMapper() {
|
|
232
|
-
if (!globalNodeMapper) {
|
|
233
|
-
throw new Error('NodeMapper not initialized. Call initializeNodeMapper() first.');
|
|
234
|
-
}
|
|
235
|
-
return globalNodeMapper;
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* Utility functions for common operations
|
|
239
|
-
*/
|
|
240
|
-
/**
|
|
241
|
-
* Get Loro TreeNode by Lexical NodeKey (using global mapper)
|
|
242
|
-
*/
|
|
243
|
-
export function getLoroNodeByLexicalKey(nodeKey, lexicalNode, parentTreeID, index) {
|
|
244
|
-
return getNodeMapper().getLoroNodeByLexicalKey(nodeKey, lexicalNode, parentTreeID, index);
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Get Lexical NodeKey by Loro TreeID (using global mapper)
|
|
248
|
-
*/
|
|
249
|
-
export function getLexicalKeyByLoroId(treeId) {
|
|
250
|
-
return getNodeMapper().getLexicalKeyByLoroId(treeId);
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Get Lexical Node by Loro TreeID (using global mapper)
|
|
254
|
-
*/
|
|
255
|
-
export function getLexicalNodeByLoroId(treeId, editorState) {
|
|
256
|
-
return getNodeMapper().getLexicalNodeByLoroId(treeId, editorState);
|
|
257
|
-
}
|
|
258
|
-
// createLexicalNodeFromLoro function is now imported from NodeFactory
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { TreeID, LoroTree } from 'loro-crdt';
|
|
2
|
-
import { DecoratorNode, UpdateListenerPayload, NodeKey, ElementNode } from 'lexical';
|
|
3
|
-
import { Binding } from '../Bindings';
|
|
4
|
-
/**
|
|
5
|
-
* DecoratorNode Propagator for Loro Tree Collaboration
|
|
6
|
-
*
|
|
7
|
-
* DecoratorNode characteristics:
|
|
8
|
-
* - Wraps arbitrary view (React components, DOM nodes, etc.)
|
|
9
|
-
* - Acts as opaque wrapper around external components
|
|
10
|
-
* - Cannot have children in the traditional sense
|
|
11
|
-
* - Renders through decorate() method which returns the view
|
|
12
|
-
* - Examples: Images, Videos, Tweets, Charts, Custom Widgets
|
|
13
|
-
*/
|
|
14
|
-
export interface DecoratorNodeMutatorOptions {
|
|
15
|
-
binding: Binding;
|
|
16
|
-
tree: LoroTree;
|
|
17
|
-
peerId: number;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Create DecoratorNode in Loro tree
|
|
21
|
-
*/
|
|
22
|
-
export declare function createDecoratorNodeInLoro(nodeKey: NodeKey, decoratorType: string, // 'image', 'video', 'tweet', 'chart', etc.
|
|
23
|
-
decoratorData: any, // The data needed to render the decorator
|
|
24
|
-
parentId?: TreeID, index?: number, metadata?: Record<string, any>, lexicalNodeJSON?: any, // JSON object from exportJSON()
|
|
25
|
-
options?: DecoratorNodeMutatorOptions): TreeID;
|
|
26
|
-
/**
|
|
27
|
-
* Update DecoratorNode in Loro tree
|
|
28
|
-
*/
|
|
29
|
-
export declare function updateDecoratorNodeInLoro(nodeKey: NodeKey, decoratorType?: string, decoratorData?: any, parentId?: TreeID, index?: number, metadata?: Record<string, any>, lexicalNodeJSON?: any, // JSON object from exportJSON()
|
|
30
|
-
options?: DecoratorNodeMutatorOptions): void;
|
|
31
|
-
/**
|
|
32
|
-
* Delete DecoratorNode from Loro tree
|
|
33
|
-
*/
|
|
34
|
-
export declare function deleteDecoratorNodeInLoro(nodeKey: NodeKey, options: DecoratorNodeMutatorOptions): void;
|
|
35
|
-
/**
|
|
36
|
-
* Create DecoratorNode in Lexical from Loro tree data
|
|
37
|
-
* Note: This is a generic implementation. In practice, you'd need
|
|
38
|
-
* specific decorator node classes for each type (ImageNode, VideoNode, etc.)
|
|
39
|
-
*/
|
|
40
|
-
export declare function createDecoratorNodeFromLoro(treeId: TreeID, parentNode: ElementNode, index?: number, options?: DecoratorNodeMutatorOptions): DecoratorNode<any> | null;
|
|
41
|
-
/**
|
|
42
|
-
* Update DecoratorNode in Lexical from Loro tree data
|
|
43
|
-
*/
|
|
44
|
-
export declare function updateDecoratorNodeFromLoro(treeId: TreeID, lexicalNode: DecoratorNode<any>, newParentNode?: ElementNode, newIndex?: number, options?: DecoratorNodeMutatorOptions): void;
|
|
45
|
-
/**
|
|
46
|
-
* Delete DecoratorNode from Lexical
|
|
47
|
-
*/
|
|
48
|
-
export declare function deleteDecoratorNodeFromLoro(treeId: TreeID, lexicalNode: DecoratorNode<any>, options?: DecoratorNodeMutatorOptions): void;
|
|
49
|
-
/**
|
|
50
|
-
* Utility to check if a tree node represents a DecoratorNode
|
|
51
|
-
*/
|
|
52
|
-
export declare function isDecoratorNodeInTree(treeId: TreeID, tree: LoroTree): boolean;
|
|
53
|
-
/**
|
|
54
|
-
* Get DecoratorNode data from Loro tree
|
|
55
|
-
*/
|
|
56
|
-
export declare function getDecoratorNodeDataFromTree(treeId: TreeID, tree: LoroTree): any;
|
|
57
|
-
/**
|
|
58
|
-
* Main propagate method for DecoratorNode - propagates all mutation types
|
|
59
|
-
*/
|
|
60
|
-
export declare function propagateDecoratorNode(update: UpdateListenerPayload, mutation: 'created' | 'updated' | 'destroyed', nodeKey: NodeKey, options: DecoratorNodeMutatorOptions): void;
|
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
import { DecoratorNode, $isDecoratorNode } from 'lexical';
|
|
2
|
-
import { getNodeMapper } from '../nodes/NodesMapper';
|
|
3
|
-
/**
|
|
4
|
-
* Create DecoratorNode in Loro tree
|
|
5
|
-
*/
|
|
6
|
-
export function createDecoratorNodeInLoro(nodeKey, decoratorType, // 'image', 'video', 'tweet', 'chart', etc.
|
|
7
|
-
decoratorData, // The data needed to render the decorator
|
|
8
|
-
parentId, index, metadata, lexicalNodeJSON, // JSON object from exportJSON()
|
|
9
|
-
options) {
|
|
10
|
-
const mapper = getNodeMapper();
|
|
11
|
-
// Use mapper to get or create the tree node (don't pass lexicalNode to avoid context issues)
|
|
12
|
-
const treeNode = mapper.getLoroNodeByLexicalKey(nodeKey, undefined, // don't pass lexicalNode to avoid context issues
|
|
13
|
-
parentId, index);
|
|
14
|
-
// Store complete lexical node data as clean JSON if provided
|
|
15
|
-
if (lexicalNodeJSON) {
|
|
16
|
-
// Store complete lexical JSON without all key-related fields
|
|
17
|
-
const { key, __key, lexicalKey, ...cleanedData } = lexicalNodeJSON;
|
|
18
|
-
treeNode.data.set('lexical', cleanedData);
|
|
19
|
-
}
|
|
20
|
-
// Store only essential metadata
|
|
21
|
-
treeNode.data.set('elementType', 'decorator');
|
|
22
|
-
treeNode.data.set('createdAt', Date.now());
|
|
23
|
-
// The exported Lexical node data is already propagated by the mapper
|
|
24
|
-
// Return the TreeID from the node's ID
|
|
25
|
-
return treeNode.id;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Update DecoratorNode in Loro tree
|
|
29
|
-
*/
|
|
30
|
-
export function updateDecoratorNodeInLoro(nodeKey, decoratorType, decoratorData, parentId, index, metadata, lexicalNodeJSON, // JSON object from exportJSON()
|
|
31
|
-
options) {
|
|
32
|
-
const mapper = getNodeMapper();
|
|
33
|
-
// Get the existing Loro node from the mapper
|
|
34
|
-
const treeNode = mapper.getLoroNodeByLexicalKey(nodeKey, undefined);
|
|
35
|
-
if (!treeNode) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
const { tree } = options;
|
|
39
|
-
const treeId = treeNode.id;
|
|
40
|
-
// Store complete lexical node data as clean JSON if provided
|
|
41
|
-
if (lexicalNodeJSON) {
|
|
42
|
-
// Store complete lexical JSON without all key-related fields
|
|
43
|
-
const { key, __key, lexicalKey, ...cleanedData } = lexicalNodeJSON;
|
|
44
|
-
treeNode.data.set('lexical', cleanedData);
|
|
45
|
-
}
|
|
46
|
-
// All decorator information is now contained in lexical data object
|
|
47
|
-
// Move the node if parent or position changed
|
|
48
|
-
if (parentId !== undefined || index !== undefined) {
|
|
49
|
-
tree.move(treeId, parentId, index);
|
|
50
|
-
}
|
|
51
|
-
// Update only essential metadata
|
|
52
|
-
treeNode.data.set('elementType', 'decorator');
|
|
53
|
-
treeNode.data.set('lastUpdated', Date.now());
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Delete DecoratorNode from Loro tree
|
|
57
|
-
*/
|
|
58
|
-
export function deleteDecoratorNodeInLoro(nodeKey, options) {
|
|
59
|
-
const mapper = getNodeMapper();
|
|
60
|
-
// Use the mapper's delete method which propagates TreeID lookup internally
|
|
61
|
-
mapper.deleteMapping(nodeKey);
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Create DecoratorNode in Lexical from Loro tree data
|
|
65
|
-
* Note: This is a generic implementation. In practice, you'd need
|
|
66
|
-
* specific decorator node classes for each type (ImageNode, VideoNode, etc.)
|
|
67
|
-
*/
|
|
68
|
-
export function createDecoratorNodeFromLoro(treeId, parentNode, index, options) {
|
|
69
|
-
const { tree } = options;
|
|
70
|
-
if (!tree.has(treeId)) {
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
const treeNode = tree.getNodeByID(treeId);
|
|
74
|
-
if (!treeNode) {
|
|
75
|
-
return null;
|
|
76
|
-
}
|
|
77
|
-
// Get LexicalNodeData (JSON object format only)
|
|
78
|
-
const lexicalData = treeNode.data.get('lexical');
|
|
79
|
-
let decoratorNode;
|
|
80
|
-
if (lexicalData && typeof lexicalData === 'object') {
|
|
81
|
-
// For DecoratorNode, we need to propagate this case appropriately
|
|
82
|
-
// But DecoratorNodes are complex and might need special handling
|
|
83
|
-
console.warn(`DecoratorNode creation from JSON object not fully implemented for TreeID: ${treeId}`);
|
|
84
|
-
return null;
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
// No lexical JSON data found - cannot create DecoratorNode
|
|
88
|
-
console.warn('No lexical JSON data found for DecoratorNode TreeID:', treeId);
|
|
89
|
-
return null;
|
|
90
|
-
}
|
|
91
|
-
// Insert into the parent at the specified index
|
|
92
|
-
if (index !== undefined && index >= 0) {
|
|
93
|
-
parentNode.splice(index, 0, [decoratorNode]);
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
parentNode.append(decoratorNode);
|
|
97
|
-
}
|
|
98
|
-
return decoratorNode;
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Update DecoratorNode in Lexical from Loro tree data
|
|
102
|
-
*/
|
|
103
|
-
export function updateDecoratorNodeFromLoro(treeId, lexicalNode, newParentNode, newIndex, options) {
|
|
104
|
-
const { tree } = options;
|
|
105
|
-
if (!tree.has(treeId)) {
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
const treeNode = tree.getNodeByID(treeId);
|
|
109
|
-
if (!treeNode || treeNode.data.get('nodeType') !== 'decorator') {
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
// Update decorator data if it has changed
|
|
113
|
-
const decoratorDataStr = treeNode.data.get('decoratorData');
|
|
114
|
-
let decoratorData;
|
|
115
|
-
try {
|
|
116
|
-
decoratorData = decoratorDataStr && typeof decoratorDataStr === 'string'
|
|
117
|
-
? JSON.parse(decoratorDataStr) : {};
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
console.warn('Failed to parse decorator data:', error);
|
|
121
|
-
decoratorData = {};
|
|
122
|
-
}
|
|
123
|
-
// Update the decorator's data (implementation depends on the specific decorator type)
|
|
124
|
-
if (typeof lexicalNode.updateData === 'function') {
|
|
125
|
-
lexicalNode.updateData(decoratorData);
|
|
126
|
-
}
|
|
127
|
-
// If parent or position changed, move the node
|
|
128
|
-
if (newParentNode && newIndex !== undefined) {
|
|
129
|
-
// Remove from current location
|
|
130
|
-
lexicalNode.remove();
|
|
131
|
-
// Insert at new location
|
|
132
|
-
newParentNode.splice(newIndex, 0, [lexicalNode]);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Delete DecoratorNode from Lexical
|
|
137
|
-
*/
|
|
138
|
-
export function deleteDecoratorNodeFromLoro(treeId, lexicalNode, options) {
|
|
139
|
-
if ($isDecoratorNode(lexicalNode)) {
|
|
140
|
-
lexicalNode.remove();
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Utility to check if a tree node represents a DecoratorNode
|
|
145
|
-
*/
|
|
146
|
-
export function isDecoratorNodeInTree(treeId, tree) {
|
|
147
|
-
if (!tree.has(treeId)) {
|
|
148
|
-
return false;
|
|
149
|
-
}
|
|
150
|
-
const treeNode = tree.getNodeByID(treeId);
|
|
151
|
-
return treeNode?.data.get('nodeType') === 'decorator';
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Get DecoratorNode data from Loro tree
|
|
155
|
-
*/
|
|
156
|
-
export function getDecoratorNodeDataFromTree(treeId, tree) {
|
|
157
|
-
if (!tree.has(treeId)) {
|
|
158
|
-
return null;
|
|
159
|
-
}
|
|
160
|
-
const treeNode = tree.getNodeByID(treeId);
|
|
161
|
-
if (!treeNode || treeNode.data.get('nodeType') !== 'decorator') {
|
|
162
|
-
return null;
|
|
163
|
-
}
|
|
164
|
-
const decoratorDataStr = treeNode.data.get('decoratorData');
|
|
165
|
-
let decoratorData;
|
|
166
|
-
try {
|
|
167
|
-
decoratorData = decoratorDataStr && typeof decoratorDataStr === 'string'
|
|
168
|
-
? JSON.parse(decoratorDataStr) : {};
|
|
169
|
-
}
|
|
170
|
-
catch (error) {
|
|
171
|
-
console.warn('Failed to parse decorator data:', error);
|
|
172
|
-
decoratorData = {};
|
|
173
|
-
}
|
|
174
|
-
return {
|
|
175
|
-
nodeType: 'decorator',
|
|
176
|
-
decoratorType: treeNode.data.get('decoratorType'),
|
|
177
|
-
decoratorData,
|
|
178
|
-
createdAt: treeNode.data.get('createdAt'),
|
|
179
|
-
lastUpdated: treeNode.data.get('lastUpdated'),
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Generic DecoratorNode implementation for demonstration purposes
|
|
184
|
-
* In a real application, you'd have specific decorator node classes
|
|
185
|
-
*/
|
|
186
|
-
class GenericDecoratorNode extends DecoratorNode {
|
|
187
|
-
__decoratorType;
|
|
188
|
-
__decoratorData;
|
|
189
|
-
constructor(decoratorType, decoratorData, key) {
|
|
190
|
-
super(key);
|
|
191
|
-
this.__decoratorType = decoratorType;
|
|
192
|
-
this.__decoratorData = decoratorData;
|
|
193
|
-
}
|
|
194
|
-
static getType() {
|
|
195
|
-
return 'generic-decorator';
|
|
196
|
-
}
|
|
197
|
-
static clone(node) {
|
|
198
|
-
return new GenericDecoratorNode(node.__decoratorType, node.__decoratorData, node.__key);
|
|
199
|
-
}
|
|
200
|
-
createDOM() {
|
|
201
|
-
const div = document.createElement('div');
|
|
202
|
-
div.className = `decorator-${this.__decoratorType}`;
|
|
203
|
-
div.textContent = `[${this.__decoratorType}]`;
|
|
204
|
-
return div;
|
|
205
|
-
}
|
|
206
|
-
updateDOM() {
|
|
207
|
-
return false;
|
|
208
|
-
}
|
|
209
|
-
decorate() {
|
|
210
|
-
return {
|
|
211
|
-
type: this.__decoratorType,
|
|
212
|
-
data: this.__decoratorData,
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
isInline() {
|
|
216
|
-
return false;
|
|
217
|
-
}
|
|
218
|
-
updateData(newData) {
|
|
219
|
-
const writable = this.getWritable();
|
|
220
|
-
writable.__decoratorData = newData;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Main propagate method for DecoratorNode - propagates all mutation types
|
|
225
|
-
*/
|
|
226
|
-
export function propagateDecoratorNode(update, mutation, nodeKey, options) {
|
|
227
|
-
const { tree, peerId } = options;
|
|
228
|
-
switch (mutation) {
|
|
229
|
-
case 'created': {
|
|
230
|
-
const currentNode = update.editorState._nodeMap.get(nodeKey);
|
|
231
|
-
if (currentNode && $isDecoratorNode(currentNode)) {
|
|
232
|
-
// Get node data using editor state context
|
|
233
|
-
const { parentId, index, decoratorType, decoratorData, metadata, lexicalNodeJSON } = update.editorState.read(() => {
|
|
234
|
-
// Get parent and index for proper positioning
|
|
235
|
-
const parent = currentNode.getParent();
|
|
236
|
-
// Get parentId from the mapper instead of constructing it manually
|
|
237
|
-
const mapper = getNodeMapper();
|
|
238
|
-
const parentId = parent ? mapper.getTreeIDByLexicalKey(parent.getKey()) : undefined;
|
|
239
|
-
const index = currentNode.getIndexWithinParent();
|
|
240
|
-
// Get decorator type and data
|
|
241
|
-
const decoratorType = currentNode.getType();
|
|
242
|
-
// For DecoratorNode, we'll store the node's internal data instead of calling decorate
|
|
243
|
-
const decoratorData = currentNode.__decoratorData || {};
|
|
244
|
-
// Collect additional metadata
|
|
245
|
-
const metadata = {};
|
|
246
|
-
if (typeof currentNode.isInline === 'function') {
|
|
247
|
-
metadata.isInline = currentNode.isInline();
|
|
248
|
-
}
|
|
249
|
-
// Export node data within editor context where node methods are available
|
|
250
|
-
let lexicalNodeJSON = undefined;
|
|
251
|
-
try {
|
|
252
|
-
lexicalNodeJSON = currentNode.exportJSON();
|
|
253
|
-
}
|
|
254
|
-
catch (error) {
|
|
255
|
-
console.warn('Failed to export node data in propagateDecoratorNode created:', error);
|
|
256
|
-
}
|
|
257
|
-
return { parentId, index, decoratorType, decoratorData, metadata, lexicalNodeJSON };
|
|
258
|
-
});
|
|
259
|
-
createDecoratorNodeInLoro(nodeKey, decoratorType, decoratorData, parentId, index, metadata, lexicalNodeJSON, options);
|
|
260
|
-
}
|
|
261
|
-
break;
|
|
262
|
-
}
|
|
263
|
-
case 'updated': {
|
|
264
|
-
const currentNode = update.editorState._nodeMap.get(nodeKey);
|
|
265
|
-
if (currentNode && $isDecoratorNode(currentNode)) {
|
|
266
|
-
// Get node data using editor state context
|
|
267
|
-
const { parentId, index, decoratorType, decoratorData, metadata, lexicalNodeJSON } = update.editorState.read(() => {
|
|
268
|
-
// Get current position
|
|
269
|
-
const parent = currentNode.getParent();
|
|
270
|
-
// Get parentId from the mapper instead of constructing it manually
|
|
271
|
-
const mapper = getNodeMapper();
|
|
272
|
-
const parentId = parent ? mapper.getTreeIDByLexicalKey(parent.getKey()) : undefined;
|
|
273
|
-
const index = currentNode.getIndexWithinParent();
|
|
274
|
-
// Get updated decorator type and data
|
|
275
|
-
const decoratorType = currentNode.getType();
|
|
276
|
-
// For DecoratorNode, we'll store the node's internal data instead of calling decorate
|
|
277
|
-
const decoratorData = currentNode.__decoratorData || {};
|
|
278
|
-
// Collect metadata
|
|
279
|
-
const metadata = {};
|
|
280
|
-
if (typeof currentNode.isInline === 'function') {
|
|
281
|
-
metadata.isInline = currentNode.isInline();
|
|
282
|
-
}
|
|
283
|
-
// Export node data within editor context where node methods are available
|
|
284
|
-
let lexicalNodeJSON = undefined;
|
|
285
|
-
try {
|
|
286
|
-
lexicalNodeJSON = currentNode.exportJSON();
|
|
287
|
-
}
|
|
288
|
-
catch (error) {
|
|
289
|
-
console.warn('Failed to export node data in propagateDecoratorNode updated:', error);
|
|
290
|
-
}
|
|
291
|
-
return { parentId, index, decoratorType, decoratorData, metadata, lexicalNodeJSON };
|
|
292
|
-
});
|
|
293
|
-
updateDecoratorNodeInLoro(nodeKey, decoratorType, decoratorData, parentId, index, metadata, lexicalNodeJSON, options);
|
|
294
|
-
}
|
|
295
|
-
break;
|
|
296
|
-
}
|
|
297
|
-
case 'destroyed': {
|
|
298
|
-
deleteDecoratorNodeInLoro(nodeKey, options);
|
|
299
|
-
break;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { TreeID, LoroTree } from 'loro-crdt';
|
|
2
|
-
import { ElementNode, UpdateListenerPayload, NodeKey } from 'lexical';
|
|
3
|
-
import { Binding } from '../Bindings';
|
|
4
|
-
/**
|
|
5
|
-
* ElementNode Propagator for Loro Tree Collaboration
|
|
6
|
-
*
|
|
7
|
-
* ElementNode characteristics:
|
|
8
|
-
* - Parent nodes that can contain other nodes (including other ElementNodes)
|
|
9
|
-
* - Examples: ParagraphNode, HeadingNode, QuoteNode, LinkNode, etc.
|
|
10
|
-
* - Can have formatting (bold, italic, etc.) and styles
|
|
11
|
-
* - Can have children and maintain parent/child relationships
|
|
12
|
-
* - Can be extended to create custom element types
|
|
13
|
-
*/
|
|
14
|
-
export interface ElementNodeMutatorOptions {
|
|
15
|
-
binding: Binding;
|
|
16
|
-
tree: LoroTree;
|
|
17
|
-
peerId: number;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Create ElementNode in Loro tree
|
|
21
|
-
*/
|
|
22
|
-
export declare function createElementNodeInLoro(nodeKey: NodeKey, elementType: string, // 'paragraph', 'heading', 'quote', 'link', etc.
|
|
23
|
-
parentId?: TreeID, index?: number, metadata?: Record<string, any>, lexicalNodeJSON?: any, // JSON object from exportJSON()
|
|
24
|
-
options?: ElementNodeMutatorOptions): TreeID;
|
|
25
|
-
/**
|
|
26
|
-
* Update ElementNode in Loro tree
|
|
27
|
-
*/
|
|
28
|
-
export declare function updateElementNodeInLoro(nodeKey: NodeKey, elementType?: string, parentId?: TreeID, index?: number, metadata?: Record<string, any>, lexicalNodeJSON?: any, // JSON object from exportJSON()
|
|
29
|
-
options?: ElementNodeMutatorOptions): void;
|
|
30
|
-
/**
|
|
31
|
-
* Delete ElementNode from Loro tree
|
|
32
|
-
*/
|
|
33
|
-
export declare function deleteElementNodeInLoro(nodeKey: NodeKey, options: ElementNodeMutatorOptions): void;
|
|
34
|
-
/**
|
|
35
|
-
* Create ElementNode in Lexical from Loro tree data
|
|
36
|
-
*/
|
|
37
|
-
export declare function createElementNodeFromLoro(treeId: TreeID, parentNode: ElementNode, // The Lexical parent node where this should be inserted
|
|
38
|
-
index?: number, options?: ElementNodeMutatorOptions): ElementNode | null;
|
|
39
|
-
/**
|
|
40
|
-
* Update ElementNode in Lexical from Loro tree data
|
|
41
|
-
*/
|
|
42
|
-
export declare function updateElementNodeFromLoro(treeId: TreeID, lexicalNode: ElementNode, newParentNode?: ElementNode, newIndex?: number, options?: ElementNodeMutatorOptions): void;
|
|
43
|
-
/**
|
|
44
|
-
* Delete ElementNode from Lexical
|
|
45
|
-
*/
|
|
46
|
-
export declare function deleteElementNodeFromLoro(treeId: TreeID, lexicalNode: ElementNode, options?: ElementNodeMutatorOptions): void;
|
|
47
|
-
/**
|
|
48
|
-
* Utility to check if a tree node represents an ElementNode
|
|
49
|
-
*/
|
|
50
|
-
export declare function isElementNodeInTree(treeId: TreeID, tree: LoroTree): boolean;
|
|
51
|
-
/**
|
|
52
|
-
* Get ElementNode data from Loro tree
|
|
53
|
-
*/
|
|
54
|
-
export declare function getElementNodeDataFromTree(treeId: TreeID, tree: LoroTree): any;
|
|
55
|
-
/**
|
|
56
|
-
* Sync ElementNode children relationships in Loro tree
|
|
57
|
-
*/
|
|
58
|
-
export declare function syncElementNodeChildrenInLoro(nodeKey: NodeKey, childKeys: string[], options: ElementNodeMutatorOptions): void;
|
|
59
|
-
/**
|
|
60
|
-
* Main propagate method for ElementNode - propagates all mutation types
|
|
61
|
-
*/
|
|
62
|
-
export declare function propagateElementNode(update: UpdateListenerPayload, mutation: 'created' | 'updated' | 'destroyed', nodeKey: NodeKey, options: ElementNodeMutatorOptions): void;
|