@dxos/react-ui-editor 0.8.4-main.5ea62a8 → 0.8.4-main.66e292d

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 (347) hide show
  1. package/dist/lib/browser/{chunk-22UMM3QJ.mjs → chunk-HL3YF6WC.mjs} +2 -2
  2. package/dist/lib/browser/chunk-HL3YF6WC.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +5117 -3807
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/types/index.mjs +1 -1
  7. package/dist/lib/node-esm/{chunk-YXYQPV6R.mjs → chunk-YJZGD3LY.mjs} +2 -2
  8. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs.map +7 -0
  9. package/dist/lib/node-esm/index.mjs +5117 -3807
  10. package/dist/lib/node-esm/index.mjs.map +4 -4
  11. package/dist/lib/node-esm/meta.json +1 -1
  12. package/dist/lib/node-esm/types/index.mjs +1 -1
  13. package/dist/types/src/components/Editor/Editor.d.ts +37 -15
  14. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  15. package/dist/types/src/components/Editor/Editor.stories.d.ts +20 -0
  16. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -0
  17. package/dist/types/src/components/EditorContent/EditorContent.d.ts +29 -0
  18. package/dist/types/src/components/EditorContent/EditorContent.d.ts.map +1 -0
  19. package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts +26 -0
  20. package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorContent/controller.d.ts +10 -0
  22. package/dist/types/src/components/EditorContent/controller.d.ts.map +1 -0
  23. package/dist/types/src/components/EditorContent/index.d.ts +3 -0
  24. package/dist/types/src/components/EditorContent/index.d.ts.map +1 -0
  25. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts +36 -0
  26. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -0
  27. package/dist/types/src/components/EditorMenuProvider/index.d.ts +7 -0
  28. package/dist/types/src/components/EditorMenuProvider/index.d.ts.map +1 -0
  29. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts +4 -0
  30. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -0
  31. package/dist/types/src/components/EditorMenuProvider/menu.d.ts +28 -0
  32. package/dist/types/src/components/EditorMenuProvider/menu.d.ts.map +1 -0
  33. package/dist/types/src/components/EditorMenuProvider/popover.d.ts +47 -0
  34. package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -0
  35. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts +34 -0
  36. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -0
  37. package/dist/types/src/components/EditorMenuProvider/util.d.ts +8 -0
  38. package/dist/types/src/components/EditorMenuProvider/util.d.ts.map +1 -0
  39. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +16 -0
  40. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -0
  41. package/dist/types/src/components/EditorPreviewProvider/index.d.ts +2 -0
  42. package/dist/types/src/components/EditorPreviewProvider/index.d.ts.map +1 -0
  43. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +26 -2
  44. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  45. package/dist/types/src/components/EditorToolbar/actions.d.ts +39 -0
  46. package/dist/types/src/components/EditorToolbar/actions.d.ts.map +1 -0
  47. package/dist/types/src/components/EditorToolbar/blocks.d.ts +3 -3
  48. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  49. package/dist/types/src/components/EditorToolbar/formatting.d.ts +3 -3
  50. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  51. package/dist/types/src/components/EditorToolbar/headings.d.ts +3 -3
  52. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  53. package/dist/types/src/components/EditorToolbar/index.d.ts +2 -1
  54. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  55. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts +11 -0
  56. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts.map +1 -0
  57. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +3 -3
  58. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  59. package/dist/types/src/components/index.d.ts +4 -2
  60. package/dist/types/src/components/index.d.ts.map +1 -1
  61. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +17 -0
  62. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +1 -0
  63. package/dist/types/src/extensions/autocomplete/index.d.ts +5 -0
  64. package/dist/types/src/extensions/autocomplete/index.d.ts.map +1 -0
  65. package/dist/types/src/extensions/autocomplete/match.d.ts +13 -0
  66. package/dist/types/src/extensions/autocomplete/match.d.ts.map +1 -0
  67. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +20 -0
  68. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +1 -0
  69. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +10 -0
  70. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +1 -0
  71. package/dist/types/src/extensions/automerge/automerge.d.ts +1 -1
  72. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  73. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +1 -1
  74. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  75. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  76. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  77. package/dist/types/src/extensions/automerge/sync.d.ts +3 -3
  78. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  79. package/dist/types/src/extensions/automerge/update-automerge.d.ts +1 -1
  80. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  81. package/dist/types/src/extensions/autoscroll.d.ts +20 -0
  82. package/dist/types/src/extensions/autoscroll.d.ts.map +1 -0
  83. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +4 -4
  84. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
  85. package/dist/types/src/extensions/blocks.d.ts +2 -0
  86. package/dist/types/src/extensions/blocks.d.ts.map +1 -0
  87. package/dist/types/src/extensions/bookmarks.d.ts +12 -0
  88. package/dist/types/src/extensions/bookmarks.d.ts.map +1 -0
  89. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  90. package/dist/types/src/extensions/factories.d.ts +14 -13
  91. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  92. package/dist/types/src/extensions/focus.d.ts.map +1 -1
  93. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  94. package/dist/types/src/extensions/index.d.ts +10 -1
  95. package/dist/types/src/extensions/index.d.ts.map +1 -1
  96. package/dist/types/src/extensions/json.d.ts +1 -1
  97. package/dist/types/src/extensions/json.d.ts.map +1 -1
  98. package/dist/types/src/extensions/listener.d.ts +8 -6
  99. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  100. package/dist/types/src/extensions/markdown/bundle.d.ts +6 -2
  101. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  102. package/dist/types/src/extensions/markdown/changes.d.ts +1 -1
  103. package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
  104. package/dist/types/src/extensions/markdown/decorate.d.ts +9 -1
  105. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  106. package/dist/types/src/extensions/markdown/formatting.d.ts +1 -3
  107. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  108. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
  109. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  110. package/dist/types/src/extensions/modal.d.ts +7 -0
  111. package/dist/types/src/extensions/modal.d.ts.map +1 -0
  112. package/dist/types/src/extensions/modes.d.ts +1 -1
  113. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  114. package/dist/types/src/extensions/outliner/menu.d.ts +8 -0
  115. package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -0
  116. package/dist/types/src/extensions/outliner/outliner.d.ts +1 -1
  117. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
  118. package/dist/types/src/extensions/outliner/tree.d.ts +1 -1
  119. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
  120. package/dist/types/src/extensions/preview/preview.d.ts +8 -8
  121. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  122. package/dist/types/src/extensions/replacer.d.ts +21 -0
  123. package/dist/types/src/extensions/replacer.d.ts.map +1 -0
  124. package/dist/types/src/extensions/replacer.test.d.ts +2 -0
  125. package/dist/types/src/extensions/replacer.test.d.ts.map +1 -0
  126. package/dist/types/src/extensions/scrolling.d.ts +78 -0
  127. package/dist/types/src/extensions/scrolling.d.ts.map +1 -0
  128. package/dist/types/src/extensions/state.d.ts +2 -0
  129. package/dist/types/src/extensions/state.d.ts.map +1 -0
  130. package/dist/types/src/extensions/submit.d.ts +10 -0
  131. package/dist/types/src/extensions/submit.d.ts.map +1 -0
  132. package/dist/types/src/extensions/tab.d.ts +4 -0
  133. package/dist/types/src/extensions/tab.d.ts.map +1 -0
  134. package/dist/types/src/extensions/tags/extended-markdown.d.ts +10 -0
  135. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +1 -0
  136. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +2 -0
  137. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +1 -0
  138. package/dist/types/src/extensions/tags/index.d.ts +4 -0
  139. package/dist/types/src/extensions/tags/index.d.ts.map +1 -0
  140. package/dist/types/src/extensions/tags/streamer.d.ts +12 -0
  141. package/dist/types/src/extensions/tags/streamer.d.ts.map +1 -0
  142. package/dist/types/src/extensions/tags/xml-tags.d.ts +97 -0
  143. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -0
  144. package/dist/types/src/extensions/tags/xml-util.d.ts +10 -0
  145. package/dist/types/src/extensions/tags/xml-util.d.ts.map +1 -0
  146. package/dist/types/src/hooks/useTextEditor.d.ts +5 -9
  147. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  148. package/dist/types/src/stories/{Command.stories.d.ts → CommandDialog.stories.d.ts} +2 -3
  149. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
  150. package/dist/types/src/stories/Comments.stories.d.ts +3 -4
  151. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  152. package/dist/types/src/stories/EditorToolbar.stories.d.ts +1 -2
  153. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  154. package/dist/types/src/stories/Experimental.stories.d.ts +3 -4
  155. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  156. package/dist/types/src/stories/Markdown.stories.d.ts +3 -4
  157. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  158. package/dist/types/src/stories/Outliner.stories.d.ts +0 -1
  159. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  160. package/dist/types/src/stories/{CommandMenu.stories.d.ts → Popover.stories.d.ts} +6 -6
  161. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  162. package/dist/types/src/stories/Preview.stories.d.ts +4 -4
  163. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  164. package/dist/types/src/stories/Tags.stories.d.ts +16 -0
  165. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  166. package/dist/types/src/stories/TextEditor.stories.d.ts +3 -5
  167. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  168. package/dist/types/src/stories/components/EditorStory.d.ts +11 -8
  169. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  170. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  171. package/dist/types/src/styles/theme.d.ts.map +1 -1
  172. package/dist/types/src/types/types.d.ts +2 -2
  173. package/dist/types/src/types/types.d.ts.map +1 -1
  174. package/dist/types/src/util/debug.d.ts +5 -1
  175. package/dist/types/src/util/debug.d.ts.map +1 -1
  176. package/dist/types/src/util/decorations.d.ts +4 -0
  177. package/dist/types/src/util/decorations.d.ts.map +1 -0
  178. package/dist/types/src/util/dom.d.ts +2 -12
  179. package/dist/types/src/util/dom.d.ts.map +1 -1
  180. package/dist/types/src/util/index.d.ts +1 -0
  181. package/dist/types/src/util/index.d.ts.map +1 -1
  182. package/dist/types/src/util/react.d.ts +1 -1
  183. package/dist/types/src/util/react.d.ts.map +1 -1
  184. package/dist/types/tsconfig.tsbuildinfo +1 -1
  185. package/package.json +70 -67
  186. package/src/components/Editor/Editor.stories.tsx +89 -0
  187. package/src/components/Editor/Editor.tsx +160 -25
  188. package/src/components/EditorContent/EditorContent.stories.tsx +70 -0
  189. package/src/components/EditorContent/EditorContent.tsx +70 -0
  190. package/src/components/EditorContent/controller.ts +50 -0
  191. package/src/components/EditorContent/index.ts +6 -0
  192. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +233 -0
  193. package/src/components/EditorMenuProvider/index.ts +11 -0
  194. package/src/components/EditorMenuProvider/menu-presets.ts +123 -0
  195. package/src/components/EditorMenuProvider/menu.ts +71 -0
  196. package/src/components/EditorMenuProvider/popover.ts +287 -0
  197. package/src/components/EditorMenuProvider/useEditorMenu.ts +175 -0
  198. package/src/components/EditorMenuProvider/util.ts +31 -0
  199. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +82 -0
  200. package/src/components/EditorPreviewProvider/index.ts +5 -0
  201. package/src/components/EditorToolbar/EditorToolbar.tsx +101 -91
  202. package/src/components/EditorToolbar/{lists.ts → actions.ts} +46 -16
  203. package/src/components/EditorToolbar/blocks.ts +2 -1
  204. package/src/components/EditorToolbar/formatting.ts +2 -1
  205. package/src/components/EditorToolbar/headings.ts +8 -5
  206. package/src/components/EditorToolbar/image.ts +1 -1
  207. package/src/components/EditorToolbar/index.ts +3 -7
  208. package/src/components/EditorToolbar/search.ts +1 -1
  209. package/src/components/EditorToolbar/useEditorToolbar.ts +20 -0
  210. package/src/components/EditorToolbar/view-mode.ts +2 -1
  211. package/src/components/index.ts +8 -2
  212. package/src/extensions/autocomplete/autocomplete.ts +151 -0
  213. package/src/extensions/autocomplete/index.ts +8 -0
  214. package/src/extensions/autocomplete/match.ts +46 -0
  215. package/src/extensions/{command → autocomplete}/placeholder.ts +21 -17
  216. package/src/extensions/{command → autocomplete}/typeahead.ts +6 -48
  217. package/src/extensions/automerge/automerge.stories.tsx +12 -11
  218. package/src/extensions/automerge/automerge.ts +28 -9
  219. package/src/extensions/automerge/cursor.ts +1 -1
  220. package/src/extensions/automerge/sync.ts +8 -4
  221. package/src/extensions/automerge/update-automerge.ts +1 -1
  222. package/src/extensions/autoscroll.ts +163 -0
  223. package/src/extensions/awareness/awareness-provider.ts +12 -12
  224. package/src/extensions/blocks.ts +131 -0
  225. package/src/extensions/bookmarks.ts +75 -0
  226. package/src/extensions/comments.ts +7 -2
  227. package/src/extensions/factories.ts +60 -38
  228. package/src/extensions/focus.ts +5 -4
  229. package/src/extensions/folding.tsx +3 -6
  230. package/src/extensions/hashtag.tsx +2 -2
  231. package/src/extensions/index.ts +10 -1
  232. package/src/extensions/json.ts +1 -1
  233. package/src/extensions/listener.ts +14 -20
  234. package/src/extensions/markdown/bundle.ts +37 -6
  235. package/src/extensions/markdown/decorate.ts +26 -17
  236. package/src/extensions/markdown/formatting.ts +8 -10
  237. package/src/extensions/markdown/highlight.ts +1 -1
  238. package/src/extensions/markdown/image.ts +5 -6
  239. package/src/extensions/markdown/link.ts +3 -0
  240. package/src/extensions/markdown/table.ts +13 -7
  241. package/src/extensions/modal.ts +24 -0
  242. package/src/extensions/modes.ts +2 -2
  243. package/src/extensions/{command/floating-menu.ts → outliner/menu.ts} +16 -21
  244. package/src/extensions/outliner/outliner.test.ts +1 -1
  245. package/src/extensions/outliner/outliner.ts +5 -5
  246. package/src/extensions/outliner/tree.test.ts +1 -1
  247. package/src/extensions/outliner/tree.ts +1 -1
  248. package/src/extensions/preview/index.ts +1 -1
  249. package/src/extensions/preview/preview.ts +69 -69
  250. package/src/extensions/replacer.test.ts +75 -0
  251. package/src/extensions/replacer.ts +93 -0
  252. package/src/extensions/scrolling.ts +189 -0
  253. package/src/extensions/selection.ts +3 -3
  254. package/src/extensions/state.ts +7 -0
  255. package/src/extensions/submit.ts +62 -0
  256. package/src/extensions/tab.ts +29 -0
  257. package/src/extensions/tags/extended-markdown.test.ts +262 -0
  258. package/src/extensions/tags/extended-markdown.ts +78 -0
  259. package/src/extensions/tags/index.ts +7 -0
  260. package/src/extensions/tags/streamer.ts +243 -0
  261. package/src/extensions/tags/xml-tags.ts +500 -0
  262. package/src/extensions/tags/xml-util.ts +94 -0
  263. package/src/extensions/typewriter.ts +1 -1
  264. package/src/hooks/useTextEditor.ts +31 -43
  265. package/src/stories/CommandDialog.stories.tsx +83 -0
  266. package/src/stories/Comments.stories.tsx +8 -9
  267. package/src/stories/EditorToolbar.stories.tsx +15 -14
  268. package/src/stories/Experimental.stories.tsx +7 -7
  269. package/src/stories/Markdown.stories.tsx +6 -6
  270. package/src/stories/Outliner.stories.tsx +40 -32
  271. package/src/stories/Popover.stories.tsx +162 -0
  272. package/src/stories/Preview.stories.tsx +46 -43
  273. package/src/stories/Tags.stories.tsx +95 -0
  274. package/src/stories/TextEditor.stories.tsx +10 -33
  275. package/src/stories/components/EditorStory.tsx +32 -21
  276. package/src/stories/components/util.tsx +40 -8
  277. package/src/styles/markdown.ts +1 -1
  278. package/src/styles/theme.ts +13 -11
  279. package/src/types/types.ts +1 -1
  280. package/src/util/debug.ts +7 -2
  281. package/src/util/decorations.ts +21 -0
  282. package/src/util/dom.ts +5 -27
  283. package/src/util/index.ts +1 -0
  284. package/src/util/react.tsx +1 -1
  285. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
  286. package/dist/lib/browser/testing/index.mjs +0 -6
  287. package/dist/lib/browser/testing/index.mjs.map +0 -7
  288. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  289. package/dist/lib/node-esm/testing/index.mjs +0 -8
  290. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  291. package/dist/types/src/components/EditorToolbar/lists.d.ts +0 -19
  292. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +0 -1
  293. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -51
  294. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  295. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  296. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  297. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  298. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  299. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  300. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  301. package/dist/types/src/components/Popover/index.d.ts +0 -4
  302. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  303. package/dist/types/src/extensions/autocomplete.d.ts +0 -13
  304. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  305. package/dist/types/src/extensions/command/action.d.ts +0 -17
  306. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  307. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  308. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  309. package/dist/types/src/extensions/command/command.d.ts +0 -6
  310. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  311. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  312. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  313. package/dist/types/src/extensions/command/hint.d.ts +0 -24
  314. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  315. package/dist/types/src/extensions/command/index.d.ts +0 -7
  316. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  317. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  318. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  319. package/dist/types/src/extensions/command/state.d.ts +0 -16
  320. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  321. package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
  322. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  323. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  324. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  325. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  326. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  327. package/dist/types/src/testing/index.d.ts +0 -2
  328. package/dist/types/src/testing/index.d.ts.map +0 -1
  329. package/dist/types/src/testing/util.d.ts +0 -3
  330. package/dist/types/src/testing/util.d.ts.map +0 -1
  331. package/src/components/EditorToolbar/util.ts +0 -76
  332. package/src/components/Popover/CommandMenu.tsx +0 -279
  333. package/src/components/Popover/RefDropdownMenu.tsx +0 -85
  334. package/src/components/Popover/RefPopover.tsx +0 -99
  335. package/src/components/Popover/index.ts +0 -7
  336. package/src/extensions/autocomplete.ts +0 -69
  337. package/src/extensions/command/action.ts +0 -56
  338. package/src/extensions/command/command-menu.ts +0 -211
  339. package/src/extensions/command/command.ts +0 -34
  340. package/src/extensions/command/hint.ts +0 -103
  341. package/src/extensions/command/index.ts +0 -10
  342. package/src/extensions/command/state.ts +0 -90
  343. package/src/extensions/command/useCommandMenu.ts +0 -119
  344. package/src/stories/Command.stories.tsx +0 -101
  345. package/src/stories/CommandMenu.stories.tsx +0 -161
  346. package/src/testing/index.ts +0 -5
  347. package/src/testing/util.ts +0 -7
@@ -0,0 +1,131 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { RangeSetBuilder } from '@codemirror/state';
6
+ import { Decoration, type DecorationSet, EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';
7
+
8
+ import { mx } from '@dxos/react-ui-theme';
9
+
10
+ const paragraphBlockPlugin = ViewPlugin.fromClass(
11
+ class {
12
+ decorations: DecorationSet;
13
+
14
+ constructor(view: EditorView) {
15
+ this.decorations = this.build(view);
16
+ }
17
+
18
+ update(update: ViewUpdate) {
19
+ if (update.docChanged || update.viewportChanged) {
20
+ this.decorations = this.build(update.view);
21
+ }
22
+ }
23
+
24
+ build({ state }: EditorView) {
25
+ const builder = new RangeSetBuilder<Decoration>();
26
+
27
+ // Helper: commit a block from blockStart to endLine (inclusive).
28
+ const pushBlock = (fromLine: number, toLine: number) => {
29
+ // Add line decorations for each line in the block.
30
+ for (let lineNum = fromLine; lineNum <= toLine; lineNum++) {
31
+ const line = state.doc.line(lineNum);
32
+ builder.add(
33
+ line.from,
34
+ line.from,
35
+ Decoration.line({
36
+ class: mx(
37
+ 'block-line',
38
+ fromLine === toLine && 'block-single',
39
+ lineNum === fromLine && 'block-first',
40
+ lineNum > fromLine && lineNum < toLine && 'block-middle',
41
+ lineNum === toLine && 'block-last',
42
+ ),
43
+ }),
44
+ );
45
+ }
46
+ };
47
+
48
+ let blockStart: number | null = null;
49
+ let consecutiveBlankLines = 0;
50
+ const totalLines = state.doc.lines;
51
+ for (let i = 1; i <= totalLines; i++) {
52
+ const line = state.doc.line(i);
53
+ const isBlank = /^\s*$/.test(line.text);
54
+
55
+ if (!isBlank) {
56
+ // Reset blank line counter.
57
+ consecutiveBlankLines = 0;
58
+ // Start a new block if we're not already in one.
59
+ if (blockStart === null) {
60
+ blockStart = i;
61
+ }
62
+ } else {
63
+ // Increment blank line counter.
64
+ consecutiveBlankLines++;
65
+
66
+ // End the current block if we have 2+ consecutive blank lines.
67
+ if (consecutiveBlankLines >= 2 && blockStart !== null) {
68
+ pushBlock(blockStart, i - consecutiveBlankLines);
69
+ blockStart = null;
70
+ }
71
+ }
72
+ }
73
+
74
+ // Handle any remaining block at the end of the document.
75
+ if (blockStart !== null) {
76
+ // Find the last non-blank line for the block end.
77
+ let lastNonBlankLine = totalLines;
78
+ while (lastNonBlankLine >= blockStart) {
79
+ const line = state.doc.line(lastNonBlankLine);
80
+ if (!/^\s*$/.test(line.text)) {
81
+ break;
82
+ }
83
+ lastNonBlankLine--;
84
+ }
85
+ if (lastNonBlankLine >= blockStart) {
86
+ pushBlock(blockStart, lastNonBlankLine);
87
+ }
88
+ }
89
+
90
+ return builder.finish();
91
+ }
92
+ },
93
+ {
94
+ decorations: (v) => v.decorations,
95
+ },
96
+ );
97
+
98
+ export const blocks = () => [
99
+ paragraphBlockPlugin,
100
+ EditorView.baseTheme({
101
+ '.cm-line.block-line': {
102
+ paddingLeft: '0.75rem',
103
+ paddingRight: '0.75rem',
104
+ borderLeft: '1px solid var(--dx-subduedSeparator)',
105
+ borderRight: '1px solid var(--dx-subduedSeparator)',
106
+ },
107
+ '.cm-line.block-single': {
108
+ border: '1px solid var(--dx-subduedSeparator)',
109
+ borderRadius: '6px',
110
+ paddingTop: '0.5rem',
111
+ paddingBottom: '0.5rem',
112
+ marginTop: '0.5rem',
113
+ marginBottom: '0.5rem',
114
+ },
115
+ '.cm-line.block-first': {
116
+ borderTop: '1px solid var(--dx-subduedSeparator)',
117
+ borderTopLeftRadius: '6px',
118
+ borderTopRightRadius: '6px',
119
+ paddingTop: '0.5rem',
120
+ marginTop: '0.5rem',
121
+ },
122
+ '.cm-line.block-middle': {},
123
+ '.cm-line.block-last': {
124
+ borderBottom: '1px solid var(--dx-subduedSeparator)',
125
+ borderBottomLeftRadius: '6px',
126
+ borderBottomRightRadius: '6px',
127
+ paddingBottom: '0.5rem',
128
+ marginBottom: '0.5rem',
129
+ },
130
+ }),
131
+ ];
@@ -0,0 +1,75 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Extension, Prec, StateEffect, StateField } from '@codemirror/state';
6
+ import { keymap } from '@codemirror/view';
7
+
8
+ type Bookmark = {
9
+ id: string;
10
+ pos: number;
11
+ name: string;
12
+ };
13
+
14
+ export const addBookmark = StateEffect.define<Bookmark>();
15
+ export const removeBookmark = StateEffect.define<string>();
16
+ export const clearBookmarks = StateEffect.define<void>();
17
+
18
+ export const bookmarks = (): Extension => {
19
+ return [
20
+ bookmarksField,
21
+ Prec.highest(
22
+ keymap.of([
23
+ {
24
+ key: 'Mod-ArrowUp',
25
+ run: (view) => {
26
+ const bookmarks = view.state.field(bookmarksField);
27
+ console.log('up', bookmarks);
28
+ return true;
29
+ },
30
+ },
31
+ {
32
+ key: 'Mod-ArrowDown',
33
+ run: (view) => {
34
+ const bookmarks = view.state.field(bookmarksField);
35
+ console.log('down', bookmarks);
36
+ return true;
37
+ },
38
+ },
39
+ ]),
40
+ ),
41
+ ];
42
+ };
43
+
44
+ type BookmarkFieldState = {
45
+ bookmarks: Bookmark[];
46
+ };
47
+
48
+ const bookmarksField = StateField.define<BookmarkFieldState>({
49
+ create: (): BookmarkFieldState => ({
50
+ bookmarks: [],
51
+ }),
52
+
53
+ update: (value: BookmarkFieldState, tr): BookmarkFieldState => {
54
+ // Map bookmark positions through document changes.
55
+ let bookmarks = value.bookmarks.map((bookmark) => ({
56
+ ...bookmark,
57
+ pos: tr.changes.mapPos(bookmark.pos),
58
+ }));
59
+
60
+ // Process effects.
61
+ for (const effect of tr.effects) {
62
+ if (effect.is(addBookmark)) {
63
+ bookmarks = [...bookmarks, effect.value];
64
+ } else if (effect.is(removeBookmark)) {
65
+ bookmarks = bookmarks.filter((b) => b.id !== effect.value);
66
+ } else if (effect.is(clearBookmarks)) {
67
+ bookmarks = [];
68
+ }
69
+ }
70
+
71
+ // Sort bookmarks by position.
72
+ bookmarks.sort(({ pos: a }, { pos: b }) => a - b);
73
+ return { bookmarks };
74
+ },
75
+ });
@@ -58,7 +58,11 @@ const setCommentState = StateEffect.define<CommentsState>();
58
58
  * The ranges are tracked as Automerge cursors from which the absolute indexed ranges can be computed.
59
59
  */
60
60
  export const commentsState = StateField.define<CommentsState>({
61
- create: (state) => ({ id: state.facet(documentId), comments: [], selection: {} }),
61
+ create: (state) => ({
62
+ id: state.facet(documentId),
63
+ comments: [],
64
+ selection: {},
65
+ }),
62
66
  update: (value, tr) => {
63
67
  for (const effect of tr.effects) {
64
68
  // Update selection.
@@ -100,13 +104,14 @@ export const commentsState = StateField.define<CommentsState>({
100
104
  const styles = EditorView.theme({
101
105
  '.cm-comment, .cm-comment-current': {
102
106
  padding: '3px 0',
107
+ color: 'var(--dx-cmCommentText)',
103
108
  backgroundColor: 'var(--dx-cmCommentSurface)',
104
109
  },
105
110
  '.cm-comment > span, .cm-comment-current > span': {
106
111
  boxDecorationBreak: 'clone',
107
112
  boxShadow: '0 0 1px 3px var(--dx-cmCommentSurface)',
108
113
  backgroundColor: 'var(--dx-cmCommentSurface)',
109
- color: 'var(--dx-cmComment)',
114
+ color: 'var(--dx-cmCommentText)',
110
115
  cursor: 'pointer',
111
116
  },
112
117
  });
@@ -4,10 +4,9 @@
4
4
 
5
5
  import { closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete';
6
6
  import { defaultKeymap, history, historyKeymap, indentWithTab, standardKeymap } from '@codemirror/commands';
7
- import { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from '@codemirror/language';
7
+ import { HighlightStyle, bracketMatching, syntaxHighlighting } from '@codemirror/language';
8
8
  import { searchKeymap } from '@codemirror/search';
9
- import { EditorState, type Extension } from '@codemirror/state';
10
- import { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';
9
+ import { type ChangeSpec, EditorState, type Extension, type TransactionSpec } from '@codemirror/state';
11
10
  import {
12
11
  EditorView,
13
12
  type KeyBinding,
@@ -20,16 +19,18 @@ import {
20
19
  placeholder,
21
20
  scrollPastEnd,
22
21
  } from '@codemirror/view';
22
+ import { vscodeDarkStyle, vscodeLightStyle } from '@uiw/codemirror-theme-vscode';
23
23
  import defaultsDeep from 'lodash.defaultsdeep';
24
24
  import merge from 'lodash.merge';
25
25
 
26
26
  import { generateName } from '@dxos/display-name';
27
+ import { type DocAccessor } from '@dxos/echo-db';
27
28
  import { log } from '@dxos/log';
28
- import { type DocAccessor, type Space } from '@dxos/react-client/echo';
29
- import { type Identity } from '@dxos/react-client/halo';
29
+ import { type Messenger } from '@dxos/protocols';
30
+ import { type Identity } from '@dxos/protocols/proto/dxos/client/services';
30
31
  import { type ThemeMode } from '@dxos/react-ui';
31
32
  import { type HuePalette } from '@dxos/react-ui-theme';
32
- import { hexToHue, isNotFalsy } from '@dxos/util';
33
+ import { hexToHue, isTruthy } from '@dxos/util';
33
34
 
34
35
  import { editorGutter, editorMonospace } from '../defaults';
35
36
  import { type ThemeStyles, defaultTheme } from '../styles';
@@ -42,12 +43,38 @@ import { focus } from './focus';
42
43
  // Basic
43
44
  //
44
45
 
45
- export const preventNewline = EditorState.transactionFilter.of((tr) => (tr.newDoc.lines > 1 ? [] : tr));
46
+ export const filterChars = (chars: RegExp) => {
47
+ return EditorState.transactionFilter.of((transaction) => {
48
+ if (!transaction.docChanged) {
49
+ return transaction;
50
+ }
51
+
52
+ const changes: ChangeSpec[] = [];
53
+ transaction.changes.iterChanges((fromA, toA, fromB, toB, text) => {
54
+ const inserted = text.toString();
55
+ const filtered = inserted.replace(chars, '');
56
+ if (inserted !== filtered) {
57
+ changes.push({
58
+ from: fromB,
59
+ to: toB,
60
+ insert: filtered,
61
+ });
62
+ }
63
+ });
64
+
65
+ if (changes.length) {
66
+ return [transaction, { changes, sequential: true } as TransactionSpec];
67
+ }
68
+
69
+ return transaction;
70
+ });
71
+ };
46
72
 
47
73
  /**
48
74
  * https://codemirror.net/docs/extensions
49
75
  * https://github.com/codemirror/basic-setup
50
76
  * https://github.com/codemirror/basic-setup/blob/main/src/codemirror.ts
77
+ * https://github.com/codemirror/theme-one-dark
51
78
  */
52
79
  export type BasicExtensionsOptions = {
53
80
  allowMultipleSelections?: boolean;
@@ -64,11 +91,11 @@ export type BasicExtensionsOptions = {
64
91
  lineNumbers?: boolean;
65
92
  /** If false then do not set a max-width or side margin on the editor. */
66
93
  lineWrapping?: boolean;
67
- monospace?: boolean;
68
94
  placeholder?: string;
69
95
  /** If true user cannot edit the text, but they can still select and copy it. */
70
96
  readOnly?: boolean;
71
97
  search?: boolean;
98
+ /** NOTE: Do not use with stack sections. */
72
99
  scrollPastEnd?: boolean;
73
100
  standardKeymap?: boolean;
74
101
  tabSize?: number;
@@ -112,7 +139,6 @@ export const createBasicExtensions = (_props?: BasicExtensionsOptions): Extensio
112
139
  props.history && history(),
113
140
  props.lineNumbers && [lineNumbers(), editorGutter],
114
141
  props.lineWrapping && EditorView.lineWrapping,
115
- props.monospace && editorMonospace,
116
142
  props.placeholder && placeholder(props.placeholder),
117
143
  props.readOnly !== undefined && EditorState.readOnly.of(props.readOnly),
118
144
  props.scrollPastEnd && scrollPastEnd(),
@@ -138,9 +164,9 @@ export const createBasicExtensions = (_props?: BasicExtensionsOptions): Extensio
138
164
  preventDefault: true,
139
165
  run: () => true,
140
166
  },
141
- ].filter(isNotFalsy),
167
+ ].filter(isTruthy),
142
168
  ),
143
- ].filter(isNotFalsy);
169
+ ].filter(isTruthy);
144
170
  };
145
171
 
146
172
  //
@@ -149,6 +175,7 @@ export const createBasicExtensions = (_props?: BasicExtensionsOptions): Extensio
149
175
 
150
176
  export type ThemeExtensionsOptions = {
151
177
  themeMode?: ThemeMode;
178
+ monospace?: boolean;
152
179
  styles?: ThemeStyles;
153
180
  syntaxHighlighting?: boolean;
154
181
  slots?: {
@@ -156,9 +183,7 @@ export type ThemeExtensionsOptions = {
156
183
  className?: string;
157
184
  };
158
185
  scroll?: {
159
- className?: string;
160
- };
161
- scroller?: {
186
+ // NOTE: Do not apply vertical padding to scroll container.
162
187
  className?: string;
163
188
  };
164
189
  content?: {
@@ -169,7 +194,7 @@ export type ThemeExtensionsOptions = {
169
194
 
170
195
  export const grow: ThemeExtensionsOptions['slots'] = {
171
196
  editor: {
172
- className: 'is-full bs-full',
197
+ className: 'bs-full is-full',
173
198
  },
174
199
  } as const;
175
200
 
@@ -181,41 +206,39 @@ export const fullWidth: ThemeExtensionsOptions['slots'] = {
181
206
 
182
207
  export const defaultThemeSlots = grow;
183
208
 
209
+ export const defaultStyles = {
210
+ dark: vscodeDarkStyle,
211
+ light: vscodeLightStyle,
212
+ };
213
+
184
214
  /**
185
215
  * https://codemirror.net/examples/styling
186
216
  */
187
217
  export const createThemeExtensions = ({
188
218
  themeMode,
219
+ monospace,
189
220
  styles,
190
- syntaxHighlighting: _syntaxHighlighting,
191
- slots: _slots,
221
+ syntaxHighlighting: syntaxHighlightingProp,
222
+ slots: slotsParam,
192
223
  }: ThemeExtensionsOptions = {}): Extension => {
193
- const slots = defaultsDeep({}, _slots, defaultThemeSlots);
224
+ const slots = defaultsDeep({}, slotsParam, defaultThemeSlots);
194
225
  return [
195
226
  EditorView.darkTheme.of(themeMode === 'dark'),
196
227
  EditorView.baseTheme(styles ? merge({}, defaultTheme, styles) : defaultTheme),
197
- // https://github.com/codemirror/theme-one-dark
198
- _syntaxHighlighting &&
199
- (themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle)),
228
+ monospace && editorMonospace,
229
+ syntaxHighlightingProp &&
230
+ syntaxHighlighting(HighlightStyle.define(themeMode === 'dark' ? defaultStyles.dark : defaultStyles.light)),
200
231
  slots.editor?.className && EditorView.editorAttributes.of({ class: slots.editor.className }),
201
232
  slots.content?.className && EditorView.contentAttributes.of({ class: slots.content.className }),
202
233
  slots.scroll?.className &&
203
234
  ViewPlugin.fromClass(
204
235
  class {
205
236
  constructor(view: EditorView) {
206
- view.scrollDOM.classList.add(slots.scroll.className);
237
+ view.scrollDOM.classList.add(...slots.scroll.className.split(/\s+/));
207
238
  }
208
239
  },
209
240
  ),
210
- slots.scroller?.className &&
211
- ViewPlugin.fromClass(
212
- class {
213
- constructor(view: EditorView) {
214
- view.dom.querySelector('.cm-scroller')?.classList.add(...slots.scroller.className.split(' '));
215
- }
216
- },
217
- ),
218
- ].filter(isNotFalsy);
241
+ ].filter(isTruthy);
219
242
  };
220
243
 
221
244
  //
@@ -225,31 +248,30 @@ export const createThemeExtensions = ({
225
248
  export type DataExtensionsProps<T> = {
226
249
  id: string;
227
250
  text?: DocAccessor<T>;
228
- space?: Space;
251
+ messenger?: Messenger;
229
252
  identity?: Identity | null;
230
253
  };
231
254
 
232
- // TODO(burdon): Move out of react-ui-editor (remove echo deps).
233
- export const createDataExtensions = <T>({ id, text, space, identity }: DataExtensionsProps<T>): Extension[] => {
255
+ // TODO(burdon): Move out of react-ui-editor?
256
+ export const createDataExtensions = <T>({ id, text, messenger, identity }: DataExtensionsProps<T>): Extension[] => {
234
257
  const extensions: Extension[] = [];
235
258
  if (text) {
236
259
  extensions.push(automerge(text));
237
260
  }
238
261
 
239
- if (space && identity) {
262
+ if (messenger && identity) {
240
263
  const peerId = identity?.identityKey.toHex();
241
264
  const hue = (identity?.profile?.data?.hue as HuePalette | undefined) ?? hexToHue(peerId ?? '0');
242
-
243
265
  extensions.push(
244
266
  awareness(
245
267
  new SpaceAwarenessProvider({
246
- space,
268
+ messenger,
247
269
  channel: `awareness.${id}`,
248
270
  peerId: identity.identityKey.toHex(),
249
271
  info: {
250
- displayName: identity.profile?.displayName ?? generateName(identity.identityKey.toHex()),
251
272
  darkColor: `var(--dx-${hue}Cursor)`,
252
273
  lightColor: `var(--dx-${hue}Cursor)`,
274
+ displayName: identity.profile?.displayName ?? generateName(identity.identityKey.toHex()),
253
275
  },
254
276
  }),
255
277
  ),
@@ -15,6 +15,7 @@ export const focusField = StateField.define<boolean>({
15
15
  return effect.value;
16
16
  }
17
17
  }
18
+
18
19
  return value;
19
20
  },
20
21
  });
@@ -25,11 +26,11 @@ export const focusField = StateField.define<boolean>({
25
26
  export const focus = [
26
27
  focusField,
27
28
  EditorView.domEventHandlers({
28
- focus: (event, view) => {
29
- setTimeout(() => view.dispatch({ effects: focusEffect.of(true) }));
29
+ focus: (_event, view) => {
30
+ requestAnimationFrame(() => view.dispatch({ effects: focusEffect.of(true) }));
30
31
  },
31
- blur: (event, view) => {
32
- setTimeout(() => view.dispatch({ effects: focusEffect.of(false) }));
32
+ blur: (_event, view) => {
33
+ requestAnimationFrame(() => view.dispatch({ effects: focusEffect.of(false) }));
33
34
  },
34
35
  }),
35
36
  ];
@@ -7,16 +7,15 @@ import { type Extension } from '@codemirror/state';
7
7
  import { EditorView } from '@codemirror/view';
8
8
  import React from 'react';
9
9
 
10
- import { Icon } from '@dxos/react-ui';
10
+ import { Domino, Icon } from '@dxos/react-ui';
11
11
 
12
- import { createElement, renderRoot } from '../util';
12
+ import { renderRoot } from '../util';
13
13
 
14
14
  export type FoldingOptions = {};
15
15
 
16
16
  /**
17
17
  * https://codemirror.net/examples/gutter
18
18
  */
19
- // TODO(burdon): Remember folding state (to state).
20
19
  export const folding = (_props: FoldingOptions = {}): Extension => [
21
20
  codeFolding({
22
21
  placeholderDOM: () => {
@@ -25,10 +24,8 @@ export const folding = (_props: FoldingOptions = {}): Extension => [
25
24
  }),
26
25
  foldGutter({
27
26
  markerDOM: (open) => {
28
- // TODO(burdon): Use sprite directly.
29
- const el = createElement('div', { className: 'flex h-full items-center' });
30
27
  return renderRoot(
31
- el,
28
+ Domino.of('div').classNames('flex bs-full items-center').build(),
32
29
  <Icon icon='ph--caret-right--bold' size={3} classNames={['mx-3 cursor-pointer', open && 'rotate-90']} />,
33
30
  );
34
31
  },
@@ -13,7 +13,7 @@ import {
13
13
  WidgetType,
14
14
  } from '@codemirror/view';
15
15
 
16
- import { getHashColor, mx } from '@dxos/react-ui-theme';
16
+ import { getHashStyles, mx } from '@dxos/react-ui-theme';
17
17
 
18
18
  class TagWidget extends WidgetType {
19
19
  constructor(private _text: string) {
@@ -22,7 +22,7 @@ class TagWidget extends WidgetType {
22
22
 
23
23
  toDOM(): HTMLSpanElement {
24
24
  const span = document.createElement('span');
25
- span.className = mx('cm-tag', getHashColor(this._text).tag);
25
+ span.className = mx('cm-tag', getHashStyles(this._text).surface);
26
26
  span.textContent = this._text;
27
27
  return span;
28
28
  }
@@ -4,10 +4,12 @@
4
4
 
5
5
  export * from './annotations';
6
6
  export * from './autocomplete';
7
+ export * from './autoscroll';
7
8
  export * from './automerge';
8
9
  export * from './awareness';
9
10
  export * from './blast';
10
- export * from './command';
11
+ export * from './blocks';
12
+ export * from './bookmarks';
11
13
  export * from './comments';
12
14
  export * from './debug';
13
15
  export * from './dnd';
@@ -19,8 +21,15 @@ export * from './json';
19
21
  export * from './listener';
20
22
  export * from './markdown';
21
23
  export * from './mention';
24
+ export * from './modal';
22
25
  export * from './modes';
23
26
  export * from './outliner';
24
27
  export * from './preview';
28
+ export * from './replacer';
25
29
  export * from './selection';
30
+ export * from './scrolling';
31
+ export * from './state';
32
+ export * from './submit';
33
+ export * from './tab';
34
+ export * from './tags';
26
35
  export * from './typewriter';
@@ -7,7 +7,7 @@ import { type LintSource, linter } from '@codemirror/lint';
7
7
  import { type Extension } from '@codemirror/state';
8
8
  import Ajv, { type ValidateFunction } from 'ajv';
9
9
 
10
- import { type JsonSchemaType } from '@dxos/echo-schema';
10
+ import { type JsonSchemaType } from '@dxos/echo/internal';
11
11
 
12
12
  export type JsonExtensionsOptions = {
13
13
  schema?: JsonSchemaType;
@@ -5,34 +5,28 @@
5
5
  import { type Extension } from '@codemirror/state';
6
6
  import { EditorView } from '@codemirror/view';
7
7
 
8
+ import { isNonNullable } from '@dxos/util';
9
+
8
10
  import { documentId } from './selection';
9
11
 
10
12
  export type ListenerOptions = {
11
- onFocus?: (focusing: boolean) => void;
12
- onChange?: (text: string, id: string) => void;
13
+ onFocus?: (event: { id: string; focusing: boolean }) => void;
14
+ onChange?: (event: { id: string; text: string }) => void;
13
15
  };
14
16
 
15
- /**
16
- * Event listener.
17
- * @deprecated Use EditorView.updateListener and listen for specific update events.
18
- */
19
17
  export const listener = ({ onFocus, onChange }: ListenerOptions): Extension => {
20
- const extensions: Extension[] = [];
21
-
22
- onFocus &&
23
- extensions.push(
24
- EditorView.focusChangeEffect.of((_, focusing) => {
25
- onFocus(focusing);
18
+ return [
19
+ onFocus &&
20
+ EditorView.focusChangeEffect.of((state, focusing) => {
21
+ onFocus({ id: state.facet(documentId), focusing });
26
22
  return null;
27
23
  }),
28
- );
29
24
 
30
- onChange &&
31
- extensions.push(
32
- EditorView.updateListener.of((update) => {
33
- onChange(update.state.doc.toString(), update.state.facet(documentId));
25
+ onChange &&
26
+ EditorView.updateListener.of(({ state, docChanged }) => {
27
+ if (docChanged) {
28
+ onChange({ id: state.facet(documentId), text: state.doc.toString() });
29
+ }
34
30
  }),
35
- );
36
-
37
- return extensions;
31
+ ].filter(isNonNullable);
38
32
  };