@dxos/react-ui-editor 0.8.4-main.3f58842 → 0.8.4-main.548089c

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 (340) 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 +8004 -6623
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +71 -1
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/browser/types/index.mjs +1 -1
  9. package/dist/lib/node-esm/{chunk-YXYQPV6R.mjs → chunk-YJZGD3LY.mjs} +2 -2
  10. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs.map +7 -0
  11. package/dist/lib/node-esm/index.mjs +8004 -6623
  12. package/dist/lib/node-esm/index.mjs.map +4 -4
  13. package/dist/lib/node-esm/meta.json +1 -1
  14. package/dist/lib/node-esm/testing/index.mjs +71 -1
  15. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  16. package/dist/lib/node-esm/types/index.mjs +1 -1
  17. package/dist/types/src/components/Editor/Editor.d.ts +24 -9
  18. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  19. package/dist/types/src/components/Editor/Editor.stories.d.ts +27 -0
  20. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +17 -2
  22. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  23. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  24. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  25. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  26. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  27. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -1
  28. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  29. package/dist/types/src/components/EditorToolbar/util.d.ts +8 -22
  30. package/dist/types/src/components/EditorToolbar/util.d.ts.map +1 -1
  31. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +1 -1
  32. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  33. package/dist/types/src/components/index.d.ts +0 -1
  34. package/dist/types/src/components/index.d.ts.map +1 -1
  35. package/dist/types/src/defaults.d.ts.map +1 -1
  36. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +26 -0
  37. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +1 -0
  38. package/dist/types/src/extensions/autocomplete/index.d.ts +5 -0
  39. package/dist/types/src/extensions/autocomplete/index.d.ts.map +1 -0
  40. package/dist/types/src/extensions/autocomplete/match.d.ts +13 -0
  41. package/dist/types/src/extensions/autocomplete/match.d.ts.map +1 -0
  42. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +20 -0
  43. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +1 -0
  44. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +10 -0
  45. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +1 -0
  46. package/dist/types/src/extensions/automerge/automerge.d.ts +1 -1
  47. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  48. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +10 -19
  49. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  50. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  51. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  52. package/dist/types/src/extensions/automerge/defs.d.ts +1 -1
  53. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
  54. package/dist/types/src/extensions/automerge/sync.d.ts +3 -3
  55. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  56. package/dist/types/src/extensions/automerge/update-automerge.d.ts +1 -1
  57. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  58. package/dist/types/src/extensions/autoscroll.d.ts +20 -0
  59. package/dist/types/src/extensions/autoscroll.d.ts.map +1 -0
  60. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +1 -1
  61. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
  62. package/dist/types/src/extensions/blocks.d.ts +2 -0
  63. package/dist/types/src/extensions/blocks.d.ts.map +1 -0
  64. package/dist/types/src/extensions/bookmarks.d.ts +12 -0
  65. package/dist/types/src/extensions/bookmarks.d.ts.map +1 -0
  66. package/dist/types/src/extensions/comments.d.ts +1 -1
  67. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  68. package/dist/types/src/extensions/dnd.d.ts.map +1 -1
  69. package/dist/types/src/extensions/factories.d.ts +11 -11
  70. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  71. package/dist/types/src/extensions/focus.d.ts.map +1 -1
  72. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  73. package/dist/types/src/extensions/index.d.ts +8 -1
  74. package/dist/types/src/extensions/index.d.ts.map +1 -1
  75. package/dist/types/src/extensions/json.d.ts +1 -1
  76. package/dist/types/src/extensions/json.d.ts.map +1 -1
  77. package/dist/types/src/extensions/listener.d.ts +8 -6
  78. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  79. package/dist/types/src/extensions/markdown/action.d.ts.map +1 -1
  80. package/dist/types/src/extensions/markdown/bundle.d.ts +8 -2
  81. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  82. package/dist/types/src/extensions/markdown/changes.d.ts +1 -1
  83. package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
  84. package/dist/types/src/extensions/markdown/decorate.d.ts +9 -1
  85. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  86. package/dist/types/src/extensions/markdown/formatting.d.ts +2 -3
  87. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  88. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +1 -1
  89. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
  90. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
  91. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  92. package/dist/types/src/extensions/modes.d.ts +1 -1
  93. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  94. package/dist/types/src/extensions/outliner/menu.d.ts +8 -0
  95. package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -0
  96. package/dist/types/src/extensions/outliner/outliner.d.ts +1 -1
  97. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
  98. package/dist/types/src/extensions/outliner/selection.d.ts.map +1 -1
  99. package/dist/types/src/extensions/outliner/tree.d.ts +2 -2
  100. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
  101. package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts +36 -0
  102. package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts.map +1 -0
  103. package/dist/types/src/extensions/popover/index.d.ts +8 -0
  104. package/dist/types/src/extensions/popover/index.d.ts.map +1 -0
  105. package/dist/types/src/extensions/popover/menu-presets.d.ts +4 -0
  106. package/dist/types/src/extensions/popover/menu-presets.d.ts.map +1 -0
  107. package/dist/types/src/extensions/popover/menu.d.ts +24 -0
  108. package/dist/types/src/extensions/popover/menu.d.ts.map +1 -0
  109. package/dist/types/src/extensions/popover/modal.d.ts +7 -0
  110. package/dist/types/src/extensions/popover/modal.d.ts.map +1 -0
  111. package/dist/types/src/extensions/popover/popover.d.ts +47 -0
  112. package/dist/types/src/extensions/popover/popover.d.ts.map +1 -0
  113. package/dist/types/src/extensions/popover/usePopoverMenu.d.ts +34 -0
  114. package/dist/types/src/extensions/popover/usePopoverMenu.d.ts.map +1 -0
  115. package/dist/types/src/extensions/popover/util.d.ts +8 -0
  116. package/dist/types/src/extensions/popover/util.d.ts.map +1 -0
  117. package/dist/types/src/extensions/preview/preview.d.ts +8 -8
  118. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  119. package/dist/types/src/extensions/replacer.d.ts +21 -0
  120. package/dist/types/src/extensions/replacer.d.ts.map +1 -0
  121. package/dist/types/src/extensions/replacer.test.d.ts +2 -0
  122. package/dist/types/src/extensions/replacer.test.d.ts.map +1 -0
  123. package/dist/types/src/extensions/scrolling.d.ts +78 -0
  124. package/dist/types/src/extensions/scrolling.d.ts.map +1 -0
  125. package/dist/types/src/extensions/state.d.ts +2 -0
  126. package/dist/types/src/extensions/state.d.ts.map +1 -0
  127. package/dist/types/src/extensions/tags/extended-markdown.d.ts +10 -0
  128. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +1 -0
  129. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +2 -0
  130. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +1 -0
  131. package/dist/types/src/extensions/tags/index.d.ts +4 -0
  132. package/dist/types/src/extensions/tags/index.d.ts.map +1 -0
  133. package/dist/types/src/extensions/tags/streamer.d.ts +12 -0
  134. package/dist/types/src/extensions/tags/streamer.d.ts.map +1 -0
  135. package/dist/types/src/extensions/tags/xml-tags.d.ts +97 -0
  136. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -0
  137. package/dist/types/src/extensions/tags/xml-util.d.ts +10 -0
  138. package/dist/types/src/extensions/tags/xml-util.d.ts.map +1 -0
  139. package/dist/types/src/hooks/useTextEditor.d.ts +4 -8
  140. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  141. package/dist/types/src/stories/CommandDialog.stories.d.ts +14 -0
  142. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
  143. package/dist/types/src/stories/Comments.stories.d.ts +21 -10
  144. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  145. package/dist/types/src/stories/EditorToolbar.stories.d.ts +39 -3
  146. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  147. package/dist/types/src/stories/Experimental.stories.d.ts +22 -13
  148. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  149. package/dist/types/src/stories/Markdown.stories.d.ts +32 -43
  150. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  151. package/dist/types/src/stories/Outliner.stories.d.ts +15 -21
  152. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  153. package/dist/types/src/stories/Popover.stories.d.ts +20 -0
  154. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  155. package/dist/types/src/stories/Preview.stories.d.ts +21 -7
  156. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  157. package/dist/types/src/stories/Tags.stories.d.ts +16 -0
  158. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  159. package/dist/types/src/stories/TextEditor.stories.d.ts +37 -52
  160. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  161. package/dist/types/src/stories/components/EditorStory.d.ts +6 -9
  162. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  163. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  164. package/dist/types/src/styles/theme.d.ts.map +1 -1
  165. package/dist/types/src/testing/PreviewPopover.d.ts +20 -0
  166. package/dist/types/src/testing/PreviewPopover.d.ts.map +1 -0
  167. package/dist/types/src/testing/index.d.ts +1 -0
  168. package/dist/types/src/testing/index.d.ts.map +1 -1
  169. package/dist/types/src/testing/util.d.ts +1 -0
  170. package/dist/types/src/testing/util.d.ts.map +1 -1
  171. package/dist/types/src/translations.d.ts +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/cursor.d.ts.map +1 -1
  175. package/dist/types/src/util/debug.d.ts +1 -1
  176. package/dist/types/src/util/debug.d.ts.map +1 -1
  177. package/dist/types/src/util/decorations.d.ts +4 -0
  178. package/dist/types/src/util/decorations.d.ts.map +1 -0
  179. package/dist/types/src/util/dom.d.ts +2 -12
  180. package/dist/types/src/util/dom.d.ts.map +1 -1
  181. package/dist/types/src/util/index.d.ts +1 -0
  182. package/dist/types/src/util/index.d.ts.map +1 -1
  183. package/dist/types/src/util/react.d.ts +1 -1
  184. package/dist/types/src/util/react.d.ts.map +1 -1
  185. package/dist/types/tsconfig.tsbuildinfo +1 -1
  186. package/package.json +73 -62
  187. package/src/components/Editor/Editor.stories.tsx +69 -0
  188. package/src/components/Editor/Editor.tsx +58 -15
  189. package/src/components/EditorToolbar/EditorToolbar.tsx +106 -95
  190. package/src/components/EditorToolbar/blocks.ts +21 -24
  191. package/src/components/EditorToolbar/formatting.ts +22 -25
  192. package/src/components/EditorToolbar/headings.ts +16 -9
  193. package/src/components/EditorToolbar/image.ts +8 -4
  194. package/src/components/EditorToolbar/lists.ts +16 -19
  195. package/src/components/EditorToolbar/search.ts +8 -4
  196. package/src/components/EditorToolbar/util.ts +20 -25
  197. package/src/components/EditorToolbar/view-mode.ts +11 -6
  198. package/src/components/index.ts +0 -1
  199. package/src/defaults.ts +5 -2
  200. package/src/extensions/autocomplete/autocomplete.ts +220 -0
  201. package/src/extensions/autocomplete/index.ts +8 -0
  202. package/src/extensions/autocomplete/match.ts +46 -0
  203. package/src/extensions/{command → autocomplete}/placeholder.ts +22 -18
  204. package/src/extensions/{command → autocomplete}/typeahead.ts +8 -50
  205. package/src/extensions/automerge/automerge.stories.tsx +32 -25
  206. package/src/extensions/automerge/automerge.ts +31 -11
  207. package/src/extensions/automerge/cursor.ts +1 -1
  208. package/src/extensions/automerge/defs.ts +1 -1
  209. package/src/extensions/automerge/sync.ts +9 -5
  210. package/src/extensions/automerge/update-automerge.ts +2 -2
  211. package/src/extensions/autoscroll.ts +163 -0
  212. package/src/extensions/awareness/awareness-provider.ts +2 -2
  213. package/src/extensions/awareness/awareness.ts +2 -2
  214. package/src/extensions/blocks.ts +131 -0
  215. package/src/extensions/bookmarks.ts +75 -0
  216. package/src/extensions/comments.ts +20 -14
  217. package/src/extensions/dnd.ts +1 -1
  218. package/src/extensions/factories.ts +54 -35
  219. package/src/extensions/focus.ts +5 -4
  220. package/src/extensions/folding.tsx +3 -6
  221. package/src/extensions/hashtag.tsx +2 -2
  222. package/src/extensions/index.ts +8 -1
  223. package/src/extensions/json.ts +1 -1
  224. package/src/extensions/listener.ts +14 -20
  225. package/src/extensions/markdown/action.ts +2 -1
  226. package/src/extensions/markdown/bundle.ts +40 -6
  227. package/src/extensions/markdown/changes.ts +1 -1
  228. package/src/extensions/markdown/decorate.ts +32 -22
  229. package/src/extensions/markdown/formatting.test.ts +6 -6
  230. package/src/extensions/markdown/formatting.ts +11 -11
  231. package/src/extensions/markdown/highlight.ts +2 -2
  232. package/src/extensions/markdown/image.ts +5 -6
  233. package/src/extensions/markdown/link.ts +3 -0
  234. package/src/extensions/markdown/table.ts +13 -7
  235. package/src/extensions/mention.ts +1 -1
  236. package/src/extensions/modes.ts +2 -2
  237. package/src/extensions/{command/floating-menu.ts → outliner/menu.ts} +16 -21
  238. package/src/extensions/outliner/outliner.test.ts +3 -2
  239. package/src/extensions/outliner/outliner.ts +7 -6
  240. package/src/extensions/outliner/selection.ts +1 -1
  241. package/src/extensions/outliner/tree.test.ts +2 -1
  242. package/src/extensions/outliner/tree.ts +2 -2
  243. package/src/extensions/popover/PopoverMenuProvider.tsx +220 -0
  244. package/src/extensions/popover/index.ts +12 -0
  245. package/src/extensions/popover/menu-presets.ts +124 -0
  246. package/src/extensions/popover/menu.ts +67 -0
  247. package/src/extensions/popover/modal.ts +24 -0
  248. package/src/extensions/popover/popover.ts +289 -0
  249. package/src/extensions/popover/usePopoverMenu.ts +173 -0
  250. package/src/extensions/popover/util.ts +29 -0
  251. package/src/extensions/preview/index.ts +1 -1
  252. package/src/extensions/preview/preview.ts +69 -69
  253. package/src/extensions/replacer.test.ts +75 -0
  254. package/src/extensions/replacer.ts +93 -0
  255. package/src/extensions/scrolling.ts +189 -0
  256. package/src/extensions/selection.ts +3 -3
  257. package/src/extensions/state.ts +7 -0
  258. package/src/extensions/tags/extended-markdown.test.ts +262 -0
  259. package/src/extensions/tags/extended-markdown.ts +78 -0
  260. package/src/extensions/tags/index.ts +7 -0
  261. package/src/extensions/tags/streamer.ts +243 -0
  262. package/src/extensions/tags/xml-tags.ts +500 -0
  263. package/src/extensions/tags/xml-util.ts +94 -0
  264. package/src/extensions/typewriter.ts +1 -1
  265. package/src/hooks/useTextEditor.ts +27 -39
  266. package/src/stories/CommandDialog.stories.tsx +83 -0
  267. package/src/stories/Comments.stories.tsx +15 -11
  268. package/src/stories/EditorToolbar.stories.tsx +17 -17
  269. package/src/stories/Experimental.stories.tsx +17 -13
  270. package/src/stories/Markdown.stories.tsx +25 -21
  271. package/src/stories/Outliner.stories.tsx +54 -35
  272. package/src/stories/Popover.stories.tsx +161 -0
  273. package/src/stories/Preview.stories.tsx +48 -40
  274. package/src/stories/Tags.stories.tsx +95 -0
  275. package/src/stories/TextEditor.stories.tsx +41 -60
  276. package/src/stories/components/EditorStory.tsx +19 -18
  277. package/src/stories/components/util.tsx +39 -6
  278. package/src/styles/markdown.ts +1 -1
  279. package/src/styles/theme.ts +16 -12
  280. package/src/testing/PreviewPopover.tsx +80 -0
  281. package/src/testing/index.ts +1 -0
  282. package/src/testing/util.ts +2 -0
  283. package/src/translations.ts +1 -1
  284. package/src/types/types.ts +1 -1
  285. package/src/util/cursor.ts +2 -1
  286. package/src/util/debug.ts +2 -2
  287. package/src/util/decorations.ts +21 -0
  288. package/src/util/dom.ts +5 -27
  289. package/src/util/index.ts +1 -0
  290. package/src/util/react.tsx +1 -1
  291. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
  292. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  293. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  294. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  295. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  296. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  297. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  298. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  299. package/dist/types/src/components/Popover/index.d.ts +0 -4
  300. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  301. package/dist/types/src/extensions/autocomplete.d.ts +0 -13
  302. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  303. package/dist/types/src/extensions/command/action.d.ts +0 -17
  304. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  305. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  306. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  307. package/dist/types/src/extensions/command/command.d.ts +0 -6
  308. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  309. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  310. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  311. package/dist/types/src/extensions/command/hint.d.ts +0 -24
  312. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  313. package/dist/types/src/extensions/command/index.d.ts +0 -7
  314. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  315. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  316. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  317. package/dist/types/src/extensions/command/state.d.ts +0 -16
  318. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  319. package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
  320. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  321. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  322. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  323. package/dist/types/src/stories/Command.stories.d.ts +0 -7
  324. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  325. package/dist/types/src/stories/CommandMenu.stories.d.ts +0 -13
  326. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  327. package/src/components/Popover/CommandMenu.tsx +0 -279
  328. package/src/components/Popover/RefDropdownMenu.tsx +0 -85
  329. package/src/components/Popover/RefPopover.tsx +0 -99
  330. package/src/components/Popover/index.ts +0 -7
  331. package/src/extensions/autocomplete.ts +0 -69
  332. package/src/extensions/command/action.ts +0 -56
  333. package/src/extensions/command/command-menu.ts +0 -210
  334. package/src/extensions/command/command.ts +0 -34
  335. package/src/extensions/command/hint.ts +0 -102
  336. package/src/extensions/command/index.ts +0 -10
  337. package/src/extensions/command/state.ts +0 -89
  338. package/src/extensions/command/useCommandMenu.ts +0 -118
  339. package/src/stories/Command.stories.tsx +0 -97
  340. package/src/stories/CommandMenu.stories.tsx +0 -159
@@ -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
+ });
@@ -5,25 +5,26 @@
5
5
  import { invertedEffects } from '@codemirror/commands';
6
6
  import { type ChangeDesc, type Extension, StateEffect, StateField, type Text } from '@codemirror/state';
7
7
  import {
8
- hoverTooltip,
9
- keymap,
10
8
  type Command,
11
9
  Decoration,
12
10
  EditorView,
13
- type Rect,
14
11
  type PluginValue,
12
+ type Rect,
15
13
  ViewPlugin,
14
+ hoverTooltip,
15
+ keymap,
16
16
  } from '@codemirror/view';
17
17
  import sortBy from 'lodash.sortby';
18
18
  import { useEffect } from 'react';
19
19
 
20
- import { debounce, type CleanupFn } from '@dxos/async';
20
+ import { type CleanupFn, debounce } from '@dxos/async';
21
21
  import { log } from '@dxos/log';
22
22
  import { isNonNullable } from '@dxos/util';
23
23
 
24
+ import { type Comment, type Range, type RenderCallback } from '../types';
25
+ import { Cursor, callbackWrapper, singleValueFacet } from '../util';
26
+
24
27
  import { documentId } from './selection';
25
- import { type RenderCallback, type Comment, type Range } from '../types';
26
- import { Cursor, singleValueFacet, callbackWrapper } from '../util';
27
28
 
28
29
  //
29
30
  // State management.
@@ -57,7 +58,11 @@ const setCommentState = StateEffect.define<CommentsState>();
57
58
  * The ranges are tracked as Automerge cursors from which the absolute indexed ranges can be computed.
58
59
  */
59
60
  export const commentsState = StateField.define<CommentsState>({
60
- create: (state) => ({ id: state.facet(documentId), comments: [], selection: {} }),
61
+ create: (state) => ({
62
+ id: state.facet(documentId),
63
+ comments: [],
64
+ selection: {},
65
+ }),
61
66
  update: (value, tr) => {
62
67
  for (const effect of tr.effects) {
63
68
  // Update selection.
@@ -98,15 +103,16 @@ export const commentsState = StateField.define<CommentsState>({
98
103
  */
99
104
  const styles = EditorView.theme({
100
105
  '.cm-comment, .cm-comment-current': {
101
- margin: '0 -3px',
102
- padding: '3px',
103
- borderRadius: '3px',
106
+ padding: '3px 0',
107
+ color: 'var(--dx-cmCommentText)',
104
108
  backgroundColor: 'var(--dx-cmCommentSurface)',
105
- color: 'var(--dx-cmComment)',
106
- cursor: 'pointer',
107
109
  },
108
- '.cm-comment:hover, .cm-comment-current': {
109
- textDecoration: 'underline',
110
+ '.cm-comment > span, .cm-comment-current > span': {
111
+ boxDecorationBreak: 'clone',
112
+ boxShadow: '0 0 1px 3px var(--dx-cmCommentSurface)',
113
+ backgroundColor: 'var(--dx-cmCommentSurface)',
114
+ color: 'var(--dx-cmCommentText)',
115
+ cursor: 'pointer',
110
116
  },
111
117
  });
112
118
 
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import type { Extension } from '@codemirror/state';
6
- import { dropCursor, EditorView } from '@codemirror/view';
6
+ import { EditorView, dropCursor } from '@codemirror/view';
7
7
 
8
8
  export type DNDOptions = { onDrop?: (view: EditorView, event: { files: FileList }) => void };
9
9
 
@@ -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,33 +19,58 @@ 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
+ import { type DocAccessor, type Space } from '@dxos/client/echo';
27
+ import { type Identity } from '@dxos/client/halo';
26
28
  import { generateName } from '@dxos/display-name';
27
29
  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';
30
30
  import { type ThemeMode } from '@dxos/react-ui';
31
31
  import { type HuePalette } from '@dxos/react-ui-theme';
32
- import { hexToHue, isNotFalsy } from '@dxos/util';
32
+ import { hexToHue, isTruthy } from '@dxos/util';
33
+
34
+ import { editorGutter, editorMonospace } from '../defaults';
35
+ import { type ThemeStyles, defaultTheme } from '../styles';
33
36
 
34
37
  import { automerge } from './automerge';
35
38
  import { SpaceAwarenessProvider, awareness } from './awareness';
36
39
  import { focus } from './focus';
37
- import { editorGutter, editorMonospace } from '../defaults';
38
- import { type ThemeStyles, defaultTheme } from '../styles';
39
40
 
40
41
  //
41
42
  // Basic
42
43
  //
43
44
 
44
- export const preventNewline = EditorState.transactionFilter.of((tr) => (tr.newDoc.lines > 1 ? [] : tr));
45
+ export const filterChars = (chars: RegExp) => {
46
+ return EditorState.transactionFilter.of((transaction) => {
47
+ if (!transaction.docChanged) return transaction;
48
+
49
+ const changes: ChangeSpec[] = [];
50
+ transaction.changes.iterChanges((fromA, toA, fromB, toB, text) => {
51
+ const inserted = text.toString();
52
+ const filtered = inserted.replace(chars, '');
53
+ if (inserted !== filtered) {
54
+ changes.push({
55
+ from: fromB,
56
+ to: toB,
57
+ insert: filtered,
58
+ });
59
+ }
60
+ });
61
+
62
+ if (changes.length) {
63
+ return [transaction, { changes, sequential: true } as TransactionSpec];
64
+ }
65
+ return transaction;
66
+ });
67
+ };
45
68
 
46
69
  /**
47
70
  * https://codemirror.net/docs/extensions
48
71
  * https://github.com/codemirror/basic-setup
49
72
  * https://github.com/codemirror/basic-setup/blob/main/src/codemirror.ts
73
+ * https://github.com/codemirror/theme-one-dark
50
74
  */
51
75
  export type BasicExtensionsOptions = {
52
76
  allowMultipleSelections?: boolean;
@@ -63,11 +87,11 @@ export type BasicExtensionsOptions = {
63
87
  lineNumbers?: boolean;
64
88
  /** If false then do not set a max-width or side margin on the editor. */
65
89
  lineWrapping?: boolean;
66
- monospace?: boolean;
67
90
  placeholder?: string;
68
91
  /** If true user cannot edit the text, but they can still select and copy it. */
69
92
  readOnly?: boolean;
70
93
  search?: boolean;
94
+ /** NOTE: Do not use with stack sections. */
71
95
  scrollPastEnd?: boolean;
72
96
  standardKeymap?: boolean;
73
97
  tabSize?: number;
@@ -82,7 +106,7 @@ const defaultBasicOptions: BasicExtensionsOptions = {
82
106
  history: true,
83
107
  keymap: 'standard',
84
108
  lineWrapping: true,
85
- search: true,
109
+ search: false,
86
110
  } as const;
87
111
 
88
112
  const keymaps: { [key: string]: readonly KeyBinding[] } = {
@@ -111,7 +135,6 @@ export const createBasicExtensions = (_props?: BasicExtensionsOptions): Extensio
111
135
  props.history && history(),
112
136
  props.lineNumbers && [lineNumbers(), editorGutter],
113
137
  props.lineWrapping && EditorView.lineWrapping,
114
- props.monospace && editorMonospace,
115
138
  props.placeholder && placeholder(props.placeholder),
116
139
  props.readOnly !== undefined && EditorState.readOnly.of(props.readOnly),
117
140
  props.scrollPastEnd && scrollPastEnd(),
@@ -137,9 +160,9 @@ export const createBasicExtensions = (_props?: BasicExtensionsOptions): Extensio
137
160
  preventDefault: true,
138
161
  run: () => true,
139
162
  },
140
- ].filter(isNotFalsy),
163
+ ].filter(isTruthy),
141
164
  ),
142
- ].filter(isNotFalsy);
165
+ ].filter(isTruthy);
143
166
  };
144
167
 
145
168
  //
@@ -148,6 +171,7 @@ export const createBasicExtensions = (_props?: BasicExtensionsOptions): Extensio
148
171
 
149
172
  export type ThemeExtensionsOptions = {
150
173
  themeMode?: ThemeMode;
174
+ monospace?: boolean;
151
175
  styles?: ThemeStyles;
152
176
  syntaxHighlighting?: boolean;
153
177
  slots?: {
@@ -155,9 +179,7 @@ export type ThemeExtensionsOptions = {
155
179
  className?: string;
156
180
  };
157
181
  scroll?: {
158
- className?: string;
159
- };
160
- scroller?: {
182
+ // NOTE: Do not apply vertical padding to scroll container.
161
183
  className?: string;
162
184
  };
163
185
  content?: {
@@ -180,41 +202,39 @@ export const fullWidth: ThemeExtensionsOptions['slots'] = {
180
202
 
181
203
  export const defaultThemeSlots = grow;
182
204
 
205
+ export const defaultStyles = {
206
+ dark: vscodeDarkStyle,
207
+ light: vscodeLightStyle,
208
+ };
209
+
183
210
  /**
184
211
  * https://codemirror.net/examples/styling
185
212
  */
186
213
  export const createThemeExtensions = ({
187
214
  themeMode,
215
+ monospace,
188
216
  styles,
189
- syntaxHighlighting: _syntaxHighlighting,
190
- slots: _slots,
217
+ syntaxHighlighting: syntaxHighlightingProp,
218
+ slots: slotsParam,
191
219
  }: ThemeExtensionsOptions = {}): Extension => {
192
- const slots = defaultsDeep({}, _slots, defaultThemeSlots);
220
+ const slots = defaultsDeep({}, slotsParam, defaultThemeSlots);
193
221
  return [
194
222
  EditorView.darkTheme.of(themeMode === 'dark'),
195
223
  EditorView.baseTheme(styles ? merge({}, defaultTheme, styles) : defaultTheme),
196
- // https://github.com/codemirror/theme-one-dark
197
- _syntaxHighlighting &&
198
- (themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle)),
224
+ monospace && editorMonospace,
225
+ syntaxHighlightingProp &&
226
+ syntaxHighlighting(HighlightStyle.define(themeMode === 'dark' ? defaultStyles.dark : defaultStyles.light)),
199
227
  slots.editor?.className && EditorView.editorAttributes.of({ class: slots.editor.className }),
200
228
  slots.content?.className && EditorView.contentAttributes.of({ class: slots.content.className }),
201
229
  slots.scroll?.className &&
202
230
  ViewPlugin.fromClass(
203
231
  class {
204
232
  constructor(view: EditorView) {
205
- view.scrollDOM.classList.add(slots.scroll.className);
233
+ view.scrollDOM.classList.add(...slots.scroll.className.split(/\s+/));
206
234
  }
207
235
  },
208
236
  ),
209
- slots.scroller?.className &&
210
- ViewPlugin.fromClass(
211
- class {
212
- constructor(view: EditorView) {
213
- view.dom.querySelector('.cm-scroller')?.classList.add(...slots.scroller.className.split(' '));
214
- }
215
- },
216
- ),
217
- ].filter(isNotFalsy);
237
+ ].filter(isTruthy);
218
238
  };
219
239
 
220
240
  //
@@ -238,7 +258,6 @@ export const createDataExtensions = <T>({ id, text, space, identity }: DataExten
238
258
  if (space && identity) {
239
259
  const peerId = identity?.identityKey.toHex();
240
260
  const hue = (identity?.profile?.data?.hue as HuePalette | undefined) ?? hexToHue(peerId ?? '0');
241
-
242
261
  extensions.push(
243
262
  awareness(
244
263
  new SpaceAwarenessProvider({
@@ -246,9 +265,9 @@ export const createDataExtensions = <T>({ id, text, space, identity }: DataExten
246
265
  channel: `awareness.${id}`,
247
266
  peerId: identity.identityKey.toHex(),
248
267
  info: {
249
- displayName: identity.profile?.displayName ?? generateName(identity.identityKey.toHex()),
250
268
  darkColor: `var(--dx-${hue}Cursor)`,
251
269
  lightColor: `var(--dx-${hue}Cursor)`,
270
+ displayName: identity.profile?.displayName ?? generateName(identity.identityKey.toHex()),
252
271
  },
253
272
  }),
254
273
  ),
@@ -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';
@@ -21,6 +23,11 @@ export * from './markdown';
21
23
  export * from './mention';
22
24
  export * from './modes';
23
25
  export * from './outliner';
26
+ export * from './popover';
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 './tags';
26
33
  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
  };
@@ -7,6 +7,8 @@ import { type EditorView } from '@codemirror/view';
7
7
  import { type Action } from '@dxos/app-graph';
8
8
  import { type MenuActionProperties } from '@dxos/react-ui-menu';
9
9
 
10
+ import { createComment } from '../comments';
11
+
10
12
  import {
11
13
  Inline,
12
14
  List,
@@ -25,7 +27,6 @@ import {
25
27
  toggleList,
26
28
  toggleStyle,
27
29
  } from './formatting';
28
- import { createComment } from '../comments';
29
30
 
30
31
  export type PayloadType =
31
32
  | 'view-mode'