@datalayer/lexical-loro 1.0.2 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/README.md +2 -2
  2. package/lib/App.d.ts +2 -0
  3. package/lib/App.js +141 -0
  4. package/lib/Editor.d.ts +2 -0
  5. package/lib/Editor.js +116 -0
  6. package/lib/Settings.d.ts +2 -0
  7. package/lib/Settings.js +57 -0
  8. package/lib/appSettings.d.ts +36 -0
  9. package/lib/appSettings.js +48 -0
  10. package/lib/collab/loro/Bindings.d.ts +41 -0
  11. package/lib/collab/loro/Bindings.js +99 -0
  12. package/lib/collab/loro/Debug.d.ts +33 -0
  13. package/lib/collab/loro/Debug.js +452 -0
  14. package/lib/collab/loro/LexicalCollaborationContext.d.ts +19 -0
  15. package/lib/collab/loro/LexicalCollaborationContext.js +52 -0
  16. package/lib/collab/loro/LexicalCollaborationPlugin.d.ts +29 -0
  17. package/lib/collab/loro/LexicalCollaborationPlugin.js +111 -0
  18. package/lib/collab/loro/State.d.ts +53 -0
  19. package/lib/collab/loro/State.js +94 -0
  20. package/lib/collab/loro/components/LoroCollaborationUI.d.ts +13 -0
  21. package/lib/collab/loro/components/LoroCollaborationUI.js +9 -0
  22. package/lib/collab/loro/components/LoroCollaborators.d.ts +8 -0
  23. package/lib/collab/loro/components/LoroCollaborators.js +90 -0
  24. package/lib/collab/loro/components/index.d.ts +2 -0
  25. package/lib/collab/loro/components/index.js +6 -0
  26. package/lib/collab/loro/index.d.ts +6 -0
  27. package/lib/collab/loro/index.js +10 -0
  28. package/lib/collab/loro/integrators/BaseIntegrator.d.ts +14 -0
  29. package/lib/collab/loro/integrators/BaseIntegrator.js +5 -0
  30. package/lib/collab/loro/integrators/CounterIntegrator.d.ts +23 -0
  31. package/lib/collab/loro/integrators/CounterIntegrator.js +44 -0
  32. package/lib/collab/loro/integrators/ListIntegrator.d.ts +23 -0
  33. package/lib/collab/loro/integrators/ListIntegrator.js +53 -0
  34. package/lib/collab/loro/integrators/MapIntegrator.d.ts +24 -0
  35. package/lib/collab/loro/integrators/MapIntegrator.js +235 -0
  36. package/lib/collab/loro/integrators/TextIntegrator.d.ts +25 -0
  37. package/lib/collab/loro/integrators/TextIntegrator.js +55 -0
  38. package/lib/collab/loro/integrators/TreeIntegrator.d.ts +41 -0
  39. package/lib/collab/loro/integrators/TreeIntegrator.js +293 -0
  40. package/lib/collab/loro/nodes/NodeFactory.d.ts +15 -0
  41. package/lib/collab/loro/nodes/NodeFactory.js +80 -0
  42. package/lib/collab/loro/nodes/NodesMapper.d.ts +120 -0
  43. package/lib/collab/loro/nodes/NodesMapper.js +289 -0
  44. package/lib/collab/loro/propagators/DecoratorNodePropagator.d.ts +60 -0
  45. package/lib/collab/loro/propagators/DecoratorNodePropagator.js +306 -0
  46. package/lib/collab/loro/propagators/ElementNodePropagator.d.ts +62 -0
  47. package/lib/collab/loro/propagators/ElementNodePropagator.js +393 -0
  48. package/lib/collab/loro/propagators/LineBreakNodePropagator.d.ts +57 -0
  49. package/lib/collab/loro/propagators/LineBreakNodePropagator.js +200 -0
  50. package/lib/collab/loro/propagators/RootNodePropagator.d.ts +55 -0
  51. package/lib/collab/loro/propagators/RootNodePropagator.js +174 -0
  52. package/lib/collab/loro/propagators/TextNodePropagator.d.ts +60 -0
  53. package/lib/collab/loro/propagators/TextNodePropagator.js +450 -0
  54. package/lib/collab/loro/propagators/index.d.ts +49 -0
  55. package/lib/collab/loro/propagators/index.js +30 -0
  56. package/lib/collab/loro/provider/websocket.d.ts +117 -0
  57. package/lib/collab/loro/provider/websocket.js +946 -0
  58. package/lib/collab/loro/servers/index.d.ts +0 -0
  59. package/lib/collab/loro/servers/index.js +4 -0
  60. package/lib/collab/loro/servers/ws/callback.d.ts +5 -0
  61. package/lib/collab/loro/servers/ws/callback.js +89 -0
  62. package/lib/collab/loro/servers/ws/server.d.ts +2 -0
  63. package/lib/collab/loro/servers/ws/server.js +29 -0
  64. package/lib/collab/loro/servers/ws/utils.d.ts +40 -0
  65. package/lib/collab/loro/servers/ws/utils.js +517 -0
  66. package/lib/collab/loro/sync/SyncCursors.d.ts +32 -0
  67. package/lib/collab/loro/sync/SyncCursors.js +501 -0
  68. package/lib/collab/loro/sync/SyncLexicalToLoro.d.ts +4 -0
  69. package/lib/collab/loro/sync/SyncLexicalToLoro.js +152 -0
  70. package/lib/collab/loro/sync/SyncLoroToLexical.d.ts +5 -0
  71. package/lib/collab/loro/sync/SyncLoroToLexical.js +106 -0
  72. package/lib/collab/loro/types/LexicalNodeData.d.ts +32 -0
  73. package/lib/collab/loro/types/LexicalNodeData.js +75 -0
  74. package/lib/collab/loro/useCollaboration.d.ts +12 -0
  75. package/lib/collab/loro/useCollaboration.js +405 -0
  76. package/lib/collab/loro/utils/InitialContent.d.ts +64 -0
  77. package/lib/collab/loro/utils/InitialContent.js +113 -0
  78. package/lib/collab/loro/utils/Invariant.d.ts +15 -0
  79. package/lib/collab/loro/utils/Invariant.js +24 -0
  80. package/lib/collab/loro/utils/LexicalToLoro.d.ts +18 -0
  81. package/lib/collab/loro/utils/LexicalToLoro.js +100 -0
  82. package/lib/collab/loro/utils/Utils.d.ts +44 -0
  83. package/lib/collab/loro/utils/Utils.js +157 -0
  84. package/lib/collab/loro/wsProvider.d.ts +8 -0
  85. package/lib/collab/loro/wsProvider.js +52 -0
  86. package/lib/collab/utils/invariant.d.ts +1 -0
  87. package/lib/collab/utils/invariant.js +15 -0
  88. package/lib/collab/utils/simpleDiffWithCursor.d.ts +5 -0
  89. package/lib/collab/utils/simpleDiffWithCursor.js +35 -0
  90. package/lib/collab/yjs/Bindings.d.ts +23 -0
  91. package/lib/collab/yjs/Bindings.js +26 -0
  92. package/lib/collab/yjs/Debug.d.ts +23 -0
  93. package/lib/collab/yjs/Debug.js +213 -0
  94. package/lib/collab/yjs/LexicalCollaborationContext.d.ts +10 -0
  95. package/lib/collab/yjs/LexicalCollaborationContext.js +37 -0
  96. package/lib/collab/yjs/LexicalCollaborationPlugin.d.ts +21 -0
  97. package/lib/collab/yjs/LexicalCollaborationPlugin.js +63 -0
  98. package/lib/collab/yjs/State.d.ts +51 -0
  99. package/lib/collab/yjs/State.js +35 -0
  100. package/lib/collab/yjs/nodes/AnyCollabNode.d.ts +5 -0
  101. package/lib/collab/yjs/nodes/AnyCollabNode.js +1 -0
  102. package/lib/collab/yjs/nodes/CollabDecoratorNode.d.ts +22 -0
  103. package/lib/collab/yjs/nodes/CollabDecoratorNode.js +64 -0
  104. package/lib/collab/yjs/nodes/CollabElementNode.d.ts +40 -0
  105. package/lib/collab/yjs/nodes/CollabElementNode.js +462 -0
  106. package/lib/collab/yjs/nodes/CollabLineBreakNode.d.ts +19 -0
  107. package/lib/collab/yjs/nodes/CollabLineBreakNode.js +44 -0
  108. package/lib/collab/yjs/nodes/CollabTextNode.d.ts +25 -0
  109. package/lib/collab/yjs/nodes/CollabTextNode.js +103 -0
  110. package/lib/collab/yjs/provider/websocket.d.ts +88 -0
  111. package/lib/collab/yjs/provider/websocket.js +415 -0
  112. package/lib/collab/yjs/servers/index.d.ts +0 -0
  113. package/lib/collab/yjs/servers/index.js +0 -0
  114. package/lib/collab/yjs/servers/ws/callback.d.ts +5 -0
  115. package/lib/collab/yjs/servers/ws/callback.js +72 -0
  116. package/lib/collab/yjs/servers/ws/server.d.ts +2 -0
  117. package/lib/collab/yjs/servers/ws/server.js +25 -0
  118. package/lib/collab/yjs/servers/ws/utils.d.ts +49 -0
  119. package/lib/collab/yjs/servers/ws/utils.js +284 -0
  120. package/lib/collab/yjs/sync/SyncCursors.d.ts +39 -0
  121. package/lib/collab/yjs/sync/SyncCursors.js +351 -0
  122. package/lib/collab/yjs/sync/SyncEditorStates.d.ts +10 -0
  123. package/lib/collab/yjs/sync/SyncEditorStates.js +200 -0
  124. package/lib/collab/yjs/useCollaboration.d.ts +12 -0
  125. package/lib/collab/yjs/useCollaboration.js +255 -0
  126. package/lib/collab/yjs/utils/Utils.d.ts +25 -0
  127. package/lib/collab/yjs/utils/Utils.js +402 -0
  128. package/lib/collab/yjs/wsProvider.d.ts +3 -0
  129. package/lib/collab/yjs/wsProvider.js +21 -0
  130. package/lib/commenting/index.d.ts +41 -0
  131. package/lib/commenting/index.js +328 -0
  132. package/lib/context/FlashMessageContext.d.ts +7 -0
  133. package/lib/context/FlashMessageContext.js +24 -0
  134. package/lib/context/SettingsContext.d.ts +12 -0
  135. package/lib/context/SettingsContext.js +38 -0
  136. package/lib/context/SharedHistoryContext.d.ts +11 -0
  137. package/lib/context/SharedHistoryContext.js +11 -0
  138. package/lib/context/ToolbarContext.d.ts +65 -0
  139. package/lib/context/ToolbarContext.js +84 -0
  140. package/lib/demo.d.ts +12 -0
  141. package/lib/demo.js +45 -0
  142. package/lib/hooks/useFlashMessage.d.ts +2 -0
  143. package/lib/hooks/useFlashMessage.js +8 -0
  144. package/lib/hooks/useModal.d.ts +5 -0
  145. package/lib/hooks/useModal.js +26 -0
  146. package/lib/hooks/useReport.d.ts +1 -0
  147. package/lib/hooks/useReport.js +50 -0
  148. package/lib/index.d.ts +1 -0
  149. package/lib/index.js +5 -0
  150. package/lib/nodes/AutocompleteNode.d.ts +27 -0
  151. package/lib/nodes/AutocompleteNode.js +60 -0
  152. package/lib/nodes/CounterComponent.d.ts +6 -0
  153. package/lib/nodes/CounterComponent.js +137 -0
  154. package/lib/nodes/CounterNode.d.ts +23 -0
  155. package/lib/nodes/CounterNode.js +47 -0
  156. package/lib/nodes/DateTimeNode/DateTimeComponent.d.ts +8 -0
  157. package/lib/nodes/DateTimeNode/DateTimeComponent.js +119 -0
  158. package/lib/nodes/DateTimeNode/DateTimeNode.d.ts +27 -0
  159. package/lib/nodes/DateTimeNode/DateTimeNode.js +82 -0
  160. package/lib/nodes/EmojiNode.d.ts +18 -0
  161. package/lib/nodes/EmojiNode.js +54 -0
  162. package/lib/nodes/EquationComponent.d.ts +9 -0
  163. package/lib/nodes/EquationComponent.js +75 -0
  164. package/lib/nodes/EquationNode.d.ts +26 -0
  165. package/lib/nodes/EquationNode.js +109 -0
  166. package/lib/nodes/ExcalidrawNode/ExcalidrawComponent.d.ts +8 -0
  167. package/lib/nodes/ExcalidrawNode/ExcalidrawComponent.js +110 -0
  168. package/lib/nodes/ExcalidrawNode/ExcalidrawImage.d.ts +50 -0
  169. package/lib/nodes/ExcalidrawNode/ExcalidrawImage.js +55 -0
  170. package/lib/nodes/ExcalidrawNode/index.d.ts +32 -0
  171. package/lib/nodes/ExcalidrawNode/index.js +117 -0
  172. package/lib/nodes/FigmaNode.d.ts +20 -0
  173. package/lib/nodes/FigmaNode.js +52 -0
  174. package/lib/nodes/ImageComponent.d.ts +16 -0
  175. package/lib/nodes/ImageComponent.js +272 -0
  176. package/lib/nodes/ImageNode.d.ts +50 -0
  177. package/lib/nodes/ImageNode.js +151 -0
  178. package/lib/nodes/InlineImageNode/InlineImageComponent.d.ts +26 -0
  179. package/lib/nodes/InlineImageNode/InlineImageComponent.js +161 -0
  180. package/lib/nodes/InlineImageNode/InlineImageNode.d.ts +59 -0
  181. package/lib/nodes/InlineImageNode/InlineImageNode.js +162 -0
  182. package/lib/nodes/KeywordNode.d.ts +14 -0
  183. package/lib/nodes/KeywordNode.js +37 -0
  184. package/lib/nodes/LayoutContainerNode.d.ts +24 -0
  185. package/lib/nodes/LayoutContainerNode.js +95 -0
  186. package/lib/nodes/LayoutItemNode.d.ts +16 -0
  187. package/lib/nodes/LayoutItemNode.js +69 -0
  188. package/lib/nodes/MentionNode.d.ts +20 -0
  189. package/lib/nodes/MentionNode.js +85 -0
  190. package/lib/nodes/PageBreakNode/index.d.ts +17 -0
  191. package/lib/nodes/PageBreakNode/index.js +83 -0
  192. package/lib/nodes/PlaygroundNodes.d.ts +3 -0
  193. package/lib/nodes/PlaygroundNodes.js +75 -0
  194. package/lib/nodes/PollComponent.d.ts +9 -0
  195. package/lib/nodes/PollComponent.js +85 -0
  196. package/lib/nodes/PollNode.d.ts +43 -0
  197. package/lib/nodes/PollNode.js +153 -0
  198. package/lib/nodes/SpecialTextNode.d.ts +24 -0
  199. package/lib/nodes/SpecialTextNode.js +54 -0
  200. package/lib/nodes/StickyComponent.d.ts +10 -0
  201. package/lib/nodes/StickyComponent.js +162 -0
  202. package/lib/nodes/StickyNode.d.ts +31 -0
  203. package/lib/nodes/StickyNode.js +76 -0
  204. package/lib/nodes/TweetNode.d.ts +21 -0
  205. package/lib/nodes/TweetNode.js +119 -0
  206. package/lib/nodes/YouTubeNode.d.ts +22 -0
  207. package/lib/nodes/YouTubeNode.js +84 -0
  208. package/lib/plugins/ActionsPlugin/index.d.ts +5 -0
  209. package/lib/plugins/ActionsPlugin/index.js +168 -0
  210. package/lib/plugins/AutoEmbedPlugin/index.d.ts +19 -0
  211. package/lib/plugins/AutoEmbedPlugin/index.js +158 -0
  212. package/lib/plugins/AutoLinkPlugin/index.d.ts +2 -0
  213. package/lib/plugins/AutoLinkPlugin/index.js +15 -0
  214. package/lib/plugins/AutocompletePlugin/index.d.ts +10 -0
  215. package/lib/plugins/AutocompletePlugin/index.js +2477 -0
  216. package/lib/plugins/CodeActionMenuPlugin/components/CopyButton/index.d.ts +7 -0
  217. package/lib/plugins/CodeActionMenuPlugin/components/CopyButton/index.js +46 -0
  218. package/lib/plugins/CodeActionMenuPlugin/components/PrettierButton/index.d.ts +17 -0
  219. package/lib/plugins/CodeActionMenuPlugin/components/PrettierButton/index.js +115 -0
  220. package/lib/plugins/CodeActionMenuPlugin/index.d.ts +5 -0
  221. package/lib/plugins/CodeActionMenuPlugin/index.js +104 -0
  222. package/lib/plugins/CodeActionMenuPlugin/utils.d.ts +1 -0
  223. package/lib/plugins/CodeActionMenuPlugin/utils.js +22 -0
  224. package/lib/plugins/CodeHighlightPrismPlugin/index.d.ts +2 -0
  225. package/lib/plugins/CodeHighlightPrismPlugin/index.js +14 -0
  226. package/lib/plugins/CodeHighlightShikiPlugin/index.d.ts +2 -0
  227. package/lib/plugins/CodeHighlightShikiPlugin/index.js +14 -0
  228. package/lib/plugins/CollapsiblePlugin/CollapsibleContainerNode.d.ts +25 -0
  229. package/lib/plugins/CollapsiblePlugin/CollapsibleContainerNode.js +135 -0
  230. package/lib/plugins/CollapsiblePlugin/CollapsibleContentNode.d.ts +16 -0
  231. package/lib/plugins/CollapsiblePlugin/CollapsibleContentNode.js +83 -0
  232. package/lib/plugins/CollapsiblePlugin/CollapsibleTitleNode.d.ts +16 -0
  233. package/lib/plugins/CollapsiblePlugin/CollapsibleTitleNode.js +85 -0
  234. package/lib/plugins/CollapsiblePlugin/CollapsibleUtils.d.ts +2 -0
  235. package/lib/plugins/CollapsiblePlugin/CollapsibleUtils.js +12 -0
  236. package/lib/plugins/CollapsiblePlugin/index.d.ts +3 -0
  237. package/lib/plugins/CollapsiblePlugin/index.js +132 -0
  238. package/lib/plugins/CommentPlugin/index.d.ts +9 -0
  239. package/lib/plugins/CommentPlugin/index.js +460 -0
  240. package/lib/plugins/ComponentPickerPlugin/index.d.ts +2 -0
  241. package/lib/plugins/ComponentPickerPlugin/index.js +276 -0
  242. package/lib/plugins/ContextMenuPlugin/index.d.ts +2 -0
  243. package/lib/plugins/ContextMenuPlugin/index.js +112 -0
  244. package/lib/plugins/CounterPlugin/index.d.ts +3 -0
  245. package/lib/plugins/CounterPlugin/index.js +24 -0
  246. package/lib/plugins/DateTimePlugin/index.d.ts +8 -0
  247. package/lib/plugins/DateTimePlugin/index.js +28 -0
  248. package/lib/plugins/DebugPlugin/index.d.ts +3 -0
  249. package/lib/plugins/DebugPlugin/index.js +275 -0
  250. package/lib/plugins/DocsPlugin/index.d.ts +2 -0
  251. package/lib/plugins/DocsPlugin/index.js +4 -0
  252. package/lib/plugins/DragDropPastePlugin/index.d.ts +1 -0
  253. package/lib/plugins/DragDropPastePlugin/index.js +37 -0
  254. package/lib/plugins/DraggableBlockPlugin/index.d.ts +12 -0
  255. package/lib/plugins/DraggableBlockPlugin/index.js +36 -0
  256. package/lib/plugins/EmojiPickerPlugin/index.d.ts +1 -0
  257. package/lib/plugins/EmojiPickerPlugin/index.js +84 -0
  258. package/lib/plugins/EmojisPlugin/index.d.ts +2 -0
  259. package/lib/plugins/EmojisPlugin/index.js +56 -0
  260. package/lib/plugins/EquationsPlugin/index.d.ts +14 -0
  261. package/lib/plugins/EquationsPlugin/index.js +34 -0
  262. package/lib/plugins/ExcalidrawPlugin/index.d.ts +5 -0
  263. package/lib/plugins/ExcalidrawPlugin/index.js +44 -0
  264. package/lib/plugins/FigmaPlugin/index.d.ts +4 -0
  265. package/lib/plugins/FigmaPlugin/index.js +24 -0
  266. package/lib/plugins/FloatingLinkEditorPlugin/index.d.ts +15 -0
  267. package/lib/plugins/FloatingLinkEditorPlugin/index.js +280 -0
  268. package/lib/plugins/FloatingTextFormatToolbarPlugin/index.d.ts +7 -0
  269. package/lib/plugins/FloatingTextFormatToolbarPlugin/index.js +219 -0
  270. package/lib/plugins/ImagesPlugin/index.d.ts +24 -0
  271. package/lib/plugins/ImagesPlugin/index.js +195 -0
  272. package/lib/plugins/InlineImagePlugin/index.d.ts +17 -0
  273. package/lib/plugins/InlineImagePlugin/index.js +180 -0
  274. package/lib/plugins/KeywordsPlugin/index.d.ts +2 -0
  275. package/lib/plugins/KeywordsPlugin/index.js +35 -0
  276. package/lib/plugins/LayoutPlugin/InsertLayoutDialog.d.ts +6 -0
  277. package/lib/plugins/LayoutPlugin/InsertLayoutDialog.js +21 -0
  278. package/lib/plugins/LayoutPlugin/LayoutPlugin.d.ts +7 -0
  279. package/lib/plugins/LayoutPlugin/LayoutPlugin.js +135 -0
  280. package/lib/plugins/LinkPlugin/index.d.ts +6 -0
  281. package/lib/plugins/LinkPlugin/index.js +11 -0
  282. package/lib/plugins/MarkdownShortcutPlugin/index.d.ts +2 -0
  283. package/lib/plugins/MarkdownShortcutPlugin/index.js +6 -0
  284. package/lib/plugins/MarkdownTransformers/index.d.ts +8 -0
  285. package/lib/plugins/MarkdownTransformers/index.js +238 -0
  286. package/lib/plugins/MaxLengthPlugin/index.d.ts +3 -0
  287. package/lib/plugins/MaxLengthPlugin/index.js +41 -0
  288. package/lib/plugins/MentionsPlugin/index.d.ts +2 -0
  289. package/lib/plugins/MentionsPlugin/index.js +564 -0
  290. package/lib/plugins/PageBreakPlugin/index.d.ts +4 -0
  291. package/lib/plugins/PageBreakPlugin/index.js +31 -0
  292. package/lib/plugins/PasteLogPlugin/index.d.ts +2 -0
  293. package/lib/plugins/PasteLogPlugin/index.js +27 -0
  294. package/lib/plugins/PollPlugin/index.d.ts +8 -0
  295. package/lib/plugins/PollPlugin/index.js +38 -0
  296. package/lib/plugins/ShortcutsPlugin/index.d.ts +6 -0
  297. package/lib/plugins/ShortcutsPlugin/index.js +116 -0
  298. package/lib/plugins/ShortcutsPlugin/shortcuts.d.ts +59 -0
  299. package/lib/plugins/ShortcutsPlugin/shortcuts.js +173 -0
  300. package/lib/plugins/SpecialTextPlugin/index.d.ts +2 -0
  301. package/lib/plugins/SpecialTextPlugin/index.js +50 -0
  302. package/lib/plugins/SpeechToTextPlugin/index.d.ts +5 -0
  303. package/lib/plugins/SpeechToTextPlugin/index.js +86 -0
  304. package/lib/plugins/StickyPlugin/index.d.ts +2 -0
  305. package/lib/plugins/StickyPlugin/index.js +16 -0
  306. package/lib/plugins/TabFocusPlugin/index.d.ts +1 -0
  307. package/lib/plugins/TabFocusPlugin/index.js +38 -0
  308. package/lib/plugins/TableActionMenuPlugin/index.d.ts +5 -0
  309. package/lib/plugins/TableActionMenuPlugin/index.js +492 -0
  310. package/lib/plugins/TableCellResizer/index.d.ts +3 -0
  311. package/lib/plugins/TableCellResizer/index.js +297 -0
  312. package/lib/plugins/TableHoverActionsPlugin/index.d.ts +4 -0
  313. package/lib/plugins/TableHoverActionsPlugin/index.js +188 -0
  314. package/lib/plugins/TableOfContentsPlugin/index.d.ts +2 -0
  315. package/lib/plugins/TableOfContentsPlugin/index.js +116 -0
  316. package/lib/plugins/TablePlugin.d.ts +31 -0
  317. package/lib/plugins/TablePlugin.js +63 -0
  318. package/lib/plugins/TestRecorderPlugin/index.d.ts +3 -0
  319. package/lib/plugins/TestRecorderPlugin/index.js +346 -0
  320. package/lib/plugins/ToolbarPlugin/fontSize.d.ts +9 -0
  321. package/lib/plugins/ToolbarPlugin/fontSize.js +84 -0
  322. package/lib/plugins/ToolbarPlugin/index.d.ts +9 -0
  323. package/lib/plugins/ToolbarPlugin/index.js +500 -0
  324. package/lib/plugins/ToolbarPlugin/utils.d.ts +26 -0
  325. package/lib/plugins/ToolbarPlugin/utils.js +247 -0
  326. package/lib/plugins/TreeViewPlugin/index.d.ts +2 -0
  327. package/lib/plugins/TreeViewPlugin/index.js +7 -0
  328. package/lib/plugins/TwitterPlugin/index.d.ts +4 -0
  329. package/lib/plugins/TwitterPlugin/index.js +24 -0
  330. package/lib/plugins/TypingPerfPlugin/index.d.ts +2 -0
  331. package/lib/plugins/TypingPerfPlugin/index.js +97 -0
  332. package/lib/plugins/YouTubePlugin/index.d.ts +4 -0
  333. package/lib/plugins/YouTubePlugin/index.js +24 -0
  334. package/lib/server/validation.d.ts +1 -0
  335. package/lib/server/validation.js +115 -0
  336. package/lib/setupEnv.d.ts +2 -0
  337. package/lib/setupEnv.js +29 -0
  338. package/lib/themes/CommentEditorTheme.d.ts +4 -0
  339. package/lib/themes/CommentEditorTheme.js +11 -0
  340. package/lib/themes/PlaygroundEditorTheme.d.ts +4 -0
  341. package/lib/themes/PlaygroundEditorTheme.js +124 -0
  342. package/lib/themes/StickyEditorTheme.d.ts +4 -0
  343. package/lib/themes/StickyEditorTheme.js +11 -0
  344. package/lib/tyes.dt.d.ts +12 -0
  345. package/lib/tyes.dt.js +4 -0
  346. package/lib/ui/Button.d.ts +12 -0
  347. package/lib/ui/Button.js +6 -0
  348. package/lib/ui/ColorPicker.d.ts +14 -0
  349. package/lib/ui/ColorPicker.js +219 -0
  350. package/lib/ui/ContentEditable.d.ts +9 -0
  351. package/lib/ui/ContentEditable.js +6 -0
  352. package/lib/ui/Dialog.d.ts +10 -0
  353. package/lib/ui/Dialog.js +8 -0
  354. package/lib/ui/DropDown.d.ts +18 -0
  355. package/lib/ui/DropDown.js +133 -0
  356. package/lib/ui/DropdownColorPicker.d.ts +13 -0
  357. package/lib/ui/DropdownColorPicker.js +6 -0
  358. package/lib/ui/EquationEditor.d.ts +8 -0
  359. package/lib/ui/EquationEditor.js +11 -0
  360. package/lib/ui/ExcalidrawModal.d.ts +42 -0
  361. package/lib/ui/ExcalidrawModal.js +103 -0
  362. package/lib/ui/FileInput.d.ts +10 -0
  363. package/lib/ui/FileInput.js +5 -0
  364. package/lib/ui/FlashMessage.d.ts +7 -0
  365. package/lib/ui/FlashMessage.js +6 -0
  366. package/lib/ui/ImageResizer.d.ts +17 -0
  367. package/lib/ui/ImageResizer.js +171 -0
  368. package/lib/ui/KatexEquationAlterer.d.ts +8 -0
  369. package/lib/ui/KatexEquationAlterer.js +23 -0
  370. package/lib/ui/KatexRenderer.d.ts +6 -0
  371. package/lib/ui/KatexRenderer.js +24 -0
  372. package/lib/ui/Modal.d.ts +9 -0
  373. package/lib/ui/Modal.js +48 -0
  374. package/lib/ui/Select.d.ts +8 -0
  375. package/lib/ui/Select.js +5 -0
  376. package/lib/ui/Switch.d.ts +8 -0
  377. package/lib/ui/Switch.js +6 -0
  378. package/lib/ui/TextInput.d.ts +13 -0
  379. package/lib/ui/TextInput.js +7 -0
  380. package/lib/utils/docSerialization.d.ts +3 -0
  381. package/lib/utils/docSerialization.js +60 -0
  382. package/lib/utils/emoji-list.d.ts +20 -0
  383. package/lib/utils/emoji-list.js +16609 -0
  384. package/lib/utils/getDOMRangeRect.d.ts +8 -0
  385. package/lib/utils/getDOMRangeRect.js +26 -0
  386. package/lib/utils/getSelectedNode.d.ts +2 -0
  387. package/lib/utils/getSelectedNode.js +28 -0
  388. package/lib/utils/getThemeSelector.d.ts +2 -0
  389. package/lib/utils/getThemeSelector.js +14 -0
  390. package/lib/utils/isMobileWidth.d.ts +7 -0
  391. package/lib/utils/isMobileWidth.js +11 -0
  392. package/lib/utils/joinClasses.d.ts +1 -0
  393. package/lib/utils/joinClasses.js +7 -0
  394. package/lib/utils/setFloatingElemPosition.d.ts +1 -0
  395. package/lib/utils/setFloatingElemPosition.js +59 -0
  396. package/lib/utils/setFloatingElemPositionForLinkEditor.d.ts +1 -0
  397. package/lib/utils/setFloatingElemPositionForLinkEditor.js +36 -0
  398. package/lib/utils/swipe.d.ts +4 -0
  399. package/lib/utils/swipe.js +94 -0
  400. package/lib/utils/url.d.ts +2 -0
  401. package/lib/utils/url.js +31 -0
  402. package/package.json +4 -4
@@ -0,0 +1,275 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { $getRoot, $createTextNode, $createParagraphNode } from 'lexical';
4
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
5
+ export function DebugPlugin() {
6
+ const [editor] = useLexicalComposerContext();
7
+ const [mcpTools, setMcpTools] = useState([]);
8
+ const [selectedTool, setSelectedTool] = useState('');
9
+ const [isLoadingTools, setIsLoadingTools] = useState(false);
10
+ const [toolsError, setToolsError] = useState(null);
11
+ const getCurrentCollabDocId = () => {
12
+ const params = new URLSearchParams(window.location.search);
13
+ return params.get('collabId') || 'main';
14
+ };
15
+ const isInSplitScreen = () => {
16
+ try {
17
+ return window.parent != null && window.parent.location.pathname === '/split/';
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ };
23
+ const navigateToRoom = (roomId, collabId) => {
24
+ const url = new URL(window.location.href);
25
+ url.searchParams.set('roomId', roomId);
26
+ url.searchParams.set('collabId', collabId);
27
+ if (isInSplitScreen()) {
28
+ window.parent.location.href = `/split/${url.search}`;
29
+ return;
30
+ }
31
+ window.location.href = `${url.pathname}${url.search}`;
32
+ };
33
+ const createNewRoomWithDocument = async () => {
34
+ const roomId = Date.now().toString(36);
35
+ const collabId = `room-${roomId}`;
36
+ const seedText = `New room ${roomId} created at ${new Date().toISOString()}`;
37
+ try {
38
+ const response = await fetch('http://localhost:3001/', {
39
+ method: 'POST',
40
+ headers: {
41
+ 'Content-Type': 'application/json',
42
+ },
43
+ body: JSON.stringify({
44
+ jsonrpc: '2.0',
45
+ id: Date.now(),
46
+ method: 'append_paragraph',
47
+ params: {
48
+ doc_id: collabId,
49
+ text: seedText,
50
+ },
51
+ }),
52
+ });
53
+ if (!response.ok) {
54
+ throw new Error(`HTTP error! status: ${response.status}`);
55
+ }
56
+ const data = await response.json();
57
+ if (data.error) {
58
+ throw new Error(typeof data.error === 'string' ? data.error : JSON.stringify(data.error));
59
+ }
60
+ console.log('Created new room document:', collabId, data.result || data);
61
+ }
62
+ catch (error) {
63
+ console.warn('Unable to seed room via MCP, continuing with room navigation:', error);
64
+ }
65
+ navigateToRoom(roomId, collabId);
66
+ };
67
+ // Fetch available MCP tools from the server
68
+ const fetchMCPTools = async () => {
69
+ setIsLoadingTools(true);
70
+ setToolsError(null);
71
+ try {
72
+ // Query the MCP server for available tools
73
+ const response = await fetch('http://localhost:3001/tools/list', {
74
+ method: 'GET',
75
+ headers: {
76
+ 'Content-Type': 'application/json',
77
+ }
78
+ });
79
+ if (!response.ok) {
80
+ throw new Error(`HTTP error! status: ${response.status}`);
81
+ }
82
+ const data = await response.json();
83
+ if (data.tools) {
84
+ const tools = data.tools.map((tool) => ({
85
+ name: tool.name,
86
+ description: tool.description || '',
87
+ parameters: tool.parameters || {}
88
+ }));
89
+ setMcpTools(tools);
90
+ console.log('Fetched MCP tools:', tools);
91
+ }
92
+ else {
93
+ throw new Error('Invalid response format from MCP server');
94
+ }
95
+ }
96
+ catch (error) {
97
+ console.error('Error fetching MCP tools:', error);
98
+ setToolsError(error instanceof Error ? error.message : 'Unknown error occurred');
99
+ // Set some mock tools for development
100
+ setMcpTools([
101
+ { name: 'create_file', description: 'Create a new file in the workspace' },
102
+ { name: 'read_file', description: 'Read contents of a file' },
103
+ { name: 'list_dir', description: 'List directory contents' }
104
+ ]);
105
+ }
106
+ finally {
107
+ setIsLoadingTools(false);
108
+ }
109
+ };
110
+ // MCP tool execution functions
111
+ const executeGetDocument = async () => {
112
+ try {
113
+ console.log('🔍 Executing get_document MCP tool...');
114
+ const response = await fetch('http://localhost:3001/', {
115
+ method: 'POST',
116
+ headers: {
117
+ 'Content-Type': 'application/json',
118
+ },
119
+ body: JSON.stringify({
120
+ jsonrpc: '2.0',
121
+ id: Date.now(),
122
+ method: 'get_document',
123
+ params: {
124
+ doc_id: getCurrentCollabDocId()
125
+ }
126
+ })
127
+ });
128
+ if (!response.ok) {
129
+ throw new Error(`HTTP error! status: ${response.status}`);
130
+ }
131
+ const data = await response.json();
132
+ console.log('📄 get_document result:', data);
133
+ if (data.result) {
134
+ console.log('✅ Document retrieved successfully:', data.result);
135
+ }
136
+ else if (data.error) {
137
+ console.error('❌ MCP error:', data.error);
138
+ }
139
+ }
140
+ catch (error) {
141
+ console.error('💥 Error executing get_document:', error);
142
+ }
143
+ };
144
+ const executeAppendParagraph = async () => {
145
+ try {
146
+ const timestamp = new Date().toISOString();
147
+ const paragraphText = `New paragraph added at via MCP at ${timestamp}`;
148
+ console.log('✏️ Executing append_paragraph MCP tool with text:', paragraphText);
149
+ const response = await fetch('http://localhost:3001/', {
150
+ method: 'POST',
151
+ headers: {
152
+ 'Content-Type': 'application/json',
153
+ },
154
+ body: JSON.stringify({
155
+ jsonrpc: '2.0',
156
+ id: Date.now(),
157
+ method: 'append_paragraph',
158
+ params: {
159
+ doc_id: getCurrentCollabDocId(),
160
+ text: paragraphText
161
+ }
162
+ })
163
+ });
164
+ if (!response.ok) {
165
+ throw new Error(`HTTP error! status: ${response.status}`);
166
+ }
167
+ const data = await response.json();
168
+ console.log('📝 append_paragraph result:', data);
169
+ if (data.result) {
170
+ console.log('✅ Paragraph appended successfully:', data.result);
171
+ }
172
+ else if (data.error) {
173
+ console.error('❌ MCP error:', data.error);
174
+ }
175
+ }
176
+ catch (error) {
177
+ console.error('💥 Error executing append_paragraph:', error);
178
+ }
179
+ };
180
+ // Handle tool selection and execution
181
+ const handleToolChange = (toolName) => {
182
+ if (toolName === '') {
183
+ setSelectedTool('');
184
+ return;
185
+ }
186
+ setSelectedTool(toolName);
187
+ if (toolName === 'get_document') {
188
+ executeGetDocument();
189
+ }
190
+ else if (toolName === 'append_paragraph') {
191
+ executeAppendParagraph();
192
+ }
193
+ // Reset selection back to "Select a tool" after execution
194
+ setTimeout(() => {
195
+ setSelectedTool('');
196
+ }, 100);
197
+ };
198
+ // Set hardcoded tools instead of fetching from server
199
+ useEffect(() => {
200
+ const hardcodedTools = [
201
+ {
202
+ name: 'get_document',
203
+ description: 'Get document',
204
+ parameters: {}
205
+ },
206
+ {
207
+ name: 'append_paragraph',
208
+ description: 'Append paragraph',
209
+ parameters: {}
210
+ }
211
+ ];
212
+ setMcpTools(hardcodedTools);
213
+ console.log('🔧 Hardcoded MCP tools loaded:', hardcodedTools);
214
+ }, []);
215
+ const reloadState = (editor) => {
216
+ const state = editor.getEditorState();
217
+ // JSON needs to be parsed to load an new state.
218
+ const newEditorState = editor.parseEditorState(JSON.stringify(state));
219
+ editor.update(() => {
220
+ // editor.setEditorState(state);
221
+ editor.setEditorState(newEditorState);
222
+ });
223
+ console.log(editor.getEditorState().toJSON());
224
+ };
225
+ function addParagraph(editor) {
226
+ editor.update(() => {
227
+ const root = $getRoot();
228
+ const timestamp = new Date().toISOString();
229
+ const textNode = $createTextNode(`Hello ${timestamp}`);
230
+ const paragraphNode = $createParagraphNode();
231
+ paragraphNode.append(textNode);
232
+ // Insert the paragraph at the beginning of the editor
233
+ const firstChild = root.getFirstChild();
234
+ if (firstChild) {
235
+ firstChild.insertBefore(paragraphNode);
236
+ }
237
+ else {
238
+ root.append(paragraphNode);
239
+ }
240
+ });
241
+ }
242
+ function first100Keys(editor) {
243
+ editor.getEditorState().read(() => {
244
+ const root = $getRoot();
245
+ const children = root.getChildren();
246
+ const keys = [];
247
+ // Get up to 100 node keys
248
+ const maxNodes = Math.min(100, children.length);
249
+ for (let i = 0; i < maxNodes; i++) {
250
+ keys.push(children[i].getKey());
251
+ }
252
+ console.log(`First ${keys.length} node keys:`, keys);
253
+ });
254
+ }
255
+ return (_jsxs(_Fragment, { children: [_jsx("button", { onClick: () => { reloadState(editor); }, children: "Reload State" }), _jsx("button", { onClick: () => { void createNewRoomWithDocument(); }, children: "Create New Room" }), _jsx("button", { onClick: () => { addParagraph(editor); }, children: "Add Paragraph" }), _jsx("button", { onClick: () => { first100Keys(editor); }, children: "100 First keys" }), _jsxs("div", { style: { marginLeft: '10px', display: 'inline-block' }, children: [_jsx("label", { htmlFor: "mcp-tools-select", style: { marginRight: '5px', fontSize: '12px' }, children: "MCP Tools:" }), _jsxs("select", { id: "mcp-tools-select", value: selectedTool, onChange: (e) => handleToolChange(e.target.value), disabled: isLoadingTools, style: {
256
+ padding: '4px 8px',
257
+ borderRadius: '4px',
258
+ border: '1px solid #ccc',
259
+ minWidth: '150px',
260
+ fontSize: '12px'
261
+ }, children: [_jsx("option", { value: "", children: isLoadingTools ? 'Loading tools...' : 'Select a tool' }), mcpTools.map((tool) => (_jsxs("option", { value: tool.name, children: [tool.name, " ", tool.description ? `- ${tool.description}` : ''] }, tool.name)))] }), toolsError && (_jsxs("span", { style: {
262
+ marginLeft: '10px',
263
+ color: 'red',
264
+ fontSize: '12px'
265
+ }, children: ["Error: ", toolsError] })), _jsx("button", { onClick: fetchMCPTools, disabled: isLoadingTools, style: {
266
+ marginLeft: '5px',
267
+ padding: '4px 8px',
268
+ fontSize: '12px'
269
+ }, children: "\uD83D\uDD04 Refresh" }), selectedTool && (_jsx("span", { style: {
270
+ marginLeft: '10px',
271
+ color: 'green',
272
+ fontSize: '12px'
273
+ }, children: selectedTool }))] })] }));
274
+ }
275
+ export default DebugPlugin;
@@ -0,0 +1,2 @@
1
+ import type { JSX } from 'react';
2
+ export default function DocsPlugin(): JSX.Element;
@@ -0,0 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ export default function DocsPlugin() {
3
+ return (_jsx("a", { target: "__blank", href: "https://lexical.dev/docs/intro", children: _jsx("button", { id: "docs-button", className: "editor-dev-button", title: "Lexical Docs" }) }));
4
+ }
@@ -0,0 +1 @@
1
+ export default function DragDropPaste(): null;
@@ -0,0 +1,37 @@
1
+ /*
2
+ * Copyright (c) 2025-2026 Datalayer, Inc.
3
+ * Distributed under the terms of the MIT License.
4
+ */
5
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
6
+ import { DRAG_DROP_PASTE } from '@lexical/rich-text';
7
+ import { isMimeType, mediaFileReader } from '@lexical/utils';
8
+ import { COMMAND_PRIORITY_LOW } from 'lexical';
9
+ import { useEffect } from 'react';
10
+ import { INSERT_IMAGE_COMMAND } from '../ImagesPlugin';
11
+ const ACCEPTABLE_IMAGE_TYPES = [
12
+ 'image/',
13
+ 'image/heic',
14
+ 'image/heif',
15
+ 'image/gif',
16
+ 'image/webp',
17
+ ];
18
+ export default function DragDropPaste() {
19
+ const [editor] = useLexicalComposerContext();
20
+ useEffect(() => {
21
+ return editor.registerCommand(DRAG_DROP_PASTE, (files) => {
22
+ (async () => {
23
+ const filesResult = await mediaFileReader(files, [ACCEPTABLE_IMAGE_TYPES].flatMap((x) => x));
24
+ for (const { file, result } of filesResult) {
25
+ if (isMimeType(file, ACCEPTABLE_IMAGE_TYPES)) {
26
+ editor.dispatchCommand(INSERT_IMAGE_COMMAND, {
27
+ altText: file.name,
28
+ src: result,
29
+ });
30
+ }
31
+ }
32
+ })();
33
+ return true;
34
+ }, COMMAND_PRIORITY_LOW);
35
+ }, [editor]);
36
+ return null;
37
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+ import type { JSX } from 'react';
9
+ import './index.css';
10
+ export default function DraggableBlockPlugin({ anchorElem, }: {
11
+ anchorElem?: HTMLElement;
12
+ }): JSX.Element;
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import './index.css';
3
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
4
+ import { DraggableBlockPlugin_EXPERIMENTAL } from '@lexical/react/LexicalDraggableBlockPlugin';
5
+ import { $createParagraphNode, $getNearestNodeFromDOMNode } from 'lexical';
6
+ import { useRef, useState } from 'react';
7
+ const DRAGGABLE_BLOCK_MENU_CLASSNAME = 'draggable-block-menu';
8
+ function isOnMenu(element) {
9
+ return !!element.closest(`.${DRAGGABLE_BLOCK_MENU_CLASSNAME}`);
10
+ }
11
+ export default function DraggableBlockPlugin({ anchorElem = document.body, }) {
12
+ const [editor] = useLexicalComposerContext();
13
+ const menuRef = useRef(null);
14
+ const targetLineRef = useRef(null);
15
+ const [draggableElement, setDraggableElement] = useState(null);
16
+ function insertBlock(e) {
17
+ if (!draggableElement || !editor) {
18
+ return;
19
+ }
20
+ editor.update(() => {
21
+ const node = $getNearestNodeFromDOMNode(draggableElement);
22
+ if (!node) {
23
+ return;
24
+ }
25
+ const pNode = $createParagraphNode();
26
+ if (e.altKey || e.ctrlKey) {
27
+ node.insertBefore(pNode);
28
+ }
29
+ else {
30
+ node.insertAfter(pNode);
31
+ }
32
+ pNode.select();
33
+ });
34
+ }
35
+ return (_jsx(DraggableBlockPlugin_EXPERIMENTAL, { anchorElem: anchorElem, menuRef: menuRef, targetLineRef: targetLineRef, menuComponent: _jsxs("div", { ref: menuRef, className: "icon draggable-block-menu", children: [_jsx("button", { title: "Click to add below", className: "icon icon-plus", onClick: insertBlock }), _jsx("div", { className: "icon" })] }), targetLineComponent: _jsx("div", { ref: targetLineRef, className: "draggable-block-target-line" }), isOnMenu: isOnMenu, onElementChanged: setDraggableElement }));
36
+ }
@@ -0,0 +1 @@
1
+ export default function EmojiPickerPlugin(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,84 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ /*
3
+ * Copyright (c) 2025-2026 Datalayer, Inc.
4
+ * Distributed under the terms of the MIT License.
5
+ */
6
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
7
+ import { LexicalTypeaheadMenuPlugin, MenuOption, useBasicTypeaheadTriggerMatch, } from '@lexical/react/LexicalTypeaheadMenuPlugin';
8
+ import { $createTextNode, $getSelection, $isRangeSelection, } from 'lexical';
9
+ import { useCallback, useEffect, useMemo, useState } from 'react';
10
+ import * as ReactDOM from 'react-dom';
11
+ class EmojiOption extends MenuOption {
12
+ title;
13
+ emoji;
14
+ keywords;
15
+ constructor(title, emoji, options) {
16
+ super(title);
17
+ this.title = title;
18
+ this.emoji = emoji;
19
+ this.keywords = options.keywords || [];
20
+ }
21
+ }
22
+ function EmojiMenuItem({ index, isSelected, onClick, onMouseEnter, option, }) {
23
+ let className = 'item';
24
+ if (isSelected) {
25
+ className += ' selected';
26
+ }
27
+ return (_jsx("li", { tabIndex: -1, className: className, ref: option.setRefElement, role: "option", "aria-selected": isSelected, id: 'typeahead-item-' + index, onMouseEnter: onMouseEnter, onClick: onClick, children: _jsxs("span", { className: "text", children: [option.emoji, " ", option.title] }) }, option.key));
28
+ }
29
+ const MAX_EMOJI_SUGGESTION_COUNT = 10;
30
+ export default function EmojiPickerPlugin() {
31
+ const [editor] = useLexicalComposerContext();
32
+ const [queryString, setQueryString] = useState(null);
33
+ const [emojis, setEmojis] = useState([]);
34
+ useEffect(() => {
35
+ import('../../utils/emoji-list').then((file) => setEmojis(file.default));
36
+ }, []);
37
+ const emojiOptions = useMemo(() => emojis != null
38
+ ? emojis.map(({ emoji, aliases, tags }) => new EmojiOption(aliases[0], emoji, {
39
+ keywords: [...aliases, ...tags],
40
+ }))
41
+ : [], [emojis]);
42
+ const checkForTriggerMatch = useBasicTypeaheadTriggerMatch(':', {
43
+ minLength: 0,
44
+ punctuation: '\\.,\\+\\*\\?\\$\\@\\|#{}\\(\\)\\^\\[\\]\\\\/!%\'"~=<>:;', // allow _ and -
45
+ });
46
+ const options = useMemo(() => {
47
+ return emojiOptions
48
+ .filter((option) => {
49
+ return queryString != null
50
+ ? new RegExp(queryString, 'gi').exec(option.title) ||
51
+ option.keywords != null
52
+ ? option.keywords.some((keyword) => new RegExp(queryString, 'gi').exec(keyword))
53
+ : false
54
+ : emojiOptions;
55
+ })
56
+ .slice(0, MAX_EMOJI_SUGGESTION_COUNT);
57
+ }, [emojiOptions, queryString]);
58
+ const onSelectOption = useCallback((selectedOption, nodeToRemove, closeMenu) => {
59
+ editor.update(() => {
60
+ const selection = $getSelection();
61
+ if (!$isRangeSelection(selection) || selectedOption == null) {
62
+ return;
63
+ }
64
+ if (nodeToRemove) {
65
+ nodeToRemove.remove();
66
+ }
67
+ selection.insertNodes([$createTextNode(selectedOption.emoji)]);
68
+ closeMenu();
69
+ });
70
+ }, [editor]);
71
+ return (_jsx(LexicalTypeaheadMenuPlugin, { onQueryChange: setQueryString, onSelectOption: onSelectOption, triggerFn: checkForTriggerMatch, options: options, menuRenderFn: (anchorElementRef, { selectedIndex, selectOptionAndCleanUp, setHighlightedIndex }) => {
72
+ if (anchorElementRef.current == null || options.length === 0) {
73
+ return null;
74
+ }
75
+ return anchorElementRef.current && options.length
76
+ ? ReactDOM.createPortal(_jsx("div", { className: "typeahead-popover emoji-menu", children: _jsx("ul", { children: options.map((option, index) => (_jsx(EmojiMenuItem, { index: index, isSelected: selectedIndex === index, onClick: () => {
77
+ setHighlightedIndex(index);
78
+ selectOptionAndCleanUp(option);
79
+ }, onMouseEnter: () => {
80
+ setHighlightedIndex(index);
81
+ }, option: option }, option.key))) }) }), anchorElementRef.current)
82
+ : null;
83
+ } }));
84
+ }
@@ -0,0 +1,2 @@
1
+ import type { JSX } from 'react';
2
+ export default function EmojisPlugin(): JSX.Element | null;
@@ -0,0 +1,56 @@
1
+ /*
2
+ * Copyright (c) 2025-2026 Datalayer, Inc.
3
+ * Distributed under the terms of the MIT License.
4
+ */
5
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
6
+ import { TextNode } from 'lexical';
7
+ import { useEffect } from 'react';
8
+ import { $createEmojiNode, EmojiNode } from '../../nodes/EmojiNode';
9
+ const emojis = new Map([
10
+ [':)', ['emoji happysmile', '🙂']],
11
+ [':D', ['emoji veryhappysmile', '😀']],
12
+ [':(', ['emoji unhappysmile', '🙁']],
13
+ ['<3', ['emoji heart', '❤']],
14
+ ]);
15
+ function $findAndTransformEmoji(node) {
16
+ const text = node.getTextContent();
17
+ for (let i = 0; i < text.length; i++) {
18
+ const emojiData = emojis.get(text[i]) || emojis.get(text.slice(i, i + 2));
19
+ if (emojiData !== undefined) {
20
+ const [emojiStyle, emojiText] = emojiData;
21
+ let targetNode;
22
+ if (i === 0) {
23
+ [targetNode] = node.splitText(i + 2);
24
+ }
25
+ else {
26
+ [, targetNode] = node.splitText(i, i + 2);
27
+ }
28
+ const emojiNode = $createEmojiNode(emojiStyle, emojiText);
29
+ targetNode.replace(emojiNode);
30
+ return emojiNode;
31
+ }
32
+ }
33
+ return null;
34
+ }
35
+ function $textNodeTransform(node) {
36
+ let targetNode = node;
37
+ while (targetNode !== null) {
38
+ if (!targetNode.isSimpleText()) {
39
+ return;
40
+ }
41
+ targetNode = $findAndTransformEmoji(targetNode);
42
+ }
43
+ }
44
+ function useEmojis(editor) {
45
+ useEffect(() => {
46
+ if (!editor.hasNodes([EmojiNode])) {
47
+ throw new Error('EmojisPlugin: EmojiNode not registered on editor');
48
+ }
49
+ return editor.registerNodeTransform(TextNode, $textNodeTransform);
50
+ }, [editor]);
51
+ }
52
+ export default function EmojisPlugin() {
53
+ const [editor] = useLexicalComposerContext();
54
+ useEmojis(editor);
55
+ return null;
56
+ }
@@ -0,0 +1,14 @@
1
+ import type { JSX } from 'react';
2
+ import 'katex/dist/katex.css';
3
+ import { LexicalCommand, LexicalEditor } from 'lexical';
4
+ type CommandPayload = {
5
+ equation: string;
6
+ inline: boolean;
7
+ };
8
+ export declare const INSERT_EQUATION_COMMAND: LexicalCommand<CommandPayload>;
9
+ export declare function InsertEquationDialog({ activeEditor, onClose, }: {
10
+ activeEditor: LexicalEditor;
11
+ onClose: () => void;
12
+ }): JSX.Element;
13
+ export default function EquationsPlugin(): JSX.Element | null;
14
+ export {};
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import 'katex/dist/katex.css';
3
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
4
+ import { $wrapNodeInElement } from '@lexical/utils';
5
+ import { $createParagraphNode, $insertNodes, $isRootOrShadowRoot, COMMAND_PRIORITY_EDITOR, createCommand, } from 'lexical';
6
+ import { useCallback, useEffect } from 'react';
7
+ import { $createEquationNode, EquationNode } from '../../nodes/EquationNode';
8
+ import KatexEquationAlterer from '../../ui/KatexEquationAlterer';
9
+ export const INSERT_EQUATION_COMMAND = createCommand('INSERT_EQUATION_COMMAND');
10
+ export function InsertEquationDialog({ activeEditor, onClose, }) {
11
+ const onEquationConfirm = useCallback((equation, inline) => {
12
+ activeEditor.dispatchCommand(INSERT_EQUATION_COMMAND, { equation, inline });
13
+ onClose();
14
+ }, [activeEditor, onClose]);
15
+ return _jsx(KatexEquationAlterer, { onConfirm: onEquationConfirm });
16
+ }
17
+ export default function EquationsPlugin() {
18
+ const [editor] = useLexicalComposerContext();
19
+ useEffect(() => {
20
+ if (!editor.hasNodes([EquationNode])) {
21
+ throw new Error('EquationsPlugins: EquationsNode not registered on editor');
22
+ }
23
+ return editor.registerCommand(INSERT_EQUATION_COMMAND, (payload) => {
24
+ const { equation, inline } = payload;
25
+ const equationNode = $createEquationNode(equation, inline);
26
+ $insertNodes([equationNode]);
27
+ if ($isRootOrShadowRoot(equationNode.getParentOrThrow())) {
28
+ $wrapNodeInElement(equationNode, $createParagraphNode).selectEnd();
29
+ }
30
+ return true;
31
+ }, COMMAND_PRIORITY_EDITOR);
32
+ }, [editor]);
33
+ return null;
34
+ }
@@ -0,0 +1,5 @@
1
+ import type { JSX } from 'react';
2
+ import '@excalidraw/excalidraw/index.css';
3
+ import { LexicalCommand } from 'lexical';
4
+ export declare const INSERT_EXCALIDRAW_COMMAND: LexicalCommand<void>;
5
+ export default function ExcalidrawPlugin(): JSX.Element | null;
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import '@excalidraw/excalidraw/index.css';
3
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
4
+ import { $wrapNodeInElement } from '@lexical/utils';
5
+ import { $createParagraphNode, $insertNodes, $isRootOrShadowRoot, COMMAND_PRIORITY_EDITOR, createCommand, } from 'lexical';
6
+ import { useEffect, useState } from 'react';
7
+ import { $createExcalidrawNode, ExcalidrawNode, } from '../../nodes/ExcalidrawNode';
8
+ import ExcalidrawModal from '../../ui/ExcalidrawModal';
9
+ export const INSERT_EXCALIDRAW_COMMAND = createCommand('INSERT_EXCALIDRAW_COMMAND');
10
+ export default function ExcalidrawPlugin() {
11
+ const [editor] = useLexicalComposerContext();
12
+ const [isModalOpen, setModalOpen] = useState(false);
13
+ useEffect(() => {
14
+ if (!editor.hasNodes([ExcalidrawNode])) {
15
+ throw new Error('ExcalidrawPlugin: ExcalidrawNode not registered on editor');
16
+ }
17
+ return editor.registerCommand(INSERT_EXCALIDRAW_COMMAND, () => {
18
+ setModalOpen(true);
19
+ return true;
20
+ }, COMMAND_PRIORITY_EDITOR);
21
+ }, [editor]);
22
+ const onClose = () => {
23
+ setModalOpen(false);
24
+ };
25
+ const onDelete = () => {
26
+ setModalOpen(false);
27
+ };
28
+ const onSave = (elements, appState, files) => {
29
+ editor.update(() => {
30
+ const excalidrawNode = $createExcalidrawNode();
31
+ excalidrawNode.setData(JSON.stringify({
32
+ appState,
33
+ elements,
34
+ files,
35
+ }));
36
+ $insertNodes([excalidrawNode]);
37
+ if ($isRootOrShadowRoot(excalidrawNode.getParentOrThrow())) {
38
+ $wrapNodeInElement(excalidrawNode, $createParagraphNode).selectEnd();
39
+ }
40
+ });
41
+ setModalOpen(false);
42
+ };
43
+ return isModalOpen ? (_jsx(ExcalidrawModal, { initialElements: [], initialAppState: {}, initialFiles: {}, isShown: isModalOpen, onDelete: onDelete, onClose: onClose, onSave: onSave, closeOnClickOutside: false })) : null;
44
+ }
@@ -0,0 +1,4 @@
1
+ import type { JSX } from 'react';
2
+ import { LexicalCommand } from 'lexical';
3
+ export declare const INSERT_FIGMA_COMMAND: LexicalCommand<string>;
4
+ export default function FigmaPlugin(): JSX.Element | null;
@@ -0,0 +1,24 @@
1
+ /*
2
+ * Copyright (c) 2025-2026 Datalayer, Inc.
3
+ * Distributed under the terms of the MIT License.
4
+ */
5
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
6
+ import { $insertNodeToNearestRoot } from '@lexical/utils';
7
+ import { COMMAND_PRIORITY_EDITOR, createCommand } from 'lexical';
8
+ import { useEffect } from 'react';
9
+ import { $createFigmaNode, FigmaNode } from '../../nodes/FigmaNode';
10
+ export const INSERT_FIGMA_COMMAND = createCommand('INSERT_FIGMA_COMMAND');
11
+ export default function FigmaPlugin() {
12
+ const [editor] = useLexicalComposerContext();
13
+ useEffect(() => {
14
+ if (!editor.hasNodes([FigmaNode])) {
15
+ throw new Error('FigmaPlugin: FigmaNode not registered on editor');
16
+ }
17
+ return editor.registerCommand(INSERT_FIGMA_COMMAND, (payload) => {
18
+ const figmaNode = $createFigmaNode(payload);
19
+ $insertNodeToNearestRoot(figmaNode);
20
+ return true;
21
+ }, COMMAND_PRIORITY_EDITOR);
22
+ }, [editor]);
23
+ return null;
24
+ }