@dxos/react-ui-editor 0.8.4-main.fd6878d → 0.8.4-main.fffef41

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 (356) 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 +7471 -5897
  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 +7471 -5897
  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/image.d.ts.map +1 -1
  54. package/dist/types/src/components/EditorToolbar/index.d.ts +2 -1
  55. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  56. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  57. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts +11 -0
  58. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts.map +1 -0
  59. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +3 -3
  60. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  61. package/dist/types/src/components/index.d.ts +4 -2
  62. package/dist/types/src/components/index.d.ts.map +1 -1
  63. package/dist/types/src/defaults.d.ts.map +1 -1
  64. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +17 -0
  65. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +1 -0
  66. package/dist/types/src/extensions/autocomplete/index.d.ts +5 -0
  67. package/dist/types/src/extensions/autocomplete/index.d.ts.map +1 -0
  68. package/dist/types/src/extensions/autocomplete/match.d.ts +13 -0
  69. package/dist/types/src/extensions/autocomplete/match.d.ts.map +1 -0
  70. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +20 -0
  71. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +1 -0
  72. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +10 -0
  73. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +1 -0
  74. package/dist/types/src/extensions/automerge/automerge.d.ts +1 -1
  75. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  76. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +10 -19
  77. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  78. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  79. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  80. package/dist/types/src/extensions/automerge/sync.d.ts +3 -3
  81. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  82. package/dist/types/src/extensions/automerge/update-automerge.d.ts +1 -1
  83. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  84. package/dist/types/src/extensions/autoscroll.d.ts +20 -0
  85. package/dist/types/src/extensions/autoscroll.d.ts.map +1 -0
  86. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +1 -1
  87. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
  88. package/dist/types/src/extensions/blocks.d.ts +2 -0
  89. package/dist/types/src/extensions/blocks.d.ts.map +1 -0
  90. package/dist/types/src/extensions/bookmarks.d.ts +12 -0
  91. package/dist/types/src/extensions/bookmarks.d.ts.map +1 -0
  92. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  93. package/dist/types/src/extensions/factories.d.ts +11 -11
  94. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  95. package/dist/types/src/extensions/focus.d.ts.map +1 -1
  96. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  97. package/dist/types/src/extensions/index.d.ts +10 -1
  98. package/dist/types/src/extensions/index.d.ts.map +1 -1
  99. package/dist/types/src/extensions/json.d.ts +1 -1
  100. package/dist/types/src/extensions/json.d.ts.map +1 -1
  101. package/dist/types/src/extensions/listener.d.ts +8 -6
  102. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  103. package/dist/types/src/extensions/markdown/bundle.d.ts +8 -2
  104. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  105. package/dist/types/src/extensions/markdown/changes.d.ts +1 -1
  106. package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
  107. package/dist/types/src/extensions/markdown/decorate.d.ts +9 -1
  108. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  109. package/dist/types/src/extensions/markdown/formatting.d.ts +1 -3
  110. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  111. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
  112. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  113. package/dist/types/src/extensions/modal.d.ts +7 -0
  114. package/dist/types/src/extensions/modal.d.ts.map +1 -0
  115. package/dist/types/src/extensions/modes.d.ts +1 -1
  116. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  117. package/dist/types/src/extensions/outliner/menu.d.ts +8 -0
  118. package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -0
  119. package/dist/types/src/extensions/outliner/outliner.d.ts +1 -1
  120. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
  121. package/dist/types/src/extensions/outliner/tree.d.ts +1 -1
  122. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
  123. package/dist/types/src/extensions/preview/preview.d.ts +8 -8
  124. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  125. package/dist/types/src/extensions/replacer.d.ts +21 -0
  126. package/dist/types/src/extensions/replacer.d.ts.map +1 -0
  127. package/dist/types/src/extensions/replacer.test.d.ts +2 -0
  128. package/dist/types/src/extensions/replacer.test.d.ts.map +1 -0
  129. package/dist/types/src/extensions/scrolling.d.ts +78 -0
  130. package/dist/types/src/extensions/scrolling.d.ts.map +1 -0
  131. package/dist/types/src/extensions/state.d.ts +2 -0
  132. package/dist/types/src/extensions/state.d.ts.map +1 -0
  133. package/dist/types/src/extensions/submit.d.ts +10 -0
  134. package/dist/types/src/extensions/submit.d.ts.map +1 -0
  135. package/dist/types/src/extensions/tab.d.ts +4 -0
  136. package/dist/types/src/extensions/tab.d.ts.map +1 -0
  137. package/dist/types/src/extensions/tags/extended-markdown.d.ts +10 -0
  138. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +1 -0
  139. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +2 -0
  140. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +1 -0
  141. package/dist/types/src/extensions/tags/index.d.ts +4 -0
  142. package/dist/types/src/extensions/tags/index.d.ts.map +1 -0
  143. package/dist/types/src/extensions/tags/streamer.d.ts +12 -0
  144. package/dist/types/src/extensions/tags/streamer.d.ts.map +1 -0
  145. package/dist/types/src/extensions/tags/xml-tags.d.ts +97 -0
  146. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -0
  147. package/dist/types/src/extensions/tags/xml-util.d.ts +10 -0
  148. package/dist/types/src/extensions/tags/xml-util.d.ts.map +1 -0
  149. package/dist/types/src/hooks/useTextEditor.d.ts +5 -9
  150. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  151. package/dist/types/src/stories/CommandDialog.stories.d.ts +14 -0
  152. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
  153. package/dist/types/src/stories/Comments.stories.d.ts +21 -10
  154. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  155. package/dist/types/src/stories/EditorToolbar.stories.d.ts +39 -3
  156. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  157. package/dist/types/src/stories/Experimental.stories.d.ts +22 -13
  158. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  159. package/dist/types/src/stories/Markdown.stories.d.ts +32 -43
  160. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  161. package/dist/types/src/stories/Outliner.stories.d.ts +15 -21
  162. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  163. package/dist/types/src/stories/Popover.stories.d.ts +20 -0
  164. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  165. package/dist/types/src/stories/Preview.stories.d.ts +22 -7
  166. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  167. package/dist/types/src/stories/Tags.stories.d.ts +16 -0
  168. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  169. package/dist/types/src/stories/TextEditor.stories.d.ts +37 -52
  170. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  171. package/dist/types/src/stories/components/EditorStory.d.ts +8 -9
  172. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  173. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  174. package/dist/types/src/styles/theme.d.ts.map +1 -1
  175. package/dist/types/src/translations.d.ts +1 -1
  176. package/dist/types/src/types/types.d.ts +2 -2
  177. package/dist/types/src/types/types.d.ts.map +1 -1
  178. package/dist/types/src/util/debug.d.ts +5 -1
  179. package/dist/types/src/util/debug.d.ts.map +1 -1
  180. package/dist/types/src/util/decorations.d.ts +4 -0
  181. package/dist/types/src/util/decorations.d.ts.map +1 -0
  182. package/dist/types/src/util/dom.d.ts +2 -12
  183. package/dist/types/src/util/dom.d.ts.map +1 -1
  184. package/dist/types/src/util/index.d.ts +1 -0
  185. package/dist/types/src/util/index.d.ts.map +1 -1
  186. package/dist/types/src/util/react.d.ts +1 -1
  187. package/dist/types/src/util/react.d.ts.map +1 -1
  188. package/dist/types/tsconfig.tsbuildinfo +1 -1
  189. package/package.json +70 -68
  190. package/src/components/Editor/Editor.stories.tsx +89 -0
  191. package/src/components/Editor/Editor.tsx +160 -25
  192. package/src/components/EditorContent/EditorContent.stories.tsx +70 -0
  193. package/src/components/EditorContent/EditorContent.tsx +70 -0
  194. package/src/components/EditorContent/controller.ts +50 -0
  195. package/src/components/EditorContent/index.ts +6 -0
  196. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +233 -0
  197. package/src/components/EditorMenuProvider/index.ts +11 -0
  198. package/src/components/EditorMenuProvider/menu-presets.ts +123 -0
  199. package/src/components/EditorMenuProvider/menu.ts +71 -0
  200. package/src/components/EditorMenuProvider/popover.ts +287 -0
  201. package/src/components/EditorMenuProvider/useEditorMenu.ts +175 -0
  202. package/src/components/EditorMenuProvider/util.ts +31 -0
  203. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +82 -0
  204. package/src/components/EditorPreviewProvider/index.ts +5 -0
  205. package/src/components/EditorToolbar/EditorToolbar.tsx +116 -96
  206. package/src/components/EditorToolbar/actions.ts +86 -0
  207. package/src/components/EditorToolbar/blocks.ts +20 -23
  208. package/src/components/EditorToolbar/formatting.ts +21 -24
  209. package/src/components/EditorToolbar/headings.ts +16 -9
  210. package/src/components/EditorToolbar/image.ts +9 -5
  211. package/src/components/EditorToolbar/index.ts +3 -7
  212. package/src/components/EditorToolbar/search.ts +9 -5
  213. package/src/components/EditorToolbar/useEditorToolbar.ts +20 -0
  214. package/src/components/EditorToolbar/view-mode.ts +11 -6
  215. package/src/components/index.ts +8 -2
  216. package/src/defaults.ts +5 -2
  217. package/src/extensions/autocomplete/autocomplete.ts +151 -0
  218. package/src/extensions/autocomplete/index.ts +8 -0
  219. package/src/extensions/autocomplete/match.ts +46 -0
  220. package/src/extensions/{command → autocomplete}/placeholder.ts +21 -17
  221. package/src/extensions/{command → autocomplete}/typeahead.ts +6 -48
  222. package/src/extensions/automerge/automerge.stories.tsx +28 -21
  223. package/src/extensions/automerge/automerge.ts +28 -9
  224. package/src/extensions/automerge/cursor.ts +1 -1
  225. package/src/extensions/automerge/sync.ts +8 -4
  226. package/src/extensions/automerge/update-automerge.ts +1 -1
  227. package/src/extensions/autoscroll.ts +163 -0
  228. package/src/extensions/awareness/awareness-provider.ts +2 -2
  229. package/src/extensions/blocks.ts +131 -0
  230. package/src/extensions/bookmarks.ts +75 -0
  231. package/src/extensions/comments.ts +13 -8
  232. package/src/extensions/factories.ts +50 -32
  233. package/src/extensions/focus.ts +5 -4
  234. package/src/extensions/folding.tsx +3 -6
  235. package/src/extensions/hashtag.tsx +2 -2
  236. package/src/extensions/index.ts +10 -1
  237. package/src/extensions/json.ts +1 -1
  238. package/src/extensions/listener.ts +14 -20
  239. package/src/extensions/markdown/bundle.ts +39 -5
  240. package/src/extensions/markdown/decorate.ts +26 -17
  241. package/src/extensions/markdown/formatting.ts +8 -10
  242. package/src/extensions/markdown/highlight.ts +1 -1
  243. package/src/extensions/markdown/image.ts +5 -6
  244. package/src/extensions/markdown/link.ts +3 -0
  245. package/src/extensions/markdown/table.ts +13 -7
  246. package/src/extensions/modal.ts +24 -0
  247. package/src/extensions/modes.ts +2 -2
  248. package/src/extensions/{command/floating-menu.ts → outliner/menu.ts} +16 -21
  249. package/src/extensions/outliner/outliner.test.ts +1 -1
  250. package/src/extensions/outliner/outliner.ts +5 -5
  251. package/src/extensions/outliner/tree.test.ts +1 -1
  252. package/src/extensions/outliner/tree.ts +1 -1
  253. package/src/extensions/preview/index.ts +1 -1
  254. package/src/extensions/preview/preview.ts +69 -69
  255. package/src/extensions/replacer.test.ts +75 -0
  256. package/src/extensions/replacer.ts +93 -0
  257. package/src/extensions/scrolling.ts +189 -0
  258. package/src/extensions/selection.ts +3 -3
  259. package/src/extensions/state.ts +7 -0
  260. package/src/extensions/submit.ts +62 -0
  261. package/src/extensions/tab.ts +29 -0
  262. package/src/extensions/tags/extended-markdown.test.ts +262 -0
  263. package/src/extensions/tags/extended-markdown.ts +78 -0
  264. package/src/extensions/tags/index.ts +7 -0
  265. package/src/extensions/tags/streamer.ts +243 -0
  266. package/src/extensions/tags/xml-tags.ts +500 -0
  267. package/src/extensions/tags/xml-util.ts +94 -0
  268. package/src/extensions/typewriter.ts +1 -1
  269. package/src/hooks/useTextEditor.ts +31 -43
  270. package/src/stories/CommandDialog.stories.tsx +83 -0
  271. package/src/stories/Comments.stories.tsx +15 -13
  272. package/src/stories/EditorToolbar.stories.tsx +18 -17
  273. package/src/stories/Experimental.stories.tsx +15 -12
  274. package/src/stories/Markdown.stories.tsx +24 -21
  275. package/src/stories/Outliner.stories.tsx +50 -39
  276. package/src/stories/Popover.stories.tsx +162 -0
  277. package/src/stories/Preview.stories.tsx +52 -46
  278. package/src/stories/Tags.stories.tsx +95 -0
  279. package/src/stories/TextEditor.stories.tsx +30 -50
  280. package/src/stories/components/EditorStory.tsx +32 -20
  281. package/src/stories/components/util.tsx +40 -8
  282. package/src/styles/markdown.ts +1 -1
  283. package/src/styles/theme.ts +16 -13
  284. package/src/translations.ts +1 -1
  285. package/src/types/types.ts +1 -1
  286. package/src/util/debug.ts +7 -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/browser/testing/index.mjs +0 -6
  293. package/dist/lib/browser/testing/index.mjs.map +0 -7
  294. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  295. package/dist/lib/node-esm/testing/index.mjs +0 -8
  296. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  297. package/dist/types/src/components/EditorToolbar/lists.d.ts +0 -19
  298. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +0 -1
  299. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -51
  300. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  301. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  302. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  303. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  304. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  305. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  306. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  307. package/dist/types/src/components/Popover/index.d.ts +0 -4
  308. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  309. package/dist/types/src/extensions/autocomplete.d.ts +0 -13
  310. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  311. package/dist/types/src/extensions/command/action.d.ts +0 -17
  312. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  313. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  314. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  315. package/dist/types/src/extensions/command/command.d.ts +0 -6
  316. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  317. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  318. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  319. package/dist/types/src/extensions/command/hint.d.ts +0 -24
  320. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  321. package/dist/types/src/extensions/command/index.d.ts +0 -7
  322. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  323. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  324. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  325. package/dist/types/src/extensions/command/state.d.ts +0 -16
  326. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  327. package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
  328. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  329. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  330. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  331. package/dist/types/src/stories/Command.stories.d.ts +0 -7
  332. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  333. package/dist/types/src/stories/CommandMenu.stories.d.ts +0 -13
  334. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  335. package/dist/types/src/testing/index.d.ts +0 -2
  336. package/dist/types/src/testing/index.d.ts.map +0 -1
  337. package/dist/types/src/testing/util.d.ts +0 -3
  338. package/dist/types/src/testing/util.d.ts.map +0 -1
  339. package/src/components/EditorToolbar/lists.ts +0 -60
  340. package/src/components/EditorToolbar/util.ts +0 -65
  341. package/src/components/Popover/CommandMenu.tsx +0 -279
  342. package/src/components/Popover/RefDropdownMenu.tsx +0 -85
  343. package/src/components/Popover/RefPopover.tsx +0 -99
  344. package/src/components/Popover/index.ts +0 -7
  345. package/src/extensions/autocomplete.ts +0 -69
  346. package/src/extensions/command/action.ts +0 -56
  347. package/src/extensions/command/command-menu.ts +0 -211
  348. package/src/extensions/command/command.ts +0 -34
  349. package/src/extensions/command/hint.ts +0 -103
  350. package/src/extensions/command/index.ts +0 -10
  351. package/src/extensions/command/state.ts +0 -90
  352. package/src/extensions/command/useCommandMenu.ts +0 -119
  353. package/src/stories/Command.stories.tsx +0 -98
  354. package/src/stories/CommandMenu.stories.tsx +0 -160
  355. package/src/testing/index.ts +0 -5
  356. package/src/testing/util.ts +0 -7
@@ -0,0 +1,163 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { StateEffect } from '@codemirror/state';
6
+ import { EditorView, ViewPlugin } from '@codemirror/view';
7
+
8
+ import { debounce } from '@dxos/async';
9
+ import { Domino } from '@dxos/react-ui';
10
+
11
+ import { scrollToLineEffect } from './scrolling';
12
+
13
+ // TODO(burdon): Reconcile with scrollToLineEffect (scrolling).
14
+ export const scrollToBottomEffect = StateEffect.define<ScrollBehavior | undefined>();
15
+
16
+ export type AutoScrollOptions = {
17
+ /** Auto-scroll when reaches the bottom. */
18
+ autoScroll?: boolean;
19
+ /** Threshold in px to trigger scroll from bottom. */
20
+ threshold?: number;
21
+ /** Throttle time in ms. */
22
+ throttleDelay?: number;
23
+ /** Callback when auto-scrolling. */
24
+ onAutoScroll?: (props: { view: EditorView; distanceFromBottom: number }) => boolean | void;
25
+ };
26
+
27
+ /**
28
+ * Extension that supports pinning the scroll position and automatically scrolls to the bottom when content is added.
29
+ */
30
+ // TODO(burdon): Reconcile with transcript-extension.
31
+ export const autoScroll = ({
32
+ autoScroll = true,
33
+ threshold = 100,
34
+ throttleDelay = 1_000,
35
+ onAutoScroll,
36
+ }: Partial<AutoScrollOptions> = {}) => {
37
+ let buttonContainer: HTMLDivElement | undefined;
38
+ let hideTimeout: NodeJS.Timeout | undefined;
39
+ let lastScrollTop = 0;
40
+ let isPinned = true;
41
+
42
+ const setPinned = (pin: boolean) => {
43
+ isPinned = pin;
44
+ buttonContainer?.classList.toggle('opacity-0', pin);
45
+ };
46
+
47
+ // Temporarily hide the scrollbar while auto-scrolling.
48
+ const hideScrollbar = (view: EditorView) => {
49
+ view.scrollDOM.classList.add('cm-hide-scrollbar');
50
+ clearTimeout(hideTimeout);
51
+ hideTimeout = setTimeout(() => {
52
+ view.scrollDOM.classList.remove('cm-hide-scrollbar');
53
+ }, 1_000);
54
+ };
55
+
56
+ // Throttled scroll to bottom.
57
+ const scrollToBottom = (view: EditorView, behavior?: ScrollBehavior) => {
58
+ setPinned(true);
59
+ hideScrollbar(view);
60
+ const line = view.state.doc.lineAt(view.state.doc.length);
61
+ view.dispatch({
62
+ selection: { anchor: line.to, head: line.to },
63
+ effects: scrollToLineEffect.of({ line: line.number, options: { position: 'end', offset: threshold, behavior } }),
64
+ });
65
+ };
66
+
67
+ // Throttled check for distance from bottom (for downward scrolls only).
68
+ const checkDistance = debounce((view: EditorView) => {
69
+ const scrollerRect = view.scrollDOM.getBoundingClientRect();
70
+ const coords = view.coordsAtPos(view.state.doc.length);
71
+ const distanceFromBottom = coords ? coords.bottom - scrollerRect.bottom : 0;
72
+ setPinned(distanceFromBottom < 0);
73
+ }, 1_000);
74
+
75
+ // Debounce scroll updates so rapid edits don't cause clunky scrolling.
76
+ const triggerUpdate = debounce((view: EditorView) => scrollToBottom(view), throttleDelay);
77
+
78
+ return [
79
+ // Update listener for logging when scrolling is needed.
80
+ EditorView.updateListener.of(({ view, transactions, heightChanged }) => {
81
+ // TODO(burdon): Remove and use scrollToLineEffect instead.
82
+ transactions.forEach((transaction) => {
83
+ for (const effect of transaction.effects) {
84
+ if (effect.is(scrollToBottomEffect)) {
85
+ scrollToBottom(view, effect.value);
86
+ }
87
+ }
88
+ });
89
+
90
+ // Maybe scroll if doc changed and pinned.
91
+ // NOTE: Geometry changed is triggered when widgets change height (e.g., toggle tool block).
92
+ if (heightChanged && isPinned) {
93
+ const coords = view.coordsAtPos(view.state.doc.length);
94
+ const scrollerRect = view.scrollDOM.getBoundingClientRect();
95
+ const distanceFromBottom = coords ? scrollerRect.bottom - coords.bottom : 0;
96
+ if (autoScroll && distanceFromBottom < threshold) {
97
+ const shouldScroll = onAutoScroll?.({ view, distanceFromBottom }) ?? true;
98
+ if (shouldScroll) {
99
+ triggerUpdate(view);
100
+ }
101
+ } else if (distanceFromBottom < 0) {
102
+ setPinned(false);
103
+ }
104
+ }
105
+ }),
106
+
107
+ // Detect user scroll.
108
+ EditorView.domEventHandlers({
109
+ scroll: (event, view) => {
110
+ const currentScrollTop = view.scrollDOM.scrollTop;
111
+ const scrollingUp = currentScrollTop < lastScrollTop;
112
+ lastScrollTop = currentScrollTop;
113
+
114
+ // If user scrolls up, immediately unpin auto-scroll.
115
+ if (scrollingUp) {
116
+ setPinned(false);
117
+ } else {
118
+ checkDistance(view);
119
+ }
120
+ },
121
+ }),
122
+
123
+ // Scroll button.
124
+ ViewPlugin.fromClass(
125
+ class {
126
+ constructor(view: EditorView) {
127
+ buttonContainer = Domino.of('div')
128
+ .classNames(true && 'cm-scroll-button transition-opacity duration-300 opacity-0')
129
+ .children(
130
+ Domino.of('button')
131
+ .classNames('dx-button bg-accentSurface')
132
+ .data('density', 'fine')
133
+ .children(Domino.of<any>('dx-icon').attributes({ icon: 'ph--arrow-down--regular' }))
134
+ .on('click', () => {
135
+ scrollToBottom(view);
136
+ }),
137
+ )
138
+ .build();
139
+
140
+ view.scrollDOM.parentElement!.appendChild(buttonContainer);
141
+ }
142
+ },
143
+ ),
144
+
145
+ // Styles.
146
+ EditorView.theme({
147
+ '.cm-scroller': {
148
+ scrollbarWidth: 'thin',
149
+ },
150
+ '.cm-scroller.cm-hide-scrollbar': {
151
+ scrollbarWidth: 'none',
152
+ },
153
+ '.cm-scroller.cm-hide-scrollbar::-webkit-scrollbar': {
154
+ display: 'none',
155
+ },
156
+ '.cm-scroll-button': {
157
+ position: 'absolute',
158
+ bottom: '0.5rem',
159
+ right: '1rem',
160
+ },
161
+ }),
162
+ ];
163
+ };
@@ -3,11 +3,11 @@
3
3
  //
4
4
 
5
5
  import { DeferredTask, Event, sleep } from '@dxos/async';
6
+ import { type Space } from '@dxos/client/echo';
7
+ import { type GossipMessage } from '@dxos/client/mesh';
6
8
  import { Context } from '@dxos/context';
7
9
  import { invariant } from '@dxos/invariant';
8
10
  import { log } from '@dxos/log';
9
- import { type Space } from '@dxos/react-client/echo';
10
- import { type GossipMessage } from '@dxos/react-client/mesh';
11
11
 
12
12
  import { type AwarenessInfo, type AwarenessPosition, type AwarenessProvider, type AwarenessState } from './awareness';
13
13
 
@@ -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.
@@ -99,15 +103,16 @@ export const commentsState = StateField.define<CommentsState>({
99
103
  */
100
104
  const styles = EditorView.theme({
101
105
  '.cm-comment, .cm-comment-current': {
102
- margin: '0 -3px',
103
- padding: '3px',
104
- borderRadius: '3px',
106
+ padding: '3px 0',
107
+ color: 'var(--dx-cmCommentText)',
105
108
  backgroundColor: 'var(--dx-cmCommentSurface)',
106
- color: 'var(--dx-cmComment)',
107
- cursor: 'pointer',
108
109
  },
109
- '.cm-comment:hover, .cm-comment-current': {
110
- 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',
111
116
  },
112
117
  });
113
118
 
@@ -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,17 @@ 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
33
 
34
34
  import { editorGutter, editorMonospace } from '../defaults';
35
35
  import { type ThemeStyles, defaultTheme } from '../styles';
@@ -42,12 +42,35 @@ import { focus } from './focus';
42
42
  // Basic
43
43
  //
44
44
 
45
- 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
+ };
46
68
 
47
69
  /**
48
70
  * https://codemirror.net/docs/extensions
49
71
  * https://github.com/codemirror/basic-setup
50
72
  * https://github.com/codemirror/basic-setup/blob/main/src/codemirror.ts
73
+ * https://github.com/codemirror/theme-one-dark
51
74
  */
52
75
  export type BasicExtensionsOptions = {
53
76
  allowMultipleSelections?: boolean;
@@ -64,11 +87,11 @@ export type BasicExtensionsOptions = {
64
87
  lineNumbers?: boolean;
65
88
  /** If false then do not set a max-width or side margin on the editor. */
66
89
  lineWrapping?: boolean;
67
- monospace?: boolean;
68
90
  placeholder?: string;
69
91
  /** If true user cannot edit the text, but they can still select and copy it. */
70
92
  readOnly?: boolean;
71
93
  search?: boolean;
94
+ /** NOTE: Do not use with stack sections. */
72
95
  scrollPastEnd?: boolean;
73
96
  standardKeymap?: boolean;
74
97
  tabSize?: number;
@@ -112,7 +135,6 @@ export const createBasicExtensions = (_props?: BasicExtensionsOptions): Extensio
112
135
  props.history && history(),
113
136
  props.lineNumbers && [lineNumbers(), editorGutter],
114
137
  props.lineWrapping && EditorView.lineWrapping,
115
- props.monospace && editorMonospace,
116
138
  props.placeholder && placeholder(props.placeholder),
117
139
  props.readOnly !== undefined && EditorState.readOnly.of(props.readOnly),
118
140
  props.scrollPastEnd && scrollPastEnd(),
@@ -138,9 +160,9 @@ export const createBasicExtensions = (_props?: BasicExtensionsOptions): Extensio
138
160
  preventDefault: true,
139
161
  run: () => true,
140
162
  },
141
- ].filter(isNotFalsy),
163
+ ].filter(isTruthy),
142
164
  ),
143
- ].filter(isNotFalsy);
165
+ ].filter(isTruthy);
144
166
  };
145
167
 
146
168
  //
@@ -149,6 +171,7 @@ export const createBasicExtensions = (_props?: BasicExtensionsOptions): Extensio
149
171
 
150
172
  export type ThemeExtensionsOptions = {
151
173
  themeMode?: ThemeMode;
174
+ monospace?: boolean;
152
175
  styles?: ThemeStyles;
153
176
  syntaxHighlighting?: boolean;
154
177
  slots?: {
@@ -156,9 +179,7 @@ export type ThemeExtensionsOptions = {
156
179
  className?: string;
157
180
  };
158
181
  scroll?: {
159
- className?: string;
160
- };
161
- scroller?: {
182
+ // NOTE: Do not apply vertical padding to scroll container.
162
183
  className?: string;
163
184
  };
164
185
  content?: {
@@ -181,41 +202,39 @@ export const fullWidth: ThemeExtensionsOptions['slots'] = {
181
202
 
182
203
  export const defaultThemeSlots = grow;
183
204
 
205
+ export const defaultStyles = {
206
+ dark: vscodeDarkStyle,
207
+ light: vscodeLightStyle,
208
+ };
209
+
184
210
  /**
185
211
  * https://codemirror.net/examples/styling
186
212
  */
187
213
  export const createThemeExtensions = ({
188
214
  themeMode,
215
+ monospace,
189
216
  styles,
190
- syntaxHighlighting: _syntaxHighlighting,
191
- slots: _slots,
217
+ syntaxHighlighting: syntaxHighlightingProp,
218
+ slots: slotsParam,
192
219
  }: ThemeExtensionsOptions = {}): Extension => {
193
- const slots = defaultsDeep({}, _slots, defaultThemeSlots);
220
+ const slots = defaultsDeep({}, slotsParam, defaultThemeSlots);
194
221
  return [
195
222
  EditorView.darkTheme.of(themeMode === 'dark'),
196
223
  EditorView.baseTheme(styles ? merge({}, defaultTheme, styles) : defaultTheme),
197
- // https://github.com/codemirror/theme-one-dark
198
- _syntaxHighlighting &&
199
- (themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle)),
224
+ monospace && editorMonospace,
225
+ syntaxHighlightingProp &&
226
+ syntaxHighlighting(HighlightStyle.define(themeMode === 'dark' ? defaultStyles.dark : defaultStyles.light)),
200
227
  slots.editor?.className && EditorView.editorAttributes.of({ class: slots.editor.className }),
201
228
  slots.content?.className && EditorView.contentAttributes.of({ class: slots.content.className }),
202
229
  slots.scroll?.className &&
203
230
  ViewPlugin.fromClass(
204
231
  class {
205
232
  constructor(view: EditorView) {
206
- view.scrollDOM.classList.add(slots.scroll.className);
233
+ view.scrollDOM.classList.add(...slots.scroll.className.split(/\s+/));
207
234
  }
208
235
  },
209
236
  ),
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);
237
+ ].filter(isTruthy);
219
238
  };
220
239
 
221
240
  //
@@ -239,7 +258,6 @@ export const createDataExtensions = <T>({ id, text, space, identity }: DataExten
239
258
  if (space && identity) {
240
259
  const peerId = identity?.identityKey.toHex();
241
260
  const hue = (identity?.profile?.data?.hue as HuePalette | undefined) ?? hexToHue(peerId ?? '0');
242
-
243
261
  extensions.push(
244
262
  awareness(
245
263
  new SpaceAwarenessProvider({
@@ -247,9 +265,9 @@ export const createDataExtensions = <T>({ id, text, space, identity }: DataExten
247
265
  channel: `awareness.${id}`,
248
266
  peerId: identity.identityKey.toHex(),
249
267
  info: {
250
- displayName: identity.profile?.displayName ?? generateName(identity.identityKey.toHex()),
251
268
  darkColor: `var(--dx-${hue}Cursor)`,
252
269
  lightColor: `var(--dx-${hue}Cursor)`,
270
+ displayName: identity.profile?.displayName ?? generateName(identity.identityKey.toHex()),
253
271
  },
254
272
  }),
255
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
  }