@dxos/react-ui-editor 0.8.4-main.3f58842 → 0.8.4-main.422d1c7879

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 (410) hide show
  1. package/dist/lib/browser/index.mjs +1407 -7462
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +1421 -7475
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/components/Editor/Editor.d.ts +42 -15
  8. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  9. package/dist/types/src/components/Editor/Editor.stories.d.ts +23 -0
  10. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -0
  11. package/dist/types/src/components/Editor/EditorView.d.ts +31 -0
  12. package/dist/types/src/components/Editor/EditorView.d.ts.map +1 -0
  13. package/dist/types/src/components/Editor/controller.d.ts +10 -0
  14. package/dist/types/src/components/Editor/controller.d.ts.map +1 -0
  15. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts +34 -0
  16. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -0
  17. package/dist/types/src/components/EditorMenuProvider/index.d.ts +6 -0
  18. package/dist/types/src/components/EditorMenuProvider/index.d.ts.map +1 -0
  19. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts +4 -0
  20. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorMenuProvider/menu.d.ts +28 -0
  22. package/dist/types/src/components/EditorMenuProvider/menu.d.ts.map +1 -0
  23. package/dist/types/src/components/EditorMenuProvider/popover.d.ts +46 -0
  24. package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -0
  25. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts +34 -0
  26. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -0
  27. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +16 -0
  28. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -0
  29. package/dist/types/src/components/EditorPreviewProvider/index.d.ts +2 -0
  30. package/dist/types/src/components/EditorPreviewProvider/index.d.ts.map +1 -0
  31. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +28 -2
  32. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  33. package/dist/types/src/components/EditorToolbar/blocks.d.ts +4 -17
  34. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  35. package/dist/types/src/components/EditorToolbar/formatting.d.ts +4 -17
  36. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  37. package/dist/types/src/components/EditorToolbar/headings.d.ts +4 -17
  38. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  39. package/dist/types/src/components/EditorToolbar/image.d.ts +3 -15
  40. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  41. package/dist/types/src/components/EditorToolbar/index.d.ts +1 -1
  42. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  43. package/dist/types/src/components/EditorToolbar/lists.d.ts +4 -17
  44. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -1
  45. package/dist/types/src/components/EditorToolbar/search.d.ts +3 -15
  46. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  47. package/dist/types/src/components/EditorToolbar/types.d.ts +5 -0
  48. package/dist/types/src/components/EditorToolbar/types.d.ts.map +1 -0
  49. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +5 -18
  50. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  51. package/dist/types/src/components/index.d.ts +2 -2
  52. package/dist/types/src/components/index.d.ts.map +1 -1
  53. package/dist/types/src/extensions/Assistant.stories.d.ts +10 -0
  54. package/dist/types/src/extensions/Assistant.stories.d.ts.map +1 -0
  55. package/dist/types/src/extensions/assistant-extension.d.ts +24 -0
  56. package/dist/types/src/extensions/assistant-extension.d.ts.map +1 -0
  57. package/dist/types/src/extensions/index.d.ts +1 -22
  58. package/dist/types/src/extensions/index.d.ts.map +1 -1
  59. package/dist/types/src/hooks/index.d.ts +1 -0
  60. package/dist/types/src/hooks/index.d.ts.map +1 -1
  61. package/dist/types/src/hooks/useBasicMarkdownExtensions.d.ts +25 -0
  62. package/dist/types/src/hooks/useBasicMarkdownExtensions.d.ts.map +1 -0
  63. package/dist/types/src/hooks/useTextEditor.d.ts +6 -10
  64. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  65. package/dist/types/src/index.d.ts +0 -7
  66. package/dist/types/src/index.d.ts.map +1 -1
  67. package/dist/types/src/stories/Automerge.stories.d.ts +44 -0
  68. package/dist/types/src/stories/Automerge.stories.d.ts.map +1 -0
  69. package/dist/types/src/stories/Comments.stories.d.ts +22 -10
  70. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  71. package/dist/types/src/stories/EditorToolbar.stories.d.ts +42 -4
  72. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  73. package/dist/types/src/stories/Experimental.stories.d.ts +23 -13
  74. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  75. package/dist/types/src/stories/Markdown.stories.d.ts +33 -43
  76. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  77. package/dist/types/src/stories/Outliner.stories.d.ts +16 -22
  78. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  79. package/dist/types/src/stories/Popover.stories.d.ts +20 -0
  80. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  81. package/dist/types/src/stories/Preview.stories.d.ts +23 -7
  82. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  83. package/dist/types/src/stories/Tags.stories.d.ts +16 -0
  84. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  85. package/dist/types/src/stories/TextEditor.stories.d.ts +38 -52
  86. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  87. package/dist/types/src/stories/Theme.stories.d.ts +8 -0
  88. package/dist/types/src/stories/Theme.stories.d.ts.map +1 -0
  89. package/dist/types/src/stories/components/EditorStory.d.ts +11 -23
  90. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  91. package/dist/types/src/stories/components/util.d.ts +3 -3
  92. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  93. package/dist/types/src/translations.d.ts +26 -26
  94. package/dist/types/src/translations.d.ts.map +1 -1
  95. package/dist/types/src/util/index.d.ts +0 -4
  96. package/dist/types/src/util/index.d.ts.map +1 -1
  97. package/dist/types/src/util/react.d.ts +7 -6
  98. package/dist/types/src/util/react.d.ts.map +1 -1
  99. package/dist/types/tsconfig.tsbuildinfo +1 -1
  100. package/package.json +87 -83
  101. package/src/components/Editor/Editor.stories.tsx +89 -0
  102. package/src/components/Editor/Editor.tsx +177 -24
  103. package/src/components/Editor/EditorView.tsx +83 -0
  104. package/src/components/Editor/controller.ts +50 -0
  105. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +226 -0
  106. package/src/components/EditorMenuProvider/index.ts +10 -0
  107. package/src/components/EditorMenuProvider/menu-presets.ts +125 -0
  108. package/src/components/EditorMenuProvider/menu.ts +70 -0
  109. package/src/components/EditorMenuProvider/popover.ts +285 -0
  110. package/src/components/EditorMenuProvider/useEditorMenu.ts +180 -0
  111. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +79 -0
  112. package/src/components/EditorPreviewProvider/index.ts +5 -0
  113. package/src/components/EditorToolbar/EditorToolbar.tsx +90 -103
  114. package/src/components/EditorToolbar/blocks.ts +52 -48
  115. package/src/components/EditorToolbar/formatting.ts +43 -48
  116. package/src/components/EditorToolbar/headings.ts +46 -45
  117. package/src/components/EditorToolbar/image.ts +16 -10
  118. package/src/components/EditorToolbar/index.ts +2 -7
  119. package/src/components/EditorToolbar/lists.ts +39 -41
  120. package/src/components/EditorToolbar/search.ts +16 -10
  121. package/src/components/EditorToolbar/types.ts +7 -0
  122. package/src/components/EditorToolbar/view-mode.ts +39 -40
  123. package/src/components/index.ts +3 -2
  124. package/src/extensions/Assistant.stories.tsx +111 -0
  125. package/src/extensions/assistant-extension.tsx +223 -0
  126. package/src/extensions/index.ts +2 -23
  127. package/src/hooks/index.ts +1 -0
  128. package/src/hooks/useBasicMarkdownExtensions.ts +55 -0
  129. package/src/hooks/useTextEditor.ts +39 -45
  130. package/src/index.ts +0 -9
  131. package/src/stories/Automerge.stories.tsx +173 -0
  132. package/src/stories/Comments.stories.tsx +58 -51
  133. package/src/stories/EditorToolbar.stories.tsx +48 -61
  134. package/src/stories/Experimental.stories.tsx +21 -19
  135. package/src/stories/Markdown.stories.tsx +37 -33
  136. package/src/stories/Outliner.stories.tsx +54 -44
  137. package/src/stories/Popover.stories.tsx +157 -0
  138. package/src/stories/Preview.stories.tsx +114 -95
  139. package/src/stories/Tags.stories.tsx +104 -0
  140. package/src/stories/TextEditor.stories.tsx +50 -75
  141. package/src/stories/Theme.stories.tsx +61 -0
  142. package/src/stories/components/EditorStory.tsx +50 -35
  143. package/src/stories/components/util.tsx +90 -59
  144. package/src/translations.ts +30 -25
  145. package/src/util/index.ts +1 -5
  146. package/src/util/react.tsx +9 -14
  147. package/dist/lib/browser/chunk-22UMM3QJ.mjs +0 -22
  148. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
  149. package/dist/lib/browser/testing/index.mjs +0 -6
  150. package/dist/lib/browser/testing/index.mjs.map +0 -7
  151. package/dist/lib/browser/types/index.mjs +0 -13
  152. package/dist/lib/browser/types/index.mjs.map +0 -7
  153. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs +0 -24
  154. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  155. package/dist/lib/node-esm/testing/index.mjs +0 -8
  156. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  157. package/dist/lib/node-esm/types/index.mjs +0 -14
  158. package/dist/lib/node-esm/types/index.mjs.map +0 -7
  159. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -51
  160. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  161. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  162. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  163. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  164. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  165. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  166. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  167. package/dist/types/src/components/Popover/index.d.ts +0 -4
  168. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  169. package/dist/types/src/defaults.d.ts +0 -14
  170. package/dist/types/src/defaults.d.ts.map +0 -1
  171. package/dist/types/src/extensions/annotations.d.ts +0 -9
  172. package/dist/types/src/extensions/annotations.d.ts.map +0 -1
  173. package/dist/types/src/extensions/autocomplete.d.ts +0 -13
  174. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  175. package/dist/types/src/extensions/automerge/automerge.d.ts +0 -4
  176. package/dist/types/src/extensions/automerge/automerge.d.ts.map +0 -1
  177. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +0 -56
  178. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +0 -1
  179. package/dist/types/src/extensions/automerge/automerge.test.d.ts +0 -2
  180. package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +0 -1
  181. package/dist/types/src/extensions/automerge/cursor.d.ts +0 -4
  182. package/dist/types/src/extensions/automerge/cursor.d.ts.map +0 -1
  183. package/dist/types/src/extensions/automerge/defs.d.ts +0 -17
  184. package/dist/types/src/extensions/automerge/defs.d.ts.map +0 -1
  185. package/dist/types/src/extensions/automerge/index.d.ts +0 -2
  186. package/dist/types/src/extensions/automerge/index.d.ts.map +0 -1
  187. package/dist/types/src/extensions/automerge/sync.d.ts +0 -17
  188. package/dist/types/src/extensions/automerge/sync.d.ts.map +0 -1
  189. package/dist/types/src/extensions/automerge/update-automerge.d.ts +0 -6
  190. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +0 -1
  191. package/dist/types/src/extensions/automerge/update-codemirror.d.ts +0 -5
  192. package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +0 -1
  193. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +0 -31
  194. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +0 -1
  195. package/dist/types/src/extensions/awareness/awareness.d.ts +0 -46
  196. package/dist/types/src/extensions/awareness/awareness.d.ts.map +0 -1
  197. package/dist/types/src/extensions/awareness/index.d.ts +0 -3
  198. package/dist/types/src/extensions/awareness/index.d.ts.map +0 -1
  199. package/dist/types/src/extensions/blast.d.ts +0 -25
  200. package/dist/types/src/extensions/blast.d.ts.map +0 -1
  201. package/dist/types/src/extensions/command/action.d.ts +0 -17
  202. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  203. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  204. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  205. package/dist/types/src/extensions/command/command.d.ts +0 -6
  206. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  207. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  208. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  209. package/dist/types/src/extensions/command/hint.d.ts +0 -24
  210. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  211. package/dist/types/src/extensions/command/index.d.ts +0 -7
  212. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  213. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  214. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  215. package/dist/types/src/extensions/command/state.d.ts +0 -16
  216. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  217. package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
  218. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  219. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  220. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  221. package/dist/types/src/extensions/comments.d.ts +0 -95
  222. package/dist/types/src/extensions/comments.d.ts.map +0 -1
  223. package/dist/types/src/extensions/debug.d.ts +0 -3
  224. package/dist/types/src/extensions/debug.d.ts.map +0 -1
  225. package/dist/types/src/extensions/dnd.d.ts +0 -9
  226. package/dist/types/src/extensions/dnd.d.ts.map +0 -1
  227. package/dist/types/src/extensions/factories.d.ts +0 -83
  228. package/dist/types/src/extensions/factories.d.ts.map +0 -1
  229. package/dist/types/src/extensions/focus.d.ts +0 -7
  230. package/dist/types/src/extensions/focus.d.ts.map +0 -1
  231. package/dist/types/src/extensions/folding.d.ts +0 -7
  232. package/dist/types/src/extensions/folding.d.ts.map +0 -1
  233. package/dist/types/src/extensions/hashtag.d.ts +0 -3
  234. package/dist/types/src/extensions/hashtag.d.ts.map +0 -1
  235. package/dist/types/src/extensions/json.d.ts +0 -7
  236. package/dist/types/src/extensions/json.d.ts.map +0 -1
  237. package/dist/types/src/extensions/listener.d.ts +0 -11
  238. package/dist/types/src/extensions/listener.d.ts.map +0 -1
  239. package/dist/types/src/extensions/markdown/action.d.ts +0 -12
  240. package/dist/types/src/extensions/markdown/action.d.ts.map +0 -1
  241. package/dist/types/src/extensions/markdown/bundle.d.ts +0 -16
  242. package/dist/types/src/extensions/markdown/bundle.d.ts.map +0 -1
  243. package/dist/types/src/extensions/markdown/changes.d.ts +0 -10
  244. package/dist/types/src/extensions/markdown/changes.d.ts.map +0 -1
  245. package/dist/types/src/extensions/markdown/changes.test.d.ts +0 -2
  246. package/dist/types/src/extensions/markdown/changes.test.d.ts.map +0 -1
  247. package/dist/types/src/extensions/markdown/debug.d.ts +0 -11
  248. package/dist/types/src/extensions/markdown/debug.d.ts.map +0 -1
  249. package/dist/types/src/extensions/markdown/decorate.d.ts +0 -17
  250. package/dist/types/src/extensions/markdown/decorate.d.ts.map +0 -1
  251. package/dist/types/src/extensions/markdown/formatting.d.ts +0 -63
  252. package/dist/types/src/extensions/markdown/formatting.d.ts.map +0 -1
  253. package/dist/types/src/extensions/markdown/formatting.test.d.ts +0 -3
  254. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +0 -1
  255. package/dist/types/src/extensions/markdown/highlight.d.ts +0 -37
  256. package/dist/types/src/extensions/markdown/highlight.d.ts.map +0 -1
  257. package/dist/types/src/extensions/markdown/image.d.ts +0 -7
  258. package/dist/types/src/extensions/markdown/image.d.ts.map +0 -1
  259. package/dist/types/src/extensions/markdown/index.d.ts +0 -10
  260. package/dist/types/src/extensions/markdown/index.d.ts.map +0 -1
  261. package/dist/types/src/extensions/markdown/link.d.ts +0 -7
  262. package/dist/types/src/extensions/markdown/link.d.ts.map +0 -1
  263. package/dist/types/src/extensions/markdown/parser.test.d.ts +0 -2
  264. package/dist/types/src/extensions/markdown/parser.test.d.ts.map +0 -1
  265. package/dist/types/src/extensions/markdown/styles.d.ts +0 -4
  266. package/dist/types/src/extensions/markdown/styles.d.ts.map +0 -1
  267. package/dist/types/src/extensions/markdown/table.d.ts +0 -8
  268. package/dist/types/src/extensions/markdown/table.d.ts.map +0 -1
  269. package/dist/types/src/extensions/mention.d.ts +0 -7
  270. package/dist/types/src/extensions/mention.d.ts.map +0 -1
  271. package/dist/types/src/extensions/modes.d.ts +0 -10
  272. package/dist/types/src/extensions/modes.d.ts.map +0 -1
  273. package/dist/types/src/extensions/outliner/commands.d.ts +0 -10
  274. package/dist/types/src/extensions/outliner/commands.d.ts.map +0 -1
  275. package/dist/types/src/extensions/outliner/editor.d.ts +0 -5
  276. package/dist/types/src/extensions/outliner/editor.d.ts.map +0 -1
  277. package/dist/types/src/extensions/outliner/editor.test.d.ts +0 -2
  278. package/dist/types/src/extensions/outliner/editor.test.d.ts.map +0 -1
  279. package/dist/types/src/extensions/outliner/index.d.ts +0 -4
  280. package/dist/types/src/extensions/outliner/index.d.ts.map +0 -1
  281. package/dist/types/src/extensions/outliner/outliner.d.ts +0 -11
  282. package/dist/types/src/extensions/outliner/outliner.d.ts.map +0 -1
  283. package/dist/types/src/extensions/outliner/outliner.test.d.ts +0 -2
  284. package/dist/types/src/extensions/outliner/outliner.test.d.ts.map +0 -1
  285. package/dist/types/src/extensions/outliner/selection.d.ts +0 -12
  286. package/dist/types/src/extensions/outliner/selection.d.ts.map +0 -1
  287. package/dist/types/src/extensions/outliner/tree.d.ts +0 -79
  288. package/dist/types/src/extensions/outliner/tree.d.ts.map +0 -1
  289. package/dist/types/src/extensions/outliner/tree.test.d.ts +0 -2
  290. package/dist/types/src/extensions/outliner/tree.test.d.ts.map +0 -1
  291. package/dist/types/src/extensions/preview/index.d.ts +0 -2
  292. package/dist/types/src/extensions/preview/index.d.ts.map +0 -1
  293. package/dist/types/src/extensions/preview/preview.d.ts +0 -32
  294. package/dist/types/src/extensions/preview/preview.d.ts.map +0 -1
  295. package/dist/types/src/extensions/selection.d.ts +0 -24
  296. package/dist/types/src/extensions/selection.d.ts.map +0 -1
  297. package/dist/types/src/extensions/typewriter.d.ts +0 -10
  298. package/dist/types/src/extensions/typewriter.d.ts.map +0 -1
  299. package/dist/types/src/stories/Command.stories.d.ts +0 -7
  300. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  301. package/dist/types/src/stories/CommandMenu.stories.d.ts +0 -13
  302. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  303. package/dist/types/src/styles/index.d.ts +0 -4
  304. package/dist/types/src/styles/index.d.ts.map +0 -1
  305. package/dist/types/src/styles/markdown.d.ts +0 -8
  306. package/dist/types/src/styles/markdown.d.ts.map +0 -1
  307. package/dist/types/src/styles/theme.d.ts +0 -38
  308. package/dist/types/src/styles/theme.d.ts.map +0 -1
  309. package/dist/types/src/styles/tokens.d.ts +0 -3
  310. package/dist/types/src/styles/tokens.d.ts.map +0 -1
  311. package/dist/types/src/testing/index.d.ts +0 -2
  312. package/dist/types/src/testing/index.d.ts.map +0 -1
  313. package/dist/types/src/testing/util.d.ts +0 -2
  314. package/dist/types/src/testing/util.d.ts.map +0 -1
  315. package/dist/types/src/types/index.d.ts +0 -2
  316. package/dist/types/src/types/index.d.ts.map +0 -1
  317. package/dist/types/src/types/types.d.ts +0 -21
  318. package/dist/types/src/types/types.d.ts.map +0 -1
  319. package/dist/types/src/util/cursor.d.ts +0 -31
  320. package/dist/types/src/util/cursor.d.ts.map +0 -1
  321. package/dist/types/src/util/debug.d.ts +0 -17
  322. package/dist/types/src/util/debug.d.ts.map +0 -1
  323. package/dist/types/src/util/dom.d.ts +0 -20
  324. package/dist/types/src/util/dom.d.ts.map +0 -1
  325. package/dist/types/src/util/facet.d.ts +0 -3
  326. package/dist/types/src/util/facet.d.ts.map +0 -1
  327. package/src/components/EditorToolbar/util.ts +0 -65
  328. package/src/components/Popover/CommandMenu.tsx +0 -279
  329. package/src/components/Popover/RefDropdownMenu.tsx +0 -85
  330. package/src/components/Popover/RefPopover.tsx +0 -99
  331. package/src/components/Popover/index.ts +0 -7
  332. package/src/defaults.ts +0 -49
  333. package/src/extensions/annotations.ts +0 -55
  334. package/src/extensions/autocomplete.ts +0 -69
  335. package/src/extensions/automerge/automerge.stories.tsx +0 -142
  336. package/src/extensions/automerge/automerge.test.tsx +0 -78
  337. package/src/extensions/automerge/automerge.ts +0 -85
  338. package/src/extensions/automerge/cursor.ts +0 -28
  339. package/src/extensions/automerge/defs.ts +0 -31
  340. package/src/extensions/automerge/index.ts +0 -5
  341. package/src/extensions/automerge/sync.ts +0 -75
  342. package/src/extensions/automerge/update-automerge.ts +0 -50
  343. package/src/extensions/automerge/update-codemirror.ts +0 -115
  344. package/src/extensions/awareness/awareness-provider.ts +0 -127
  345. package/src/extensions/awareness/awareness.ts +0 -315
  346. package/src/extensions/awareness/index.ts +0 -6
  347. package/src/extensions/blast.ts +0 -363
  348. package/src/extensions/command/action.ts +0 -56
  349. package/src/extensions/command/command-menu.ts +0 -210
  350. package/src/extensions/command/command.ts +0 -34
  351. package/src/extensions/command/floating-menu.ts +0 -133
  352. package/src/extensions/command/hint.ts +0 -102
  353. package/src/extensions/command/index.ts +0 -10
  354. package/src/extensions/command/placeholder.ts +0 -113
  355. package/src/extensions/command/state.ts +0 -89
  356. package/src/extensions/command/typeahead.ts +0 -129
  357. package/src/extensions/command/useCommandMenu.ts +0 -118
  358. package/src/extensions/comments.ts +0 -592
  359. package/src/extensions/debug.ts +0 -15
  360. package/src/extensions/dnd.ts +0 -37
  361. package/src/extensions/factories.ts +0 -259
  362. package/src/extensions/focus.ts +0 -35
  363. package/src/extensions/folding.tsx +0 -46
  364. package/src/extensions/hashtag.tsx +0 -68
  365. package/src/extensions/json.ts +0 -57
  366. package/src/extensions/listener.ts +0 -38
  367. package/src/extensions/markdown/action.ts +0 -116
  368. package/src/extensions/markdown/bundle.ts +0 -71
  369. package/src/extensions/markdown/changes.test.ts +0 -26
  370. package/src/extensions/markdown/changes.ts +0 -149
  371. package/src/extensions/markdown/debug.ts +0 -44
  372. package/src/extensions/markdown/decorate.ts +0 -591
  373. package/src/extensions/markdown/formatting.test.ts +0 -498
  374. package/src/extensions/markdown/formatting.ts +0 -1267
  375. package/src/extensions/markdown/highlight.ts +0 -183
  376. package/src/extensions/markdown/image.ts +0 -119
  377. package/src/extensions/markdown/index.ts +0 -13
  378. package/src/extensions/markdown/link.ts +0 -47
  379. package/src/extensions/markdown/parser.test.ts +0 -75
  380. package/src/extensions/markdown/styles.ts +0 -135
  381. package/src/extensions/markdown/table.ts +0 -144
  382. package/src/extensions/mention.ts +0 -41
  383. package/src/extensions/modes.ts +0 -41
  384. package/src/extensions/outliner/commands.ts +0 -270
  385. package/src/extensions/outliner/editor.test.ts +0 -33
  386. package/src/extensions/outliner/editor.ts +0 -184
  387. package/src/extensions/outliner/index.ts +0 -7
  388. package/src/extensions/outliner/outliner.test.ts +0 -99
  389. package/src/extensions/outliner/outliner.ts +0 -166
  390. package/src/extensions/outliner/selection.ts +0 -50
  391. package/src/extensions/outliner/tree.test.ts +0 -167
  392. package/src/extensions/outliner/tree.ts +0 -317
  393. package/src/extensions/preview/index.ts +0 -5
  394. package/src/extensions/preview/preview.ts +0 -193
  395. package/src/extensions/selection.ts +0 -100
  396. package/src/extensions/typewriter.ts +0 -68
  397. package/src/stories/Command.stories.tsx +0 -97
  398. package/src/stories/CommandMenu.stories.tsx +0 -159
  399. package/src/styles/index.ts +0 -7
  400. package/src/styles/markdown.ts +0 -26
  401. package/src/styles/theme.ts +0 -265
  402. package/src/styles/tokens.ts +0 -17
  403. package/src/testing/index.ts +0 -5
  404. package/src/testing/util.ts +0 -5
  405. package/src/types/index.ts +0 -5
  406. package/src/types/types.ts +0 -32
  407. package/src/util/cursor.ts +0 -55
  408. package/src/util/debug.ts +0 -64
  409. package/src/util/dom.ts +0 -56
  410. package/src/util/facet.ts +0 -13
package/src/defaults.ts DELETED
@@ -1,49 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { EditorView } from '@codemirror/view';
6
-
7
- import { mx } from '@dxos/react-ui-theme';
8
-
9
- import { type ThemeExtensionsOptions } from './extensions';
10
- import { fontMono } from './styles';
11
-
12
- /**
13
- * CodeMirror content width.
14
- * 40rem = 640px. Corresponds to initial plank width (Google docs, Stashpad, etc.)
15
- * 50rem = 800px. Maximum content width for solo mode.
16
- * NOTE: Max width - 4rem = 2rem left/right margin (or 2rem gutter plus 1rem left/right margin).
17
- */
18
- export const editorWidth = '!mli-auto is-full max-is-[min(50rem,100%-4rem)]';
19
-
20
- export const editorSlots: ThemeExtensionsOptions['slots'] = {
21
- scroll: {
22
- className: 'pbs-2',
23
- },
24
- content: {
25
- className: editorWidth,
26
- },
27
- };
28
-
29
- export const editorGutter = EditorView.theme({
30
- '.cm-gutters': {
31
- background: 'var(--dx-baseSurface)',
32
- paddingRight: '1rem',
33
- },
34
- });
35
-
36
- export const editorMonospace = EditorView.theme({
37
- '.cm-content': {
38
- fontFamily: fontMono,
39
- },
40
- });
41
-
42
- export const editorWithToolbarLayout =
43
- 'grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden';
44
-
45
- export const stackItemContentEditorClassNames = (role?: string) =>
46
- mx(
47
- 'attention-surface dx-focus-ring-inset data-[toolbar=disabled]:pbs-2',
48
- role === 'section' ? '[&_.cm-scroller]:overflow-hidden [&_.cm-scroller]:min-bs-24' : 'min-bs-0',
49
- );
@@ -1,55 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { type Extension, RangeSetBuilder } from '@codemirror/state';
6
- import { Decoration, type DecorationSet, EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';
7
-
8
- const annotationMark = Decoration.mark({ class: 'cm-annotation' });
9
-
10
- export type AnnotationOptions = {
11
- match?: RegExp; // TODO(burdon): Update via hook (e.g., for search).
12
- };
13
-
14
- /**
15
- *
16
- */
17
- export const annotations = ({ match }: AnnotationOptions = {}): Extension => {
18
- return [
19
- ViewPlugin.fromClass(
20
- class {
21
- decorations: DecorationSet = Decoration.none;
22
- update(update: ViewUpdate) {
23
- const builder = new RangeSetBuilder<Decoration>();
24
- if (match) {
25
- // Only process visible lines.
26
- const { from, to } = update.view.viewport;
27
- const text = update.state.doc.sliceString(from, to);
28
- const matches = text.matchAll(match);
29
- for (const m of matches) {
30
- if (m.index !== undefined) {
31
- // Adjust match position relative to viewport.
32
- const start = from + m.index;
33
- const end = start + m[0].length;
34
- builder.add(start, end, annotationMark);
35
- }
36
- }
37
- }
38
-
39
- this.decorations = builder.finish();
40
- }
41
- },
42
- {
43
- decorations: (v) => v.decorations,
44
- },
45
- ),
46
-
47
- EditorView.theme({
48
- '.cm-annotation': {
49
- textDecoration: 'underline',
50
- textDecorationStyle: 'wavy',
51
- textDecorationColor: 'var(--dx-errorText)',
52
- },
53
- }),
54
- ];
55
- };
@@ -1,69 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import {
6
- autocompletion,
7
- completionKeymap,
8
- type CompletionSource,
9
- type Completion,
10
- type CompletionContext,
11
- type CompletionResult,
12
- } from '@codemirror/autocomplete';
13
- import { markdownLanguage } from '@codemirror/lang-markdown';
14
- import { type Extension } from '@codemirror/state';
15
- import { keymap } from '@codemirror/view';
16
-
17
- export type AutocompleteResult = Completion;
18
-
19
- export type AutocompleteOptions = {
20
- activateOnTyping?: boolean;
21
- override?: CompletionSource[];
22
- onSearch?: (text: string) => Completion[];
23
- };
24
-
25
- // https://codemirror.net/examples/autocompletion
26
- // https://codemirror.net/docs/ref/#autocomplete.autocompletion
27
- // https://codemirror.net/docs/ref/#autocomplete.Completion
28
-
29
- /**
30
- * Autocomplete extension.
31
- */
32
- export const autocomplete = ({ activateOnTyping, override, onSearch }: AutocompleteOptions = {}): Extension => {
33
- const extensions: Extension[] = [
34
- // https://codemirror.net/docs/ref/#view.keymap
35
- // https://discuss.codemirror.net/t/how-can-i-replace-the-default-autocompletion-keymap-v6/3322
36
- // TODO(burdon): Set custom keymap.
37
- keymap.of(completionKeymap),
38
-
39
- // https://codemirror.net/examples/autocompletion
40
- // https://codemirror.net/docs/ref/#autocomplete.autocompletion
41
- autocompletion({
42
- override,
43
- activateOnTyping,
44
- // closeOnBlur: false,
45
- // tooltipClass: () => 'rounded-be pbe-1 border-separator',
46
- }),
47
- ];
48
-
49
- if (onSearch) {
50
- extensions.push(
51
- // TODO(burdon): Optional decoration via addToOptions.
52
- markdownLanguage.data.of({
53
- autocomplete: (context: CompletionContext): CompletionResult | null => {
54
- const match = context.matchBefore(/\w*/);
55
- if (!match || (match.from === match.to && !context.explicit)) {
56
- return null;
57
- }
58
-
59
- return {
60
- from: match.from,
61
- options: onSearch(match.text.toLowerCase()),
62
- };
63
- },
64
- }),
65
- );
66
- }
67
-
68
- return extensions;
69
- };
@@ -1,142 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import '@dxos-theme';
6
-
7
- import '@preact/signals-react';
8
-
9
- import { Repo } from '@automerge/automerge-repo';
10
- import { BroadcastChannelNetworkAdapter } from '@automerge/automerge-repo-network-broadcastchannel';
11
- import React, { useEffect, useState } from 'react';
12
-
13
- import { Obj, Ref, Type } from '@dxos/echo';
14
- import { DocAccessor, createDocAccessor, useQuery, useSpace, type Space, Query } from '@dxos/react-client/echo';
15
- import { useIdentity, type Identity } from '@dxos/react-client/halo';
16
- import { ClientRepeater, type ClientRepeatedComponentProps } from '@dxos/react-client/testing';
17
- import { useThemeContext } from '@dxos/react-ui';
18
- import { withLayout, withTheme } from '@dxos/storybook-utils';
19
-
20
- import { editorSlots } from '../../defaults';
21
- import { useTextEditor } from '../../hooks';
22
- import { translations } from '../../translations';
23
- import { createBasicExtensions, createDataExtensions, createThemeExtensions } from '../factories';
24
-
25
- const initialContent = 'Hello world!';
26
-
27
- type TestObject = {
28
- text: string;
29
- };
30
-
31
- type EditorProps = {
32
- source: DocAccessor;
33
- autoFocus?: boolean;
34
- space?: Space;
35
- identity?: Identity;
36
- };
37
-
38
- const Editor = ({ source, autoFocus, space, identity }: EditorProps) => {
39
- const { themeMode } = useThemeContext();
40
- const { parentRef } = useTextEditor(
41
- () => ({
42
- initialValue: DocAccessor.getValue(source),
43
- extensions: [
44
- createBasicExtensions({ placeholder: 'Type here...' }),
45
- createThemeExtensions({ themeMode, slots: editorSlots }),
46
- createDataExtensions({ id: 'test', text: source, space, identity }),
47
- ],
48
- autoFocus,
49
- }),
50
- [source, themeMode],
51
- );
52
-
53
- return <div ref={parentRef} className='flex w-full' />;
54
- };
55
-
56
- const Story = () => {
57
- const [object1, setObject1] = useState<DocAccessor<TestObject>>();
58
- const [object2, setObject2] = useState<DocAccessor<TestObject>>();
59
-
60
- useEffect(() => {
61
- queueMicrotask(async () => {
62
- const repo1 = new Repo({ network: [new BroadcastChannelNetworkAdapter()] });
63
- const repo2 = new Repo({ network: [new BroadcastChannelNetworkAdapter()] });
64
-
65
- const object1 = repo1.create<TestObject>();
66
- object1.change((doc: TestObject) => {
67
- doc.text = initialContent;
68
- });
69
-
70
- const object2 = await repo2.find<TestObject>(object1.url);
71
- await object2.whenReady();
72
-
73
- // TODO(mykola): Fix types.
74
- setObject1({ handle: object1 as any, path: ['text'] });
75
- setObject2({ handle: object2 as any, path: ['text'] });
76
- });
77
- }, []);
78
-
79
- if (!object1 || !object2) {
80
- return null;
81
- }
82
-
83
- return (
84
- <div role='none' className='grid grid-cols-2 bs-full is-full divide-x divide-neutral-500'>
85
- <Editor source={object1} autoFocus />
86
- <Editor source={object2} />
87
- </div>
88
- );
89
- };
90
-
91
- export default {
92
- title: 'ui/react-ui-editor/Automerge',
93
- component: Editor,
94
- decorators: [withTheme, withLayout({ fullscreen: true })],
95
- render: () => <Story />,
96
- parameters: {
97
- translations,
98
- },
99
- };
100
-
101
- const EchoStory = ({ spaceKey }: ClientRepeatedComponentProps) => {
102
- const identity = useIdentity();
103
- const space = useSpace(spaceKey);
104
- const [source, setSource] = useState<DocAccessor>();
105
- const objects = useQuery(space, Query.type(Type.Expando, { type: 'test' }));
106
-
107
- useEffect(() => {
108
- if (!source && objects.length) {
109
- const source = createDocAccessor(objects[0].content, ['content']);
110
- setSource(source);
111
- }
112
- }, [objects, source]);
113
-
114
- if (!source) {
115
- return null;
116
- }
117
-
118
- return <Editor source={source} space={space} identity={identity ?? undefined} />;
119
- };
120
-
121
- export const Default = {};
122
-
123
- export const WithEcho = {
124
- decorators: [withTheme],
125
- render: () => {
126
- return (
127
- <ClientRepeater
128
- count={2}
129
- component={EchoStory}
130
- createSpace
131
- onSpaceCreated={async ({ space }) => {
132
- space.db.add(
133
- Obj.make(Type.Expando, {
134
- type: 'test',
135
- content: Ref.make(Obj.make(Type.Expando, { content: initialContent })),
136
- }),
137
- );
138
- }}
139
- />
140
- );
141
- },
142
- };
@@ -1,78 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { type DocHandle, Repo } from '@automerge/automerge-repo';
6
- import { EditorState } from '@codemirror/state';
7
- import { EditorView } from '@codemirror/view';
8
- import { render, screen } from '@testing-library/react';
9
- // TODO(wittjosiah): Move to vitest expect (and remove from package.json).
10
- import chai, { expect } from 'chai';
11
- import chaiDom from 'chai-dom';
12
- import React, { type FC, useEffect, useRef, useState } from 'react';
13
- import { describe, test } from 'vitest';
14
-
15
- import { get } from '@dxos/util';
16
-
17
- import { automerge } from './automerge';
18
-
19
- type TestObject = {
20
- text: string;
21
- };
22
-
23
- const path = ['text'];
24
-
25
- class Generator {
26
- constructor(private readonly _handle: DocHandle<TestObject>) {}
27
- update(text: string): void {
28
- this._handle.change((doc: TestObject) => {
29
- doc.text = text;
30
- });
31
- }
32
- }
33
-
34
- const Test: FC<{ handle: DocHandle<TestObject>; generator: Generator }> = ({ handle, generator }) => {
35
- const ref = useRef<HTMLDivElement>(null);
36
- const [view, setView] = useState<EditorView>();
37
- useEffect(() => {
38
- const extensions = [
39
- // TODO(mykola): Fix types.
40
- automerge({ handle: handle as any, path }),
41
- EditorView.updateListener.of((update) => {
42
- if (view.state.doc.toString() === 'hello!') {
43
- // Update editor.
44
- update.view.dispatch({ changes: { from: view.state.doc.length - 1, insert: ' world' } });
45
- }
46
- }),
47
- ];
48
-
49
- const view = new EditorView({
50
- state: EditorState.create({ doc: get(handle.doc()!, path), extensions }),
51
- parent: ref.current!,
52
- });
53
-
54
- setView(view);
55
- }, []);
56
-
57
- useEffect(() => {}, [view]);
58
-
59
- return <div ref={ref} />;
60
- };
61
-
62
- chai.use(chaiDom);
63
-
64
- describe('Automerge', () => {
65
- test('basic sync', () => {
66
- const repo = new Repo({ network: [] });
67
- const handle = repo.create<TestObject>();
68
- const generator = new Generator(handle);
69
- render(<Test handle={handle} generator={generator} />);
70
- expect(screen.getByRole('textbox')).to.have.text('');
71
-
72
- generator.update('hello!');
73
- expect(screen.getByRole('textbox')).to.have.text('hello world!');
74
- });
75
-
76
- // TODO(burdon): Test history/undo.
77
- // TODO(burdon): https://testing-library.com/docs/react-testing-library/example-intro/
78
- });
@@ -1,85 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- // Copyright 2024 Automerge
4
- // Ref: https://github.com/automerge/automerge-codemirror
5
- //
6
-
7
- import { next as A } from '@automerge/automerge';
8
- import { StateField, type Extension } from '@codemirror/state';
9
- import { EditorView, ViewPlugin } from '@codemirror/view';
10
-
11
- import { type DocAccessor } from '@dxos/react-client/echo';
12
-
13
- import { cursorConverter } from './cursor';
14
- import { updateHeadsEffect, isReconcile, type State } from './defs';
15
- import { Syncer } from './sync';
16
- import { Cursor } from '../../util';
17
-
18
- export const automerge = (accessor: DocAccessor): Extension => {
19
- const syncState = StateField.define<State>({
20
- create: () => ({
21
- path: accessor.path.slice(),
22
- lastHeads: A.getHeads(accessor.handle.doc()!),
23
- unreconciledTransactions: [],
24
- }),
25
-
26
- update: (value, tr) => {
27
- const result: State = {
28
- path: accessor.path.slice(),
29
- lastHeads: value.lastHeads,
30
- unreconciledTransactions: value.unreconciledTransactions.slice(),
31
- };
32
-
33
- let clearUnreconciled = false;
34
- for (const effect of tr.effects) {
35
- if (effect.is(updateHeadsEffect)) {
36
- result.lastHeads = effect.value.newHeads;
37
- clearUnreconciled = true;
38
- }
39
- }
40
-
41
- if (clearUnreconciled) {
42
- result.unreconciledTransactions = [];
43
- } else {
44
- if (!isReconcile(tr)) {
45
- result.unreconciledTransactions.push(tr);
46
- }
47
- }
48
-
49
- return result;
50
- },
51
- });
52
-
53
- const syncer = new Syncer(accessor.handle, syncState);
54
-
55
- return [
56
- Cursor.converter.of(cursorConverter(accessor)),
57
-
58
- // Track heads.
59
- syncState,
60
-
61
- // Reconcile external updates.
62
- ViewPlugin.fromClass(
63
- class {
64
- constructor(private readonly _view: EditorView) {
65
- accessor.handle.addListener('change', this._handleChange);
66
- }
67
-
68
- destroy() {
69
- accessor.handle.removeListener('change', this._handleChange);
70
- }
71
-
72
- readonly _handleChange = () => {
73
- syncer.reconcile(this._view, false);
74
- };
75
- },
76
- ),
77
-
78
- // Reconcile local updates.
79
- EditorView.updateListener.of(({ view, changes }) => {
80
- if (!changes.empty) {
81
- syncer.reconcile(view, true);
82
- }
83
- }),
84
- ];
85
- };
@@ -1,28 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { log } from '@dxos/log';
6
- import { type DocAccessor, fromCursor, toCursor } from '@dxos/react-client/echo';
7
-
8
- import { type CursorConverter } from '../../util';
9
-
10
- export const cursorConverter = (accessor: DocAccessor): CursorConverter => ({
11
- toCursor: (pos, assoc) => {
12
- try {
13
- return toCursor(accessor, pos, assoc);
14
- } catch (err) {
15
- log.catch(err);
16
- return ''; // In case of invalid request (e.g., wrong document).
17
- }
18
- },
19
-
20
- fromCursor: (cursor) => {
21
- try {
22
- return fromCursor(accessor, cursor);
23
- } catch (err) {
24
- log.catch(err);
25
- return 0; // In case of invalid request (e.g., wrong document).
26
- }
27
- },
28
- });
@@ -1,31 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- // Copyright 2024 Automerge
4
- // Ref: https://github.com/automerge/automerge-codemirror
5
- //
6
-
7
- import { type Heads, type Prop } from '@automerge/automerge';
8
- import { Annotation, StateEffect, type StateField, type EditorState, type Transaction } from '@codemirror/state';
9
-
10
- export type State = {
11
- path: Prop[];
12
- lastHeads: Heads;
13
- unreconciledTransactions: Transaction[];
14
- };
15
-
16
- export const getPath = (state: EditorState, field: StateField<State>): Prop[] => state.field(field).path;
17
- export const getLastHeads = (state: EditorState, field: StateField<State>): Heads => state.field(field).lastHeads;
18
-
19
- export type UpdateHeads = {
20
- newHeads: Heads;
21
- };
22
-
23
- export const updateHeadsEffect = StateEffect.define<UpdateHeads>({});
24
-
25
- export const updateHeads = (newHeads: Heads): StateEffect<UpdateHeads> => updateHeadsEffect.of({ newHeads });
26
-
27
- export const reconcileAnnotation = Annotation.define<boolean>();
28
-
29
- export const isReconcile = (tr: Transaction): boolean => {
30
- return !!tr.annotation(reconcileAnnotation);
31
- };
@@ -1,5 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- export { automerge } from './automerge';
@@ -1,75 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- // Copyright 2024 Automerge
4
- // Ref: https://github.com/automerge/automerge-codemirror
5
- //
6
-
7
- import { next as A } from '@automerge/automerge';
8
- import { type StateField } from '@codemirror/state';
9
- import { type EditorView } from '@codemirror/view';
10
-
11
- import { type IDocHandle } from '@dxos/react-client/echo';
12
-
13
- import { getLastHeads, getPath, isReconcile, reconcileAnnotation, type State, updateHeads } from './defs';
14
- import { updateAutomerge } from './update-automerge';
15
- import { updateCodeMirror } from './update-codemirror';
16
-
17
- /**
18
- * Implements three-way merge (on each mutation).
19
- */
20
- export class Syncer {
21
- private _pending = false;
22
-
23
- // prettier-ignore
24
- constructor(
25
- private readonly _handle: IDocHandle,
26
- private readonly _state: StateField<State>
27
- ) {}
28
-
29
- reconcile(view: EditorView, editor: boolean): void {
30
- // TODO(burdon): Better way to do mutex?
31
- if (this._pending) {
32
- return;
33
- }
34
-
35
- this._pending = true;
36
- if (editor) {
37
- this.onEditorChange(view);
38
- } else {
39
- this.onAutomergeChange(view);
40
- }
41
- this._pending = false;
42
- }
43
-
44
- onEditorChange(view: EditorView): void {
45
- // Apply the unreconciled transactions to the document.
46
- const transactions = view.state.field(this._state).unreconciledTransactions.filter((tx) => !isReconcile(tx));
47
- const newHeads = updateAutomerge(this._state, this._handle, transactions, view.state);
48
-
49
- if (newHeads) {
50
- view.dispatch({
51
- effects: updateHeads(newHeads),
52
- annotations: reconcileAnnotation.of(false),
53
- });
54
- }
55
- }
56
-
57
- onAutomergeChange(view: EditorView): void {
58
- // Get the diff between the updated state of the document and the heads and apply that to the codemirror doc.
59
- const oldHeads = getLastHeads(view.state, this._state);
60
- const newHeads = A.getHeads(this._handle.doc()!);
61
- const diff = A.equals(oldHeads, newHeads) ? [] : A.diff(this._handle.doc()!, oldHeads, newHeads);
62
-
63
- const selection = view.state.selection;
64
- const path = getPath(view.state, this._state);
65
- updateCodeMirror(view, selection, path, diff);
66
-
67
- // TODO(burdon): Test conflicts?
68
- // A.getConflicts(this._handle.doc()!, path[0]);
69
-
70
- view.dispatch({
71
- effects: updateHeads(newHeads),
72
- annotations: reconcileAnnotation.of(false),
73
- });
74
- }
75
- }
@@ -1,50 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- // Copyright 2024 Automerge
4
- // Ref: https://github.com/automerge/automerge-codemirror
5
- //
6
-
7
- import { next as A, type Heads } from '@automerge/automerge';
8
- import { type EditorState, type StateField, type Transaction, type Text } from '@codemirror/state';
9
-
10
- import { type IDocHandle } from '@dxos/react-client/echo';
11
-
12
- import { type State } from './defs';
13
-
14
- export const updateAutomerge = (
15
- field: StateField<State>,
16
- handle: IDocHandle,
17
- transactions: Transaction[],
18
- state: EditorState, // TODO(burdon): Just pass in the state field value?
19
- ): Heads | undefined => {
20
- const { lastHeads, path } = state.field(field);
21
-
22
- // We don't want to call `automerge.updateAt` if there are no changes.
23
- // Otherwise, later on `automerge.diff` will return empty patches that result in a no-op but still mess up the selection.
24
- let hasChanges = false;
25
- for (const tr of transactions) {
26
- tr.changes.iterChanges(() => {
27
- hasChanges = true;
28
- });
29
- }
30
-
31
- if (!hasChanges) {
32
- return undefined;
33
- }
34
-
35
- const newHeads = handle.changeAt(lastHeads, (doc: A.Doc<unknown>) => {
36
- const invertedTransactions: { from: number; del: number; insert: Text }[] = [];
37
- for (const tr of transactions) {
38
- tr.changes.iterChanges((fromA, toA, _fromB, _toB, insert) => {
39
- invertedTransactions.push({ from: fromA, del: toA - fromA, insert });
40
- });
41
- }
42
-
43
- // TODO(burdon): Hack to apply in reverse order to properly apply range.
44
- invertedTransactions.reverse().forEach(({ from, del, insert }) => {
45
- A.splice(doc, path.slice(), from, del, insert.toString());
46
- });
47
- });
48
-
49
- return newHeads ?? undefined;
50
- };