@datalayer/lexical-loro 0.1.0 → 0.2.1

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