@datalayer/lexical-loro 1.0.2 → 1.0.5

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.
Files changed (402) hide show
  1. package/README.md +2 -2
  2. package/lib/App.d.ts +2 -0
  3. package/lib/App.js +141 -0
  4. package/lib/Editor.d.ts +2 -0
  5. package/lib/Editor.js +116 -0
  6. package/lib/Settings.d.ts +2 -0
  7. package/lib/Settings.js +57 -0
  8. package/lib/appSettings.d.ts +36 -0
  9. package/lib/appSettings.js +48 -0
  10. package/lib/collab/loro/Bindings.d.ts +41 -0
  11. package/lib/collab/loro/Bindings.js +99 -0
  12. package/lib/collab/loro/Debug.d.ts +33 -0
  13. package/lib/collab/loro/Debug.js +452 -0
  14. package/lib/collab/loro/LexicalCollaborationContext.d.ts +19 -0
  15. package/lib/collab/loro/LexicalCollaborationContext.js +52 -0
  16. package/lib/collab/loro/LexicalCollaborationPlugin.d.ts +29 -0
  17. package/lib/collab/loro/LexicalCollaborationPlugin.js +111 -0
  18. package/lib/collab/loro/State.d.ts +53 -0
  19. package/lib/collab/loro/State.js +94 -0
  20. package/lib/collab/loro/components/LoroCollaborationUI.d.ts +13 -0
  21. package/lib/collab/loro/components/LoroCollaborationUI.js +9 -0
  22. package/lib/collab/loro/components/LoroCollaborators.d.ts +8 -0
  23. package/lib/collab/loro/components/LoroCollaborators.js +90 -0
  24. package/lib/collab/loro/components/index.d.ts +2 -0
  25. package/lib/collab/loro/components/index.js +6 -0
  26. package/lib/collab/loro/index.d.ts +6 -0
  27. package/lib/collab/loro/index.js +10 -0
  28. package/lib/collab/loro/integrators/BaseIntegrator.d.ts +14 -0
  29. package/lib/collab/loro/integrators/BaseIntegrator.js +5 -0
  30. package/lib/collab/loro/integrators/CounterIntegrator.d.ts +23 -0
  31. package/lib/collab/loro/integrators/CounterIntegrator.js +44 -0
  32. package/lib/collab/loro/integrators/ListIntegrator.d.ts +23 -0
  33. package/lib/collab/loro/integrators/ListIntegrator.js +53 -0
  34. package/lib/collab/loro/integrators/MapIntegrator.d.ts +24 -0
  35. package/lib/collab/loro/integrators/MapIntegrator.js +235 -0
  36. package/lib/collab/loro/integrators/TextIntegrator.d.ts +25 -0
  37. package/lib/collab/loro/integrators/TextIntegrator.js +55 -0
  38. package/lib/collab/loro/integrators/TreeIntegrator.d.ts +41 -0
  39. package/lib/collab/loro/integrators/TreeIntegrator.js +293 -0
  40. package/lib/collab/loro/nodes/NodeFactory.d.ts +15 -0
  41. package/lib/collab/loro/nodes/NodeFactory.js +80 -0
  42. package/lib/collab/loro/nodes/NodesMapper.d.ts +120 -0
  43. package/lib/collab/loro/nodes/NodesMapper.js +289 -0
  44. package/lib/collab/loro/propagators/DecoratorNodePropagator.d.ts +60 -0
  45. package/lib/collab/loro/propagators/DecoratorNodePropagator.js +306 -0
  46. package/lib/collab/loro/propagators/ElementNodePropagator.d.ts +62 -0
  47. package/lib/collab/loro/propagators/ElementNodePropagator.js +393 -0
  48. package/lib/collab/loro/propagators/LineBreakNodePropagator.d.ts +57 -0
  49. package/lib/collab/loro/propagators/LineBreakNodePropagator.js +200 -0
  50. package/lib/collab/loro/propagators/RootNodePropagator.d.ts +55 -0
  51. package/lib/collab/loro/propagators/RootNodePropagator.js +174 -0
  52. package/lib/collab/loro/propagators/TextNodePropagator.d.ts +60 -0
  53. package/lib/collab/loro/propagators/TextNodePropagator.js +450 -0
  54. package/lib/collab/loro/propagators/index.d.ts +49 -0
  55. package/lib/collab/loro/propagators/index.js +30 -0
  56. package/lib/collab/loro/provider/websocket.d.ts +117 -0
  57. package/lib/collab/loro/provider/websocket.js +946 -0
  58. package/lib/collab/loro/servers/index.d.ts +0 -0
  59. package/lib/collab/loro/servers/index.js +4 -0
  60. package/lib/collab/loro/servers/ws/callback.d.ts +5 -0
  61. package/lib/collab/loro/servers/ws/callback.js +89 -0
  62. package/lib/collab/loro/servers/ws/server.d.ts +2 -0
  63. package/lib/collab/loro/servers/ws/server.js +29 -0
  64. package/lib/collab/loro/servers/ws/utils.d.ts +40 -0
  65. package/lib/collab/loro/servers/ws/utils.js +517 -0
  66. package/lib/collab/loro/sync/SyncCursors.d.ts +32 -0
  67. package/lib/collab/loro/sync/SyncCursors.js +501 -0
  68. package/lib/collab/loro/sync/SyncLexicalToLoro.d.ts +4 -0
  69. package/lib/collab/loro/sync/SyncLexicalToLoro.js +152 -0
  70. package/lib/collab/loro/sync/SyncLoroToLexical.d.ts +5 -0
  71. package/lib/collab/loro/sync/SyncLoroToLexical.js +106 -0
  72. package/lib/collab/loro/types/LexicalNodeData.d.ts +32 -0
  73. package/lib/collab/loro/types/LexicalNodeData.js +75 -0
  74. package/lib/collab/loro/useCollaboration.d.ts +12 -0
  75. package/lib/collab/loro/useCollaboration.js +405 -0
  76. package/lib/collab/loro/utils/InitialContent.d.ts +64 -0
  77. package/lib/collab/loro/utils/InitialContent.js +113 -0
  78. package/lib/collab/loro/utils/Invariant.d.ts +15 -0
  79. package/lib/collab/loro/utils/Invariant.js +24 -0
  80. package/lib/collab/loro/utils/LexicalToLoro.d.ts +18 -0
  81. package/lib/collab/loro/utils/LexicalToLoro.js +100 -0
  82. package/lib/collab/loro/utils/Utils.d.ts +44 -0
  83. package/lib/collab/loro/utils/Utils.js +157 -0
  84. package/lib/collab/loro/wsProvider.d.ts +8 -0
  85. package/lib/collab/loro/wsProvider.js +52 -0
  86. package/lib/collab/utils/invariant.d.ts +1 -0
  87. package/lib/collab/utils/invariant.js +15 -0
  88. package/lib/collab/utils/simpleDiffWithCursor.d.ts +5 -0
  89. package/lib/collab/utils/simpleDiffWithCursor.js +35 -0
  90. package/lib/collab/yjs/Bindings.d.ts +23 -0
  91. package/lib/collab/yjs/Bindings.js +26 -0
  92. package/lib/collab/yjs/Debug.d.ts +23 -0
  93. package/lib/collab/yjs/Debug.js +213 -0
  94. package/lib/collab/yjs/LexicalCollaborationContext.d.ts +10 -0
  95. package/lib/collab/yjs/LexicalCollaborationContext.js +37 -0
  96. package/lib/collab/yjs/LexicalCollaborationPlugin.d.ts +21 -0
  97. package/lib/collab/yjs/LexicalCollaborationPlugin.js +63 -0
  98. package/lib/collab/yjs/State.d.ts +51 -0
  99. package/lib/collab/yjs/State.js +35 -0
  100. package/lib/collab/yjs/nodes/AnyCollabNode.d.ts +5 -0
  101. package/lib/collab/yjs/nodes/AnyCollabNode.js +1 -0
  102. package/lib/collab/yjs/nodes/CollabDecoratorNode.d.ts +22 -0
  103. package/lib/collab/yjs/nodes/CollabDecoratorNode.js +64 -0
  104. package/lib/collab/yjs/nodes/CollabElementNode.d.ts +40 -0
  105. package/lib/collab/yjs/nodes/CollabElementNode.js +462 -0
  106. package/lib/collab/yjs/nodes/CollabLineBreakNode.d.ts +19 -0
  107. package/lib/collab/yjs/nodes/CollabLineBreakNode.js +44 -0
  108. package/lib/collab/yjs/nodes/CollabTextNode.d.ts +25 -0
  109. package/lib/collab/yjs/nodes/CollabTextNode.js +103 -0
  110. package/lib/collab/yjs/provider/websocket.d.ts +88 -0
  111. package/lib/collab/yjs/provider/websocket.js +415 -0
  112. package/lib/collab/yjs/servers/index.d.ts +0 -0
  113. package/lib/collab/yjs/servers/index.js +0 -0
  114. package/lib/collab/yjs/servers/ws/callback.d.ts +5 -0
  115. package/lib/collab/yjs/servers/ws/callback.js +72 -0
  116. package/lib/collab/yjs/servers/ws/server.d.ts +2 -0
  117. package/lib/collab/yjs/servers/ws/server.js +25 -0
  118. package/lib/collab/yjs/servers/ws/utils.d.ts +49 -0
  119. package/lib/collab/yjs/servers/ws/utils.js +284 -0
  120. package/lib/collab/yjs/sync/SyncCursors.d.ts +39 -0
  121. package/lib/collab/yjs/sync/SyncCursors.js +351 -0
  122. package/lib/collab/yjs/sync/SyncEditorStates.d.ts +10 -0
  123. package/lib/collab/yjs/sync/SyncEditorStates.js +200 -0
  124. package/lib/collab/yjs/useCollaboration.d.ts +12 -0
  125. package/lib/collab/yjs/useCollaboration.js +255 -0
  126. package/lib/collab/yjs/utils/Utils.d.ts +25 -0
  127. package/lib/collab/yjs/utils/Utils.js +402 -0
  128. package/lib/collab/yjs/wsProvider.d.ts +3 -0
  129. package/lib/collab/yjs/wsProvider.js +21 -0
  130. package/lib/commenting/index.d.ts +41 -0
  131. package/lib/commenting/index.js +328 -0
  132. package/lib/context/FlashMessageContext.d.ts +7 -0
  133. package/lib/context/FlashMessageContext.js +24 -0
  134. package/lib/context/SettingsContext.d.ts +12 -0
  135. package/lib/context/SettingsContext.js +38 -0
  136. package/lib/context/SharedHistoryContext.d.ts +11 -0
  137. package/lib/context/SharedHistoryContext.js +11 -0
  138. package/lib/context/ToolbarContext.d.ts +65 -0
  139. package/lib/context/ToolbarContext.js +84 -0
  140. package/lib/demo.d.ts +12 -0
  141. package/lib/demo.js +45 -0
  142. package/lib/hooks/useFlashMessage.d.ts +2 -0
  143. package/lib/hooks/useFlashMessage.js +8 -0
  144. package/lib/hooks/useModal.d.ts +5 -0
  145. package/lib/hooks/useModal.js +26 -0
  146. package/lib/hooks/useReport.d.ts +1 -0
  147. package/lib/hooks/useReport.js +50 -0
  148. package/lib/index.d.ts +1 -0
  149. package/lib/index.js +5 -0
  150. package/lib/nodes/AutocompleteNode.d.ts +27 -0
  151. package/lib/nodes/AutocompleteNode.js +60 -0
  152. package/lib/nodes/CounterComponent.d.ts +6 -0
  153. package/lib/nodes/CounterComponent.js +137 -0
  154. package/lib/nodes/CounterNode.d.ts +23 -0
  155. package/lib/nodes/CounterNode.js +47 -0
  156. package/lib/nodes/DateTimeNode/DateTimeComponent.d.ts +8 -0
  157. package/lib/nodes/DateTimeNode/DateTimeComponent.js +119 -0
  158. package/lib/nodes/DateTimeNode/DateTimeNode.d.ts +27 -0
  159. package/lib/nodes/DateTimeNode/DateTimeNode.js +82 -0
  160. package/lib/nodes/EmojiNode.d.ts +18 -0
  161. package/lib/nodes/EmojiNode.js +54 -0
  162. package/lib/nodes/EquationComponent.d.ts +9 -0
  163. package/lib/nodes/EquationComponent.js +75 -0
  164. package/lib/nodes/EquationNode.d.ts +26 -0
  165. package/lib/nodes/EquationNode.js +109 -0
  166. package/lib/nodes/ExcalidrawNode/ExcalidrawComponent.d.ts +8 -0
  167. package/lib/nodes/ExcalidrawNode/ExcalidrawComponent.js +110 -0
  168. package/lib/nodes/ExcalidrawNode/ExcalidrawImage.d.ts +50 -0
  169. package/lib/nodes/ExcalidrawNode/ExcalidrawImage.js +55 -0
  170. package/lib/nodes/ExcalidrawNode/index.d.ts +32 -0
  171. package/lib/nodes/ExcalidrawNode/index.js +117 -0
  172. package/lib/nodes/FigmaNode.d.ts +20 -0
  173. package/lib/nodes/FigmaNode.js +52 -0
  174. package/lib/nodes/ImageComponent.d.ts +16 -0
  175. package/lib/nodes/ImageComponent.js +272 -0
  176. package/lib/nodes/ImageNode.d.ts +50 -0
  177. package/lib/nodes/ImageNode.js +151 -0
  178. package/lib/nodes/InlineImageNode/InlineImageComponent.d.ts +26 -0
  179. package/lib/nodes/InlineImageNode/InlineImageComponent.js +161 -0
  180. package/lib/nodes/InlineImageNode/InlineImageNode.d.ts +59 -0
  181. package/lib/nodes/InlineImageNode/InlineImageNode.js +162 -0
  182. package/lib/nodes/KeywordNode.d.ts +14 -0
  183. package/lib/nodes/KeywordNode.js +37 -0
  184. package/lib/nodes/LayoutContainerNode.d.ts +24 -0
  185. package/lib/nodes/LayoutContainerNode.js +95 -0
  186. package/lib/nodes/LayoutItemNode.d.ts +16 -0
  187. package/lib/nodes/LayoutItemNode.js +69 -0
  188. package/lib/nodes/MentionNode.d.ts +20 -0
  189. package/lib/nodes/MentionNode.js +85 -0
  190. package/lib/nodes/PageBreakNode/index.d.ts +17 -0
  191. package/lib/nodes/PageBreakNode/index.js +83 -0
  192. package/lib/nodes/PlaygroundNodes.d.ts +3 -0
  193. package/lib/nodes/PlaygroundNodes.js +75 -0
  194. package/lib/nodes/PollComponent.d.ts +9 -0
  195. package/lib/nodes/PollComponent.js +85 -0
  196. package/lib/nodes/PollNode.d.ts +43 -0
  197. package/lib/nodes/PollNode.js +153 -0
  198. package/lib/nodes/SpecialTextNode.d.ts +24 -0
  199. package/lib/nodes/SpecialTextNode.js +54 -0
  200. package/lib/nodes/StickyComponent.d.ts +10 -0
  201. package/lib/nodes/StickyComponent.js +162 -0
  202. package/lib/nodes/StickyNode.d.ts +31 -0
  203. package/lib/nodes/StickyNode.js +76 -0
  204. package/lib/nodes/TweetNode.d.ts +21 -0
  205. package/lib/nodes/TweetNode.js +119 -0
  206. package/lib/nodes/YouTubeNode.d.ts +22 -0
  207. package/lib/nodes/YouTubeNode.js +84 -0
  208. package/lib/plugins/ActionsPlugin/index.d.ts +5 -0
  209. package/lib/plugins/ActionsPlugin/index.js +168 -0
  210. package/lib/plugins/AutoEmbedPlugin/index.d.ts +19 -0
  211. package/lib/plugins/AutoEmbedPlugin/index.js +158 -0
  212. package/lib/plugins/AutoLinkPlugin/index.d.ts +2 -0
  213. package/lib/plugins/AutoLinkPlugin/index.js +15 -0
  214. package/lib/plugins/AutocompletePlugin/index.d.ts +10 -0
  215. package/lib/plugins/AutocompletePlugin/index.js +2477 -0
  216. package/lib/plugins/CodeActionMenuPlugin/components/CopyButton/index.d.ts +7 -0
  217. package/lib/plugins/CodeActionMenuPlugin/components/CopyButton/index.js +46 -0
  218. package/lib/plugins/CodeActionMenuPlugin/components/PrettierButton/index.d.ts +17 -0
  219. package/lib/plugins/CodeActionMenuPlugin/components/PrettierButton/index.js +115 -0
  220. package/lib/plugins/CodeActionMenuPlugin/index.d.ts +5 -0
  221. package/lib/plugins/CodeActionMenuPlugin/index.js +104 -0
  222. package/lib/plugins/CodeActionMenuPlugin/utils.d.ts +1 -0
  223. package/lib/plugins/CodeActionMenuPlugin/utils.js +22 -0
  224. package/lib/plugins/CodeHighlightPrismPlugin/index.d.ts +2 -0
  225. package/lib/plugins/CodeHighlightPrismPlugin/index.js +14 -0
  226. package/lib/plugins/CodeHighlightShikiPlugin/index.d.ts +2 -0
  227. package/lib/plugins/CodeHighlightShikiPlugin/index.js +14 -0
  228. package/lib/plugins/CollapsiblePlugin/CollapsibleContainerNode.d.ts +25 -0
  229. package/lib/plugins/CollapsiblePlugin/CollapsibleContainerNode.js +135 -0
  230. package/lib/plugins/CollapsiblePlugin/CollapsibleContentNode.d.ts +16 -0
  231. package/lib/plugins/CollapsiblePlugin/CollapsibleContentNode.js +83 -0
  232. package/lib/plugins/CollapsiblePlugin/CollapsibleTitleNode.d.ts +16 -0
  233. package/lib/plugins/CollapsiblePlugin/CollapsibleTitleNode.js +85 -0
  234. package/lib/plugins/CollapsiblePlugin/CollapsibleUtils.d.ts +2 -0
  235. package/lib/plugins/CollapsiblePlugin/CollapsibleUtils.js +12 -0
  236. package/lib/plugins/CollapsiblePlugin/index.d.ts +3 -0
  237. package/lib/plugins/CollapsiblePlugin/index.js +132 -0
  238. package/lib/plugins/CommentPlugin/index.d.ts +9 -0
  239. package/lib/plugins/CommentPlugin/index.js +460 -0
  240. package/lib/plugins/ComponentPickerPlugin/index.d.ts +2 -0
  241. package/lib/plugins/ComponentPickerPlugin/index.js +276 -0
  242. package/lib/plugins/ContextMenuPlugin/index.d.ts +2 -0
  243. package/lib/plugins/ContextMenuPlugin/index.js +112 -0
  244. package/lib/plugins/CounterPlugin/index.d.ts +3 -0
  245. package/lib/plugins/CounterPlugin/index.js +24 -0
  246. package/lib/plugins/DateTimePlugin/index.d.ts +8 -0
  247. package/lib/plugins/DateTimePlugin/index.js +28 -0
  248. package/lib/plugins/DebugPlugin/index.d.ts +3 -0
  249. package/lib/plugins/DebugPlugin/index.js +275 -0
  250. package/lib/plugins/DocsPlugin/index.d.ts +2 -0
  251. package/lib/plugins/DocsPlugin/index.js +4 -0
  252. package/lib/plugins/DragDropPastePlugin/index.d.ts +1 -0
  253. package/lib/plugins/DragDropPastePlugin/index.js +37 -0
  254. package/lib/plugins/DraggableBlockPlugin/index.d.ts +12 -0
  255. package/lib/plugins/DraggableBlockPlugin/index.js +36 -0
  256. package/lib/plugins/EmojiPickerPlugin/index.d.ts +1 -0
  257. package/lib/plugins/EmojiPickerPlugin/index.js +84 -0
  258. package/lib/plugins/EmojisPlugin/index.d.ts +2 -0
  259. package/lib/plugins/EmojisPlugin/index.js +56 -0
  260. package/lib/plugins/EquationsPlugin/index.d.ts +14 -0
  261. package/lib/plugins/EquationsPlugin/index.js +34 -0
  262. package/lib/plugins/ExcalidrawPlugin/index.d.ts +5 -0
  263. package/lib/plugins/ExcalidrawPlugin/index.js +44 -0
  264. package/lib/plugins/FigmaPlugin/index.d.ts +4 -0
  265. package/lib/plugins/FigmaPlugin/index.js +24 -0
  266. package/lib/plugins/FloatingLinkEditorPlugin/index.d.ts +15 -0
  267. package/lib/plugins/FloatingLinkEditorPlugin/index.js +280 -0
  268. package/lib/plugins/FloatingTextFormatToolbarPlugin/index.d.ts +7 -0
  269. package/lib/plugins/FloatingTextFormatToolbarPlugin/index.js +219 -0
  270. package/lib/plugins/ImagesPlugin/index.d.ts +24 -0
  271. package/lib/plugins/ImagesPlugin/index.js +195 -0
  272. package/lib/plugins/InlineImagePlugin/index.d.ts +17 -0
  273. package/lib/plugins/InlineImagePlugin/index.js +180 -0
  274. package/lib/plugins/KeywordsPlugin/index.d.ts +2 -0
  275. package/lib/plugins/KeywordsPlugin/index.js +35 -0
  276. package/lib/plugins/LayoutPlugin/InsertLayoutDialog.d.ts +6 -0
  277. package/lib/plugins/LayoutPlugin/InsertLayoutDialog.js +21 -0
  278. package/lib/plugins/LayoutPlugin/LayoutPlugin.d.ts +7 -0
  279. package/lib/plugins/LayoutPlugin/LayoutPlugin.js +135 -0
  280. package/lib/plugins/LinkPlugin/index.d.ts +6 -0
  281. package/lib/plugins/LinkPlugin/index.js +11 -0
  282. package/lib/plugins/MarkdownShortcutPlugin/index.d.ts +2 -0
  283. package/lib/plugins/MarkdownShortcutPlugin/index.js +6 -0
  284. package/lib/plugins/MarkdownTransformers/index.d.ts +8 -0
  285. package/lib/plugins/MarkdownTransformers/index.js +238 -0
  286. package/lib/plugins/MaxLengthPlugin/index.d.ts +3 -0
  287. package/lib/plugins/MaxLengthPlugin/index.js +41 -0
  288. package/lib/plugins/MentionsPlugin/index.d.ts +2 -0
  289. package/lib/plugins/MentionsPlugin/index.js +564 -0
  290. package/lib/plugins/PageBreakPlugin/index.d.ts +4 -0
  291. package/lib/plugins/PageBreakPlugin/index.js +31 -0
  292. package/lib/plugins/PasteLogPlugin/index.d.ts +2 -0
  293. package/lib/plugins/PasteLogPlugin/index.js +27 -0
  294. package/lib/plugins/PollPlugin/index.d.ts +8 -0
  295. package/lib/plugins/PollPlugin/index.js +38 -0
  296. package/lib/plugins/ShortcutsPlugin/index.d.ts +6 -0
  297. package/lib/plugins/ShortcutsPlugin/index.js +116 -0
  298. package/lib/plugins/ShortcutsPlugin/shortcuts.d.ts +59 -0
  299. package/lib/plugins/ShortcutsPlugin/shortcuts.js +173 -0
  300. package/lib/plugins/SpecialTextPlugin/index.d.ts +2 -0
  301. package/lib/plugins/SpecialTextPlugin/index.js +50 -0
  302. package/lib/plugins/SpeechToTextPlugin/index.d.ts +5 -0
  303. package/lib/plugins/SpeechToTextPlugin/index.js +86 -0
  304. package/lib/plugins/StickyPlugin/index.d.ts +2 -0
  305. package/lib/plugins/StickyPlugin/index.js +16 -0
  306. package/lib/plugins/TabFocusPlugin/index.d.ts +1 -0
  307. package/lib/plugins/TabFocusPlugin/index.js +38 -0
  308. package/lib/plugins/TableActionMenuPlugin/index.d.ts +5 -0
  309. package/lib/plugins/TableActionMenuPlugin/index.js +492 -0
  310. package/lib/plugins/TableCellResizer/index.d.ts +3 -0
  311. package/lib/plugins/TableCellResizer/index.js +297 -0
  312. package/lib/plugins/TableHoverActionsPlugin/index.d.ts +4 -0
  313. package/lib/plugins/TableHoverActionsPlugin/index.js +188 -0
  314. package/lib/plugins/TableOfContentsPlugin/index.d.ts +2 -0
  315. package/lib/plugins/TableOfContentsPlugin/index.js +116 -0
  316. package/lib/plugins/TablePlugin.d.ts +31 -0
  317. package/lib/plugins/TablePlugin.js +63 -0
  318. package/lib/plugins/TestRecorderPlugin/index.d.ts +3 -0
  319. package/lib/plugins/TestRecorderPlugin/index.js +346 -0
  320. package/lib/plugins/ToolbarPlugin/fontSize.d.ts +9 -0
  321. package/lib/plugins/ToolbarPlugin/fontSize.js +84 -0
  322. package/lib/plugins/ToolbarPlugin/index.d.ts +9 -0
  323. package/lib/plugins/ToolbarPlugin/index.js +500 -0
  324. package/lib/plugins/ToolbarPlugin/utils.d.ts +26 -0
  325. package/lib/plugins/ToolbarPlugin/utils.js +247 -0
  326. package/lib/plugins/TreeViewPlugin/index.d.ts +2 -0
  327. package/lib/plugins/TreeViewPlugin/index.js +7 -0
  328. package/lib/plugins/TwitterPlugin/index.d.ts +4 -0
  329. package/lib/plugins/TwitterPlugin/index.js +24 -0
  330. package/lib/plugins/TypingPerfPlugin/index.d.ts +2 -0
  331. package/lib/plugins/TypingPerfPlugin/index.js +97 -0
  332. package/lib/plugins/YouTubePlugin/index.d.ts +4 -0
  333. package/lib/plugins/YouTubePlugin/index.js +24 -0
  334. package/lib/server/validation.d.ts +1 -0
  335. package/lib/server/validation.js +115 -0
  336. package/lib/setupEnv.d.ts +2 -0
  337. package/lib/setupEnv.js +29 -0
  338. package/lib/themes/CommentEditorTheme.d.ts +4 -0
  339. package/lib/themes/CommentEditorTheme.js +11 -0
  340. package/lib/themes/PlaygroundEditorTheme.d.ts +4 -0
  341. package/lib/themes/PlaygroundEditorTheme.js +124 -0
  342. package/lib/themes/StickyEditorTheme.d.ts +4 -0
  343. package/lib/themes/StickyEditorTheme.js +11 -0
  344. package/lib/tyes.dt.d.ts +12 -0
  345. package/lib/tyes.dt.js +4 -0
  346. package/lib/ui/Button.d.ts +12 -0
  347. package/lib/ui/Button.js +6 -0
  348. package/lib/ui/ColorPicker.d.ts +14 -0
  349. package/lib/ui/ColorPicker.js +219 -0
  350. package/lib/ui/ContentEditable.d.ts +9 -0
  351. package/lib/ui/ContentEditable.js +6 -0
  352. package/lib/ui/Dialog.d.ts +10 -0
  353. package/lib/ui/Dialog.js +8 -0
  354. package/lib/ui/DropDown.d.ts +18 -0
  355. package/lib/ui/DropDown.js +133 -0
  356. package/lib/ui/DropdownColorPicker.d.ts +13 -0
  357. package/lib/ui/DropdownColorPicker.js +6 -0
  358. package/lib/ui/EquationEditor.d.ts +8 -0
  359. package/lib/ui/EquationEditor.js +11 -0
  360. package/lib/ui/ExcalidrawModal.d.ts +42 -0
  361. package/lib/ui/ExcalidrawModal.js +103 -0
  362. package/lib/ui/FileInput.d.ts +10 -0
  363. package/lib/ui/FileInput.js +5 -0
  364. package/lib/ui/FlashMessage.d.ts +7 -0
  365. package/lib/ui/FlashMessage.js +6 -0
  366. package/lib/ui/ImageResizer.d.ts +17 -0
  367. package/lib/ui/ImageResizer.js +171 -0
  368. package/lib/ui/KatexEquationAlterer.d.ts +8 -0
  369. package/lib/ui/KatexEquationAlterer.js +23 -0
  370. package/lib/ui/KatexRenderer.d.ts +6 -0
  371. package/lib/ui/KatexRenderer.js +24 -0
  372. package/lib/ui/Modal.d.ts +9 -0
  373. package/lib/ui/Modal.js +48 -0
  374. package/lib/ui/Select.d.ts +8 -0
  375. package/lib/ui/Select.js +5 -0
  376. package/lib/ui/Switch.d.ts +8 -0
  377. package/lib/ui/Switch.js +6 -0
  378. package/lib/ui/TextInput.d.ts +13 -0
  379. package/lib/ui/TextInput.js +7 -0
  380. package/lib/utils/docSerialization.d.ts +3 -0
  381. package/lib/utils/docSerialization.js +60 -0
  382. package/lib/utils/emoji-list.d.ts +20 -0
  383. package/lib/utils/emoji-list.js +16609 -0
  384. package/lib/utils/getDOMRangeRect.d.ts +8 -0
  385. package/lib/utils/getDOMRangeRect.js +26 -0
  386. package/lib/utils/getSelectedNode.d.ts +2 -0
  387. package/lib/utils/getSelectedNode.js +28 -0
  388. package/lib/utils/getThemeSelector.d.ts +2 -0
  389. package/lib/utils/getThemeSelector.js +14 -0
  390. package/lib/utils/isMobileWidth.d.ts +7 -0
  391. package/lib/utils/isMobileWidth.js +11 -0
  392. package/lib/utils/joinClasses.d.ts +1 -0
  393. package/lib/utils/joinClasses.js +7 -0
  394. package/lib/utils/setFloatingElemPosition.d.ts +1 -0
  395. package/lib/utils/setFloatingElemPosition.js +59 -0
  396. package/lib/utils/setFloatingElemPositionForLinkEditor.d.ts +1 -0
  397. package/lib/utils/setFloatingElemPositionForLinkEditor.js +36 -0
  398. package/lib/utils/swipe.d.ts +4 -0
  399. package/lib/utils/swipe.js +94 -0
  400. package/lib/utils/url.d.ts +2 -0
  401. package/lib/utils/url.js +31 -0
  402. package/package.json +4 -4
@@ -0,0 +1,23 @@
1
+ import type { LexicalEditor, NodeKey } from 'lexical';
2
+ import { Klass, LexicalNode } from 'lexical';
3
+ import type { Doc } from 'yjs';
4
+ import type { CollabElementNode } from './nodes/CollabElementNode';
5
+ import { AnyCollabNode } from './nodes/AnyCollabNode';
6
+ import type { Cursor } from './sync/SyncCursors';
7
+ import { Provider } from './State';
8
+ export type ClientID = number;
9
+ export type Binding = {
10
+ clientID: ClientID;
11
+ collabNodeMap: Map<NodeKey, AnyCollabNode>;
12
+ cursors: Map<ClientID, Cursor>;
13
+ cursorsContainer: null | HTMLElement;
14
+ doc: Doc;
15
+ docMap: Map<string, Doc>;
16
+ editor: LexicalEditor;
17
+ id: string;
18
+ nodeProperties: Map<string, Array<string>>;
19
+ root: CollabElementNode;
20
+ excludedProperties: ExcludedProperties;
21
+ };
22
+ export type ExcludedProperties = Map<Klass<LexicalNode>, Set<string>>;
23
+ export declare function createBinding(editor: LexicalEditor, provider: Provider, id: string, doc: Doc | null | undefined, docMap: Map<string, Doc>, excludedProperties?: ExcludedProperties): Binding;
@@ -0,0 +1,26 @@
1
+ import { XmlText } from 'yjs';
2
+ import invariant from '../utils/invariant';
3
+ import { $createCollabElementNode } from './nodes/CollabElementNode';
4
+ import { setupYjsDebugging } from './Debug';
5
+ export function createBinding(editor, provider, id, doc, docMap, excludedProperties) {
6
+ invariant(doc !== undefined && doc !== null, 'createBinding: doc is null or undefined');
7
+ const rootXmlText = doc.get('root', XmlText);
8
+ const collabRoot = $createCollabElementNode(rootXmlText, null, 'root');
9
+ collabRoot._key = 'root';
10
+ const binding = {
11
+ clientID: doc.clientID,
12
+ collabNodeMap: new Map(),
13
+ cursors: new Map(),
14
+ cursorsContainer: null,
15
+ doc,
16
+ docMap,
17
+ editor,
18
+ excludedProperties: excludedProperties || new Map(),
19
+ id,
20
+ nodeProperties: new Map(),
21
+ root: collabRoot,
22
+ };
23
+ // Setup Y.js debugging utilities
24
+ setupYjsDebugging(binding);
25
+ return binding;
26
+ }
@@ -0,0 +1,23 @@
1
+ import type { Binding } from './Bindings';
2
+ /**
3
+ * YJS Debugging Interface - Provides comprehensive debugging utilities for Y.js collaboration
4
+ */
5
+ export interface YjsDebugger {
6
+ binding: Binding | null;
7
+ logStructure: () => void;
8
+ verifyStructure: () => void;
9
+ inspectNode: (nodeKey: string) => void;
10
+ generateTreeHTML: (node: any, prefix?: string, isLast?: boolean) => string;
11
+ addDebugToPage: () => void;
12
+ }
13
+ /**
14
+ * Setup global debugging utilities for Y.js collaboration
15
+ * This function creates comprehensive debugging tools including:
16
+ * - Tree structure visualization
17
+ * - Node inspection utilities
18
+ * - Interactive debug panel
19
+ * - Console logging functions
20
+ *
21
+ * @param binding - The Y.js binding instance to debug
22
+ */
23
+ export declare function setupYjsDebugging(binding: Binding): void;
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Setup global debugging utilities for Y.js collaboration
3
+ * This function creates comprehensive debugging tools including:
4
+ * - Tree structure visualization
5
+ * - Node inspection utilities
6
+ * - Interactive debug panel
7
+ * - Console logging functions
8
+ *
9
+ * @param binding - The Y.js binding instance to debug
10
+ */
11
+ export function setupYjsDebugging(binding) {
12
+ // Setup global debugging for Y.js
13
+ window.debugYjs = {
14
+ binding: null, // Will be set after binding is created
15
+ logStructure: () => {
16
+ const binding = window.debugYjs.binding;
17
+ if (binding) {
18
+ console.log('=== YJS STRUCTURE DEBUG ===');
19
+ console.log('Root children:', binding.root._children.length);
20
+ binding.root._children.forEach((child, index) => {
21
+ console.log(` ${index}: ${child.constructor.name}(${child._key})`);
22
+ });
23
+ console.log('=== END DEBUG ===');
24
+ }
25
+ else {
26
+ console.log('Y.js binding not available yet');
27
+ }
28
+ },
29
+ verifyStructure: () => {
30
+ const binding = window.debugYjs.binding;
31
+ if (!binding)
32
+ return console.log('❌ Binding not available');
33
+ console.log('🔍 YJS STRUCTURE VERIFICATION:');
34
+ console.log('Root children count:', binding.root._children.length);
35
+ binding.root._children.forEach((child, index) => {
36
+ console.log(`\n📍 Root child ${index}:`);
37
+ console.log(' Type:', child.constructor.name);
38
+ console.log(' Key:', child._key);
39
+ console.log(' Element Type:', child.getType ? child.getType() : 'N/A');
40
+ console.log(' Children Count:', child._children ? child._children.length : 0);
41
+ if (child._children && child._children.length > 0) {
42
+ console.log(' Children:');
43
+ child._children.forEach((grandChild, gIndex) => {
44
+ console.log(` ${gIndex}: ${grandChild.constructor.name}(${grandChild._key})`);
45
+ });
46
+ }
47
+ });
48
+ // Check for any orphaned text nodes at root level
49
+ const textNodesAtRoot = binding.root._children.filter(child => child.constructor.name === 'CollabTextNode');
50
+ if (textNodesAtRoot.length > 0) {
51
+ console.log('⚠️ WARNING: Found text nodes directly under root:');
52
+ textNodesAtRoot.forEach(node => console.log(' -', node._key));
53
+ }
54
+ },
55
+ inspectNode: (nodeKey) => {
56
+ const binding = window.debugYjs.binding;
57
+ if (!binding)
58
+ return console.log('Binding not available');
59
+ // Search for node in tree
60
+ const findNode = (node, key) => {
61
+ if (node._key === key)
62
+ return node;
63
+ if (node._children) {
64
+ for (const child of node._children) {
65
+ const found = findNode(child, key);
66
+ if (found)
67
+ return found;
68
+ }
69
+ }
70
+ return null;
71
+ };
72
+ const node = findNode(binding.root, nodeKey);
73
+ if (node) {
74
+ console.log('🔍 Node Details:', {
75
+ key: node._key,
76
+ type: node.constructor.name,
77
+ elementType: node.getType ? node.getType() : 'N/A',
78
+ children: node._children ? node._children.length : 0,
79
+ properties: node._xmlText ? 'Has XmlText' : 'No XmlText',
80
+ parent: node._parent ? node._parent._key : 'No parent'
81
+ });
82
+ }
83
+ else {
84
+ console.warn(`Node with key "${nodeKey}" not found`);
85
+ }
86
+ },
87
+ generateTreeHTML: (node, prefix = '', isLast = true) => {
88
+ const nodeKey = node._key || 'no-key';
89
+ const nodeType = node.getType ? node.getType() : 'no-type';
90
+ const nodeInfo = `${node.constructor.name}(${nodeKey}) [${nodeType}]`;
91
+ const connector = isLast ? '└── ' : '├── ';
92
+ const childPrefix = prefix + (isLast ? ' ' : '│ ');
93
+ const clickIntegrator = nodeKey !== 'no-key' ? `onclick="window.debugYjs.inspectNode('${nodeKey}')"` : '';
94
+ const nodeColor = nodeKey !== 'no-key' ? '#00ff88' : '#888';
95
+ const cursor = nodeKey !== 'no-key' ? 'cursor: pointer; text-decoration: underline;' : '';
96
+ // Convert spaces to non-breaking spaces for proper HTML rendering
97
+ const htmlPrefix = prefix.replace(/ /g, '&nbsp;');
98
+ const htmlConnector = connector.replace(/ /g, '&nbsp;');
99
+ let result = `<div style="color: ${nodeColor}; ${cursor}" ${clickIntegrator}>${htmlPrefix}${htmlConnector}${nodeInfo}</div>`;
100
+ if (node._children && node._children.length > 0) {
101
+ node._children.forEach((child, index) => {
102
+ const isLastChild = index === node._children.length - 1;
103
+ if (child) {
104
+ result += window.debugYjs.generateTreeHTML(child, childPrefix, isLastChild);
105
+ }
106
+ else {
107
+ const childConnector = isLastChild ? '└── ' : '├── ';
108
+ const htmlChildPrefix = childPrefix.replace(/ /g, '&nbsp;');
109
+ const htmlChildConnector = childConnector.replace(/ /g, '&nbsp;');
110
+ result += `<div style="color: #ffaa00;">${htmlChildPrefix}${htmlChildConnector}null</div>`;
111
+ }
112
+ });
113
+ }
114
+ return result;
115
+ },
116
+ addDebugToPage: () => {
117
+ const binding = window.debugYjs.binding;
118
+ if (!binding)
119
+ return;
120
+ // Debug: log the actual structure to console
121
+ console.log('🟢 YJS Root structure:', {
122
+ rootChildren: binding.root._children.length,
123
+ children: binding.root._children.map((child, index) => ({
124
+ index,
125
+ type: child.constructor.name,
126
+ key: child._key,
127
+ childrenCount: child._children ? child._children.length : 0,
128
+ children: child._children ? child._children.map((grandChild) => ({
129
+ type: grandChild.constructor.name,
130
+ key: grandChild._key
131
+ })) : []
132
+ }))
133
+ });
134
+ const treeHTML = window.debugYjs.generateTreeHTML(binding.root);
135
+ const debugDiv = document.getElementById('debug-yjs') || document.createElement('div');
136
+ const existingDiv = document.getElementById('debug-yjs');
137
+ // Preserve current position if panel already exists
138
+ let currentLeft = '10px';
139
+ let currentTop = '700px';
140
+ if (existingDiv) {
141
+ currentLeft = existingDiv.style.left || '10px';
142
+ currentTop = existingDiv.style.top || '700px';
143
+ }
144
+ debugDiv.id = 'debug-yjs';
145
+ debugDiv.style.cssText = `position: fixed; top: ${currentTop}; left: ${currentLeft}; background: rgba(0,100,0,0.9); color: white; padding: 0; border-radius: 8px; font-family: "Courier New", monospace; font-size: 11px; z-index: 9999; max-width: 500px; max-height: 80vh; box-shadow: 0 4px 8px rgba(0,0,0,0.3); border: 1px solid #51cf66; user-select: none;`;
146
+ // Add drag functionality if not already added
147
+ if (!debugDiv.classList.contains('draggable-initialized')) {
148
+ debugDiv.classList.add('draggable-initialized');
149
+ let isDragging = false;
150
+ let startX = 0;
151
+ let startY = 0;
152
+ let startLeft = 0;
153
+ let startTop = 0;
154
+ debugDiv.addEventListener('mousedown', (e) => {
155
+ // Only start drag if clicking on the header area
156
+ const target = e.target;
157
+ const dragHandle = debugDiv.querySelector('.debug-drag-handle');
158
+ if (!dragHandle || !dragHandle.contains(target))
159
+ return;
160
+ isDragging = true;
161
+ startX = e.clientX;
162
+ startY = e.clientY;
163
+ const rect = debugDiv.getBoundingClientRect();
164
+ startLeft = rect.left;
165
+ startTop = rect.top;
166
+ document.addEventListener('mousemove', onMouseMove);
167
+ document.addEventListener('mouseup', onMouseUp);
168
+ e.preventDefault();
169
+ });
170
+ function onMouseMove(e) {
171
+ if (!isDragging)
172
+ return;
173
+ const deltaX = e.clientX - startX;
174
+ const deltaY = e.clientY - startY;
175
+ const newLeft = Math.max(0, Math.min(window.innerWidth - debugDiv.offsetWidth, startLeft + deltaX));
176
+ const newTop = Math.max(0, Math.min(window.innerHeight - debugDiv.offsetHeight, startTop + deltaY));
177
+ debugDiv.style.left = newLeft + 'px';
178
+ debugDiv.style.top = newTop + 'px';
179
+ }
180
+ function onMouseUp() {
181
+ isDragging = false;
182
+ document.removeEventListener('mousemove', onMouseMove);
183
+ document.removeEventListener('mouseup', onMouseUp);
184
+ }
185
+ }
186
+ debugDiv.innerHTML = `
187
+ <div class="debug-drag-handle" style="color: #51cf66; font-weight: bold; margin-bottom: 10px; border-bottom: 1px solid #444; padding: 15px 15px 5px 15px; cursor: move; background: linear-gradient(90deg, rgba(81,207,102,0.1), transparent);">
188
+ 🟢 YJS STRUCTURE <span style="float: right; font-size: 9px; color: #666;">⋮⋮ drag</span>
189
+ </div>
190
+ <div style="padding: 0 15px 15px 15px; overflow-y: auto; max-height: calc(80vh - 50px);">
191
+ <div style="color: #74c0fc; margin-bottom: 8px;">Root children: ${binding.root._children.length}</div>
192
+ <div style="color: #ffd43b; margin-bottom: 10px;">Time: ${new Date().toLocaleTimeString()}</div>
193
+ <div style="border-top: 1px solid #444; padding-top: 8px;">
194
+ ${treeHTML}
195
+ </div>
196
+ <div style="margin-top: 10px; font-size: 10px; color: #888;">
197
+ <span onclick="window.debugYjs.addDebugToPage()" style="color: #74c0fc; cursor: pointer; text-decoration: underline;">🔄 Refresh</span> |
198
+ <span onclick="window.debugYjs.verifyStructure()" style="color: #00ff88; cursor: pointer; text-decoration: underline;">✅ Verify</span> |
199
+ <span onclick="window.debugYjs.logStructure()" style="color: #ffd43b; cursor: pointer; text-decoration: underline;">📝 Console Log</span> |
200
+ <span onclick="document.getElementById('debug-yjs').remove()" style="color: #51cf66; cursor: pointer; text-decoration: underline;">❌ Close</span>
201
+ </div>
202
+ </div>
203
+ `;
204
+ document.body.appendChild(debugDiv);
205
+ }
206
+ };
207
+ // Expose binding for debugging
208
+ window.debugYjs.binding = binding;
209
+ // Auto-initialize debug window after a short delay
210
+ setTimeout(() => {
211
+ window.debugYjs.addDebugToPage();
212
+ }, 1500); // Slightly later than Y.js to avoid overlap
213
+ }
@@ -0,0 +1,10 @@
1
+ import type { Doc } from 'yjs';
2
+ export type CollaborationContextType = {
3
+ clientID: number;
4
+ color: string;
5
+ isCollabActive: boolean;
6
+ name: string;
7
+ docMap: Map<string, Doc>;
8
+ };
9
+ export declare const CollaborationContext: import("react").Context<CollaborationContextType>;
10
+ export declare function useCollaborationContext(username?: string, color?: string): CollaborationContextType;
@@ -0,0 +1,37 @@
1
+ import { createContext, useContext } from 'react';
2
+ const ENTRIES = [
3
+ ['Cat', 'rgb(125, 50, 0)'],
4
+ ['Dog', 'rgb(100, 0, 0)'],
5
+ ['Rabbit', 'rgb(150, 0, 0)'],
6
+ ['Frog', 'rgb(200, 0, 0)'],
7
+ ['Fox', 'rgb(200, 75, 0)'],
8
+ ['Hedgehog', 'rgb(0, 75, 0)'],
9
+ ['Pigeon', 'rgb(0, 125, 0)'],
10
+ ['Squirrel', 'rgb(75, 100, 0)'],
11
+ ['Bear', 'rgb(125, 100, 0)'],
12
+ ['Tiger', 'rgb(0, 0, 150)'],
13
+ ['Leopard', 'rgb(0, 0, 200)'],
14
+ ['Zebra', 'rgb(0, 0, 250)'],
15
+ ['Wolf', 'rgb(0, 100, 150)'],
16
+ ['Owl', 'rgb(0, 100, 100)'],
17
+ ['Gull', 'rgb(100, 0, 100)'],
18
+ ['Squid', 'rgb(150, 0, 150)'],
19
+ ];
20
+ const randomEntry = ENTRIES[Math.floor(Math.random() * ENTRIES.length)];
21
+ export const CollaborationContext = createContext({
22
+ clientID: 0,
23
+ color: randomEntry[1],
24
+ isCollabActive: false,
25
+ name: randomEntry[0],
26
+ docMap: new Map(),
27
+ });
28
+ export function useCollaborationContext(username, color) {
29
+ const collabContext = useContext(CollaborationContext);
30
+ if (username != null) {
31
+ collabContext.name = username;
32
+ }
33
+ if (color != null) {
34
+ collabContext.color = color;
35
+ }
36
+ return collabContext;
37
+ }
@@ -0,0 +1,21 @@
1
+ import type { JSX } from 'react';
2
+ import type { Doc } from 'yjs';
3
+ import { InitialEditorStateType } from '@lexical/react/LexicalComposer';
4
+ import { Provider } from './State';
5
+ import { CursorsContainerRef } from './useCollaboration';
6
+ import { SyncCursorPositionsFn } from './sync/SyncCursors';
7
+ import { ExcludedProperties } from './Bindings';
8
+ type Props = {
9
+ id: string;
10
+ providerFactory: (id: string, docMap: Map<string, Doc>) => Provider;
11
+ shouldBootstrap: boolean;
12
+ username?: string;
13
+ cursorColor?: string;
14
+ cursorsContainerRef?: CursorsContainerRef;
15
+ initialEditorState?: InitialEditorStateType;
16
+ excludedProperties?: ExcludedProperties;
17
+ awarenessData?: object;
18
+ syncCursorPositionsFn?: SyncCursorPositionsFn;
19
+ };
20
+ export declare function CollaborationPlugin({ id, providerFactory, shouldBootstrap, username, cursorColor, cursorsContainerRef, initialEditorState, excludedProperties, awarenessData, syncCursorPositionsFn, }: Props): JSX.Element;
21
+ export {};
@@ -0,0 +1,63 @@
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, } from './LexicalCollaborationContext';
5
+ import { useCollaboration, useFocusTracking, useHistory, } from './useCollaboration';
6
+ import { createBinding } from './Bindings';
7
+ export function CollaborationPlugin({ id, providerFactory, shouldBootstrap, username, cursorColor, cursorsContainerRef, initialEditorState, excludedProperties, awarenessData, syncCursorPositionsFn, }) {
8
+ const isBindingInitialized = useRef(false);
9
+ const isProviderInitialized = useRef(false);
10
+ const collabContext = useCollaborationContext(username, cursorColor);
11
+ const { docMap, name, color } = collabContext;
12
+ const [editor] = useLexicalComposerContext();
13
+ useEffect(() => {
14
+ collabContext.isCollabActive = true;
15
+ return () => {
16
+ // Resetting flag only when unmount top level editor collab plugin. Nested
17
+ // editors (e.g. image caption) should unmount without affecting it
18
+ if (editor._parentEditor == null) {
19
+ collabContext.isCollabActive = false;
20
+ }
21
+ };
22
+ }, [collabContext, editor]);
23
+ const [provider, setProvider] = useState();
24
+ const [doc, setDoc] = useState();
25
+ useEffect(() => {
26
+ if (isProviderInitialized.current) {
27
+ return;
28
+ }
29
+ isProviderInitialized.current = true;
30
+ const provider = providerFactory(id, docMap);
31
+ setProvider(provider);
32
+ setDoc(docMap.get(id));
33
+ return () => {
34
+ provider.disconnect();
35
+ };
36
+ }, [id, providerFactory, docMap]);
37
+ const [binding, setBinding] = useState();
38
+ useEffect(() => {
39
+ if (!provider) {
40
+ return;
41
+ }
42
+ if (isBindingInitialized.current) {
43
+ return;
44
+ }
45
+ isBindingInitialized.current = true;
46
+ const binding = createBinding(editor, provider, id, doc || docMap.get(id), docMap, excludedProperties);
47
+ setBinding(binding);
48
+ return () => {
49
+ binding.root.destroy(binding);
50
+ };
51
+ }, [editor, provider, id, docMap, doc, excludedProperties]);
52
+ if (!provider || !binding) {
53
+ return _jsx(_Fragment, {});
54
+ }
55
+ return (_jsx(YjsCollaborationCursors, { 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 }));
56
+ }
57
+ function YjsCollaborationCursors({ editor, id, provider, docMap, name, color, shouldBootstrap, cursorsContainerRef, initialEditorState, awarenessData, collabContext, binding, setDoc, syncCursorPositionsFn, }) {
58
+ const cursorsElement = useCollaboration(editor, id, provider, docMap, name, color, shouldBootstrap, binding, setDoc, cursorsContainerRef, initialEditorState, awarenessData, syncCursorPositionsFn);
59
+ collabContext.clientID = binding.clientID;
60
+ useHistory(editor, binding);
61
+ useFocusTracking(editor, provider, name, color, awarenessData);
62
+ return cursorsElement;
63
+ }
@@ -0,0 +1,51 @@
1
+ import type { LexicalCommand } from 'lexical';
2
+ import type { Doc, RelativePosition, UndoManager, XmlText } from 'yjs';
3
+ import type { Binding } from './Bindings';
4
+ export type UserState = {
5
+ anchorPos: RelativePosition | null;
6
+ color: string;
7
+ focusing: boolean;
8
+ focusPos: RelativePosition | null;
9
+ name: string;
10
+ awarenessData: object;
11
+ [key: string]: unknown;
12
+ };
13
+ export declare const CONNECTED_COMMAND: LexicalCommand<boolean>;
14
+ export declare const TOGGLE_CONNECT_COMMAND: LexicalCommand<boolean>;
15
+ export type AwarenessProvider = {
16
+ getLocalState: () => UserState | null;
17
+ getStates: () => Map<number, UserState>;
18
+ off: (type: 'update', cb: () => void) => void;
19
+ on: (type: 'update', cb: () => void) => void;
20
+ setLocalState: (userState: UserState) => void;
21
+ setLocalStateField: (field: string, value: unknown) => void;
22
+ };
23
+ export type Provider = {
24
+ awareness: AwarenessProvider;
25
+ connect(): void | Promise<void>;
26
+ disconnect(): void;
27
+ off(type: 'sync', cb: (isSynced: boolean) => void): void;
28
+ off(type: 'update', cb: (update: unknown) => void): void;
29
+ off(type: 'status', cb: (status: {
30
+ status: string;
31
+ }) => void): void;
32
+ off(type: 'reload', cb: (doc: Doc) => void): void;
33
+ on(type: 'sync', cb: (isSynced: boolean) => void): void;
34
+ on(type: 'status', cb: (status: {
35
+ status: string;
36
+ }) => void): void;
37
+ on(type: 'update', cb: (update: unknown) => void): void;
38
+ on(type: 'reload', cb: (doc: Doc) => void): void;
39
+ };
40
+ export type Operation = {
41
+ attributes: {
42
+ __type: string;
43
+ };
44
+ insert: string | Record<string, unknown>;
45
+ };
46
+ export type Delta = Array<Operation>;
47
+ export type YjsNode = Record<string, unknown>;
48
+ export type YjsEvent = Record<string, unknown>;
49
+ export declare function createUndoManager(binding: Binding, root: XmlText): UndoManager;
50
+ export declare function initLocalState(provider: Provider, name: string, color: string, focusing: boolean, awarenessData: object): void;
51
+ export declare function setLocalStateFocus(provider: Provider, name: string, color: string, focusing: boolean, awarenessData: object): void;
@@ -0,0 +1,35 @@
1
+ import { createCommand } from 'lexical';
2
+ import { UndoManager as YjsUndoManager } from 'yjs';
3
+ export const CONNECTED_COMMAND = createCommand('CONNECTED_COMMAND');
4
+ export const TOGGLE_CONNECT_COMMAND = createCommand('TOGGLE_CONNECT_COMMAND');
5
+ export function createUndoManager(binding, root) {
6
+ return new YjsUndoManager(root, {
7
+ trackedOrigins: new Set([binding, null]),
8
+ });
9
+ }
10
+ export function initLocalState(provider, name, color, focusing, awarenessData) {
11
+ provider.awareness.setLocalState({
12
+ anchorPos: null,
13
+ awarenessData,
14
+ color,
15
+ focusPos: null,
16
+ focusing,
17
+ name,
18
+ });
19
+ }
20
+ export function setLocalStateFocus(provider, name, color, focusing, awarenessData) {
21
+ const { awareness } = provider;
22
+ let localState = awareness.getLocalState();
23
+ if (localState === null) {
24
+ localState = {
25
+ anchorPos: null,
26
+ awarenessData,
27
+ color,
28
+ focusPos: null,
29
+ focusing: focusing,
30
+ name,
31
+ };
32
+ }
33
+ localState.focusing = focusing;
34
+ awareness.setLocalState(localState);
35
+ }
@@ -0,0 +1,5 @@
1
+ import { CollabDecoratorNode } from "./CollabDecoratorNode";
2
+ import { CollabElementNode } from "./CollabElementNode";
3
+ import { CollabLineBreakNode } from "./CollabLineBreakNode";
4
+ import { CollabTextNode } from "./CollabTextNode";
5
+ export type AnyCollabNode = CollabDecoratorNode | CollabElementNode | CollabTextNode | CollabLineBreakNode;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,22 @@
1
+ import type { XmlElement } from 'yjs';
2
+ import type { DecoratorNode, NodeKey, NodeMap } from 'lexical';
3
+ import type { Binding } from '../Bindings';
4
+ import type { CollabElementNode } from './CollabElementNode';
5
+ export declare class CollabDecoratorNode {
6
+ _xmlElem: XmlElement;
7
+ _key: NodeKey;
8
+ _parent: CollabElementNode;
9
+ _type: string;
10
+ constructor(xmlElem: XmlElement, parent: CollabElementNode, type: string);
11
+ getPrevNode(nodeMap: null | NodeMap): null | DecoratorNode<unknown>;
12
+ getNode(): null | DecoratorNode<unknown>;
13
+ getSharedType(): XmlElement;
14
+ getType(): string;
15
+ getKey(): NodeKey;
16
+ getSize(): number;
17
+ getOffset(): number;
18
+ syncPropertiesFromLexical(binding: Binding, nextLexicalNode: DecoratorNode<unknown>, prevNodeMap: null | NodeMap): void;
19
+ syncPropertiesFromYjs(binding: Binding, keysChanged: null | Set<string>): void;
20
+ destroy(binding: Binding): void;
21
+ }
22
+ export declare function $createCollabDecoratorNode(xmlElem: XmlElement, parent: CollabElementNode, type: string): CollabDecoratorNode;
@@ -0,0 +1,64 @@
1
+ import { $getNodeByKey, $isDecoratorNode } from 'lexical';
2
+ import invariant from '../../utils/invariant';
3
+ import { $syncPropertiesFromYjs, syncPropertiesFromLexical } from '../utils/Utils';
4
+ export class CollabDecoratorNode {
5
+ _xmlElem;
6
+ _key;
7
+ _parent;
8
+ _type;
9
+ constructor(xmlElem, parent, type) {
10
+ this._key = '';
11
+ this._xmlElem = xmlElem;
12
+ this._parent = parent;
13
+ this._type = type;
14
+ }
15
+ getPrevNode(nodeMap) {
16
+ if (nodeMap === null) {
17
+ return null;
18
+ }
19
+ const node = nodeMap.get(this._key);
20
+ return $isDecoratorNode(node) ? node : null;
21
+ }
22
+ getNode() {
23
+ const node = $getNodeByKey(this._key);
24
+ return $isDecoratorNode(node) ? node : null;
25
+ }
26
+ getSharedType() {
27
+ return this._xmlElem;
28
+ }
29
+ getType() {
30
+ return this._type;
31
+ }
32
+ getKey() {
33
+ return this._key;
34
+ }
35
+ getSize() {
36
+ return 1;
37
+ }
38
+ getOffset() {
39
+ const collabElementNode = this._parent;
40
+ return collabElementNode.getChildOffset(this);
41
+ }
42
+ syncPropertiesFromLexical(binding, nextLexicalNode, prevNodeMap) {
43
+ const prevLexicalNode = this.getPrevNode(prevNodeMap);
44
+ const xmlElem = this._xmlElem;
45
+ syncPropertiesFromLexical(binding, xmlElem, prevLexicalNode, nextLexicalNode);
46
+ }
47
+ syncPropertiesFromYjs(binding, keysChanged) {
48
+ const lexicalNode = this.getNode();
49
+ invariant(lexicalNode !== null, 'syncPropertiesFromYjs: could not find decorator node');
50
+ const xmlElem = this._xmlElem;
51
+ $syncPropertiesFromYjs(binding, xmlElem, lexicalNode, keysChanged);
52
+ }
53
+ destroy(binding) {
54
+ const collabNodeMap = binding.collabNodeMap;
55
+ if (collabNodeMap.get(this._key) === this) {
56
+ collabNodeMap.delete(this._key);
57
+ }
58
+ }
59
+ }
60
+ export function $createCollabDecoratorNode(xmlElem, parent, type) {
61
+ const collabNode = new CollabDecoratorNode(xmlElem, parent, type);
62
+ xmlElem._collabNode = collabNode;
63
+ return collabNode;
64
+ }
@@ -0,0 +1,40 @@
1
+ import type { ElementNode, NodeKey, NodeMap } from 'lexical';
2
+ import type { AbstractType, XmlText } from 'yjs';
3
+ import type { Binding } from '../Bindings';
4
+ import { AnyCollabNode } from './AnyCollabNode';
5
+ type IntentionallyMarkedAsDirtyElement = boolean;
6
+ export declare class CollabElementNode {
7
+ _key: NodeKey;
8
+ _children: Array<AnyCollabNode>;
9
+ _xmlText: XmlText;
10
+ _type: string;
11
+ _parent: null | CollabElementNode;
12
+ constructor(xmlText: XmlText, parent: null | CollabElementNode, type: string);
13
+ getPrevNode(nodeMap: null | NodeMap): null | ElementNode;
14
+ getNode(): null | ElementNode;
15
+ getSharedType(): XmlText;
16
+ getType(): string;
17
+ getKey(): NodeKey;
18
+ isEmpty(): boolean;
19
+ getSize(): number;
20
+ getOffset(): number;
21
+ syncPropertiesFromYjs(binding: Binding, keysChanged: null | Set<string>): void;
22
+ applyChildrenYjsDelta(binding: Binding, deltas: Array<{
23
+ insert?: string | object | AbstractType<unknown>;
24
+ delete?: number;
25
+ retain?: number;
26
+ attributes?: {
27
+ [x: string]: unknown;
28
+ };
29
+ }>): void;
30
+ syncChildrenFromYjs(binding: Binding): void;
31
+ syncPropertiesFromLexical(binding: Binding, nextLexicalNode: ElementNode, prevNodeMap: null | NodeMap): void;
32
+ _syncChildFromLexical(binding: Binding, index: number, key: NodeKey, prevNodeMap: null | NodeMap, dirtyElements: null | Map<NodeKey, IntentionallyMarkedAsDirtyElement>, dirtyLeaves: null | Set<NodeKey>): void;
33
+ syncChildrenFromLexical(binding: Binding, nextLexicalNode: ElementNode, prevNodeMap: null | NodeMap, dirtyElements: null | Map<NodeKey, IntentionallyMarkedAsDirtyElement>, dirtyLeaves: null | Set<NodeKey>): void;
34
+ append(collabNode: AnyCollabNode): void;
35
+ splice(binding: Binding, index: number, delCount: number, collabNode?: AnyCollabNode): void;
36
+ getChildOffset(collabNode: AnyCollabNode): number;
37
+ destroy(binding: Binding): void;
38
+ }
39
+ export declare function $createCollabElementNode(xmlText: XmlText, parent: null | CollabElementNode, type: string): CollabElementNode;
40
+ export {};