@datalayer/lexical-loro 0.2.5 → 1.0.0

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