@datalayer/lexical-loro 0.1.0 → 0.2.2

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