@datalayer/lexical-loro 0.0.7 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (406) hide show
  1. package/README.md +24 -137
  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 +111 -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 +44 -0
  10. package/lib/collab/loro/Bindings.d.ts +41 -0
  11. package/lib/collab/loro/Bindings.js +95 -0
  12. package/lib/collab/loro/Debug.d.ts +33 -0
  13. package/lib/collab/loro/Debug.js +448 -0
  14. package/lib/collab/loro/LexicalCollaborationContext.d.ts +19 -0
  15. package/lib/collab/loro/LexicalCollaborationContext.js +48 -0
  16. package/lib/collab/loro/LexicalCollaborationPlugin.d.ts +24 -0
  17. package/lib/collab/loro/LexicalCollaborationPlugin.js +83 -0
  18. package/lib/collab/loro/State.d.ts +53 -0
  19. package/lib/collab/loro/State.js +90 -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 +97 -0
  24. package/lib/collab/loro/components/index.d.ts +2 -0
  25. package/lib/collab/loro/components/index.js +2 -0
  26. package/lib/collab/loro/index.d.ts +6 -0
  27. package/lib/collab/loro/index.js +6 -0
  28. package/lib/collab/loro/integrators/BaseIntegrator.d.ts +14 -0
  29. package/lib/collab/loro/integrators/BaseIntegrator.js +1 -0
  30. package/lib/collab/loro/integrators/CounterIntegrator.d.ts +23 -0
  31. package/lib/collab/loro/integrators/CounterIntegrator.js +40 -0
  32. package/lib/collab/loro/integrators/ListIntegrator.d.ts +23 -0
  33. package/lib/collab/loro/integrators/ListIntegrator.js +49 -0
  34. package/lib/collab/loro/integrators/MapIntegrator.d.ts +24 -0
  35. package/lib/collab/loro/integrators/MapIntegrator.js +177 -0
  36. package/lib/collab/loro/integrators/TextIntegrator.d.ts +25 -0
  37. package/lib/collab/loro/integrators/TextIntegrator.js +51 -0
  38. package/lib/collab/loro/integrators/TreeIntegrator.d.ts +25 -0
  39. package/lib/collab/loro/integrators/TreeIntegrator.js +201 -0
  40. package/lib/collab/loro/nodes/NodeFactory.d.ts +8 -0
  41. package/lib/collab/loro/nodes/NodeFactory.js +105 -0
  42. package/lib/collab/loro/nodes/NodesMapper.d.ts +111 -0
  43. package/lib/collab/loro/nodes/NodesMapper.js +258 -0
  44. package/lib/collab/loro/propagators/DecoratorNodePropagator.d.ts +60 -0
  45. package/lib/collab/loro/propagators/DecoratorNodePropagator.js +302 -0
  46. package/lib/collab/loro/propagators/ElementNodePropagator.d.ts +62 -0
  47. package/lib/collab/loro/propagators/ElementNodePropagator.js +335 -0
  48. package/lib/collab/loro/propagators/LineBreakNodePropagator.d.ts +57 -0
  49. package/lib/collab/loro/propagators/LineBreakNodePropagator.js +196 -0
  50. package/lib/collab/loro/propagators/RootNodePropagator.d.ts +55 -0
  51. package/lib/collab/loro/propagators/RootNodePropagator.js +168 -0
  52. package/lib/collab/loro/propagators/TextNodePropagator.d.ts +60 -0
  53. package/lib/collab/loro/propagators/TextNodePropagator.js +434 -0
  54. package/lib/collab/loro/propagators/index.d.ts +49 -0
  55. package/lib/collab/loro/propagators/index.js +32 -0
  56. package/lib/collab/loro/provider/websocket.d.ts +116 -0
  57. package/lib/collab/loro/provider/websocket.js +907 -0
  58. package/lib/collab/loro/servers/index.d.ts +0 -0
  59. package/lib/collab/loro/servers/index.js +0 -0
  60. package/lib/collab/loro/servers/ws/callback.d.ts +5 -0
  61. package/lib/collab/loro/servers/ws/callback.js +85 -0
  62. package/lib/collab/loro/servers/ws/server.d.ts +2 -0
  63. package/lib/collab/loro/servers/ws/server.js +25 -0
  64. package/lib/collab/loro/servers/ws/utils.d.ts +40 -0
  65. package/lib/collab/loro/servers/ws/utils.js +513 -0
  66. package/lib/collab/loro/sync/SyncCursors.d.ts +32 -0
  67. package/lib/collab/loro/sync/SyncCursors.js +435 -0
  68. package/lib/collab/loro/sync/SyncLexicalToLoro.d.ts +4 -0
  69. package/lib/collab/loro/sync/SyncLexicalToLoro.js +80 -0
  70. package/lib/collab/loro/sync/SyncLoroToLexical.d.ts +5 -0
  71. package/lib/collab/loro/sync/SyncLoroToLexical.js +96 -0
  72. package/lib/collab/loro/types/LexicalNodeData.d.ts +32 -0
  73. package/lib/collab/loro/types/LexicalNodeData.js +71 -0
  74. package/lib/collab/loro/useCollaboration.d.ts +12 -0
  75. package/lib/collab/loro/useCollaboration.js +248 -0
  76. package/lib/collab/loro/utils/InitialContent.d.ts +64 -0
  77. package/lib/collab/loro/utils/InitialContent.js +109 -0
  78. package/lib/collab/loro/utils/LexicalToLoro.d.ts +18 -0
  79. package/lib/collab/loro/utils/LexicalToLoro.js +96 -0
  80. package/lib/collab/loro/utils/Utils.d.ts +44 -0
  81. package/lib/collab/loro/utils/Utils.js +153 -0
  82. package/lib/collab/loro/wsProvider.d.ts +8 -0
  83. package/lib/collab/loro/wsProvider.js +31 -0
  84. package/lib/collab/utils/invariant.d.ts +1 -0
  85. package/lib/collab/utils/invariant.js +11 -0
  86. package/lib/collab/utils/simpleDiffWithCursor.d.ts +5 -0
  87. package/lib/collab/utils/simpleDiffWithCursor.js +31 -0
  88. package/lib/collab/yjs/Bindings.d.ts +23 -0
  89. package/lib/collab/yjs/Bindings.js +26 -0
  90. package/lib/collab/yjs/Debug.d.ts +23 -0
  91. package/lib/collab/yjs/Debug.js +213 -0
  92. package/lib/collab/yjs/LexicalCollaborationContext.d.ts +10 -0
  93. package/lib/collab/yjs/LexicalCollaborationContext.js +37 -0
  94. package/lib/collab/yjs/LexicalCollaborationPlugin.d.ts +21 -0
  95. package/lib/collab/yjs/LexicalCollaborationPlugin.js +63 -0
  96. package/lib/collab/yjs/State.d.ts +51 -0
  97. package/lib/collab/yjs/State.js +35 -0
  98. package/lib/collab/yjs/nodes/AnyCollabNode.d.ts +5 -0
  99. package/lib/collab/yjs/nodes/AnyCollabNode.js +1 -0
  100. package/lib/collab/yjs/nodes/CollabDecoratorNode.d.ts +22 -0
  101. package/lib/collab/yjs/nodes/CollabDecoratorNode.js +64 -0
  102. package/lib/collab/yjs/nodes/CollabElementNode.d.ts +40 -0
  103. package/lib/collab/yjs/nodes/CollabElementNode.js +462 -0
  104. package/lib/collab/yjs/nodes/CollabLineBreakNode.d.ts +19 -0
  105. package/lib/collab/yjs/nodes/CollabLineBreakNode.js +44 -0
  106. package/lib/collab/yjs/nodes/CollabTextNode.d.ts +25 -0
  107. package/lib/collab/yjs/nodes/CollabTextNode.js +103 -0
  108. package/lib/collab/yjs/provider/websocket.d.ts +88 -0
  109. package/lib/collab/yjs/provider/websocket.js +415 -0
  110. package/lib/collab/yjs/servers/index.d.ts +0 -0
  111. package/lib/collab/yjs/servers/index.js +0 -0
  112. package/lib/collab/yjs/servers/ws/callback.d.ts +5 -0
  113. package/lib/collab/yjs/servers/ws/callback.js +72 -0
  114. package/lib/collab/yjs/servers/ws/server.d.ts +2 -0
  115. package/lib/collab/yjs/servers/ws/server.js +25 -0
  116. package/lib/collab/yjs/servers/ws/utils.d.ts +49 -0
  117. package/lib/collab/yjs/servers/ws/utils.js +284 -0
  118. package/lib/collab/yjs/sync/SyncCursors.d.ts +39 -0
  119. package/lib/collab/yjs/sync/SyncCursors.js +351 -0
  120. package/lib/collab/yjs/sync/SyncEditorStates.d.ts +10 -0
  121. package/lib/collab/yjs/sync/SyncEditorStates.js +200 -0
  122. package/lib/collab/yjs/useCollaboration.d.ts +12 -0
  123. package/lib/collab/yjs/useCollaboration.js +255 -0
  124. package/lib/collab/yjs/utils/Utils.d.ts +25 -0
  125. package/lib/collab/yjs/utils/Utils.js +402 -0
  126. package/lib/collab/yjs/wsProvider.d.ts +3 -0
  127. package/lib/collab/yjs/wsProvider.js +21 -0
  128. package/lib/commenting/index.d.ts +41 -0
  129. package/lib/commenting/index.js +324 -0
  130. package/lib/context/FlashMessageContext.d.ts +7 -0
  131. package/lib/context/FlashMessageContext.js +24 -0
  132. package/lib/context/SettingsContext.d.ts +12 -0
  133. package/lib/context/SettingsContext.js +38 -0
  134. package/lib/context/SharedHistoryContext.d.ts +11 -0
  135. package/lib/context/SharedHistoryContext.js +11 -0
  136. package/lib/context/ToolbarContext.d.ts +65 -0
  137. package/lib/context/ToolbarContext.js +84 -0
  138. package/lib/demo.d.ts +12 -0
  139. package/lib/demo.js +41 -0
  140. package/lib/hooks/useFlashMessage.d.ts +2 -0
  141. package/lib/hooks/useFlashMessage.js +4 -0
  142. package/lib/hooks/useModal.d.ts +5 -0
  143. package/lib/hooks/useModal.js +26 -0
  144. package/lib/hooks/useReport.d.ts +1 -0
  145. package/lib/hooks/useReport.js +46 -0
  146. package/lib/index.d.ts +1 -1
  147. package/lib/index.js +1 -5
  148. package/lib/nodes/AutocompleteNode.d.ts +27 -0
  149. package/lib/nodes/AutocompleteNode.js +56 -0
  150. package/lib/nodes/CounterComponent.d.ts +6 -0
  151. package/lib/nodes/CounterComponent.js +137 -0
  152. package/lib/nodes/CounterNode.d.ts +23 -0
  153. package/lib/nodes/CounterNode.js +47 -0
  154. package/lib/nodes/DateTimeNode/DateTimeComponent.d.ts +8 -0
  155. package/lib/nodes/DateTimeNode/DateTimeComponent.js +119 -0
  156. package/lib/nodes/DateTimeNode/DateTimeNode.d.ts +27 -0
  157. package/lib/nodes/DateTimeNode/DateTimeNode.js +82 -0
  158. package/lib/nodes/EmojiNode.d.ts +18 -0
  159. package/lib/nodes/EmojiNode.js +50 -0
  160. package/lib/nodes/EquationComponent.d.ts +9 -0
  161. package/lib/nodes/EquationComponent.js +75 -0
  162. package/lib/nodes/EquationNode.d.ts +26 -0
  163. package/lib/nodes/EquationNode.js +109 -0
  164. package/lib/nodes/ExcalidrawNode/ExcalidrawComponent.d.ts +8 -0
  165. package/lib/nodes/ExcalidrawNode/ExcalidrawComponent.js +110 -0
  166. package/lib/nodes/ExcalidrawNode/ExcalidrawImage.d.ts +50 -0
  167. package/lib/nodes/ExcalidrawNode/ExcalidrawImage.js +55 -0
  168. package/lib/nodes/ExcalidrawNode/index.d.ts +32 -0
  169. package/lib/nodes/ExcalidrawNode/index.js +117 -0
  170. package/lib/nodes/FigmaNode.d.ts +20 -0
  171. package/lib/nodes/FigmaNode.js +52 -0
  172. package/lib/nodes/ImageComponent.d.ts +16 -0
  173. package/lib/nodes/ImageComponent.js +272 -0
  174. package/lib/nodes/ImageNode.d.ts +50 -0
  175. package/lib/nodes/ImageNode.js +151 -0
  176. package/lib/nodes/InlineImageNode/InlineImageComponent.d.ts +26 -0
  177. package/lib/nodes/InlineImageNode/InlineImageComponent.js +161 -0
  178. package/lib/nodes/InlineImageNode/InlineImageNode.d.ts +59 -0
  179. package/lib/nodes/InlineImageNode/InlineImageNode.js +162 -0
  180. package/lib/nodes/KeywordNode.d.ts +14 -0
  181. package/lib/nodes/KeywordNode.js +33 -0
  182. package/lib/nodes/LayoutContainerNode.d.ts +24 -0
  183. package/lib/nodes/LayoutContainerNode.js +91 -0
  184. package/lib/nodes/LayoutItemNode.d.ts +16 -0
  185. package/lib/nodes/LayoutItemNode.js +65 -0
  186. package/lib/nodes/MentionNode.d.ts +20 -0
  187. package/lib/nodes/MentionNode.js +81 -0
  188. package/lib/nodes/PageBreakNode/index.d.ts +17 -0
  189. package/lib/nodes/PageBreakNode/index.js +83 -0
  190. package/lib/nodes/PlaygroundNodes.d.ts +3 -0
  191. package/lib/nodes/PlaygroundNodes.js +71 -0
  192. package/lib/nodes/PollComponent.d.ts +9 -0
  193. package/lib/nodes/PollComponent.js +85 -0
  194. package/lib/nodes/PollNode.d.ts +43 -0
  195. package/lib/nodes/PollNode.js +153 -0
  196. package/lib/nodes/SpecialTextNode.d.ts +24 -0
  197. package/lib/nodes/SpecialTextNode.js +50 -0
  198. package/lib/nodes/StickyComponent.d.ts +10 -0
  199. package/lib/nodes/StickyComponent.js +162 -0
  200. package/lib/nodes/StickyNode.d.ts +31 -0
  201. package/lib/nodes/StickyNode.js +76 -0
  202. package/lib/nodes/TweetNode.d.ts +21 -0
  203. package/lib/nodes/TweetNode.js +119 -0
  204. package/lib/nodes/YouTubeNode.d.ts +22 -0
  205. package/lib/nodes/YouTubeNode.js +84 -0
  206. package/lib/plugins/ActionsPlugin/index.d.ts +5 -0
  207. package/lib/plugins/ActionsPlugin/index.js +168 -0
  208. package/lib/plugins/AutoEmbedPlugin/index.d.ts +19 -0
  209. package/lib/plugins/AutoEmbedPlugin/index.js +158 -0
  210. package/lib/plugins/AutoLinkPlugin/index.d.ts +2 -0
  211. package/lib/plugins/AutoLinkPlugin/index.js +15 -0
  212. package/lib/plugins/AutocompletePlugin/index.d.ts +10 -0
  213. package/lib/plugins/AutocompletePlugin/index.js +2473 -0
  214. package/lib/plugins/CodeActionMenuPlugin/components/CopyButton/index.d.ts +7 -0
  215. package/lib/plugins/CodeActionMenuPlugin/components/CopyButton/index.js +42 -0
  216. package/lib/plugins/CodeActionMenuPlugin/components/PrettierButton/index.d.ts +17 -0
  217. package/lib/plugins/CodeActionMenuPlugin/components/PrettierButton/index.js +111 -0
  218. package/lib/plugins/CodeActionMenuPlugin/index.d.ts +5 -0
  219. package/lib/plugins/CodeActionMenuPlugin/index.js +104 -0
  220. package/lib/plugins/CodeActionMenuPlugin/utils.d.ts +1 -0
  221. package/lib/plugins/CodeActionMenuPlugin/utils.js +18 -0
  222. package/lib/plugins/CodeHighlightPrismPlugin/index.d.ts +2 -0
  223. package/lib/plugins/CodeHighlightPrismPlugin/index.js +10 -0
  224. package/lib/plugins/CodeHighlightShikiPlugin/index.d.ts +2 -0
  225. package/lib/plugins/CodeHighlightShikiPlugin/index.js +10 -0
  226. package/lib/plugins/CollapsiblePlugin/CollapsibleContainerNode.d.ts +25 -0
  227. package/lib/plugins/CollapsiblePlugin/CollapsibleContainerNode.js +131 -0
  228. package/lib/plugins/CollapsiblePlugin/CollapsibleContentNode.d.ts +16 -0
  229. package/lib/plugins/CollapsiblePlugin/CollapsibleContentNode.js +79 -0
  230. package/lib/plugins/CollapsiblePlugin/CollapsibleTitleNode.d.ts +16 -0
  231. package/lib/plugins/CollapsiblePlugin/CollapsibleTitleNode.js +81 -0
  232. package/lib/plugins/CollapsiblePlugin/CollapsibleUtils.d.ts +2 -0
  233. package/lib/plugins/CollapsiblePlugin/CollapsibleUtils.js +8 -0
  234. package/lib/plugins/CollapsiblePlugin/index.d.ts +3 -0
  235. package/lib/plugins/CollapsiblePlugin/index.js +128 -0
  236. package/lib/plugins/CommentPlugin/index.d.ts +9 -0
  237. package/lib/plugins/CommentPlugin/index.js +460 -0
  238. package/lib/plugins/ComponentPickerPlugin/index.d.ts +2 -0
  239. package/lib/plugins/ComponentPickerPlugin/index.js +276 -0
  240. package/lib/plugins/ContextMenuPlugin/index.d.ts +2 -0
  241. package/lib/plugins/ContextMenuPlugin/index.js +112 -0
  242. package/lib/plugins/CounterPlugin/index.d.ts +3 -0
  243. package/lib/plugins/CounterPlugin/index.js +20 -0
  244. package/lib/plugins/DatalayerPlugin/index.d.ts +2 -0
  245. package/lib/plugins/DatalayerPlugin/index.js +218 -0
  246. package/lib/plugins/DateTimePlugin/index.d.ts +8 -0
  247. package/lib/plugins/DateTimePlugin/index.js +24 -0
  248. package/lib/plugins/DocsPlugin/index.d.ts +2 -0
  249. package/lib/plugins/DocsPlugin/index.js +4 -0
  250. package/lib/plugins/DragDropPastePlugin/index.d.ts +1 -0
  251. package/lib/plugins/DragDropPastePlugin/index.js +33 -0
  252. package/lib/plugins/DraggableBlockPlugin/index.d.ts +12 -0
  253. package/lib/plugins/DraggableBlockPlugin/index.js +36 -0
  254. package/lib/plugins/EmojiPickerPlugin/index.d.ts +1 -0
  255. package/lib/plugins/EmojiPickerPlugin/index.js +80 -0
  256. package/lib/plugins/EmojisPlugin/index.d.ts +2 -0
  257. package/lib/plugins/EmojisPlugin/index.js +52 -0
  258. package/lib/plugins/EquationsPlugin/index.d.ts +14 -0
  259. package/lib/plugins/EquationsPlugin/index.js +34 -0
  260. package/lib/plugins/ExcalidrawPlugin/index.d.ts +5 -0
  261. package/lib/plugins/ExcalidrawPlugin/index.js +44 -0
  262. package/lib/plugins/FigmaPlugin/index.d.ts +4 -0
  263. package/lib/plugins/FigmaPlugin/index.js +20 -0
  264. package/lib/plugins/FloatingLinkEditorPlugin/index.d.ts +15 -0
  265. package/lib/plugins/FloatingLinkEditorPlugin/index.js +280 -0
  266. package/lib/plugins/FloatingTextFormatToolbarPlugin/index.d.ts +7 -0
  267. package/lib/plugins/FloatingTextFormatToolbarPlugin/index.js +219 -0
  268. package/lib/plugins/ImagesPlugin/index.d.ts +24 -0
  269. package/lib/plugins/ImagesPlugin/index.js +195 -0
  270. package/lib/plugins/InlineImagePlugin/index.d.ts +17 -0
  271. package/lib/plugins/InlineImagePlugin/index.js +180 -0
  272. package/lib/plugins/KeywordsPlugin/index.d.ts +2 -0
  273. package/lib/plugins/KeywordsPlugin/index.js +31 -0
  274. package/lib/plugins/LayoutPlugin/InsertLayoutDialog.d.ts +6 -0
  275. package/lib/plugins/LayoutPlugin/InsertLayoutDialog.js +21 -0
  276. package/lib/plugins/LayoutPlugin/LayoutPlugin.d.ts +7 -0
  277. package/lib/plugins/LayoutPlugin/LayoutPlugin.js +131 -0
  278. package/lib/plugins/LinkPlugin/index.d.ts +6 -0
  279. package/lib/plugins/LinkPlugin/index.js +11 -0
  280. package/lib/plugins/MarkdownShortcutPlugin/index.d.ts +2 -0
  281. package/lib/plugins/MarkdownShortcutPlugin/index.js +6 -0
  282. package/lib/plugins/MarkdownTransformers/index.d.ts +8 -0
  283. package/lib/plugins/MarkdownTransformers/index.js +234 -0
  284. package/lib/plugins/MaxLengthPlugin/index.d.ts +3 -0
  285. package/lib/plugins/MaxLengthPlugin/index.js +37 -0
  286. package/lib/plugins/MentionsPlugin/index.d.ts +2 -0
  287. package/lib/plugins/MentionsPlugin/index.js +564 -0
  288. package/lib/plugins/PageBreakPlugin/index.d.ts +4 -0
  289. package/lib/plugins/PageBreakPlugin/index.js +27 -0
  290. package/lib/plugins/PasteLogPlugin/index.d.ts +2 -0
  291. package/lib/plugins/PasteLogPlugin/index.js +27 -0
  292. package/lib/plugins/PollPlugin/index.d.ts +8 -0
  293. package/lib/plugins/PollPlugin/index.js +38 -0
  294. package/lib/plugins/ShortcutsPlugin/index.d.ts +6 -0
  295. package/lib/plugins/ShortcutsPlugin/index.js +112 -0
  296. package/lib/plugins/ShortcutsPlugin/shortcuts.d.ts +59 -0
  297. package/lib/plugins/ShortcutsPlugin/shortcuts.js +169 -0
  298. package/lib/plugins/SpecialTextPlugin/index.d.ts +2 -0
  299. package/lib/plugins/SpecialTextPlugin/index.js +46 -0
  300. package/lib/plugins/SpeechToTextPlugin/index.d.ts +5 -0
  301. package/lib/plugins/SpeechToTextPlugin/index.js +82 -0
  302. package/lib/plugins/StickyPlugin/index.d.ts +2 -0
  303. package/lib/plugins/StickyPlugin/index.js +12 -0
  304. package/lib/plugins/TabFocusPlugin/index.d.ts +1 -0
  305. package/lib/plugins/TabFocusPlugin/index.js +34 -0
  306. package/lib/plugins/TableActionMenuPlugin/index.d.ts +5 -0
  307. package/lib/plugins/TableActionMenuPlugin/index.js +492 -0
  308. package/lib/plugins/TableCellResizer/index.d.ts +3 -0
  309. package/lib/plugins/TableCellResizer/index.js +297 -0
  310. package/lib/plugins/TableHoverActionsPlugin/index.d.ts +4 -0
  311. package/lib/plugins/TableHoverActionsPlugin/index.js +188 -0
  312. package/lib/plugins/TableOfContentsPlugin/index.d.ts +2 -0
  313. package/lib/plugins/TableOfContentsPlugin/index.js +116 -0
  314. package/lib/plugins/TablePlugin.d.ts +31 -0
  315. package/lib/plugins/TablePlugin.js +63 -0
  316. package/lib/plugins/TestRecorderPlugin/index.d.ts +3 -0
  317. package/lib/plugins/TestRecorderPlugin/index.js +346 -0
  318. package/lib/plugins/ToolbarPlugin/fontSize.d.ts +9 -0
  319. package/lib/plugins/ToolbarPlugin/fontSize.js +80 -0
  320. package/lib/plugins/ToolbarPlugin/index.d.ts +9 -0
  321. package/lib/plugins/ToolbarPlugin/index.js +500 -0
  322. package/lib/plugins/ToolbarPlugin/utils.d.ts +26 -0
  323. package/lib/plugins/ToolbarPlugin/utils.js +243 -0
  324. package/lib/plugins/TreeViewPlugin/index.d.ts +2 -0
  325. package/lib/plugins/TreeViewPlugin/index.js +7 -0
  326. package/lib/plugins/TwitterPlugin/index.d.ts +4 -0
  327. package/lib/plugins/TwitterPlugin/index.js +20 -0
  328. package/lib/plugins/TypingPerfPlugin/index.d.ts +2 -0
  329. package/lib/plugins/TypingPerfPlugin/index.js +93 -0
  330. package/lib/plugins/YouTubePlugin/index.d.ts +4 -0
  331. package/lib/plugins/YouTubePlugin/index.js +20 -0
  332. package/lib/server/validation.d.ts +1 -0
  333. package/lib/server/validation.js +111 -0
  334. package/lib/setupEnv.d.ts +2 -0
  335. package/lib/setupEnv.js +25 -0
  336. package/lib/themes/CommentEditorTheme.d.ts +4 -0
  337. package/lib/themes/CommentEditorTheme.js +7 -0
  338. package/lib/themes/PlaygroundEditorTheme.d.ts +4 -0
  339. package/lib/themes/PlaygroundEditorTheme.js +120 -0
  340. package/lib/themes/StickyEditorTheme.d.ts +4 -0
  341. package/lib/themes/StickyEditorTheme.js +7 -0
  342. package/lib/tyes.dt.d.ts +12 -0
  343. package/lib/tyes.dt.js +0 -0
  344. package/lib/ui/Button.d.ts +12 -0
  345. package/lib/ui/Button.js +6 -0
  346. package/lib/ui/ColorPicker.d.ts +14 -0
  347. package/lib/ui/ColorPicker.js +219 -0
  348. package/lib/ui/ContentEditable.d.ts +9 -0
  349. package/lib/ui/ContentEditable.js +6 -0
  350. package/lib/ui/Dialog.d.ts +10 -0
  351. package/lib/ui/Dialog.js +8 -0
  352. package/lib/ui/DropDown.d.ts +18 -0
  353. package/lib/ui/DropDown.js +133 -0
  354. package/lib/ui/DropdownColorPicker.d.ts +13 -0
  355. package/lib/ui/DropdownColorPicker.js +6 -0
  356. package/lib/ui/EquationEditor.d.ts +8 -0
  357. package/lib/ui/EquationEditor.js +11 -0
  358. package/lib/ui/ExcalidrawModal.d.ts +42 -0
  359. package/lib/ui/ExcalidrawModal.js +103 -0
  360. package/lib/ui/FileInput.d.ts +10 -0
  361. package/lib/ui/FileInput.js +5 -0
  362. package/lib/ui/FlashMessage.d.ts +7 -0
  363. package/lib/ui/FlashMessage.js +6 -0
  364. package/lib/ui/ImageResizer.d.ts +17 -0
  365. package/lib/ui/ImageResizer.js +171 -0
  366. package/lib/ui/KatexEquationAlterer.d.ts +8 -0
  367. package/lib/ui/KatexEquationAlterer.js +23 -0
  368. package/lib/ui/KatexRenderer.d.ts +6 -0
  369. package/lib/ui/KatexRenderer.js +24 -0
  370. package/lib/ui/Modal.d.ts +9 -0
  371. package/lib/ui/Modal.js +48 -0
  372. package/lib/ui/Select.d.ts +8 -0
  373. package/lib/ui/Select.js +5 -0
  374. package/lib/ui/Switch.d.ts +8 -0
  375. package/lib/ui/Switch.js +6 -0
  376. package/lib/ui/TextInput.d.ts +13 -0
  377. package/lib/ui/TextInput.js +7 -0
  378. package/lib/utils/docSerialization.d.ts +3 -0
  379. package/lib/utils/docSerialization.js +56 -0
  380. package/lib/utils/emoji-list.d.ts +20 -0
  381. package/lib/utils/emoji-list.js +16605 -0
  382. package/lib/utils/getDOMRangeRect.d.ts +8 -0
  383. package/lib/utils/getDOMRangeRect.js +22 -0
  384. package/lib/utils/getSelectedNode.d.ts +2 -0
  385. package/lib/utils/getSelectedNode.js +24 -0
  386. package/lib/utils/getThemeSelector.d.ts +2 -0
  387. package/lib/utils/getThemeSelector.js +10 -0
  388. package/lib/utils/isMobileWidth.d.ts +7 -0
  389. package/lib/utils/isMobileWidth.js +7 -0
  390. package/lib/utils/joinClasses.d.ts +1 -0
  391. package/lib/utils/joinClasses.js +3 -0
  392. package/lib/utils/setFloatingElemPosition.d.ts +1 -0
  393. package/lib/utils/setFloatingElemPosition.js +55 -0
  394. package/lib/utils/setFloatingElemPositionForLinkEditor.d.ts +1 -0
  395. package/lib/utils/setFloatingElemPositionForLinkEditor.js +32 -0
  396. package/lib/utils/swipe.d.ts +4 -0
  397. package/lib/utils/swipe.js +90 -0
  398. package/lib/utils/url.d.ts +2 -0
  399. package/lib/utils/url.js +27 -0
  400. package/package.json +82 -51
  401. package/lib/DiffMerge.d.ts +0 -39
  402. package/lib/DiffMerge.js +0 -437
  403. package/lib/LoroCollaborativePlugin.d.ts +0 -62
  404. package/lib/LoroCollaborativePlugin.js +0 -2826
  405. package/lib/stableNodeState.d.ts +0 -8
  406. package/lib/stableNodeState.js +0 -15
@@ -0,0 +1,276 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { $createCodeNode } from '@lexical/code';
3
+ import { INSERT_CHECK_LIST_COMMAND, INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND, } from '@lexical/list';
4
+ import { INSERT_EMBED_COMMAND } from '@lexical/react/LexicalAutoEmbedPlugin';
5
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
6
+ import { INSERT_HORIZONTAL_RULE_COMMAND } from '@lexical/react/LexicalHorizontalRuleNode';
7
+ import { LexicalTypeaheadMenuPlugin, MenuOption, useBasicTypeaheadTriggerMatch, } from '@lexical/react/LexicalTypeaheadMenuPlugin';
8
+ import { $createHeadingNode, $createQuoteNode } from '@lexical/rich-text';
9
+ import { $setBlocksType } from '@lexical/selection';
10
+ import { INSERT_TABLE_COMMAND } from '@lexical/table';
11
+ import { $createParagraphNode, $getSelection, $isRangeSelection, FORMAT_ELEMENT_COMMAND, } from 'lexical';
12
+ import { useCallback, useMemo, useState } from 'react';
13
+ import * as ReactDOM from 'react-dom';
14
+ import useModal from '../../hooks/useModal';
15
+ import catTypingGif from '../../images/cat-typing.gif';
16
+ import { EmbedConfigs } from '../AutoEmbedPlugin';
17
+ import { INSERT_COLLAPSIBLE_COMMAND } from '../CollapsiblePlugin';
18
+ import { INSERT_DATETIME_COMMAND } from '../DateTimePlugin';
19
+ import { InsertEquationDialog } from '../EquationsPlugin';
20
+ import { INSERT_EXCALIDRAW_COMMAND } from '../ExcalidrawPlugin';
21
+ import { INSERT_IMAGE_COMMAND, InsertImageDialog } from '../ImagesPlugin';
22
+ import InsertLayoutDialog from '../LayoutPlugin/InsertLayoutDialog';
23
+ import { INSERT_PAGE_BREAK } from '../PageBreakPlugin';
24
+ import { InsertPollDialog } from '../PollPlugin';
25
+ import { InsertTableDialog } from '../TablePlugin';
26
+ class ComponentPickerOption extends MenuOption {
27
+ // What shows up in the editor
28
+ title;
29
+ // Icon for display
30
+ icon;
31
+ // For extra searching.
32
+ keywords;
33
+ // TBD
34
+ keyboardShortcut;
35
+ // What happens when you select this option?
36
+ onSelect;
37
+ constructor(title, options) {
38
+ super(title);
39
+ this.title = title;
40
+ this.keywords = options.keywords || [];
41
+ this.icon = options.icon;
42
+ this.keyboardShortcut = options.keyboardShortcut;
43
+ this.onSelect = options.onSelect.bind(this);
44
+ }
45
+ }
46
+ function ComponentPickerMenuItem({ index, isSelected, onClick, onMouseEnter, option, }) {
47
+ let className = 'item';
48
+ if (isSelected) {
49
+ className += ' selected';
50
+ }
51
+ return (_jsxs("li", { tabIndex: -1, className: className, ref: option.setRefElement, role: "option", "aria-selected": isSelected, id: 'typeahead-item-' + index, onMouseEnter: onMouseEnter, onClick: onClick, children: [option.icon, _jsx("span", { className: "text", children: option.title })] }, option.key));
52
+ }
53
+ function getDynamicOptions(editor, queryString) {
54
+ const options = [];
55
+ if (queryString == null) {
56
+ return options;
57
+ }
58
+ const tableMatch = queryString.match(/^([1-9]\d?)(?:x([1-9]\d?)?)?$/);
59
+ if (tableMatch !== null) {
60
+ const rows = tableMatch[1];
61
+ const colOptions = tableMatch[2]
62
+ ? [tableMatch[2]]
63
+ : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(String);
64
+ options.push(...colOptions.map((columns) => new ComponentPickerOption(`${rows}x${columns} Table`, {
65
+ icon: _jsx("i", { className: "icon table" }),
66
+ keywords: ['table'],
67
+ onSelect: () => editor.dispatchCommand(INSERT_TABLE_COMMAND, { columns, rows }),
68
+ })));
69
+ }
70
+ return options;
71
+ }
72
+ function getBaseOptions(editor, showModal) {
73
+ return [
74
+ new ComponentPickerOption('Paragraph', {
75
+ icon: _jsx("i", { className: "icon paragraph" }),
76
+ keywords: ['normal', 'paragraph', 'p', 'text'],
77
+ onSelect: () => editor.update(() => {
78
+ const selection = $getSelection();
79
+ if ($isRangeSelection(selection)) {
80
+ $setBlocksType(selection, () => $createParagraphNode());
81
+ }
82
+ }),
83
+ }),
84
+ ...[1, 2, 3].map((n) => new ComponentPickerOption(`Heading ${n}`, {
85
+ icon: _jsx("i", { className: `icon h${n}` }),
86
+ keywords: ['heading', 'header', `h${n}`],
87
+ onSelect: () => editor.update(() => {
88
+ const selection = $getSelection();
89
+ if ($isRangeSelection(selection)) {
90
+ $setBlocksType(selection, () => $createHeadingNode(`h${n}`));
91
+ }
92
+ }),
93
+ })),
94
+ new ComponentPickerOption('Table', {
95
+ icon: _jsx("i", { className: "icon table" }),
96
+ keywords: ['table', 'grid', 'spreadsheet', 'rows', 'columns'],
97
+ onSelect: () => showModal('Insert Table', (onClose) => (_jsx(InsertTableDialog, { activeEditor: editor, onClose: onClose }))),
98
+ }),
99
+ new ComponentPickerOption('Numbered List', {
100
+ icon: _jsx("i", { className: "icon number" }),
101
+ keywords: ['numbered list', 'ordered list', 'ol'],
102
+ onSelect: () => editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined),
103
+ }),
104
+ new ComponentPickerOption('Bulleted List', {
105
+ icon: _jsx("i", { className: "icon bullet" }),
106
+ keywords: ['bulleted list', 'unordered list', 'ul'],
107
+ onSelect: () => editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined),
108
+ }),
109
+ new ComponentPickerOption('Check List', {
110
+ icon: _jsx("i", { className: "icon check" }),
111
+ keywords: ['check list', 'todo list'],
112
+ onSelect: () => editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined),
113
+ }),
114
+ new ComponentPickerOption('Quote', {
115
+ icon: _jsx("i", { className: "icon quote" }),
116
+ keywords: ['block quote'],
117
+ onSelect: () => editor.update(() => {
118
+ const selection = $getSelection();
119
+ if ($isRangeSelection(selection)) {
120
+ $setBlocksType(selection, () => $createQuoteNode());
121
+ }
122
+ }),
123
+ }),
124
+ new ComponentPickerOption('Code', {
125
+ icon: _jsx("i", { className: "icon code" }),
126
+ keywords: ['javascript', 'python', 'js', 'codeblock'],
127
+ onSelect: () => editor.update(() => {
128
+ const selection = $getSelection();
129
+ if ($isRangeSelection(selection)) {
130
+ if (selection.isCollapsed()) {
131
+ $setBlocksType(selection, () => $createCodeNode());
132
+ }
133
+ else {
134
+ // Will this ever happen?
135
+ const textContent = selection.getTextContent();
136
+ const codeNode = $createCodeNode();
137
+ selection.insertNodes([codeNode]);
138
+ selection.insertRawText(textContent);
139
+ }
140
+ }
141
+ }),
142
+ }),
143
+ new ComponentPickerOption('Divider', {
144
+ icon: _jsx("i", { className: "icon horizontal-rule" }),
145
+ keywords: ['horizontal rule', 'divider', 'hr'],
146
+ onSelect: () => editor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, undefined),
147
+ }),
148
+ new ComponentPickerOption('Page Break', {
149
+ icon: _jsx("i", { className: "icon page-break" }),
150
+ keywords: ['page break', 'divider'],
151
+ onSelect: () => editor.dispatchCommand(INSERT_PAGE_BREAK, undefined),
152
+ }),
153
+ new ComponentPickerOption('Excalidraw', {
154
+ icon: _jsx("i", { className: "icon diagram-2" }),
155
+ keywords: ['excalidraw', 'diagram', 'drawing'],
156
+ onSelect: () => editor.dispatchCommand(INSERT_EXCALIDRAW_COMMAND, undefined),
157
+ }),
158
+ new ComponentPickerOption('Poll', {
159
+ icon: _jsx("i", { className: "icon poll" }),
160
+ keywords: ['poll', 'vote'],
161
+ onSelect: () => showModal('Insert Poll', (onClose) => (_jsx(InsertPollDialog, { activeEditor: editor, onClose: onClose }))),
162
+ }),
163
+ ...EmbedConfigs.map((embedConfig) => new ComponentPickerOption(`Embed ${embedConfig.contentName}`, {
164
+ icon: embedConfig.icon,
165
+ keywords: [...embedConfig.keywords, 'embed'],
166
+ onSelect: () => editor.dispatchCommand(INSERT_EMBED_COMMAND, embedConfig.type),
167
+ })),
168
+ new ComponentPickerOption('Date', {
169
+ icon: _jsx("i", { className: "icon calendar" }),
170
+ keywords: ['date', 'calendar', 'time'],
171
+ onSelect: () => {
172
+ const dateTime = new Date();
173
+ dateTime.setHours(0, 0, 0, 0); // Set time to midnight
174
+ editor.dispatchCommand(INSERT_DATETIME_COMMAND, { dateTime });
175
+ },
176
+ }),
177
+ new ComponentPickerOption('Today', {
178
+ icon: _jsx("i", { className: "icon calendar" }),
179
+ keywords: ['date', 'calendar', 'time', 'today'],
180
+ onSelect: () => {
181
+ const dateTime = new Date();
182
+ dateTime.setHours(0, 0, 0, 0); // Set time to midnight
183
+ editor.dispatchCommand(INSERT_DATETIME_COMMAND, { dateTime });
184
+ },
185
+ }),
186
+ new ComponentPickerOption('Tomorrow', {
187
+ icon: _jsx("i", { className: "icon calendar" }),
188
+ keywords: ['date', 'calendar', 'time', 'tomorrow'],
189
+ onSelect: () => {
190
+ const dateTime = new Date();
191
+ dateTime.setDate(dateTime.getDate() + 1);
192
+ dateTime.setHours(0, 0, 0, 0); // Set time to midnight
193
+ editor.dispatchCommand(INSERT_DATETIME_COMMAND, { dateTime });
194
+ },
195
+ }),
196
+ new ComponentPickerOption('Yesterday', {
197
+ icon: _jsx("i", { className: "icon calendar" }),
198
+ keywords: ['date', 'calendar', 'time', 'yesterday'],
199
+ onSelect: () => {
200
+ const dateTime = new Date();
201
+ dateTime.setDate(dateTime.getDate() - 1);
202
+ dateTime.setHours(0, 0, 0, 0); // Set time to midnight
203
+ editor.dispatchCommand(INSERT_DATETIME_COMMAND, { dateTime });
204
+ },
205
+ }),
206
+ new ComponentPickerOption('Equation', {
207
+ icon: _jsx("i", { className: "icon equation" }),
208
+ keywords: ['equation', 'latex', 'math'],
209
+ onSelect: () => showModal('Insert Equation', (onClose) => (_jsx(InsertEquationDialog, { activeEditor: editor, onClose: onClose }))),
210
+ }),
211
+ new ComponentPickerOption('GIF', {
212
+ icon: _jsx("i", { className: "icon gif" }),
213
+ keywords: ['gif', 'animate', 'image', 'file'],
214
+ onSelect: () => editor.dispatchCommand(INSERT_IMAGE_COMMAND, {
215
+ altText: 'Cat typing on a laptop',
216
+ src: catTypingGif,
217
+ }),
218
+ }),
219
+ new ComponentPickerOption('Image', {
220
+ icon: _jsx("i", { className: "icon image" }),
221
+ keywords: ['image', 'photo', 'picture', 'file'],
222
+ onSelect: () => showModal('Insert Image', (onClose) => (_jsx(InsertImageDialog, { activeEditor: editor, onClose: onClose }))),
223
+ }),
224
+ new ComponentPickerOption('Collapsible', {
225
+ icon: _jsx("i", { className: "icon caret-right" }),
226
+ keywords: ['collapse', 'collapsible', 'toggle'],
227
+ onSelect: () => editor.dispatchCommand(INSERT_COLLAPSIBLE_COMMAND, undefined),
228
+ }),
229
+ new ComponentPickerOption('Columns Layout', {
230
+ icon: _jsx("i", { className: "icon columns" }),
231
+ keywords: ['columns', 'layout', 'grid'],
232
+ onSelect: () => showModal('Insert Columns Layout', (onClose) => (_jsx(InsertLayoutDialog, { activeEditor: editor, onClose: onClose }))),
233
+ }),
234
+ ...['left', 'center', 'right', 'justify'].map((alignment) => new ComponentPickerOption(`Align ${alignment}`, {
235
+ icon: _jsx("i", { className: `icon ${alignment}-align` }),
236
+ keywords: ['align', 'justify', alignment],
237
+ onSelect: () => editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, alignment),
238
+ })),
239
+ ];
240
+ }
241
+ export default function ComponentPickerMenuPlugin() {
242
+ const [editor] = useLexicalComposerContext();
243
+ const [modal, showModal] = useModal();
244
+ const [queryString, setQueryString] = useState(null);
245
+ const checkForTriggerMatch = useBasicTypeaheadTriggerMatch('/', {
246
+ allowWhitespace: true,
247
+ minLength: 0,
248
+ });
249
+ const options = useMemo(() => {
250
+ const baseOptions = getBaseOptions(editor, showModal);
251
+ if (!queryString) {
252
+ return baseOptions;
253
+ }
254
+ const regex = new RegExp(queryString, 'i');
255
+ return [
256
+ ...getDynamicOptions(editor, queryString),
257
+ ...baseOptions.filter((option) => regex.test(option.title) ||
258
+ option.keywords.some((keyword) => regex.test(keyword))),
259
+ ];
260
+ }, [editor, queryString, showModal]);
261
+ const onSelectOption = useCallback((selectedOption, nodeToRemove, closeMenu, matchingString) => {
262
+ editor.update(() => {
263
+ nodeToRemove?.remove();
264
+ selectedOption.onSelect(matchingString);
265
+ closeMenu();
266
+ });
267
+ }, [editor]);
268
+ return (_jsxs(_Fragment, { children: [modal, _jsx(LexicalTypeaheadMenuPlugin, { onQueryChange: setQueryString, onSelectOption: onSelectOption, triggerFn: checkForTriggerMatch, options: options, menuRenderFn: (anchorElementRef, { selectedIndex, selectOptionAndCleanUp, setHighlightedIndex }) => anchorElementRef.current && options.length
269
+ ? ReactDOM.createPortal(_jsx("div", { className: "typeahead-popover component-picker-menu", children: _jsx("ul", { children: options.map((option, i) => (_jsx(ComponentPickerMenuItem, { index: i, isSelected: selectedIndex === i, onClick: () => {
270
+ setHighlightedIndex(i);
271
+ selectOptionAndCleanUp(option);
272
+ }, onMouseEnter: () => {
273
+ setHighlightedIndex(i);
274
+ }, option: option }, option.key))) }) }), anchorElementRef.current)
275
+ : null })] }));
276
+ }
@@ -0,0 +1,2 @@
1
+ import type { JSX } from 'react';
2
+ export default function ContextMenuPlugin(): JSX.Element;
@@ -0,0 +1,112 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { $isLinkNode, TOGGLE_LINK_COMMAND } from '@lexical/link';
3
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
4
+ import { NodeContextMenuOption, NodeContextMenuPlugin, NodeContextMenuSeparator, } from '@lexical/react/LexicalNodeContextMenuPlugin';
5
+ import { $getSelection, $isDecoratorNode, $isNodeSelection, $isRangeSelection, COPY_COMMAND, CUT_COMMAND, PASTE_COMMAND, } from 'lexical';
6
+ import { useMemo } from 'react';
7
+ export default function ContextMenuPlugin() {
8
+ const [editor] = useLexicalComposerContext();
9
+ const items = useMemo(() => {
10
+ return [
11
+ new NodeContextMenuOption(`Remove Link`, {
12
+ $onSelect: () => {
13
+ editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);
14
+ },
15
+ $showOn: (node) => $isLinkNode(node.getParent()),
16
+ disabled: false,
17
+ icon: _jsx("i", { className: "PlaygroundEditorTheme__contextMenuItemIcon" }),
18
+ }),
19
+ new NodeContextMenuSeparator({
20
+ $showOn: (node) => $isLinkNode(node.getParent()),
21
+ }),
22
+ new NodeContextMenuOption(`Cut`, {
23
+ $onSelect: () => {
24
+ editor.dispatchCommand(CUT_COMMAND, null);
25
+ },
26
+ disabled: false,
27
+ icon: (_jsx("i", { className: "PlaygroundEditorTheme__contextMenuItemIcon page-break" })),
28
+ }),
29
+ new NodeContextMenuOption(`Copy`, {
30
+ $onSelect: () => {
31
+ editor.dispatchCommand(COPY_COMMAND, null);
32
+ },
33
+ disabled: false,
34
+ icon: _jsx("i", { className: "PlaygroundEditorTheme__contextMenuItemIcon copy" }),
35
+ }),
36
+ new NodeContextMenuOption(`Paste`, {
37
+ $onSelect: () => {
38
+ navigator.clipboard.read().then(async function (...args) {
39
+ const data = new DataTransfer();
40
+ const readClipboardItems = await navigator.clipboard.read();
41
+ const item = readClipboardItems[0];
42
+ const permission = await navigator.permissions.query({
43
+ // @ts-expect-error These types are incorrect.
44
+ name: 'clipboard-read',
45
+ });
46
+ if (permission.state === 'denied') {
47
+ alert('Not allowed to paste from clipboard.');
48
+ return;
49
+ }
50
+ for (const type of item.types) {
51
+ const dataString = await (await item.getType(type)).text();
52
+ data.setData(type, dataString);
53
+ }
54
+ const event = new ClipboardEvent('paste', {
55
+ clipboardData: data,
56
+ });
57
+ editor.dispatchCommand(PASTE_COMMAND, event);
58
+ });
59
+ },
60
+ disabled: false,
61
+ icon: (_jsx("i", { className: "PlaygroundEditorTheme__contextMenuItemIcon paste" })),
62
+ }),
63
+ new NodeContextMenuOption(`Paste as Plain Text`, {
64
+ $onSelect: () => {
65
+ navigator.clipboard.read().then(async function (...args) {
66
+ const permission = await navigator.permissions.query({
67
+ // @ts-expect-error These types are incorrect.
68
+ name: 'clipboard-read',
69
+ });
70
+ if (permission.state === 'denied') {
71
+ alert('Not allowed to paste from clipboard.');
72
+ return;
73
+ }
74
+ const data = new DataTransfer();
75
+ const clipboardText = await navigator.clipboard.readText();
76
+ data.setData('text/plain', clipboardText);
77
+ const event = new ClipboardEvent('paste', {
78
+ clipboardData: data,
79
+ });
80
+ editor.dispatchCommand(PASTE_COMMAND, event);
81
+ });
82
+ },
83
+ disabled: false,
84
+ icon: _jsx("i", { className: "PlaygroundEditorTheme__contextMenuItemIcon" }),
85
+ }),
86
+ new NodeContextMenuSeparator(),
87
+ new NodeContextMenuOption(`Delete Node`, {
88
+ $onSelect: () => {
89
+ const selection = $getSelection();
90
+ if ($isRangeSelection(selection)) {
91
+ const currentNode = selection.anchor.getNode();
92
+ const ancestorNodeWithRootAsParent = currentNode
93
+ .getParents()
94
+ .at(-2);
95
+ ancestorNodeWithRootAsParent?.remove();
96
+ }
97
+ else if ($isNodeSelection(selection)) {
98
+ const selectedNodes = selection.getNodes();
99
+ selectedNodes.forEach((node) => {
100
+ if ($isDecoratorNode(node)) {
101
+ node.remove();
102
+ }
103
+ });
104
+ }
105
+ },
106
+ disabled: false,
107
+ icon: (_jsx("i", { className: "PlaygroundEditorTheme__contextMenuItemIcon clear" })),
108
+ }),
109
+ ];
110
+ }, [editor]);
111
+ return (_jsx(NodeContextMenuPlugin, { className: "PlaygroundEditorTheme__contextMenu", itemClassName: "PlaygroundEditorTheme__contextMenuItem", separatorClassName: "PlaygroundEditorTheme__contextMenuSeparator", items: items }));
112
+ }
@@ -0,0 +1,3 @@
1
+ import type { LexicalCommand } from 'lexical';
2
+ export declare const INSERT_COUNTER_COMMAND: LexicalCommand<number | undefined>;
3
+ export default function CounterPlugin(): null;
@@ -0,0 +1,20 @@
1
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
2
+ import { $insertNodeToNearestRoot } from '@lexical/utils';
3
+ import { createCommand, COMMAND_PRIORITY_EDITOR } from 'lexical';
4
+ import { useEffect } from 'react';
5
+ import { $createCounterNode, CounterNode } from '../../nodes/CounterNode';
6
+ export const INSERT_COUNTER_COMMAND = createCommand('INSERT_COUNTER_COMMAND');
7
+ export default function CounterPlugin() {
8
+ const [editor] = useLexicalComposerContext();
9
+ useEffect(() => {
10
+ if (!editor.hasNodes([CounterNode])) {
11
+ throw new Error('CounterPlugin: CounterNode not registered on editor');
12
+ }
13
+ return editor.registerCommand(INSERT_COUNTER_COMMAND, (payload) => {
14
+ const counterNode = $createCounterNode(payload || 0);
15
+ $insertNodeToNearestRoot(counterNode);
16
+ return true;
17
+ }, COMMAND_PRIORITY_EDITOR);
18
+ }, [editor]);
19
+ return null;
20
+ }
@@ -0,0 +1,2 @@
1
+ import type { JSX } from 'react';
2
+ export default function DatalayerPlugin(): JSX.Element | null;
@@ -0,0 +1,218 @@
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 default function DatalayerPlugin() {
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
+ // Fetch available MCP tools from the server
12
+ const fetchMCPTools = async () => {
13
+ setIsLoadingTools(true);
14
+ setToolsError(null);
15
+ try {
16
+ // Query the MCP server for available tools
17
+ const response = await fetch('http://localhost:3001/tools/list', {
18
+ method: 'GET',
19
+ headers: {
20
+ 'Content-Type': 'application/json',
21
+ }
22
+ });
23
+ if (!response.ok) {
24
+ throw new Error(`HTTP error! status: ${response.status}`);
25
+ }
26
+ const data = await response.json();
27
+ if (data.tools) {
28
+ const tools = data.tools.map((tool) => ({
29
+ name: tool.name,
30
+ description: tool.description || '',
31
+ parameters: tool.parameters || {}
32
+ }));
33
+ setMcpTools(tools);
34
+ console.log('Fetched MCP tools:', tools);
35
+ }
36
+ else {
37
+ throw new Error('Invalid response format from MCP server');
38
+ }
39
+ }
40
+ catch (error) {
41
+ console.error('Error fetching MCP tools:', error);
42
+ setToolsError(error instanceof Error ? error.message : 'Unknown error occurred');
43
+ // Set some mock tools for development
44
+ setMcpTools([
45
+ { name: 'create_file', description: 'Create a new file in the workspace' },
46
+ { name: 'read_file', description: 'Read contents of a file' },
47
+ { name: 'list_dir', description: 'List directory contents' }
48
+ ]);
49
+ }
50
+ finally {
51
+ setIsLoadingTools(false);
52
+ }
53
+ };
54
+ // MCP tool execution functions
55
+ const executeGetDocument = async () => {
56
+ try {
57
+ console.log('🔍 Executing get_document MCP tool...');
58
+ const response = await fetch('http://localhost:3001/', {
59
+ method: 'POST',
60
+ headers: {
61
+ 'Content-Type': 'application/json',
62
+ },
63
+ body: JSON.stringify({
64
+ jsonrpc: '2.0',
65
+ id: Date.now(),
66
+ method: 'get_document',
67
+ params: {
68
+ doc_id: 'playground/0/main'
69
+ }
70
+ })
71
+ });
72
+ if (!response.ok) {
73
+ throw new Error(`HTTP error! status: ${response.status}`);
74
+ }
75
+ const data = await response.json();
76
+ console.log('📄 get_document result:', data);
77
+ if (data.result) {
78
+ console.log('✅ Document retrieved successfully:', data.result);
79
+ }
80
+ else if (data.error) {
81
+ console.error('❌ MCP error:', data.error);
82
+ }
83
+ }
84
+ catch (error) {
85
+ console.error('💥 Error executing get_document:', error);
86
+ }
87
+ };
88
+ const executeAppendParagraph = async () => {
89
+ try {
90
+ const timestamp = new Date().toISOString();
91
+ const paragraphText = `New paragraph added at via MCP at ${timestamp}`;
92
+ console.log('✏️ Executing append_paragraph MCP tool with text:', paragraphText);
93
+ const response = await fetch('http://localhost:3001/', {
94
+ method: 'POST',
95
+ headers: {
96
+ 'Content-Type': 'application/json',
97
+ },
98
+ body: JSON.stringify({
99
+ jsonrpc: '2.0',
100
+ id: Date.now(),
101
+ method: 'append_paragraph',
102
+ params: {
103
+ doc_id: 'playground/0/main',
104
+ text: paragraphText
105
+ }
106
+ })
107
+ });
108
+ if (!response.ok) {
109
+ throw new Error(`HTTP error! status: ${response.status}`);
110
+ }
111
+ const data = await response.json();
112
+ console.log('📝 append_paragraph result:', data);
113
+ if (data.result) {
114
+ console.log('✅ Paragraph appended successfully:', data.result);
115
+ }
116
+ else if (data.error) {
117
+ console.error('❌ MCP error:', data.error);
118
+ }
119
+ }
120
+ catch (error) {
121
+ console.error('💥 Error executing append_paragraph:', error);
122
+ }
123
+ };
124
+ // Handle tool selection and execution
125
+ const handleToolChange = (toolName) => {
126
+ if (toolName === '') {
127
+ setSelectedTool('');
128
+ return;
129
+ }
130
+ setSelectedTool(toolName);
131
+ if (toolName === 'get_document') {
132
+ executeGetDocument();
133
+ }
134
+ else if (toolName === 'append_paragraph') {
135
+ executeAppendParagraph();
136
+ }
137
+ // Reset selection back to "Select a tool" after execution
138
+ setTimeout(() => {
139
+ setSelectedTool('');
140
+ }, 100);
141
+ };
142
+ // Set hardcoded tools instead of fetching from server
143
+ useEffect(() => {
144
+ const hardcodedTools = [
145
+ {
146
+ name: 'get_document',
147
+ description: 'Get document',
148
+ parameters: {}
149
+ },
150
+ {
151
+ name: 'append_paragraph',
152
+ description: 'Append paragraph',
153
+ parameters: {}
154
+ }
155
+ ];
156
+ setMcpTools(hardcodedTools);
157
+ console.log('🔧 Hardcoded MCP tools loaded:', hardcodedTools);
158
+ }, []);
159
+ const reloadState = (editor) => {
160
+ const state = editor.getEditorState();
161
+ // JSON needs to be parsed to load an new state.
162
+ const newEditorState = editor.parseEditorState(JSON.stringify(state));
163
+ editor.update(() => {
164
+ // editor.setEditorState(state);
165
+ editor.setEditorState(newEditorState);
166
+ });
167
+ console.log(editor.getEditorState().toJSON());
168
+ };
169
+ function addParagraph(editor) {
170
+ editor.update(() => {
171
+ const root = $getRoot();
172
+ const timestamp = new Date().toISOString();
173
+ const textNode = $createTextNode(`Hello ${timestamp}`);
174
+ const paragraphNode = $createParagraphNode();
175
+ paragraphNode.append(textNode);
176
+ // Insert the paragraph at the beginning of the editor
177
+ const firstChild = root.getFirstChild();
178
+ if (firstChild) {
179
+ firstChild.insertBefore(paragraphNode);
180
+ }
181
+ else {
182
+ root.append(paragraphNode);
183
+ }
184
+ });
185
+ }
186
+ function first100Keys(editor) {
187
+ editor.getEditorState().read(() => {
188
+ const root = $getRoot();
189
+ const children = root.getChildren();
190
+ const keys = [];
191
+ // Get up to 100 node keys
192
+ const maxNodes = Math.min(100, children.length);
193
+ for (let i = 0; i < maxNodes; i++) {
194
+ keys.push(children[i].getKey());
195
+ }
196
+ console.log(`First ${keys.length} node keys:`, keys);
197
+ });
198
+ }
199
+ return (_jsxs(_Fragment, { children: [_jsx("button", { onClick: () => { reloadState(editor); }, children: "Reload State" }), _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: {
200
+ padding: '4px 8px',
201
+ borderRadius: '4px',
202
+ border: '1px solid #ccc',
203
+ minWidth: '150px',
204
+ fontSize: '12px'
205
+ }, 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: {
206
+ marginLeft: '10px',
207
+ color: 'red',
208
+ fontSize: '12px'
209
+ }, children: ["Error: ", toolsError] })), _jsx("button", { onClick: fetchMCPTools, disabled: isLoadingTools, style: {
210
+ marginLeft: '5px',
211
+ padding: '4px 8px',
212
+ fontSize: '12px'
213
+ }, children: "\uD83D\uDD04 Refresh" }), selectedTool && (_jsx("span", { style: {
214
+ marginLeft: '10px',
215
+ color: 'green',
216
+ fontSize: '12px'
217
+ }, children: selectedTool }))] })] }));
218
+ }
@@ -0,0 +1,8 @@
1
+ import type { JSX } from 'react';
2
+ import { LexicalCommand } from 'lexical';
3
+ type CommandPayload = {
4
+ dateTime: Date;
5
+ };
6
+ export declare const INSERT_DATETIME_COMMAND: LexicalCommand<CommandPayload>;
7
+ export default function DateTimePlugin(): JSX.Element | null;
8
+ export {};