@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,247 @@
1
+ /*
2
+ * Copyright (c) 2025-2026 Datalayer, Inc.
3
+ * Distributed under the terms of the MIT License.
4
+ */
5
+ /**
6
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
7
+ *
8
+ * This source code is licensed under the MIT license found in the
9
+ * LICENSE file in the root directory of this source tree.
10
+ *
11
+ */
12
+ import { $createCodeNode } from '@lexical/code';
13
+ import { INSERT_CHECK_LIST_COMMAND, INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND, } from '@lexical/list';
14
+ import { $isDecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode';
15
+ import { $createHeadingNode, $createQuoteNode, $isHeadingNode, $isQuoteNode, } from '@lexical/rich-text';
16
+ import { $patchStyleText, $setBlocksType } from '@lexical/selection';
17
+ import { $isTableSelection } from '@lexical/table';
18
+ import { $getNearestBlockElementAncestorOrThrow } from '@lexical/utils';
19
+ import { $createParagraphNode, $getSelection, $isRangeSelection, $isTextNode, } from 'lexical';
20
+ import { DEFAULT_FONT_SIZE, MAX_ALLOWED_FONT_SIZE, MIN_ALLOWED_FONT_SIZE, } from '../../context/ToolbarContext';
21
+ // eslint-disable-next-line no-shadow
22
+ export var UpdateFontSizeType;
23
+ (function (UpdateFontSizeType) {
24
+ UpdateFontSizeType[UpdateFontSizeType["increment"] = 1] = "increment";
25
+ UpdateFontSizeType[UpdateFontSizeType["decrement"] = 2] = "decrement";
26
+ })(UpdateFontSizeType || (UpdateFontSizeType = {}));
27
+ /**
28
+ * Calculates the new font size based on the update type.
29
+ * @param currentFontSize - The current font size
30
+ * @param updateType - The type of change, either increment or decrement
31
+ * @returns the next font size
32
+ */
33
+ export const calculateNextFontSize = (currentFontSize, updateType) => {
34
+ if (!updateType) {
35
+ return currentFontSize;
36
+ }
37
+ let updatedFontSize = currentFontSize;
38
+ switch (updateType) {
39
+ case UpdateFontSizeType.decrement:
40
+ switch (true) {
41
+ case currentFontSize > MAX_ALLOWED_FONT_SIZE:
42
+ updatedFontSize = MAX_ALLOWED_FONT_SIZE;
43
+ break;
44
+ case currentFontSize >= 48:
45
+ updatedFontSize -= 12;
46
+ break;
47
+ case currentFontSize >= 24:
48
+ updatedFontSize -= 4;
49
+ break;
50
+ case currentFontSize >= 14:
51
+ updatedFontSize -= 2;
52
+ break;
53
+ case currentFontSize >= 9:
54
+ updatedFontSize -= 1;
55
+ break;
56
+ default:
57
+ updatedFontSize = MIN_ALLOWED_FONT_SIZE;
58
+ break;
59
+ }
60
+ break;
61
+ case UpdateFontSizeType.increment:
62
+ switch (true) {
63
+ case currentFontSize < MIN_ALLOWED_FONT_SIZE:
64
+ updatedFontSize = MIN_ALLOWED_FONT_SIZE;
65
+ break;
66
+ case currentFontSize < 12:
67
+ updatedFontSize += 1;
68
+ break;
69
+ case currentFontSize < 20:
70
+ updatedFontSize += 2;
71
+ break;
72
+ case currentFontSize < 36:
73
+ updatedFontSize += 4;
74
+ break;
75
+ case currentFontSize <= 60:
76
+ updatedFontSize += 12;
77
+ break;
78
+ default:
79
+ updatedFontSize = MAX_ALLOWED_FONT_SIZE;
80
+ break;
81
+ }
82
+ break;
83
+ default:
84
+ break;
85
+ }
86
+ return updatedFontSize;
87
+ };
88
+ /**
89
+ * Patches the selection with the updated font size.
90
+ */
91
+ export const updateFontSizeInSelection = (editor, newFontSize, updateType) => {
92
+ const getNextFontSize = (prevFontSize) => {
93
+ if (!prevFontSize) {
94
+ prevFontSize = `${DEFAULT_FONT_SIZE}px`;
95
+ }
96
+ prevFontSize = prevFontSize.slice(0, -2);
97
+ const nextFontSize = calculateNextFontSize(Number(prevFontSize), updateType);
98
+ return `${nextFontSize}px`;
99
+ };
100
+ editor.update(() => {
101
+ if (editor.isEditable()) {
102
+ const selection = $getSelection();
103
+ if (selection !== null) {
104
+ $patchStyleText(selection, {
105
+ 'font-size': newFontSize || getNextFontSize,
106
+ });
107
+ }
108
+ }
109
+ });
110
+ };
111
+ export const updateFontSize = (editor, updateType, inputValue) => {
112
+ if (inputValue !== '') {
113
+ const nextFontSize = calculateNextFontSize(Number(inputValue), updateType);
114
+ updateFontSizeInSelection(editor, String(nextFontSize) + 'px', null);
115
+ }
116
+ else {
117
+ updateFontSizeInSelection(editor, null, updateType);
118
+ }
119
+ };
120
+ export const formatParagraph = (editor) => {
121
+ editor.update(() => {
122
+ const selection = $getSelection();
123
+ $setBlocksType(selection, () => $createParagraphNode());
124
+ });
125
+ };
126
+ export const formatHeading = (editor, blockType, headingSize) => {
127
+ if (blockType !== headingSize) {
128
+ editor.update(() => {
129
+ const selection = $getSelection();
130
+ $setBlocksType(selection, () => $createHeadingNode(headingSize));
131
+ });
132
+ }
133
+ };
134
+ export const formatBulletList = (editor, blockType) => {
135
+ if (blockType !== 'bullet') {
136
+ editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);
137
+ }
138
+ else {
139
+ formatParagraph(editor);
140
+ }
141
+ };
142
+ export const formatCheckList = (editor, blockType) => {
143
+ if (blockType !== 'check') {
144
+ editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined);
145
+ }
146
+ else {
147
+ formatParagraph(editor);
148
+ }
149
+ };
150
+ export const formatNumberedList = (editor, blockType) => {
151
+ if (blockType !== 'number') {
152
+ editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);
153
+ }
154
+ else {
155
+ formatParagraph(editor);
156
+ }
157
+ };
158
+ export const formatQuote = (editor, blockType) => {
159
+ if (blockType !== 'quote') {
160
+ editor.update(() => {
161
+ const selection = $getSelection();
162
+ $setBlocksType(selection, () => $createQuoteNode());
163
+ });
164
+ }
165
+ };
166
+ export const formatCode = (editor, blockType) => {
167
+ if (blockType !== 'code') {
168
+ editor.update(() => {
169
+ let selection = $getSelection();
170
+ if (!selection) {
171
+ return;
172
+ }
173
+ if (!$isRangeSelection(selection) || selection.isCollapsed()) {
174
+ $setBlocksType(selection, () => $createCodeNode());
175
+ }
176
+ else {
177
+ const textContent = selection.getTextContent();
178
+ const codeNode = $createCodeNode();
179
+ selection.insertNodes([codeNode]);
180
+ selection = $getSelection();
181
+ if ($isRangeSelection(selection)) {
182
+ selection.insertRawText(textContent);
183
+ }
184
+ }
185
+ });
186
+ }
187
+ };
188
+ export const clearFormatting = (editor) => {
189
+ editor.update(() => {
190
+ const selection = $getSelection();
191
+ if ($isRangeSelection(selection) || $isTableSelection(selection)) {
192
+ const anchor = selection.anchor;
193
+ const focus = selection.focus;
194
+ const nodes = selection.getNodes();
195
+ const extractedNodes = selection.extract();
196
+ if (anchor.key === focus.key && anchor.offset === focus.offset) {
197
+ return;
198
+ }
199
+ nodes.forEach((node, idx) => {
200
+ // We split the first and last node by the selection
201
+ // So that we don't format unselected text inside those nodes
202
+ if ($isTextNode(node)) {
203
+ // Use a separate variable to ensure TS does not lose the refinement
204
+ let textNode = node;
205
+ if (idx === 0 && anchor.offset !== 0) {
206
+ textNode = textNode.splitText(anchor.offset)[1] || textNode;
207
+ }
208
+ if (idx === nodes.length - 1) {
209
+ textNode = textNode.splitText(focus.offset)[0] || textNode;
210
+ }
211
+ /**
212
+ * If the selected text has one format applied
213
+ * selecting a portion of the text, could
214
+ * clear the format to the wrong portion of the text.
215
+ *
216
+ * The cleared text is based on the length of the selected text.
217
+ */
218
+ // We need this in case the selected text only has one format
219
+ const extractedTextNode = extractedNodes[0];
220
+ if (nodes.length === 1 && $isTextNode(extractedTextNode)) {
221
+ textNode = extractedTextNode;
222
+ }
223
+ if (textNode.__style !== '') {
224
+ textNode.setStyle('');
225
+ }
226
+ if (textNode.__format !== 0) {
227
+ textNode.setFormat(0);
228
+ }
229
+ const nearestBlockElement = $getNearestBlockElementAncestorOrThrow(textNode);
230
+ if (nearestBlockElement.__format !== 0) {
231
+ nearestBlockElement.setFormat('');
232
+ }
233
+ if (nearestBlockElement.__indent !== 0) {
234
+ nearestBlockElement.setIndent(0);
235
+ }
236
+ node = textNode;
237
+ }
238
+ else if ($isHeadingNode(node) || $isQuoteNode(node)) {
239
+ node.replace($createParagraphNode(), true);
240
+ }
241
+ else if ($isDecoratorBlockNode(node)) {
242
+ node.setFormat('');
243
+ }
244
+ });
245
+ }
246
+ });
247
+ };
@@ -0,0 +1,2 @@
1
+ import type { JSX } from 'react';
2
+ export default function TreeViewPlugin(): JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
3
+ import { TreeView } from '@lexical/react/LexicalTreeView';
4
+ export default function TreeViewPlugin() {
5
+ const [editor] = useLexicalComposerContext();
6
+ return (_jsx(TreeView, { viewClassName: "tree-view-output", treeTypeButtonClassName: "debug-treetype-button", timeTravelPanelClassName: "debug-timetravel-panel", timeTravelButtonClassName: "debug-timetravel-button", timeTravelPanelSliderClassName: "debug-timetravel-panel-slider", timeTravelPanelButtonClassName: "debug-timetravel-panel-button", editor: editor }));
7
+ }
@@ -0,0 +1,4 @@
1
+ import type { JSX } from 'react';
2
+ import { LexicalCommand } from 'lexical';
3
+ export declare const INSERT_TWEET_COMMAND: LexicalCommand<string>;
4
+ export default function TwitterPlugin(): 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 { $createTweetNode, TweetNode } from '../../nodes/TweetNode';
10
+ export const INSERT_TWEET_COMMAND = createCommand('INSERT_TWEET_COMMAND');
11
+ export default function TwitterPlugin() {
12
+ const [editor] = useLexicalComposerContext();
13
+ useEffect(() => {
14
+ if (!editor.hasNodes([TweetNode])) {
15
+ throw new Error('TwitterPlugin: TweetNode not registered on editor');
16
+ }
17
+ return editor.registerCommand(INSERT_TWEET_COMMAND, (payload) => {
18
+ const tweetNode = $createTweetNode(payload);
19
+ $insertNodeToNearestRoot(tweetNode);
20
+ return true;
21
+ }, COMMAND_PRIORITY_EDITOR);
22
+ }, [editor]);
23
+ return null;
24
+ }
@@ -0,0 +1,2 @@
1
+ import type { JSX } from 'react';
2
+ export default function TypingPerfPlugin(): JSX.Element | null;
@@ -0,0 +1,97 @@
1
+ /*
2
+ * Copyright (c) 2025-2026 Datalayer, Inc.
3
+ * Distributed under the terms of the MIT License.
4
+ */
5
+ import { useEffect } from 'react';
6
+ import useReport from '../../hooks/useReport';
7
+ const validInputTypes = new Set([
8
+ 'insertText',
9
+ 'insertCompositionText',
10
+ 'insertFromComposition',
11
+ 'insertLineBreak',
12
+ 'insertParagraph',
13
+ 'deleteCompositionText',
14
+ 'deleteContentBackward',
15
+ 'deleteByComposition',
16
+ 'deleteContent',
17
+ 'deleteContentForward',
18
+ 'deleteWordBackward',
19
+ 'deleteWordForward',
20
+ 'deleteHardLineBackward',
21
+ 'deleteSoftLineBackward',
22
+ 'deleteHardLineForward',
23
+ 'deleteSoftLineForward',
24
+ ]);
25
+ export default function TypingPerfPlugin() {
26
+ const report = useReport();
27
+ useEffect(() => {
28
+ let start = 0;
29
+ let timerId;
30
+ let keyPressTimerId;
31
+ let log = [];
32
+ let invalidatingEvent = false;
33
+ const measureEventEnd = function logKeyPress() {
34
+ if (keyPressTimerId != null) {
35
+ if (invalidatingEvent) {
36
+ invalidatingEvent = false;
37
+ }
38
+ else {
39
+ log.push(performance.now() - start);
40
+ }
41
+ clearTimeout(keyPressTimerId);
42
+ keyPressTimerId = null;
43
+ }
44
+ };
45
+ const measureEventStart = function measureEvent() {
46
+ if (timerId != null) {
47
+ clearTimeout(timerId);
48
+ timerId = null;
49
+ }
50
+ // We use a setTimeout(0) instead of requestAnimationFrame, due to
51
+ // inconsistencies between the sequencing of rAF in different browsers.
52
+ keyPressTimerId = setTimeout(measureEventEnd, 0);
53
+ // Schedule a timer to report the results.
54
+ timerId = setTimeout(() => {
55
+ const total = log.reduce((a, b) => a + b, 0);
56
+ const reportedText = 'Typing Perf: ' + Math.round((total / log.length) * 100) / 100 + 'ms';
57
+ report(reportedText);
58
+ log = [];
59
+ }, 2000);
60
+ // Make the time after we do the previous logic, so we don't measure the overhead
61
+ // for it all.
62
+ start = performance.now();
63
+ };
64
+ const beforeInputHandler = function beforeInputHandler(event) {
65
+ if (!validInputTypes.has(event.inputType) || invalidatingEvent) {
66
+ invalidatingEvent = false;
67
+ return;
68
+ }
69
+ measureEventStart();
70
+ };
71
+ const keyDownHandler = function keyDownHandler(event) {
72
+ const key = event.key;
73
+ if (key === 'Backspace' || key === 'Enter') {
74
+ measureEventStart();
75
+ }
76
+ };
77
+ const pasteHandler = function pasteHandler() {
78
+ invalidatingEvent = true;
79
+ };
80
+ const cutHandler = function cutHandler() {
81
+ invalidatingEvent = true;
82
+ };
83
+ window.addEventListener('keydown', keyDownHandler, true);
84
+ window.addEventListener('selectionchange', measureEventEnd, true);
85
+ window.addEventListener('beforeinput', beforeInputHandler, true);
86
+ window.addEventListener('paste', pasteHandler, true);
87
+ window.addEventListener('cut', cutHandler, true);
88
+ return () => {
89
+ window.removeEventListener('keydown', keyDownHandler, true);
90
+ window.removeEventListener('selectionchange', measureEventEnd, true);
91
+ window.removeEventListener('beforeinput', beforeInputHandler, true);
92
+ window.removeEventListener('paste', pasteHandler, true);
93
+ window.removeEventListener('cut', cutHandler, true);
94
+ };
95
+ }, [report]);
96
+ return null;
97
+ }
@@ -0,0 +1,4 @@
1
+ import type { JSX } from 'react';
2
+ import { LexicalCommand } from 'lexical';
3
+ export declare const INSERT_YOUTUBE_COMMAND: LexicalCommand<string>;
4
+ export default function YouTubePlugin(): 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 { $createYouTubeNode, YouTubeNode } from '../../nodes/YouTubeNode';
10
+ export const INSERT_YOUTUBE_COMMAND = createCommand('INSERT_YOUTUBE_COMMAND');
11
+ export default function YouTubePlugin() {
12
+ const [editor] = useLexicalComposerContext();
13
+ useEffect(() => {
14
+ if (!editor.hasNodes([YouTubeNode])) {
15
+ throw new Error('YouTubePlugin: YouTubeNode not registered on editor');
16
+ }
17
+ return editor.registerCommand(INSERT_YOUTUBE_COMMAND, (payload) => {
18
+ const youTubeNode = $createYouTubeNode(payload);
19
+ $insertNodeToNearestRoot(youTubeNode);
20
+ return true;
21
+ }, COMMAND_PRIORITY_EDITOR);
22
+ }, [editor]);
23
+ return null;
24
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,115 @@
1
+ /*
2
+ * Copyright (c) 2025-2026 Datalayer, Inc.
3
+ * Distributed under the terms of the MIT License.
4
+ */
5
+ import { createHeadlessEditor } from '@lexical/headless';
6
+ import { $isMarkNode, $unwrapMarkNode } from '@lexical/mark';
7
+ import * as http from 'http';
8
+ import { $getRoot, $isElementNode } from 'lexical';
9
+ import * as url from 'url';
10
+ import PlaygroundNodes from '../nodes/PlaygroundNodes';
11
+ const hostname = 'localhost';
12
+ const port = 1235;
13
+ let stringifiedEditorStateJSON = '';
14
+ global.__DEV__ = true;
15
+ const editor = createHeadlessEditor({
16
+ namespace: 'validation',
17
+ nodes: [...PlaygroundNodes],
18
+ onError: (error) => {
19
+ console.error(error);
20
+ },
21
+ });
22
+ const getJSONData = (req) => {
23
+ const body = [];
24
+ return new Promise((resolve) => {
25
+ req
26
+ .on('data', (chunk) => {
27
+ body.push(chunk);
28
+ })
29
+ .on('end', () => {
30
+ resolve(Buffer.concat(body).toString());
31
+ })
32
+ .on('error', (error) => {
33
+ // eslint-disable-next-line no-console
34
+ console.log(error);
35
+ });
36
+ });
37
+ };
38
+ const $sanitizeNode = (node) => {
39
+ if ($isMarkNode(node)) {
40
+ $unwrapMarkNode(node);
41
+ return;
42
+ }
43
+ if ($isElementNode(node)) {
44
+ const children = node.getChildren();
45
+ for (const child of children) {
46
+ $sanitizeNode(child);
47
+ }
48
+ }
49
+ };
50
+ const validateEditorState = async (stringifiedJSON) => {
51
+ if (stringifiedEditorStateJSON === stringifiedJSON) {
52
+ return true;
53
+ }
54
+ const prevEditorState = editor.getEditorState();
55
+ const nextEditorState = editor.parseEditorState(stringifiedJSON);
56
+ editor.setEditorState(nextEditorState);
57
+ editor.update(() => {
58
+ const root = $getRoot();
59
+ $sanitizeNode(root);
60
+ });
61
+ await Promise.resolve().then();
62
+ const assertion = JSON.stringify(editor.getEditorState().toJSON());
63
+ const success = assertion === stringifiedEditorStateJSON;
64
+ if (success) {
65
+ // eslint-disable-next-line no-console
66
+ console.log('Editor state updated successfully.');
67
+ editor.setEditorState(nextEditorState);
68
+ stringifiedEditorStateJSON = assertion;
69
+ }
70
+ else {
71
+ // eslint-disable-next-line no-console
72
+ console.log('Editor state was rejected!');
73
+ editor.setEditorState(prevEditorState);
74
+ }
75
+ return success;
76
+ };
77
+ const server = http.createServer(async (req, res) => {
78
+ const pathname = url.parse(req.url).pathname;
79
+ const { method } = req;
80
+ res.setHeader('Content-Type', 'application/json');
81
+ res.setHeader('Access-Control-Allow-Origin', '*');
82
+ res.setHeader('Access-Control-Request-Method', '*');
83
+ res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, POST, GET');
84
+ res.setHeader('Access-Control-Allow-Headers', '*');
85
+ if (method === 'OPTIONS') {
86
+ res.end();
87
+ return;
88
+ }
89
+ if (method === 'POST' && pathname === '/setEditorState') {
90
+ const stringifiedJSON = await getJSONData(req);
91
+ const editorState = editor.parseEditorState(stringifiedJSON);
92
+ editor.setEditorState(editorState);
93
+ stringifiedEditorStateJSON = stringifiedJSON;
94
+ res.statusCode = 200;
95
+ res.end();
96
+ }
97
+ else if (method === 'POST' && pathname === '/validateEditorState') {
98
+ const stringifiedJSON = await getJSONData(req);
99
+ if (await validateEditorState(stringifiedJSON)) {
100
+ res.statusCode = 200;
101
+ }
102
+ else {
103
+ res.statusCode = 403;
104
+ }
105
+ res.end();
106
+ }
107
+ else {
108
+ res.statusCode = 404;
109
+ res.end();
110
+ }
111
+ });
112
+ server.listen(port, hostname, () => {
113
+ // eslint-disable-next-line no-console
114
+ console.log(`Read-only validation server running at http://${hostname}:${port}/`);
115
+ });
@@ -0,0 +1,2 @@
1
+ declare const _default: Record<"useYjs" | "disableBeforeInput" | "emptyEditor" | "hasLinkAttributes" | "isAutocomplete" | "isCharLimit" | "isCharLimitUtf8" | "isCodeHighlighted" | "isCodeShiki" | "isCollab" | "isMaxLength" | "isRichText" | "listStrictIndent" | "measureTypingPerf" | "selectionAlwaysOnDisplay" | "shouldAllowHighlightingWithBrackets" | "shouldPreserveNewLinesInMarkdown" | "shouldUseLexicalContextMenu" | "showNestedEditorTreeView" | "showTableOfContents" | "showTreeView" | "tableCellBackgroundColor" | "tableCellMerge" | "tableHorizontalScroll" | "debug", boolean>;
2
+ export default _default;
@@ -0,0 +1,29 @@
1
+ /*
2
+ * Copyright (c) 2025-2026 Datalayer, Inc.
3
+ * Distributed under the terms of the MIT License.
4
+ */
5
+ import { INITIAL_SETTINGS } from './appSettings';
6
+ // Export a function so this is not tree-shaken,
7
+ // but evaluate it immediately so it executes before
8
+ // lexical computes CAN_USE_BEFORE_INPUT
9
+ export default (() => {
10
+ // override default options with query parameters if any
11
+ const urlSearchParams = new URLSearchParams(window.location.search);
12
+ for (const param of Object.keys(INITIAL_SETTINGS)) {
13
+ if (urlSearchParams.has(param)) {
14
+ try {
15
+ const value = JSON.parse(urlSearchParams.get(param) ?? 'true');
16
+ INITIAL_SETTINGS[param] = Boolean(value);
17
+ }
18
+ catch (error) {
19
+ console.warn(`Unable to parse query parameter "${param}"`);
20
+ }
21
+ }
22
+ }
23
+ if (INITIAL_SETTINGS.disableBeforeInput) {
24
+ delete window.InputEvent.prototype.getTargetRanges;
25
+ }
26
+ // @ts-ignore
27
+ window.EXCALIDRAW_ASSET_PATH = process.env.EXCALIDRAW_ASSET_PATH;
28
+ return INITIAL_SETTINGS;
29
+ })();
@@ -0,0 +1,4 @@
1
+ import type { EditorThemeClasses } from 'lexical';
2
+ import './CommentEditorTheme.css';
3
+ declare const theme: EditorThemeClasses;
4
+ export default theme;
@@ -0,0 +1,11 @@
1
+ /*
2
+ * Copyright (c) 2025-2026 Datalayer, Inc.
3
+ * Distributed under the terms of the MIT License.
4
+ */
5
+ import './CommentEditorTheme.css';
6
+ import baseTheme from './PlaygroundEditorTheme';
7
+ const theme = {
8
+ ...baseTheme,
9
+ paragraph: 'CommentEditorTheme__paragraph',
10
+ };
11
+ export default theme;
@@ -0,0 +1,4 @@
1
+ import type { EditorThemeClasses } from 'lexical';
2
+ import './PlaygroundEditorTheme.css';
3
+ declare const theme: EditorThemeClasses;
4
+ export default theme;