@datalayer/lexical-loro 0.0.7 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -137
- package/lib/App.d.ts +2 -0
- package/lib/App.js +141 -0
- package/lib/Editor.d.ts +2 -0
- package/lib/Editor.js +111 -0
- package/lib/Settings.d.ts +2 -0
- package/lib/Settings.js +57 -0
- package/lib/appSettings.d.ts +36 -0
- package/lib/appSettings.js +44 -0
- package/lib/collab/loro/Bindings.d.ts +41 -0
- package/lib/collab/loro/Bindings.js +95 -0
- package/lib/collab/loro/Debug.d.ts +33 -0
- package/lib/collab/loro/Debug.js +448 -0
- package/lib/collab/loro/LexicalCollaborationContext.d.ts +19 -0
- package/lib/collab/loro/LexicalCollaborationContext.js +48 -0
- package/lib/collab/loro/LexicalCollaborationPlugin.d.ts +24 -0
- package/lib/collab/loro/LexicalCollaborationPlugin.js +83 -0
- package/lib/collab/loro/State.d.ts +53 -0
- package/lib/collab/loro/State.js +90 -0
- package/lib/collab/loro/components/LoroCollaborationUI.d.ts +13 -0
- package/lib/collab/loro/components/LoroCollaborationUI.js +9 -0
- package/lib/collab/loro/components/LoroCollaborators.d.ts +8 -0
- package/lib/collab/loro/components/LoroCollaborators.js +97 -0
- package/lib/collab/loro/components/index.d.ts +2 -0
- package/lib/collab/loro/components/index.js +2 -0
- package/lib/collab/loro/index.d.ts +6 -0
- package/lib/collab/loro/index.js +6 -0
- package/lib/collab/loro/integrators/BaseIntegrator.d.ts +14 -0
- package/lib/collab/loro/integrators/BaseIntegrator.js +1 -0
- package/lib/collab/loro/integrators/CounterIntegrator.d.ts +23 -0
- package/lib/collab/loro/integrators/CounterIntegrator.js +40 -0
- package/lib/collab/loro/integrators/ListIntegrator.d.ts +23 -0
- package/lib/collab/loro/integrators/ListIntegrator.js +49 -0
- package/lib/collab/loro/integrators/MapIntegrator.d.ts +24 -0
- package/lib/collab/loro/integrators/MapIntegrator.js +177 -0
- package/lib/collab/loro/integrators/TextIntegrator.d.ts +25 -0
- package/lib/collab/loro/integrators/TextIntegrator.js +51 -0
- package/lib/collab/loro/integrators/TreeIntegrator.d.ts +25 -0
- package/lib/collab/loro/integrators/TreeIntegrator.js +201 -0
- package/lib/collab/loro/nodes/NodeFactory.d.ts +8 -0
- package/lib/collab/loro/nodes/NodeFactory.js +105 -0
- package/lib/collab/loro/nodes/NodesMapper.d.ts +111 -0
- package/lib/collab/loro/nodes/NodesMapper.js +258 -0
- package/lib/collab/loro/propagators/DecoratorNodePropagator.d.ts +60 -0
- package/lib/collab/loro/propagators/DecoratorNodePropagator.js +302 -0
- package/lib/collab/loro/propagators/ElementNodePropagator.d.ts +62 -0
- package/lib/collab/loro/propagators/ElementNodePropagator.js +335 -0
- package/lib/collab/loro/propagators/LineBreakNodePropagator.d.ts +57 -0
- package/lib/collab/loro/propagators/LineBreakNodePropagator.js +196 -0
- package/lib/collab/loro/propagators/RootNodePropagator.d.ts +55 -0
- package/lib/collab/loro/propagators/RootNodePropagator.js +168 -0
- package/lib/collab/loro/propagators/TextNodePropagator.d.ts +60 -0
- package/lib/collab/loro/propagators/TextNodePropagator.js +434 -0
- package/lib/collab/loro/propagators/index.d.ts +49 -0
- package/lib/collab/loro/propagators/index.js +32 -0
- package/lib/collab/loro/provider/websocket.d.ts +116 -0
- package/lib/collab/loro/provider/websocket.js +907 -0
- 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 +5 -0
- package/lib/collab/loro/servers/ws/callback.js +85 -0
- package/lib/collab/loro/servers/ws/server.d.ts +2 -0
- package/lib/collab/loro/servers/ws/server.js +25 -0
- package/lib/collab/loro/servers/ws/utils.d.ts +40 -0
- package/lib/collab/loro/servers/ws/utils.js +513 -0
- package/lib/collab/loro/sync/SyncCursors.d.ts +32 -0
- package/lib/collab/loro/sync/SyncCursors.js +435 -0
- package/lib/collab/loro/sync/SyncLexicalToLoro.d.ts +4 -0
- package/lib/collab/loro/sync/SyncLexicalToLoro.js +80 -0
- package/lib/collab/loro/sync/SyncLoroToLexical.d.ts +5 -0
- package/lib/collab/loro/sync/SyncLoroToLexical.js +96 -0
- package/lib/collab/loro/types/LexicalNodeData.d.ts +32 -0
- package/lib/collab/loro/types/LexicalNodeData.js +71 -0
- package/lib/collab/loro/useCollaboration.d.ts +12 -0
- package/lib/collab/loro/useCollaboration.js +248 -0
- package/lib/collab/loro/utils/InitialContent.d.ts +64 -0
- package/lib/collab/loro/utils/InitialContent.js +109 -0
- package/lib/collab/loro/utils/LexicalToLoro.d.ts +18 -0
- package/lib/collab/loro/utils/LexicalToLoro.js +96 -0
- package/lib/collab/loro/utils/Utils.d.ts +44 -0
- package/lib/collab/loro/utils/Utils.js +153 -0
- package/lib/collab/loro/wsProvider.d.ts +8 -0
- package/lib/collab/loro/wsProvider.js +31 -0
- package/lib/collab/utils/invariant.d.ts +1 -0
- package/lib/collab/utils/invariant.js +11 -0
- package/lib/collab/utils/simpleDiffWithCursor.d.ts +5 -0
- package/lib/collab/utils/simpleDiffWithCursor.js +31 -0
- package/lib/collab/yjs/Bindings.d.ts +23 -0
- package/lib/collab/yjs/Bindings.js +26 -0
- package/lib/collab/yjs/Debug.d.ts +23 -0
- package/lib/collab/yjs/Debug.js +213 -0
- package/lib/collab/yjs/LexicalCollaborationContext.d.ts +10 -0
- package/lib/collab/yjs/LexicalCollaborationContext.js +37 -0
- package/lib/collab/yjs/LexicalCollaborationPlugin.d.ts +21 -0
- package/lib/collab/yjs/LexicalCollaborationPlugin.js +63 -0
- package/lib/collab/yjs/State.d.ts +51 -0
- package/lib/collab/yjs/State.js +35 -0
- package/lib/collab/yjs/nodes/AnyCollabNode.d.ts +5 -0
- package/lib/collab/yjs/nodes/AnyCollabNode.js +1 -0
- package/lib/collab/yjs/nodes/CollabDecoratorNode.d.ts +22 -0
- package/lib/collab/yjs/nodes/CollabDecoratorNode.js +64 -0
- package/lib/collab/yjs/nodes/CollabElementNode.d.ts +40 -0
- package/lib/collab/yjs/nodes/CollabElementNode.js +462 -0
- package/lib/collab/yjs/nodes/CollabLineBreakNode.d.ts +19 -0
- package/lib/collab/yjs/nodes/CollabLineBreakNode.js +44 -0
- package/lib/collab/yjs/nodes/CollabTextNode.d.ts +25 -0
- package/lib/collab/yjs/nodes/CollabTextNode.js +103 -0
- package/lib/collab/yjs/provider/websocket.d.ts +88 -0
- package/lib/collab/yjs/provider/websocket.js +415 -0
- 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 +5 -0
- package/lib/collab/yjs/servers/ws/callback.js +72 -0
- package/lib/collab/yjs/servers/ws/server.d.ts +2 -0
- package/lib/collab/yjs/servers/ws/server.js +25 -0
- package/lib/collab/yjs/servers/ws/utils.d.ts +49 -0
- package/lib/collab/yjs/servers/ws/utils.js +284 -0
- package/lib/collab/yjs/sync/SyncCursors.d.ts +39 -0
- package/lib/collab/yjs/sync/SyncCursors.js +351 -0
- package/lib/collab/yjs/sync/SyncEditorStates.d.ts +10 -0
- package/lib/collab/yjs/sync/SyncEditorStates.js +200 -0
- package/lib/collab/yjs/useCollaboration.d.ts +12 -0
- package/lib/collab/yjs/useCollaboration.js +255 -0
- package/lib/collab/yjs/utils/Utils.d.ts +25 -0
- package/lib/collab/yjs/utils/Utils.js +402 -0
- package/lib/collab/yjs/wsProvider.d.ts +3 -0
- package/lib/collab/yjs/wsProvider.js +21 -0
- package/lib/commenting/index.d.ts +41 -0
- package/lib/commenting/index.js +324 -0
- package/lib/context/FlashMessageContext.d.ts +7 -0
- package/lib/context/FlashMessageContext.js +24 -0
- package/lib/context/SettingsContext.d.ts +12 -0
- package/lib/context/SettingsContext.js +38 -0
- package/lib/context/SharedHistoryContext.d.ts +11 -0
- package/lib/context/SharedHistoryContext.js +11 -0
- package/lib/context/ToolbarContext.d.ts +65 -0
- package/lib/context/ToolbarContext.js +84 -0
- package/lib/demo.d.ts +12 -0
- package/lib/demo.js +41 -0
- package/lib/hooks/useFlashMessage.d.ts +2 -0
- package/lib/hooks/useFlashMessage.js +4 -0
- package/lib/hooks/useModal.d.ts +5 -0
- package/lib/hooks/useModal.js +26 -0
- package/lib/hooks/useReport.d.ts +1 -0
- package/lib/hooks/useReport.js +46 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -5
- package/lib/nodes/AutocompleteNode.d.ts +27 -0
- package/lib/nodes/AutocompleteNode.js +56 -0
- package/lib/nodes/CounterComponent.d.ts +6 -0
- package/lib/nodes/CounterComponent.js +137 -0
- package/lib/nodes/CounterNode.d.ts +23 -0
- package/lib/nodes/CounterNode.js +47 -0
- package/lib/nodes/DateTimeNode/DateTimeComponent.d.ts +8 -0
- package/lib/nodes/DateTimeNode/DateTimeComponent.js +119 -0
- package/lib/nodes/DateTimeNode/DateTimeNode.d.ts +27 -0
- package/lib/nodes/DateTimeNode/DateTimeNode.js +82 -0
- package/lib/nodes/EmojiNode.d.ts +18 -0
- package/lib/nodes/EmojiNode.js +50 -0
- package/lib/nodes/EquationComponent.d.ts +9 -0
- package/lib/nodes/EquationComponent.js +75 -0
- package/lib/nodes/EquationNode.d.ts +26 -0
- package/lib/nodes/EquationNode.js +109 -0
- package/lib/nodes/ExcalidrawNode/ExcalidrawComponent.d.ts +8 -0
- package/lib/nodes/ExcalidrawNode/ExcalidrawComponent.js +110 -0
- package/lib/nodes/ExcalidrawNode/ExcalidrawImage.d.ts +50 -0
- package/lib/nodes/ExcalidrawNode/ExcalidrawImage.js +55 -0
- package/lib/nodes/ExcalidrawNode/index.d.ts +32 -0
- package/lib/nodes/ExcalidrawNode/index.js +117 -0
- package/lib/nodes/FigmaNode.d.ts +20 -0
- package/lib/nodes/FigmaNode.js +52 -0
- package/lib/nodes/ImageComponent.d.ts +16 -0
- package/lib/nodes/ImageComponent.js +272 -0
- package/lib/nodes/ImageNode.d.ts +50 -0
- package/lib/nodes/ImageNode.js +151 -0
- package/lib/nodes/InlineImageNode/InlineImageComponent.d.ts +26 -0
- package/lib/nodes/InlineImageNode/InlineImageComponent.js +161 -0
- package/lib/nodes/InlineImageNode/InlineImageNode.d.ts +59 -0
- package/lib/nodes/InlineImageNode/InlineImageNode.js +162 -0
- package/lib/nodes/KeywordNode.d.ts +14 -0
- package/lib/nodes/KeywordNode.js +33 -0
- package/lib/nodes/LayoutContainerNode.d.ts +24 -0
- package/lib/nodes/LayoutContainerNode.js +91 -0
- package/lib/nodes/LayoutItemNode.d.ts +16 -0
- package/lib/nodes/LayoutItemNode.js +65 -0
- package/lib/nodes/MentionNode.d.ts +20 -0
- package/lib/nodes/MentionNode.js +81 -0
- package/lib/nodes/PageBreakNode/index.d.ts +17 -0
- package/lib/nodes/PageBreakNode/index.js +83 -0
- package/lib/nodes/PlaygroundNodes.d.ts +3 -0
- package/lib/nodes/PlaygroundNodes.js +71 -0
- package/lib/nodes/PollComponent.d.ts +9 -0
- package/lib/nodes/PollComponent.js +85 -0
- package/lib/nodes/PollNode.d.ts +43 -0
- package/lib/nodes/PollNode.js +153 -0
- package/lib/nodes/SpecialTextNode.d.ts +24 -0
- package/lib/nodes/SpecialTextNode.js +50 -0
- package/lib/nodes/StickyComponent.d.ts +10 -0
- package/lib/nodes/StickyComponent.js +162 -0
- package/lib/nodes/StickyNode.d.ts +31 -0
- package/lib/nodes/StickyNode.js +76 -0
- package/lib/nodes/TweetNode.d.ts +21 -0
- package/lib/nodes/TweetNode.js +119 -0
- package/lib/nodes/YouTubeNode.d.ts +22 -0
- package/lib/nodes/YouTubeNode.js +84 -0
- package/lib/plugins/ActionsPlugin/index.d.ts +5 -0
- package/lib/plugins/ActionsPlugin/index.js +168 -0
- package/lib/plugins/AutoEmbedPlugin/index.d.ts +19 -0
- package/lib/plugins/AutoEmbedPlugin/index.js +158 -0
- package/lib/plugins/AutoLinkPlugin/index.d.ts +2 -0
- package/lib/plugins/AutoLinkPlugin/index.js +15 -0
- package/lib/plugins/AutocompletePlugin/index.d.ts +10 -0
- package/lib/plugins/AutocompletePlugin/index.js +2473 -0
- package/lib/plugins/CodeActionMenuPlugin/components/CopyButton/index.d.ts +7 -0
- package/lib/plugins/CodeActionMenuPlugin/components/CopyButton/index.js +42 -0
- package/lib/plugins/CodeActionMenuPlugin/components/PrettierButton/index.d.ts +17 -0
- package/lib/plugins/CodeActionMenuPlugin/components/PrettierButton/index.js +111 -0
- package/lib/plugins/CodeActionMenuPlugin/index.d.ts +5 -0
- package/lib/plugins/CodeActionMenuPlugin/index.js +104 -0
- package/lib/plugins/CodeActionMenuPlugin/utils.d.ts +1 -0
- package/lib/plugins/CodeActionMenuPlugin/utils.js +18 -0
- package/lib/plugins/CodeHighlightPrismPlugin/index.d.ts +2 -0
- package/lib/plugins/CodeHighlightPrismPlugin/index.js +10 -0
- package/lib/plugins/CodeHighlightShikiPlugin/index.d.ts +2 -0
- package/lib/plugins/CodeHighlightShikiPlugin/index.js +10 -0
- package/lib/plugins/CollapsiblePlugin/CollapsibleContainerNode.d.ts +25 -0
- package/lib/plugins/CollapsiblePlugin/CollapsibleContainerNode.js +131 -0
- package/lib/plugins/CollapsiblePlugin/CollapsibleContentNode.d.ts +16 -0
- package/lib/plugins/CollapsiblePlugin/CollapsibleContentNode.js +79 -0
- package/lib/plugins/CollapsiblePlugin/CollapsibleTitleNode.d.ts +16 -0
- package/lib/plugins/CollapsiblePlugin/CollapsibleTitleNode.js +81 -0
- package/lib/plugins/CollapsiblePlugin/CollapsibleUtils.d.ts +2 -0
- package/lib/plugins/CollapsiblePlugin/CollapsibleUtils.js +8 -0
- package/lib/plugins/CollapsiblePlugin/index.d.ts +3 -0
- package/lib/plugins/CollapsiblePlugin/index.js +128 -0
- package/lib/plugins/CommentPlugin/index.d.ts +9 -0
- package/lib/plugins/CommentPlugin/index.js +460 -0
- package/lib/plugins/ComponentPickerPlugin/index.d.ts +2 -0
- package/lib/plugins/ComponentPickerPlugin/index.js +276 -0
- package/lib/plugins/ContextMenuPlugin/index.d.ts +2 -0
- package/lib/plugins/ContextMenuPlugin/index.js +112 -0
- package/lib/plugins/CounterPlugin/index.d.ts +3 -0
- package/lib/plugins/CounterPlugin/index.js +20 -0
- package/lib/plugins/DatalayerPlugin/index.d.ts +2 -0
- package/lib/plugins/DatalayerPlugin/index.js +218 -0
- package/lib/plugins/DateTimePlugin/index.d.ts +8 -0
- package/lib/plugins/DateTimePlugin/index.js +24 -0
- package/lib/plugins/DocsPlugin/index.d.ts +2 -0
- package/lib/plugins/DocsPlugin/index.js +4 -0
- package/lib/plugins/DragDropPastePlugin/index.d.ts +1 -0
- package/lib/plugins/DragDropPastePlugin/index.js +33 -0
- package/lib/plugins/DraggableBlockPlugin/index.d.ts +12 -0
- package/lib/plugins/DraggableBlockPlugin/index.js +36 -0
- package/lib/plugins/EmojiPickerPlugin/index.d.ts +1 -0
- package/lib/plugins/EmojiPickerPlugin/index.js +80 -0
- package/lib/plugins/EmojisPlugin/index.d.ts +2 -0
- package/lib/plugins/EmojisPlugin/index.js +52 -0
- package/lib/plugins/EquationsPlugin/index.d.ts +14 -0
- package/lib/plugins/EquationsPlugin/index.js +34 -0
- package/lib/plugins/ExcalidrawPlugin/index.d.ts +5 -0
- package/lib/plugins/ExcalidrawPlugin/index.js +44 -0
- package/lib/plugins/FigmaPlugin/index.d.ts +4 -0
- package/lib/plugins/FigmaPlugin/index.js +20 -0
- package/lib/plugins/FloatingLinkEditorPlugin/index.d.ts +15 -0
- package/lib/plugins/FloatingLinkEditorPlugin/index.js +280 -0
- package/lib/plugins/FloatingTextFormatToolbarPlugin/index.d.ts +7 -0
- package/lib/plugins/FloatingTextFormatToolbarPlugin/index.js +219 -0
- package/lib/plugins/ImagesPlugin/index.d.ts +24 -0
- package/lib/plugins/ImagesPlugin/index.js +195 -0
- package/lib/plugins/InlineImagePlugin/index.d.ts +17 -0
- package/lib/plugins/InlineImagePlugin/index.js +180 -0
- package/lib/plugins/KeywordsPlugin/index.d.ts +2 -0
- package/lib/plugins/KeywordsPlugin/index.js +31 -0
- package/lib/plugins/LayoutPlugin/InsertLayoutDialog.d.ts +6 -0
- package/lib/plugins/LayoutPlugin/InsertLayoutDialog.js +21 -0
- package/lib/plugins/LayoutPlugin/LayoutPlugin.d.ts +7 -0
- package/lib/plugins/LayoutPlugin/LayoutPlugin.js +131 -0
- package/lib/plugins/LinkPlugin/index.d.ts +6 -0
- package/lib/plugins/LinkPlugin/index.js +11 -0
- package/lib/plugins/MarkdownShortcutPlugin/index.d.ts +2 -0
- package/lib/plugins/MarkdownShortcutPlugin/index.js +6 -0
- package/lib/plugins/MarkdownTransformers/index.d.ts +8 -0
- package/lib/plugins/MarkdownTransformers/index.js +234 -0
- package/lib/plugins/MaxLengthPlugin/index.d.ts +3 -0
- package/lib/plugins/MaxLengthPlugin/index.js +37 -0
- package/lib/plugins/MentionsPlugin/index.d.ts +2 -0
- package/lib/plugins/MentionsPlugin/index.js +564 -0
- package/lib/plugins/PageBreakPlugin/index.d.ts +4 -0
- package/lib/plugins/PageBreakPlugin/index.js +27 -0
- package/lib/plugins/PasteLogPlugin/index.d.ts +2 -0
- package/lib/plugins/PasteLogPlugin/index.js +27 -0
- package/lib/plugins/PollPlugin/index.d.ts +8 -0
- package/lib/plugins/PollPlugin/index.js +38 -0
- package/lib/plugins/ShortcutsPlugin/index.d.ts +6 -0
- package/lib/plugins/ShortcutsPlugin/index.js +112 -0
- package/lib/plugins/ShortcutsPlugin/shortcuts.d.ts +59 -0
- package/lib/plugins/ShortcutsPlugin/shortcuts.js +169 -0
- package/lib/plugins/SpecialTextPlugin/index.d.ts +2 -0
- package/lib/plugins/SpecialTextPlugin/index.js +46 -0
- package/lib/plugins/SpeechToTextPlugin/index.d.ts +5 -0
- package/lib/plugins/SpeechToTextPlugin/index.js +82 -0
- package/lib/plugins/StickyPlugin/index.d.ts +2 -0
- package/lib/plugins/StickyPlugin/index.js +12 -0
- package/lib/plugins/TabFocusPlugin/index.d.ts +1 -0
- package/lib/plugins/TabFocusPlugin/index.js +34 -0
- package/lib/plugins/TableActionMenuPlugin/index.d.ts +5 -0
- package/lib/plugins/TableActionMenuPlugin/index.js +492 -0
- package/lib/plugins/TableCellResizer/index.d.ts +3 -0
- package/lib/plugins/TableCellResizer/index.js +297 -0
- package/lib/plugins/TableHoverActionsPlugin/index.d.ts +4 -0
- package/lib/plugins/TableHoverActionsPlugin/index.js +188 -0
- package/lib/plugins/TableOfContentsPlugin/index.d.ts +2 -0
- package/lib/plugins/TableOfContentsPlugin/index.js +116 -0
- package/lib/plugins/TablePlugin.d.ts +31 -0
- package/lib/plugins/TablePlugin.js +63 -0
- package/lib/plugins/TestRecorderPlugin/index.d.ts +3 -0
- package/lib/plugins/TestRecorderPlugin/index.js +346 -0
- package/lib/plugins/ToolbarPlugin/fontSize.d.ts +9 -0
- package/lib/plugins/ToolbarPlugin/fontSize.js +80 -0
- package/lib/plugins/ToolbarPlugin/index.d.ts +9 -0
- package/lib/plugins/ToolbarPlugin/index.js +500 -0
- package/lib/plugins/ToolbarPlugin/utils.d.ts +26 -0
- package/lib/plugins/ToolbarPlugin/utils.js +243 -0
- package/lib/plugins/TreeViewPlugin/index.d.ts +2 -0
- package/lib/plugins/TreeViewPlugin/index.js +7 -0
- package/lib/plugins/TwitterPlugin/index.d.ts +4 -0
- package/lib/plugins/TwitterPlugin/index.js +20 -0
- package/lib/plugins/TypingPerfPlugin/index.d.ts +2 -0
- package/lib/plugins/TypingPerfPlugin/index.js +93 -0
- package/lib/plugins/YouTubePlugin/index.d.ts +4 -0
- package/lib/plugins/YouTubePlugin/index.js +20 -0
- package/lib/server/validation.d.ts +1 -0
- package/lib/server/validation.js +111 -0
- package/lib/setupEnv.d.ts +2 -0
- package/lib/setupEnv.js +25 -0
- package/lib/themes/CommentEditorTheme.d.ts +4 -0
- package/lib/themes/CommentEditorTheme.js +7 -0
- package/lib/themes/PlaygroundEditorTheme.d.ts +4 -0
- package/lib/themes/PlaygroundEditorTheme.js +120 -0
- package/lib/themes/StickyEditorTheme.d.ts +4 -0
- package/lib/themes/StickyEditorTheme.js +7 -0
- package/lib/tyes.dt.d.ts +12 -0
- package/lib/tyes.dt.js +0 -0
- package/lib/ui/Button.d.ts +12 -0
- package/lib/ui/Button.js +6 -0
- package/lib/ui/ColorPicker.d.ts +14 -0
- package/lib/ui/ColorPicker.js +219 -0
- package/lib/ui/ContentEditable.d.ts +9 -0
- package/lib/ui/ContentEditable.js +6 -0
- package/lib/ui/Dialog.d.ts +10 -0
- package/lib/ui/Dialog.js +8 -0
- package/lib/ui/DropDown.d.ts +18 -0
- package/lib/ui/DropDown.js +133 -0
- package/lib/ui/DropdownColorPicker.d.ts +13 -0
- package/lib/ui/DropdownColorPicker.js +6 -0
- package/lib/ui/EquationEditor.d.ts +8 -0
- package/lib/ui/EquationEditor.js +11 -0
- package/lib/ui/ExcalidrawModal.d.ts +42 -0
- package/lib/ui/ExcalidrawModal.js +103 -0
- package/lib/ui/FileInput.d.ts +10 -0
- package/lib/ui/FileInput.js +5 -0
- package/lib/ui/FlashMessage.d.ts +7 -0
- package/lib/ui/FlashMessage.js +6 -0
- package/lib/ui/ImageResizer.d.ts +17 -0
- package/lib/ui/ImageResizer.js +171 -0
- package/lib/ui/KatexEquationAlterer.d.ts +8 -0
- package/lib/ui/KatexEquationAlterer.js +23 -0
- package/lib/ui/KatexRenderer.d.ts +6 -0
- package/lib/ui/KatexRenderer.js +24 -0
- package/lib/ui/Modal.d.ts +9 -0
- package/lib/ui/Modal.js +48 -0
- package/lib/ui/Select.d.ts +8 -0
- package/lib/ui/Select.js +5 -0
- package/lib/ui/Switch.d.ts +8 -0
- package/lib/ui/Switch.js +6 -0
- package/lib/ui/TextInput.d.ts +13 -0
- package/lib/ui/TextInput.js +7 -0
- package/lib/utils/docSerialization.d.ts +3 -0
- package/lib/utils/docSerialization.js +56 -0
- package/lib/utils/emoji-list.d.ts +20 -0
- package/lib/utils/emoji-list.js +16605 -0
- package/lib/utils/getDOMRangeRect.d.ts +8 -0
- package/lib/utils/getDOMRangeRect.js +22 -0
- package/lib/utils/getSelectedNode.d.ts +2 -0
- package/lib/utils/getSelectedNode.js +24 -0
- package/lib/utils/getThemeSelector.d.ts +2 -0
- package/lib/utils/getThemeSelector.js +10 -0
- package/lib/utils/isMobileWidth.d.ts +7 -0
- package/lib/utils/isMobileWidth.js +7 -0
- package/lib/utils/joinClasses.d.ts +1 -0
- package/lib/utils/joinClasses.js +3 -0
- package/lib/utils/setFloatingElemPosition.d.ts +1 -0
- package/lib/utils/setFloatingElemPosition.js +55 -0
- package/lib/utils/setFloatingElemPositionForLinkEditor.d.ts +1 -0
- package/lib/utils/setFloatingElemPositionForLinkEditor.js +32 -0
- package/lib/utils/swipe.d.ts +4 -0
- package/lib/utils/swipe.js +90 -0
- package/lib/utils/url.d.ts +2 -0
- package/lib/utils/url.js +27 -0
- package/package.json +82 -51
- package/lib/DiffMerge.d.ts +0 -39
- package/lib/DiffMerge.js +0 -437
- package/lib/LoroCollaborativePlugin.d.ts +0 -62
- package/lib/LoroCollaborativePlugin.js +0 -2826
- package/lib/stableNodeState.d.ts +0 -8
- package/lib/stableNodeState.js +0 -15
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
|
|
4
|
+
import { useCollaborationContext, generateDeterministicUserData, } from './LexicalCollaborationContext';
|
|
5
|
+
import { updateLocalStateName } from './State';
|
|
6
|
+
import { useCollaboration, useFocusTracking, useHistory, } from './useCollaboration';
|
|
7
|
+
import { createBinding, LoroCollaborationUI } from './Bindings';
|
|
8
|
+
export function LoroCollaborationPlugin({ id, providerFactory, shouldBootstrap, username, cursorColor, cursorsContainerRef, initialEditorState, excludedProperties, awarenessData, syncCursorPositionsFn, showCollaborators = true, websocketUrl = 'ws://localhost:3002', onInitialization, }) {
|
|
9
|
+
const isBindingInitialized = useRef(false);
|
|
10
|
+
const isProviderInitialized = useRef(false);
|
|
11
|
+
const collabContext = useCollaborationContext(username, cursorColor);
|
|
12
|
+
const { docMap, name, color } = collabContext;
|
|
13
|
+
const [editor] = useLexicalComposerContext();
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
collabContext.isCollabActive = true;
|
|
16
|
+
return () => {
|
|
17
|
+
// Resetting flag only when unmount top level editor collab plugin. Nested
|
|
18
|
+
// editors (e.g. image caption) should unmount without affecting it
|
|
19
|
+
if (editor._parentEditor == null) {
|
|
20
|
+
collabContext.isCollabActive = false;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}, [collabContext, editor]);
|
|
24
|
+
const [provider, setProvider] = useState();
|
|
25
|
+
const [doc, setDoc] = useState();
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
if (isProviderInitialized.current) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
isProviderInitialized.current = true;
|
|
31
|
+
const provider = providerFactory(id, docMap, websocketUrl);
|
|
32
|
+
setProvider(provider);
|
|
33
|
+
setDoc(docMap.get(id));
|
|
34
|
+
return () => {
|
|
35
|
+
provider.disconnect();
|
|
36
|
+
};
|
|
37
|
+
}, [id, providerFactory, docMap, websocketUrl]);
|
|
38
|
+
const [binding, setBinding] = useState();
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
if (!provider) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (isBindingInitialized.current) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
isBindingInitialized.current = true;
|
|
47
|
+
const binding = createBinding(editor, provider, id, doc || docMap.get(id), docMap, excludedProperties);
|
|
48
|
+
// Update collaboration context with deterministic name based on client ID
|
|
49
|
+
// This ensures consistent names across browser sessions
|
|
50
|
+
const deterministicUserData = generateDeterministicUserData(binding.clientID);
|
|
51
|
+
console.log('Setting deterministic user data based on client ID:', {
|
|
52
|
+
clientId: binding.clientID,
|
|
53
|
+
name: deterministicUserData.name,
|
|
54
|
+
color: deterministicUserData.color
|
|
55
|
+
});
|
|
56
|
+
// Update the collaboration context with stable name and color
|
|
57
|
+
const finalName = username || deterministicUserData.name;
|
|
58
|
+
const finalColor = cursorColor || deterministicUserData.color;
|
|
59
|
+
collabContext.name = finalName;
|
|
60
|
+
collabContext.color = finalColor;
|
|
61
|
+
collabContext.clientID = binding.clientID;
|
|
62
|
+
// Update the awareness state immediately with the deterministic name
|
|
63
|
+
updateLocalStateName(provider, finalName, finalColor);
|
|
64
|
+
setBinding(binding);
|
|
65
|
+
return () => {
|
|
66
|
+
// Clean up binding resources if needed
|
|
67
|
+
};
|
|
68
|
+
}, [editor, provider, id, docMap, doc, excludedProperties, collabContext, username, cursorColor]);
|
|
69
|
+
if (!provider || !binding) {
|
|
70
|
+
return _jsx(_Fragment, {});
|
|
71
|
+
}
|
|
72
|
+
return (_jsx(LoroCollaborationCursors, { awarenessData: awarenessData, binding: binding, collabContext: collabContext, color: color, cursorsContainerRef: cursorsContainerRef, editor: editor, id: id, initialEditorState: initialEditorState, name: name, provider: provider, setDoc: setDoc, shouldBootstrap: shouldBootstrap, docMap: docMap, syncCursorPositionsFn: syncCursorPositionsFn, showCollaborators: showCollaborators, onInitialization: onInitialization }));
|
|
73
|
+
}
|
|
74
|
+
function LoroCollaborationCursors({ editor, id, provider, docMap, name, color, shouldBootstrap, cursorsContainerRef, initialEditorState, awarenessData, collabContext, binding, setDoc, syncCursorPositionsFn, showCollaborators = false, onInitialization, }) {
|
|
75
|
+
const cursorsElement = useCollaboration(editor, id, provider, docMap, name, color, shouldBootstrap, binding, setDoc, cursorsContainerRef, initialEditorState, awarenessData, syncCursorPositionsFn, onInitialization);
|
|
76
|
+
collabContext.clientID = binding.clientID;
|
|
77
|
+
useHistory(editor, binding);
|
|
78
|
+
useFocusTracking(editor, provider, name, color, awarenessData);
|
|
79
|
+
if (showCollaborators) {
|
|
80
|
+
return (_jsx(LoroCollaborationUI, { binding: binding, cursorsContainer: cursorsElement, currentUserName: name, currentUserColor: color, showCollaborators: true }));
|
|
81
|
+
}
|
|
82
|
+
return cursorsElement;
|
|
83
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { LexicalCommand } from 'lexical';
|
|
2
|
+
import type { LoroDoc, Cursor } from 'loro-crdt';
|
|
3
|
+
import { UndoManager } from 'loro-crdt';
|
|
4
|
+
import type { Binding } from './Bindings';
|
|
5
|
+
export type UserState = {
|
|
6
|
+
anchorPos: Cursor | null;
|
|
7
|
+
color: string;
|
|
8
|
+
focusing: boolean;
|
|
9
|
+
focusPos: Cursor | null;
|
|
10
|
+
name: string;
|
|
11
|
+
awarenessData: object;
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
};
|
|
14
|
+
export declare const CONNECTED_COMMAND: LexicalCommand<boolean>;
|
|
15
|
+
export declare const TOGGLE_CONNECT_COMMAND: LexicalCommand<boolean>;
|
|
16
|
+
export type AwarenessProvider = {
|
|
17
|
+
getLocalState: () => UserState | null;
|
|
18
|
+
getStates: () => Map<number, UserState>;
|
|
19
|
+
off: (type: 'update', cb: () => void) => void;
|
|
20
|
+
on: (type: 'update', cb: () => void) => void;
|
|
21
|
+
setLocalState: (userState: UserState) => void;
|
|
22
|
+
setLocalStateField: (field: string, value: unknown) => void;
|
|
23
|
+
};
|
|
24
|
+
export type Provider = {
|
|
25
|
+
awareness: AwarenessProvider;
|
|
26
|
+
connect(): void | Promise<void>;
|
|
27
|
+
disconnect(): void;
|
|
28
|
+
off(type: 'sync', cb: (isSynced: boolean) => void): void;
|
|
29
|
+
off(type: 'update', cb: (update: unknown) => void): void;
|
|
30
|
+
off(type: 'status', cb: (status: {
|
|
31
|
+
status: string;
|
|
32
|
+
}) => void): void;
|
|
33
|
+
off(type: 'reload', cb: (doc: LoroDoc) => void): void;
|
|
34
|
+
on(type: 'sync', cb: (isSynced: boolean) => void): void;
|
|
35
|
+
on(type: 'status', cb: (status: {
|
|
36
|
+
status: string;
|
|
37
|
+
}) => void): void;
|
|
38
|
+
on(type: 'update', cb: (update: unknown) => void): void;
|
|
39
|
+
on(type: 'reload', cb: (doc: LoroDoc) => void): void;
|
|
40
|
+
};
|
|
41
|
+
export type Operation = {
|
|
42
|
+
attributes: {
|
|
43
|
+
__type: string;
|
|
44
|
+
};
|
|
45
|
+
insert: string | Record<string, unknown>;
|
|
46
|
+
};
|
|
47
|
+
export type Delta = Array<Operation>;
|
|
48
|
+
export type LoroNode = Record<string, unknown>;
|
|
49
|
+
export type LoroEvent = Record<string, unknown>;
|
|
50
|
+
export declare function createUndoManager(binding: Binding): UndoManager;
|
|
51
|
+
export declare function initLocalState(provider: Provider, name: string, color: string, focusing: boolean, awarenessData: object): void;
|
|
52
|
+
export declare function setLocalStateFocus(provider: Provider, name: string, color: string, focusing: boolean, awarenessData: object): void;
|
|
53
|
+
export declare function updateLocalStateName(provider: Provider, name: string, color: string): void;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { createCommand } from 'lexical';
|
|
2
|
+
import { UndoManager } from 'loro-crdt';
|
|
3
|
+
export const CONNECTED_COMMAND = createCommand('CONNECTED_COMMAND');
|
|
4
|
+
export const TOGGLE_CONNECT_COMMAND = createCommand('TOGGLE_CONNECT_COMMAND');
|
|
5
|
+
export function createUndoManager(binding) {
|
|
6
|
+
// Create Loro UndoManager with configuration
|
|
7
|
+
const undoManager = new UndoManager(binding.doc, {
|
|
8
|
+
mergeInterval: 1000, // Merge operations within 1 second
|
|
9
|
+
maxUndoSteps: 100, // Keep up to 100 undo steps
|
|
10
|
+
excludeOriginPrefixes: ['collab-', 'sync-'], // Exclude collaboration operations
|
|
11
|
+
/*
|
|
12
|
+
onPush: (isUndo, counterRange, event) => {
|
|
13
|
+
// Save cursor positions when adding to undo stack
|
|
14
|
+
const selection = binding.editor.getEditorState().read(() => {
|
|
15
|
+
return binding.editor.getEditorState()._selection;
|
|
16
|
+
});
|
|
17
|
+
// Get cursors for the current state
|
|
18
|
+
const cursors: Cursor[] = [];
|
|
19
|
+
if (selection) {
|
|
20
|
+
// TODO: Convert Lexical selection to Loro cursors
|
|
21
|
+
// This would need to be implemented based on the specific selection format
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
value: binding.doc.toJSON(), // Save document state
|
|
25
|
+
cursors: cursors
|
|
26
|
+
};
|
|
27
|
+
},
|
|
28
|
+
onPop: (isUndo, metadata, counterRange) => {
|
|
29
|
+
// Restore cursor positions when undoing/redoing
|
|
30
|
+
if (metadata?.cursors && metadata.cursors.length > 0) {
|
|
31
|
+
binding.editor.update(() => {
|
|
32
|
+
// TODO: Restore selection state from cursors
|
|
33
|
+
// This would need to convert Loro cursors back to Lexical selection
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
*/
|
|
38
|
+
});
|
|
39
|
+
return undoManager;
|
|
40
|
+
}
|
|
41
|
+
export function initLocalState(provider, name, color, focusing, awarenessData) {
|
|
42
|
+
provider.awareness.setLocalState({
|
|
43
|
+
anchorPos: null,
|
|
44
|
+
awarenessData,
|
|
45
|
+
color,
|
|
46
|
+
focusPos: null,
|
|
47
|
+
focusing,
|
|
48
|
+
name,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
export function setLocalStateFocus(provider, name, color, focusing, awarenessData) {
|
|
52
|
+
const { awareness } = provider;
|
|
53
|
+
let localState = awareness.getLocalState();
|
|
54
|
+
if (localState === null) {
|
|
55
|
+
localState = {
|
|
56
|
+
anchorPos: null,
|
|
57
|
+
awarenessData,
|
|
58
|
+
color,
|
|
59
|
+
focusPos: null,
|
|
60
|
+
focusing: focusing,
|
|
61
|
+
name,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// Always update name and color in case they changed
|
|
65
|
+
localState.name = name;
|
|
66
|
+
localState.color = color;
|
|
67
|
+
localState.focusing = focusing;
|
|
68
|
+
awareness.setLocalState(localState);
|
|
69
|
+
}
|
|
70
|
+
export function updateLocalStateName(provider, name, color) {
|
|
71
|
+
const { awareness } = provider;
|
|
72
|
+
let localState = awareness.getLocalState();
|
|
73
|
+
if (localState === null) {
|
|
74
|
+
// Initialize with the new name if no state exists
|
|
75
|
+
localState = {
|
|
76
|
+
anchorPos: null,
|
|
77
|
+
awarenessData: {},
|
|
78
|
+
color,
|
|
79
|
+
focusPos: null,
|
|
80
|
+
focusing: false,
|
|
81
|
+
name,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// Update existing state with new name and color
|
|
86
|
+
localState.name = name;
|
|
87
|
+
localState.color = color;
|
|
88
|
+
}
|
|
89
|
+
awareness.setLocalState(localState);
|
|
90
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Binding } from '../Bindings';
|
|
2
|
+
export interface LoroCollaborationUIProps {
|
|
3
|
+
binding: Binding;
|
|
4
|
+
cursorsContainer: JSX.Element | null;
|
|
5
|
+
currentUserName?: string;
|
|
6
|
+
currentUserColor?: string;
|
|
7
|
+
showCollaborators?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Combines the cursors container with the collaborators list
|
|
11
|
+
*/
|
|
12
|
+
export declare function LoroCollaborationUI({ binding, cursorsContainer, currentUserName, currentUserColor, showCollaborators }: LoroCollaborationUIProps): JSX.Element;
|
|
13
|
+
export default LoroCollaborationUI;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { LoroCollaborators } from './LoroCollaborators';
|
|
3
|
+
/**
|
|
4
|
+
* Combines the cursors container with the collaborators list
|
|
5
|
+
*/
|
|
6
|
+
export function LoroCollaborationUI({ binding, cursorsContainer, currentUserName = 'You', currentUserColor = '#007acc', showCollaborators = true }) {
|
|
7
|
+
return (_jsxs(_Fragment, { children: [showCollaborators && (_jsx(LoroCollaborators, { binding: binding, currentUserName: currentUserName, currentUserColor: currentUserColor })), cursorsContainer] }));
|
|
8
|
+
}
|
|
9
|
+
export default LoroCollaborationUI;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Binding } from '../Bindings';
|
|
2
|
+
export interface LoroCollaboratorsProps {
|
|
3
|
+
binding: Binding;
|
|
4
|
+
currentUserName?: string;
|
|
5
|
+
currentUserColor?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function LoroCollaborators({ binding, currentUserName, currentUserColor }: LoroCollaboratorsProps): JSX.Element;
|
|
8
|
+
export default LoroCollaborators;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
export function LoroCollaborators({ binding, currentUserName = 'Me', currentUserColor = '#007acc' }) {
|
|
4
|
+
// Force re-render when cursors change
|
|
5
|
+
const [updateTrigger, setUpdateTrigger] = useState(0);
|
|
6
|
+
// Monitor cursors map changes
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
const interval = setInterval(() => {
|
|
9
|
+
setUpdateTrigger(prev => prev + 1);
|
|
10
|
+
}, 1000); // Check for updates every second
|
|
11
|
+
return () => clearInterval(interval);
|
|
12
|
+
}, []);
|
|
13
|
+
// Get current user's client ID
|
|
14
|
+
const currentClientID = binding.clientID;
|
|
15
|
+
// Debug: Log cursor information
|
|
16
|
+
const allCursorsDebug = Array.from(binding.cursors.entries()).map(([id, cursor]) => ({
|
|
17
|
+
clientId: id,
|
|
18
|
+
name: cursor.name,
|
|
19
|
+
color: cursor.color,
|
|
20
|
+
isCurrentUser: id === currentClientID
|
|
21
|
+
}));
|
|
22
|
+
// Get all collaborators including current user
|
|
23
|
+
const allCollaborators = Array.from(binding.cursors.entries())
|
|
24
|
+
.map(([clientId, cursor]) => ({ clientId, cursor, isCurrentUser: clientId === currentClientID }));
|
|
25
|
+
// Get current user's cursor if it exists
|
|
26
|
+
const currentUserCursor = binding.cursors.get(currentClientID);
|
|
27
|
+
const currentDisplayColor = currentUserCursor?.color || currentUserColor;
|
|
28
|
+
const currentDisplayName = currentUserCursor?.name || currentUserName;
|
|
29
|
+
// Separate current user and others for display order (current user first)
|
|
30
|
+
const currentUserData = allCollaborators.find(({ isCurrentUser }) => isCurrentUser);
|
|
31
|
+
const otherCollaborators = allCollaborators.filter(({ isCurrentUser }) => !isCurrentUser);
|
|
32
|
+
return (_jsxs("div", { style: {
|
|
33
|
+
display: 'flex',
|
|
34
|
+
alignItems: 'center',
|
|
35
|
+
padding: '8px 12px',
|
|
36
|
+
backgroundColor: '#f8f9fa',
|
|
37
|
+
borderBottom: '1px solid #e1e5e9',
|
|
38
|
+
fontSize: '14px',
|
|
39
|
+
fontFamily: 'system-ui, -apple-system, sans-serif',
|
|
40
|
+
gap: '8px',
|
|
41
|
+
flexWrap: 'wrap'
|
|
42
|
+
}, children: [currentUserData && (_jsx(CollaboratorBadge, { name: `${currentUserData.cursor.name}`, color: currentDisplayColor, isCurrentUser: true, clientId: currentClientID })), !currentUserData && (_jsx(CollaboratorBadge, { name: `${currentDisplayName} (Me)`, color: currentDisplayColor, isCurrentUser: true, clientId: currentClientID })), otherCollaborators.length > 0 && (_jsx("div", { style: {
|
|
43
|
+
width: '1px',
|
|
44
|
+
height: '20px',
|
|
45
|
+
backgroundColor: '#d1d5db',
|
|
46
|
+
margin: '0 4px'
|
|
47
|
+
} })), otherCollaborators.map(({ clientId, cursor }) => (_jsx(CollaboratorBadge, { name: cursor.name, color: cursor.color, isCurrentUser: false, clientId: clientId }, clientId))), otherCollaborators.length === 0 && (_jsx("span", { style: {
|
|
48
|
+
color: '#6b7280',
|
|
49
|
+
fontStyle: 'italic',
|
|
50
|
+
marginLeft: '8px'
|
|
51
|
+
}, children: "No other collaborators" }))] }));
|
|
52
|
+
}
|
|
53
|
+
function CollaboratorBadge({ name, color, isCurrentUser, clientId }) {
|
|
54
|
+
// Convert color to rgba for transparency when current user
|
|
55
|
+
const getColorWithOpacity = (color, opacity = 1) => {
|
|
56
|
+
// If it's a hex color, convert to rgba
|
|
57
|
+
if (color.startsWith('#')) {
|
|
58
|
+
const hex = color.slice(1);
|
|
59
|
+
const r = parseInt(hex.slice(0, 2), 16);
|
|
60
|
+
const g = parseInt(hex.slice(2, 4), 16);
|
|
61
|
+
const b = parseInt(hex.slice(4, 6), 16);
|
|
62
|
+
return `rgba(${r}, ${g}, ${b}, ${opacity})`;
|
|
63
|
+
}
|
|
64
|
+
// If it's already rgba or rgb, just return as is (basic support)
|
|
65
|
+
return color;
|
|
66
|
+
};
|
|
67
|
+
const circleColor = isCurrentUser ? getColorWithOpacity(color, 0.1) : color;
|
|
68
|
+
const badgeColor = isCurrentUser ? getColorWithOpacity(color, 0.1) : color;
|
|
69
|
+
return (_jsxs("div", { style: {
|
|
70
|
+
display: 'flex',
|
|
71
|
+
alignItems: 'center',
|
|
72
|
+
gap: '6px'
|
|
73
|
+
}, title: `${name} (Client ID: ${clientId})`, children: [_jsx("div", { style: {
|
|
74
|
+
width: '12px',
|
|
75
|
+
height: '12px',
|
|
76
|
+
borderRadius: '50%',
|
|
77
|
+
backgroundColor: circleColor,
|
|
78
|
+
border: isCurrentUser ? '2px solid #ffffff' : 'none',
|
|
79
|
+
boxShadow: isCurrentUser ? '0 0 0 1px #d1d5db' : 'none',
|
|
80
|
+
flexShrink: 0
|
|
81
|
+
} }), _jsx("span", { style: {
|
|
82
|
+
backgroundColor: badgeColor,
|
|
83
|
+
color: '#ffffff',
|
|
84
|
+
padding: '3px 8px',
|
|
85
|
+
borderRadius: '12px',
|
|
86
|
+
fontSize: '12px',
|
|
87
|
+
fontWeight: '500',
|
|
88
|
+
lineHeight: '1.2',
|
|
89
|
+
whiteSpace: 'nowrap',
|
|
90
|
+
textShadow: '0 1px 2px rgba(0,0,0,0.1)',
|
|
91
|
+
boxShadow: isCurrentUser
|
|
92
|
+
? '0 1px 3px rgba(0,0,0,0.2), inset 0 1px 0 rgba(255,255,255,0.2)'
|
|
93
|
+
: '0 1px 2px rgba(0,0,0,0.1)',
|
|
94
|
+
opacity: isCurrentUser ? 0.9 : 1
|
|
95
|
+
}, children: name })] }));
|
|
96
|
+
}
|
|
97
|
+
export default LoroCollaborators;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Binding } from '../Bindings';
|
|
2
|
+
import { Provider } from '../State';
|
|
3
|
+
/**
|
|
4
|
+
* Base interface for all diff integrators
|
|
5
|
+
*/
|
|
6
|
+
export interface BaseIntegrator<T = any> {
|
|
7
|
+
/**
|
|
8
|
+
* Handle the diff event
|
|
9
|
+
* @param diff The diff event to integrate
|
|
10
|
+
* @param binding The binding instance
|
|
11
|
+
* @param provider The provider instance
|
|
12
|
+
*/
|
|
13
|
+
integrate(diff: T, binding: Binding, provider: Provider): void;
|
|
14
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BaseIntegrator } from './BaseIntegrator';
|
|
2
|
+
import { Binding } from '../Bindings';
|
|
3
|
+
import { Provider } from '../State';
|
|
4
|
+
interface CounterDiff {
|
|
5
|
+
type: 'counter';
|
|
6
|
+
increment?: number;
|
|
7
|
+
value?: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Handles counter changes (increment/decrement operations)
|
|
11
|
+
*/
|
|
12
|
+
export declare class CounterIntegrator implements BaseIntegrator<CounterDiff> {
|
|
13
|
+
integrate(diff: CounterDiff, binding: Binding, provider: Provider): void;
|
|
14
|
+
integrateInternal(diff: CounterDiff, binding: Binding, provider: Provider): void;
|
|
15
|
+
private integrateIncrement;
|
|
16
|
+
private integrateSetValue;
|
|
17
|
+
/**
|
|
18
|
+
* Helper method to update a counter property in a specific node
|
|
19
|
+
* This would be used when counters are associated with particular nodes
|
|
20
|
+
*/
|
|
21
|
+
private updateNodeCounter;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handles counter changes (increment/decrement operations)
|
|
3
|
+
*/
|
|
4
|
+
export class CounterIntegrator {
|
|
5
|
+
integrate(diff, binding, provider) {
|
|
6
|
+
this.integrateInternal(diff, binding, provider);
|
|
7
|
+
}
|
|
8
|
+
// Internal method for use when already inside editor.update()
|
|
9
|
+
integrateInternal(diff, binding, provider) {
|
|
10
|
+
if (diff.increment !== undefined) {
|
|
11
|
+
this.integrateIncrement(diff.increment, binding, provider);
|
|
12
|
+
}
|
|
13
|
+
if (diff.value !== undefined) {
|
|
14
|
+
this.integrateSetValue(diff.value, binding, provider);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
integrateIncrement(increment, binding, provider) {
|
|
18
|
+
// Counter operations in Lexical context might be used for:
|
|
19
|
+
// - Version numbers
|
|
20
|
+
// - Reference counts
|
|
21
|
+
// - Numeric properties in nodes
|
|
22
|
+
// - Analytics or tracking data
|
|
23
|
+
// For now, this is a placeholder since counters are not commonly
|
|
24
|
+
// used in basic text editing scenarios
|
|
25
|
+
}
|
|
26
|
+
integrateSetValue(value, binding, provider) {
|
|
27
|
+
// Similar to increment, the specific implementation would depend
|
|
28
|
+
// on what the counter represents in the document structure
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Helper method to update a counter property in a specific node
|
|
32
|
+
* This would be used when counters are associated with particular nodes
|
|
33
|
+
*/
|
|
34
|
+
updateNodeCounter(nodeKey, counterName, operation, value, binding) {
|
|
35
|
+
// This is a hypothetical implementation
|
|
36
|
+
// Real usage would depend on how counters are integrated into the document model
|
|
37
|
+
// In practice, this might update metadata or special numeric properties
|
|
38
|
+
// associated with Lexical nodes
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BaseIntegrator } from './BaseIntegrator';
|
|
2
|
+
import { Binding } from '../Bindings';
|
|
3
|
+
import { Provider } from '../State';
|
|
4
|
+
interface ListDiff {
|
|
5
|
+
type: 'list';
|
|
6
|
+
diff?: Array<{
|
|
7
|
+
type: 'insert' | 'delete' | 'retain';
|
|
8
|
+
index?: number;
|
|
9
|
+
length?: number;
|
|
10
|
+
value?: any;
|
|
11
|
+
}>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Handles list changes (insertions, deletions, moves in ordered structures)
|
|
15
|
+
*/
|
|
16
|
+
export declare class ListIntegrator implements BaseIntegrator<ListDiff> {
|
|
17
|
+
integrate(diff: ListDiff, binding: Binding, provider: Provider): void;
|
|
18
|
+
integrateInternal(diff: ListDiff, binding: Binding, provider: Provider): void;
|
|
19
|
+
private integrateInsert;
|
|
20
|
+
private integrateDelete;
|
|
21
|
+
private integrateRetain;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handles list changes (insertions, deletions, moves in ordered structures)
|
|
3
|
+
*/
|
|
4
|
+
export class ListIntegrator {
|
|
5
|
+
integrate(diff, binding, provider) {
|
|
6
|
+
console.log('📋 Handling ListDiff:', diff);
|
|
7
|
+
this.integrateInternal(diff, binding, provider);
|
|
8
|
+
}
|
|
9
|
+
// Internal method for use when already inside editor.update()
|
|
10
|
+
integrateInternal(diff, binding, provider) {
|
|
11
|
+
if (diff.diff) {
|
|
12
|
+
diff.diff.forEach((change) => {
|
|
13
|
+
switch (change.type) {
|
|
14
|
+
case 'insert':
|
|
15
|
+
this.integrateInsert(change, binding, provider);
|
|
16
|
+
break;
|
|
17
|
+
case 'delete':
|
|
18
|
+
this.integrateDelete(change, binding, provider);
|
|
19
|
+
break;
|
|
20
|
+
case 'retain':
|
|
21
|
+
this.integrateRetain(change, binding, provider);
|
|
22
|
+
break;
|
|
23
|
+
default:
|
|
24
|
+
console.warn(`📋 Unknown list change type: ${change.type}`);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
integrateInsert(change, binding, provider) {
|
|
30
|
+
// This typically represents insertion of child nodes in an ElementNode
|
|
31
|
+
// The actual node creation should be integrated by TreeIntegrator
|
|
32
|
+
// This integrater focuses on the ordering and position updates
|
|
33
|
+
// For now, log the operation - specific implementation would depend on
|
|
34
|
+
// the context of which list/container this change applies to
|
|
35
|
+
}
|
|
36
|
+
integrateDelete(change, binding, provider) {
|
|
37
|
+
// This typically represents removal of child nodes from an ElementNode
|
|
38
|
+
// The actual node deletion should be integrated by TreeIntegrator
|
|
39
|
+
// This integrater focuses on the ordering and position updates
|
|
40
|
+
}
|
|
41
|
+
integrateRetain(change, binding, provider) {
|
|
42
|
+
// Retain operations typically don't require action in Lexical
|
|
43
|
+
// They represent portions of the list that remain unchanged
|
|
44
|
+
if (change.attributes) {
|
|
45
|
+
console.log(`📋 List retain with attributes at ${change.index}, length: ${change.length}`, change.attributes);
|
|
46
|
+
// Handle any attribute changes if needed
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { BaseIntegrator } from './BaseIntegrator';
|
|
2
|
+
import { Binding } from '../Bindings';
|
|
3
|
+
import { Provider } from '../State';
|
|
4
|
+
interface MapDiff {
|
|
5
|
+
type: 'map';
|
|
6
|
+
updated?: Record<string, any>;
|
|
7
|
+
deleted?: string[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Handles map data changes (node properties, metadata updates)
|
|
11
|
+
*/
|
|
12
|
+
export declare class MapIntegrator implements BaseIntegrator<MapDiff> {
|
|
13
|
+
integrate(diff: MapDiff, binding: Binding, provider: Provider): void;
|
|
14
|
+
integrateWithContext(diff: MapDiff, treeId: any, binding: Binding, provider: Provider): void;
|
|
15
|
+
integrateInternal(diff: MapDiff, binding: Binding, provider: Provider): void;
|
|
16
|
+
integrateWithContextInternal(diff: MapDiff, treeId: any, binding: Binding, provider: Provider): void;
|
|
17
|
+
private integratePropertyUpdateWithContext;
|
|
18
|
+
private integratePropertyUpdateWithContextInternal;
|
|
19
|
+
private integratePropertyUpdate;
|
|
20
|
+
private integratePropertyDelete;
|
|
21
|
+
private integrateLexicalDataUpdateWithContext;
|
|
22
|
+
private integrateLexicalDataUpdateInternal;
|
|
23
|
+
}
|
|
24
|
+
export {};
|