@dxos/ui-editor 0.10.0 → 0.11.1

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 (551) hide show
  1. package/dist/lib/chunk-diff.mjs +935 -0
  2. package/dist/lib/chunk-diff.mjs.map +1 -0
  3. package/dist/lib/headless.mjs +2 -0
  4. package/dist/lib/index.mjs +9937 -0
  5. package/dist/lib/index.mjs.map +1 -0
  6. package/dist/lib/types.mjs +18 -0
  7. package/dist/lib/types.mjs.map +1 -0
  8. package/dist/types/src/extensions/{bookmarks.d.ts → behavior/bookmarks.d.ts} +3 -0
  9. package/dist/types/src/extensions/behavior/bookmarks.d.ts.map +1 -0
  10. package/dist/types/src/extensions/behavior/dnd.d.ts.map +1 -0
  11. package/dist/types/src/extensions/behavior/index.d.ts +6 -0
  12. package/dist/types/src/extensions/behavior/index.d.ts.map +1 -0
  13. package/dist/types/src/extensions/{listener.d.ts → behavior/listener.d.ts} +3 -0
  14. package/dist/types/src/extensions/behavior/listener.d.ts.map +1 -0
  15. package/dist/types/src/extensions/{spacing.d.ts → behavior/spacing.d.ts} +3 -0
  16. package/dist/types/src/extensions/behavior/spacing.d.ts.map +1 -0
  17. package/dist/types/src/extensions/behavior/submit.d.ts.map +1 -0
  18. package/dist/types/src/extensions/collab/automerge/automerge.d.ts.map +1 -0
  19. package/dist/types/src/extensions/collab/automerge/automerge.test.d.ts.map +1 -0
  20. package/dist/types/src/extensions/{automerge → collab/automerge}/cursor.d.ts +1 -1
  21. package/dist/types/src/extensions/collab/automerge/cursor.d.ts.map +1 -0
  22. package/dist/types/src/extensions/{automerge → collab/automerge}/defs.d.ts +3 -1
  23. package/dist/types/src/extensions/collab/automerge/defs.d.ts.map +1 -0
  24. package/dist/types/src/extensions/collab/automerge/index.d.ts +3 -0
  25. package/dist/types/src/extensions/collab/automerge/index.d.ts.map +1 -0
  26. package/dist/types/src/extensions/collab/automerge/sync.d.ts.map +1 -0
  27. package/dist/types/src/extensions/{automerge → collab/automerge}/update-automerge.d.ts +4 -0
  28. package/dist/types/src/extensions/collab/automerge/update-automerge.d.ts.map +1 -0
  29. package/dist/types/src/extensions/{automerge → collab/automerge}/update-codemirror.d.ts +4 -0
  30. package/dist/types/src/extensions/collab/automerge/update-codemirror.d.ts.map +1 -0
  31. package/dist/types/src/extensions/collab/awareness/awareness-provider.d.ts.map +1 -0
  32. package/dist/types/src/extensions/{awareness → collab/awareness}/awareness.d.ts +4 -1
  33. package/dist/types/src/extensions/collab/awareness/awareness.d.ts.map +1 -0
  34. package/dist/types/src/extensions/collab/awareness/index.d.ts.map +1 -0
  35. package/dist/types/src/extensions/collab/index.d.ts +3 -0
  36. package/dist/types/src/extensions/collab/index.d.ts.map +1 -0
  37. package/dist/types/src/extensions/completion/autocomplete.d.ts.map +1 -0
  38. package/dist/types/src/extensions/{autocomplete → completion}/index.d.ts +1 -0
  39. package/dist/types/src/extensions/completion/index.d.ts.map +1 -0
  40. package/dist/types/src/extensions/{autocomplete → completion}/match.d.ts +2 -2
  41. package/dist/types/src/extensions/completion/match.d.ts.map +1 -0
  42. package/dist/types/src/extensions/{mention.d.ts → completion/mention.d.ts} +3 -0
  43. package/dist/types/src/extensions/completion/mention.d.ts.map +1 -0
  44. package/dist/types/src/extensions/completion/placeholder.d.ts.map +1 -0
  45. package/dist/types/src/extensions/{autocomplete → completion}/typeahead.d.ts +2 -2
  46. package/dist/types/src/extensions/completion/typeahead.d.ts.map +1 -0
  47. package/dist/types/src/extensions/{factories.d.ts → core/factories.d.ts} +23 -2
  48. package/dist/types/src/extensions/core/factories.d.ts.map +1 -0
  49. package/dist/types/src/extensions/core/factories.test.d.ts.map +1 -0
  50. package/dist/types/src/extensions/core/index.d.ts +3 -0
  51. package/dist/types/src/extensions/core/index.d.ts.map +1 -0
  52. package/dist/types/src/extensions/{modes.d.ts → core/modes.d.ts} +3 -0
  53. package/dist/types/src/extensions/core/modes.d.ts.map +1 -0
  54. package/dist/types/src/extensions/{debug.d.ts → debug/debug.d.ts} +3 -0
  55. package/dist/types/src/extensions/debug/debug.d.ts.map +1 -0
  56. package/dist/types/src/extensions/debug/index.d.ts +2 -0
  57. package/dist/types/src/extensions/debug/index.d.ts.map +1 -0
  58. package/dist/types/src/extensions/{annotations.d.ts → decoration/annotations.d.ts} +1 -1
  59. package/dist/types/src/extensions/decoration/annotations.d.ts.map +1 -0
  60. package/dist/types/src/extensions/decoration/assistant.d.ts +27 -0
  61. package/dist/types/src/extensions/decoration/assistant.d.ts.map +1 -0
  62. package/dist/types/src/extensions/decoration/fader.d.ts.map +1 -0
  63. package/dist/types/src/extensions/decoration/hashtag.d.ts +6 -0
  64. package/dist/types/src/extensions/decoration/hashtag.d.ts.map +1 -0
  65. package/dist/types/src/extensions/decoration/index.d.ts +8 -0
  66. package/dist/types/src/extensions/decoration/index.d.ts.map +1 -0
  67. package/dist/types/src/extensions/decoration/marker.d.ts.map +1 -0
  68. package/dist/types/src/extensions/{pos.d.ts → decoration/pos.d.ts} +40 -14
  69. package/dist/types/src/extensions/decoration/pos.d.ts.map +1 -0
  70. package/dist/types/src/extensions/decoration/pos.test.d.ts.map +1 -0
  71. package/dist/types/src/extensions/{replacer.d.ts → decoration/replacer.d.ts} +8 -8
  72. package/dist/types/src/extensions/decoration/replacer.d.ts.map +1 -0
  73. package/dist/types/src/extensions/decoration/replacer.test.d.ts.map +1 -0
  74. package/dist/types/src/extensions/{blast.d.ts → demo/blast.d.ts} +3 -0
  75. package/dist/types/src/extensions/demo/blast.d.ts.map +1 -0
  76. package/dist/types/src/extensions/demo/index.d.ts +3 -0
  77. package/dist/types/src/extensions/demo/index.d.ts.map +1 -0
  78. package/dist/types/src/extensions/demo/snippets.d.ts.map +1 -0
  79. package/dist/types/src/extensions/index.d.ts +10 -33
  80. package/dist/types/src/extensions/index.d.ts.map +1 -1
  81. package/dist/types/src/extensions/language/index.d.ts +5 -0
  82. package/dist/types/src/extensions/language/index.d.ts.map +1 -0
  83. package/dist/types/src/extensions/language/json/index.d.ts +2 -0
  84. package/dist/types/src/extensions/language/json/index.d.ts.map +1 -0
  85. package/dist/types/src/extensions/language/json/json.d.ts +12 -0
  86. package/dist/types/src/extensions/language/json/json.d.ts.map +1 -0
  87. package/dist/types/src/extensions/language/markdown/action.d.ts.map +1 -0
  88. package/dist/types/src/extensions/language/markdown/bundle.d.ts.map +1 -0
  89. package/dist/types/src/extensions/{markdown → language/markdown}/changes.d.ts +1 -1
  90. package/dist/types/src/extensions/language/markdown/changes.d.ts.map +1 -0
  91. package/dist/types/src/extensions/language/markdown/changes.test.d.ts.map +1 -0
  92. package/dist/types/src/extensions/{markdown → language/markdown}/debug.d.ts +3 -0
  93. package/dist/types/src/extensions/language/markdown/debug.d.ts.map +1 -0
  94. package/dist/types/src/extensions/{markdown → language/markdown}/decorate.d.ts +5 -1
  95. package/dist/types/src/extensions/language/markdown/decorate.d.ts.map +1 -0
  96. package/dist/types/src/extensions/{markdown → language/markdown}/formatting.d.ts +11 -2
  97. package/dist/types/src/extensions/language/markdown/formatting.d.ts.map +1 -0
  98. package/dist/types/src/extensions/language/markdown/formatting.test.d.ts.map +1 -0
  99. package/dist/types/src/extensions/{markdown → language/markdown}/highlight.d.ts +16 -12
  100. package/dist/types/src/extensions/language/markdown/highlight.d.ts.map +1 -0
  101. package/dist/types/src/extensions/language/markdown/image.d.ts.map +1 -0
  102. package/dist/types/src/extensions/language/markdown/image.test.d.ts.map +1 -0
  103. package/dist/types/src/extensions/language/markdown/index.d.ts.map +1 -0
  104. package/dist/types/src/extensions/language/markdown/link.d.ts +25 -0
  105. package/dist/types/src/extensions/language/markdown/link.d.ts.map +1 -0
  106. package/dist/types/src/extensions/language/markdown/link.test.d.ts +2 -0
  107. package/dist/types/src/extensions/language/markdown/link.test.d.ts.map +1 -0
  108. package/dist/types/src/extensions/language/markdown/parser.test.d.ts.map +1 -0
  109. package/dist/types/src/extensions/{markdown → language/markdown}/styles.d.ts +3 -0
  110. package/dist/types/src/extensions/language/markdown/styles.d.ts.map +1 -0
  111. package/dist/types/src/extensions/language/markdown/table.d.ts.map +1 -0
  112. package/dist/types/src/extensions/language/mermaid/index.d.ts +2 -0
  113. package/dist/types/src/extensions/language/mermaid/index.d.ts.map +1 -0
  114. package/dist/types/src/extensions/language/mermaid/mermaid.d.ts +18 -0
  115. package/dist/types/src/extensions/language/mermaid/mermaid.d.ts.map +1 -0
  116. package/dist/types/src/extensions/language/xml/extended-markdown.d.ts.map +1 -0
  117. package/dist/types/src/extensions/language/xml/extended-markdown.test.d.ts.map +1 -0
  118. package/dist/types/src/extensions/language/xml/index.d.ts.map +1 -0
  119. package/dist/types/src/extensions/language/xml/stub.d.ts +76 -0
  120. package/dist/types/src/extensions/language/xml/stub.d.ts.map +1 -0
  121. package/dist/types/src/extensions/language/xml/widgets/anchor.d.ts.map +1 -0
  122. package/dist/types/src/extensions/language/xml/widgets/index.d.ts.map +1 -0
  123. package/dist/types/src/extensions/language/xml/xml-block-decoration.d.ts +48 -0
  124. package/dist/types/src/extensions/language/xml/xml-block-decoration.d.ts.map +1 -0
  125. package/dist/types/src/extensions/language/xml/xml-formatting.d.ts.map +1 -0
  126. package/dist/types/src/extensions/{tags → language/xml}/xml-tags.d.ts +12 -1
  127. package/dist/types/src/extensions/language/xml/xml-tags.d.ts.map +1 -0
  128. package/dist/types/src/extensions/language/xml/xml-tags.test.d.ts +2 -0
  129. package/dist/types/src/extensions/language/xml/xml-tags.test.d.ts.map +1 -0
  130. package/dist/types/src/extensions/language/xml/xml-util.d.ts.map +1 -0
  131. package/dist/types/src/extensions/language/xml/xml-util.test.d.ts.map +1 -0
  132. package/dist/types/src/extensions/review/change-bar.d.ts +29 -0
  133. package/dist/types/src/extensions/review/change-bar.d.ts.map +1 -0
  134. package/dist/types/src/extensions/{comments.d.ts → review/comments.d.ts} +56 -38
  135. package/dist/types/src/extensions/review/comments.d.ts.map +1 -0
  136. package/dist/types/src/extensions/review/comments.test.d.ts +2 -0
  137. package/dist/types/src/extensions/review/comments.test.d.ts.map +1 -0
  138. package/dist/types/src/extensions/review/diff.d.ts +131 -0
  139. package/dist/types/src/extensions/review/diff.d.ts.map +1 -0
  140. package/dist/types/src/extensions/review/diff.test.d.ts +2 -0
  141. package/dist/types/src/extensions/review/diff.test.d.ts.map +1 -0
  142. package/dist/types/src/extensions/review/index.d.ts +7 -0
  143. package/dist/types/src/extensions/review/index.d.ts.map +1 -0
  144. package/dist/types/src/extensions/review/suggest.d.ts +89 -0
  145. package/dist/types/src/extensions/review/suggest.d.ts.map +1 -0
  146. package/dist/types/src/extensions/review/suggest.test.d.ts +2 -0
  147. package/dist/types/src/extensions/review/suggest.test.d.ts.map +1 -0
  148. package/dist/types/src/extensions/review/suggestions-overlay.d.ts +25 -0
  149. package/dist/types/src/extensions/review/suggestions-overlay.d.ts.map +1 -0
  150. package/dist/types/src/extensions/review/suggestions-overlay.test.d.ts +2 -0
  151. package/dist/types/src/extensions/review/suggestions-overlay.test.d.ts.map +1 -0
  152. package/dist/types/src/extensions/review/track-changes.d.ts +27 -0
  153. package/dist/types/src/extensions/review/track-changes.d.ts.map +1 -0
  154. package/dist/types/src/extensions/review/track-changes.test.d.ts +2 -0
  155. package/dist/types/src/extensions/review/track-changes.test.d.ts.map +1 -0
  156. package/dist/types/src/extensions/{busy.d.ts → state/busy.d.ts} +1 -0
  157. package/dist/types/src/extensions/state/busy.d.ts.map +1 -0
  158. package/dist/types/src/extensions/{focus.d.ts → state/focus.d.ts} +4 -0
  159. package/dist/types/src/extensions/state/focus.d.ts.map +1 -0
  160. package/dist/types/src/extensions/state/index.d.ts +5 -0
  161. package/dist/types/src/extensions/state/index.d.ts.map +1 -0
  162. package/dist/types/src/extensions/state/modal.d.ts.map +1 -0
  163. package/dist/types/src/extensions/{selection.d.ts → state/selection.d.ts} +1 -1
  164. package/dist/types/src/extensions/state/selection.d.ts.map +1 -0
  165. package/dist/types/src/extensions/state/selection.test.d.ts.map +1 -0
  166. package/dist/types/src/extensions/streaming/index.d.ts +4 -0
  167. package/dist/types/src/extensions/streaming/index.d.ts.map +1 -0
  168. package/dist/types/src/extensions/streaming/pending/index.d.ts.map +1 -0
  169. package/dist/types/src/extensions/streaming/pending/pending-text-stream.d.ts.map +1 -0
  170. package/dist/types/src/extensions/streaming/pending/pending-text-stream.test.d.ts.map +1 -0
  171. package/dist/types/src/extensions/{pending → streaming/pending}/pending-text.d.ts +1 -0
  172. package/dist/types/src/extensions/streaming/pending/pending-text.d.ts.map +1 -0
  173. package/dist/types/src/extensions/streaming/pending/pending-text.test.d.ts.map +1 -0
  174. package/dist/types/src/extensions/streaming/scrolling/auto-scroll.d.ts.map +1 -0
  175. package/dist/types/src/extensions/streaming/scrolling/crawler.d.ts.map +1 -0
  176. package/dist/types/src/extensions/streaming/scrolling/index.d.ts.map +1 -0
  177. package/dist/types/src/extensions/streaming/scrolling/scroll-past-end.d.ts +4 -0
  178. package/dist/types/src/extensions/streaming/scrolling/scroll-past-end.d.ts.map +1 -0
  179. package/dist/types/src/extensions/streaming/scrolling/scrollbar-autohide.d.ts.map +1 -0
  180. package/dist/types/src/extensions/streaming/scrolling/scroller.d.ts.map +1 -0
  181. package/dist/types/src/extensions/{typewriter.d.ts → streaming/typewriter.d.ts} +12 -12
  182. package/dist/types/src/extensions/streaming/typewriter.d.ts.map +1 -0
  183. package/dist/types/src/extensions/streaming/typewriter.test.d.ts.map +1 -0
  184. package/dist/types/src/extensions/structure/blocks/blocks.d.ts +52 -0
  185. package/dist/types/src/extensions/structure/blocks/blocks.d.ts.map +1 -0
  186. package/dist/types/src/extensions/structure/blocks/blocks.test.d.ts +2 -0
  187. package/dist/types/src/extensions/structure/blocks/blocks.test.d.ts.map +1 -0
  188. package/dist/types/src/extensions/structure/blocks/drag.d.ts +57 -0
  189. package/dist/types/src/extensions/structure/blocks/drag.d.ts.map +1 -0
  190. package/dist/types/src/extensions/structure/blocks/index.d.ts +5 -0
  191. package/dist/types/src/extensions/structure/blocks/index.d.ts.map +1 -0
  192. package/dist/types/src/extensions/structure/blocks/selection.d.ts +47 -0
  193. package/dist/types/src/extensions/structure/blocks/selection.d.ts.map +1 -0
  194. package/dist/types/src/extensions/structure/blocks/selection.test.d.ts +2 -0
  195. package/dist/types/src/extensions/structure/blocks/selection.test.d.ts.map +1 -0
  196. package/dist/types/src/extensions/structure/blocks/types.d.ts +17 -0
  197. package/dist/types/src/extensions/structure/blocks/types.d.ts.map +1 -0
  198. package/dist/types/src/extensions/structure/folding/folding.d.ts.map +1 -0
  199. package/dist/types/src/extensions/structure/folding/index.d.ts +3 -0
  200. package/dist/types/src/extensions/structure/folding/index.d.ts.map +1 -0
  201. package/dist/types/src/extensions/structure/folding/turns.d.ts +55 -0
  202. package/dist/types/src/extensions/structure/folding/turns.d.ts.map +1 -0
  203. package/dist/types/src/extensions/structure/folding/turns.test.d.ts +2 -0
  204. package/dist/types/src/extensions/structure/folding/turns.test.d.ts.map +1 -0
  205. package/dist/types/src/extensions/structure/index.d.ts +4 -0
  206. package/dist/types/src/extensions/structure/index.d.ts.map +1 -0
  207. package/dist/types/src/extensions/structure/outliner/commands.d.ts +31 -0
  208. package/dist/types/src/extensions/structure/outliner/commands.d.ts.map +1 -0
  209. package/dist/types/src/extensions/structure/outliner/dnd.d.ts +43 -0
  210. package/dist/types/src/extensions/structure/outliner/dnd.d.ts.map +1 -0
  211. package/dist/types/src/extensions/structure/outliner/dnd.test.d.ts +2 -0
  212. package/dist/types/src/extensions/structure/outliner/dnd.test.d.ts.map +1 -0
  213. package/dist/types/src/extensions/structure/outliner/editor.d.ts.map +1 -0
  214. package/dist/types/src/extensions/structure/outliner/editor.test.d.ts.map +1 -0
  215. package/dist/types/src/extensions/{outliner → structure/outliner}/index.d.ts +1 -0
  216. package/dist/types/src/extensions/structure/outliner/index.d.ts.map +1 -0
  217. package/dist/types/src/extensions/{outliner → structure/outliner}/menu.d.ts +1 -0
  218. package/dist/types/src/extensions/structure/outliner/menu.d.ts.map +1 -0
  219. package/dist/types/src/extensions/structure/outliner/outliner.d.ts.map +1 -0
  220. package/dist/types/src/extensions/structure/outliner/outliner.test.d.ts.map +1 -0
  221. package/dist/types/src/extensions/{outliner → structure/outliner}/tree.d.ts +1 -1
  222. package/dist/types/src/extensions/structure/outliner/tree.d.ts.map +1 -0
  223. package/dist/types/src/extensions/structure/outliner/tree.test.d.ts.map +1 -0
  224. package/dist/types/src/headless.d.ts +4 -0
  225. package/dist/types/src/headless.d.ts.map +1 -0
  226. package/dist/types/src/styles/theme.d.ts +1 -1
  227. package/dist/types/src/styles/theme.d.ts.map +1 -1
  228. package/dist/types/src/util/util.d.ts +2 -0
  229. package/dist/types/src/util/util.d.ts.map +1 -1
  230. package/dist/types/tsconfig.tsbuildinfo +1 -1
  231. package/package.json +48 -42
  232. package/src/defaults.ts +1 -1
  233. package/src/extensions/{bookmarks.ts → behavior/bookmarks.ts} +24 -14
  234. package/src/extensions/behavior/index.ts +9 -0
  235. package/src/extensions/{listener.ts → behavior/listener.ts} +4 -1
  236. package/src/extensions/{spacing.ts → behavior/spacing.ts} +8 -2
  237. package/src/extensions/{submit.ts → behavior/submit.ts} +2 -10
  238. package/src/extensions/{automerge → collab/automerge}/automerge.test.tsx +4 -4
  239. package/src/extensions/{automerge → collab/automerge}/automerge.ts +7 -4
  240. package/src/extensions/{automerge → collab/automerge}/cursor.ts +1 -1
  241. package/src/extensions/{automerge → collab/automerge}/defs.ts +4 -1
  242. package/src/extensions/{automerge → collab/automerge}/index.ts +1 -0
  243. package/src/extensions/{automerge → collab/automerge}/sync.ts +1 -2
  244. package/src/extensions/{automerge → collab/automerge}/update-automerge.ts +4 -0
  245. package/src/extensions/{automerge → collab/automerge}/update-codemirror.ts +5 -1
  246. package/src/extensions/{awareness → collab/awareness}/awareness-provider.ts +3 -4
  247. package/src/extensions/{awareness → collab/awareness}/awareness.ts +19 -16
  248. package/src/extensions/collab/index.ts +6 -0
  249. package/src/extensions/{autocomplete → completion}/autocomplete.ts +7 -5
  250. package/src/extensions/{autocomplete → completion}/index.ts +2 -1
  251. package/src/extensions/{autocomplete → completion}/match.ts +2 -2
  252. package/src/extensions/{mention.ts → completion/mention.ts} +3 -0
  253. package/src/extensions/{autocomplete → completion}/placeholder.ts +1 -1
  254. package/src/extensions/completion/typeahead.ts +97 -0
  255. package/src/extensions/{factories.ts → core/factories.ts} +35 -13
  256. package/src/extensions/core/index.ts +6 -0
  257. package/src/extensions/{modes.ts → core/modes.ts} +4 -1
  258. package/src/extensions/{debug.ts → debug/debug.ts} +3 -0
  259. package/src/extensions/debug/index.ts +5 -0
  260. package/src/extensions/{annotations.ts → decoration/annotations.ts} +12 -10
  261. package/src/extensions/decoration/assistant.ts +225 -0
  262. package/src/extensions/{fader.ts → decoration/fader.ts} +17 -19
  263. package/src/extensions/{hashtag.ts → decoration/hashtag.ts} +35 -28
  264. package/src/extensions/decoration/index.ts +11 -0
  265. package/src/extensions/{marker.ts → decoration/marker.ts} +18 -18
  266. package/src/extensions/{pos.test.ts → decoration/pos.test.ts} +57 -1
  267. package/src/extensions/{pos.ts → decoration/pos.ts} +165 -31
  268. package/src/extensions/{blast.ts → demo/blast.ts} +3 -0
  269. package/src/extensions/demo/index.ts +6 -0
  270. package/src/extensions/{snippets.ts → demo/snippets.ts} +5 -1
  271. package/src/extensions/index.ts +10 -33
  272. package/src/extensions/language/index.ts +8 -0
  273. package/src/extensions/language/json/index.ts +5 -0
  274. package/src/extensions/{json.ts → language/json/json.ts} +11 -6
  275. package/src/extensions/{markdown → language/markdown}/action.ts +1 -1
  276. package/src/extensions/{markdown → language/markdown}/bundle.ts +7 -1
  277. package/src/extensions/{markdown → language/markdown}/changes.test.ts +2 -2
  278. package/src/extensions/{markdown → language/markdown}/changes.ts +2 -2
  279. package/src/extensions/{markdown → language/markdown}/debug.ts +3 -0
  280. package/src/extensions/{markdown → language/markdown}/decorate.ts +96 -85
  281. package/src/extensions/{markdown → language/markdown}/formatting.test.ts +88 -1
  282. package/src/extensions/{markdown → language/markdown}/formatting.ts +193 -74
  283. package/src/extensions/{markdown → language/markdown}/highlight.ts +42 -41
  284. package/src/extensions/{markdown → language/markdown}/image.test.ts +1 -1
  285. package/src/extensions/{markdown → language/markdown}/image.ts +6 -6
  286. package/src/extensions/language/markdown/link.test.ts +58 -0
  287. package/src/extensions/language/markdown/link.ts +109 -0
  288. package/src/extensions/{markdown → language/markdown}/parser.test.ts +0 -28
  289. package/src/extensions/{markdown → language/markdown}/styles.ts +38 -7
  290. package/src/extensions/{markdown → language/markdown}/table.ts +5 -5
  291. package/src/extensions/language/mermaid/index.ts +5 -0
  292. package/src/extensions/language/mermaid/mermaid.ts +44 -0
  293. package/src/extensions/{tags → language/xml}/DESIGN.md +3 -3
  294. package/src/extensions/{tags → language/xml}/extended-markdown.test.ts +2 -1
  295. package/src/extensions/{tags → language/xml}/extended-markdown.ts +2 -4
  296. package/src/extensions/language/xml/stub.ts +233 -0
  297. package/src/extensions/language/xml/xml-block-decoration.ts +165 -0
  298. package/src/extensions/{tags → language/xml}/xml-formatting.ts +54 -38
  299. package/src/extensions/language/xml/xml-tags.test.ts +588 -0
  300. package/src/extensions/{tags → language/xml}/xml-tags.ts +165 -66
  301. package/src/extensions/{tags → language/xml}/xml-util.test.ts +2 -2
  302. package/src/extensions/review/change-bar.ts +94 -0
  303. package/src/extensions/review/comments.test.ts +72 -0
  304. package/src/extensions/{comments.ts → review/comments.ts} +395 -267
  305. package/src/extensions/review/diff.test.ts +405 -0
  306. package/src/extensions/review/diff.ts +502 -0
  307. package/src/extensions/review/index.ts +10 -0
  308. package/src/extensions/review/suggest.test.ts +170 -0
  309. package/src/extensions/review/suggest.ts +512 -0
  310. package/src/extensions/review/suggestions-overlay.test.ts +58 -0
  311. package/src/extensions/review/suggestions-overlay.ts +50 -0
  312. package/src/extensions/review/track-changes.test.ts +101 -0
  313. package/src/extensions/review/track-changes.ts +215 -0
  314. package/src/extensions/{busy.ts → state/busy.ts} +1 -0
  315. package/src/extensions/{focus.ts → state/focus.ts} +4 -0
  316. package/src/extensions/state/index.ts +8 -0
  317. package/src/extensions/{selection.ts → state/selection.ts} +3 -3
  318. package/src/extensions/streaming/index.ts +7 -0
  319. package/src/extensions/{pending → streaming/pending}/pending-text-stream.ts +10 -3
  320. package/src/extensions/{pending → streaming/pending}/pending-text.test.ts +1 -1
  321. package/src/extensions/{pending → streaming/pending}/pending-text.ts +20 -19
  322. package/src/extensions/{scrolling → streaming/scrolling}/auto-scroll.ts +9 -6
  323. package/src/extensions/{scrolling → streaming/scrolling}/scroll-past-end.ts +1 -0
  324. package/src/extensions/{scrolling → streaming/scrolling}/scrollbar-autohide.ts +13 -11
  325. package/src/extensions/{typewriter.ts → streaming/typewriter.ts} +46 -47
  326. package/src/extensions/structure/blocks/DESIGN.md +134 -0
  327. package/src/extensions/structure/blocks/blocks.test.ts +147 -0
  328. package/src/extensions/structure/blocks/blocks.ts +219 -0
  329. package/src/extensions/structure/blocks/drag.ts +996 -0
  330. package/src/extensions/structure/blocks/index.ts +8 -0
  331. package/src/extensions/structure/blocks/selection.test.ts +56 -0
  332. package/src/extensions/structure/blocks/selection.ts +279 -0
  333. package/src/extensions/structure/blocks/types.ts +22 -0
  334. package/src/extensions/{folding.ts → structure/folding/folding.ts} +12 -10
  335. package/src/extensions/structure/folding/index.ts +6 -0
  336. package/src/extensions/structure/folding/turns.test.ts +72 -0
  337. package/src/extensions/structure/folding/turns.ts +209 -0
  338. package/src/extensions/structure/index.ts +7 -0
  339. package/src/extensions/structure/outliner/DESIGN.md +183 -0
  340. package/src/extensions/structure/outliner/SPEC.mdl +305 -0
  341. package/src/extensions/{outliner → structure/outliner}/commands.ts +125 -42
  342. package/src/extensions/structure/outliner/dnd.test.ts +142 -0
  343. package/src/extensions/structure/outliner/dnd.ts +375 -0
  344. package/src/extensions/structure/outliner/editor.test.ts +85 -0
  345. package/src/extensions/{outliner → structure/outliner}/editor.ts +14 -9
  346. package/src/extensions/{outliner → structure/outliner}/index.ts +1 -0
  347. package/src/extensions/{outliner → structure/outliner}/menu.ts +48 -25
  348. package/src/extensions/structure/outliner/outliner.test.ts +193 -0
  349. package/src/extensions/structure/outliner/outliner.ts +183 -0
  350. package/src/extensions/{outliner → structure/outliner}/tree.test.ts +2 -2
  351. package/src/extensions/{outliner → structure/outliner}/tree.ts +1 -1
  352. package/src/headless.ts +13 -0
  353. package/src/styles/theme.ts +3 -1
  354. package/src/util/util.ts +3 -0
  355. package/dist/lib/browser/index.mjs +0 -9594
  356. package/dist/lib/browser/index.mjs.map +0 -7
  357. package/dist/lib/browser/meta.json +0 -1
  358. package/dist/lib/browser/types/index.mjs +0 -33
  359. package/dist/lib/browser/types/index.mjs.map +0 -7
  360. package/dist/lib/node-esm/index.mjs +0 -9596
  361. package/dist/lib/node-esm/index.mjs.map +0 -7
  362. package/dist/lib/node-esm/meta.json +0 -1
  363. package/dist/lib/node-esm/types/index.mjs +0 -35
  364. package/dist/lib/node-esm/types/index.mjs.map +0 -7
  365. package/dist/types/src/extensions/annotations.d.ts.map +0 -1
  366. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +0 -1
  367. package/dist/types/src/extensions/autocomplete/index.d.ts.map +0 -1
  368. package/dist/types/src/extensions/autocomplete/match.d.ts.map +0 -1
  369. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +0 -1
  370. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +0 -1
  371. package/dist/types/src/extensions/automerge/automerge.d.ts.map +0 -1
  372. package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +0 -1
  373. package/dist/types/src/extensions/automerge/cursor.d.ts.map +0 -1
  374. package/dist/types/src/extensions/automerge/defs.d.ts.map +0 -1
  375. package/dist/types/src/extensions/automerge/index.d.ts +0 -2
  376. package/dist/types/src/extensions/automerge/index.d.ts.map +0 -1
  377. package/dist/types/src/extensions/automerge/sync.d.ts.map +0 -1
  378. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +0 -1
  379. package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +0 -1
  380. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +0 -1
  381. package/dist/types/src/extensions/awareness/awareness.d.ts.map +0 -1
  382. package/dist/types/src/extensions/awareness/index.d.ts.map +0 -1
  383. package/dist/types/src/extensions/blast.d.ts.map +0 -1
  384. package/dist/types/src/extensions/blocks.d.ts +0 -2
  385. package/dist/types/src/extensions/blocks.d.ts.map +0 -1
  386. package/dist/types/src/extensions/bookmarks.d.ts.map +0 -1
  387. package/dist/types/src/extensions/busy.d.ts.map +0 -1
  388. package/dist/types/src/extensions/comments.d.ts.map +0 -1
  389. package/dist/types/src/extensions/debug.d.ts.map +0 -1
  390. package/dist/types/src/extensions/dnd.d.ts.map +0 -1
  391. package/dist/types/src/extensions/factories.d.ts.map +0 -1
  392. package/dist/types/src/extensions/factories.test.d.ts.map +0 -1
  393. package/dist/types/src/extensions/fader.d.ts.map +0 -1
  394. package/dist/types/src/extensions/focus.d.ts.map +0 -1
  395. package/dist/types/src/extensions/folding.d.ts.map +0 -1
  396. package/dist/types/src/extensions/hashtag.d.ts +0 -3
  397. package/dist/types/src/extensions/hashtag.d.ts.map +0 -1
  398. package/dist/types/src/extensions/json.d.ts +0 -7
  399. package/dist/types/src/extensions/json.d.ts.map +0 -1
  400. package/dist/types/src/extensions/listener.d.ts.map +0 -1
  401. package/dist/types/src/extensions/markdown/action.d.ts.map +0 -1
  402. package/dist/types/src/extensions/markdown/bundle.d.ts.map +0 -1
  403. package/dist/types/src/extensions/markdown/changes.d.ts.map +0 -1
  404. package/dist/types/src/extensions/markdown/changes.test.d.ts.map +0 -1
  405. package/dist/types/src/extensions/markdown/debug.d.ts.map +0 -1
  406. package/dist/types/src/extensions/markdown/decorate.d.ts.map +0 -1
  407. package/dist/types/src/extensions/markdown/formatting.d.ts.map +0 -1
  408. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +0 -1
  409. package/dist/types/src/extensions/markdown/highlight.d.ts.map +0 -1
  410. package/dist/types/src/extensions/markdown/image.d.ts.map +0 -1
  411. package/dist/types/src/extensions/markdown/image.test.d.ts.map +0 -1
  412. package/dist/types/src/extensions/markdown/index.d.ts.map +0 -1
  413. package/dist/types/src/extensions/markdown/link.d.ts +0 -7
  414. package/dist/types/src/extensions/markdown/link.d.ts.map +0 -1
  415. package/dist/types/src/extensions/markdown/parser.test.d.ts.map +0 -1
  416. package/dist/types/src/extensions/markdown/styles.d.ts.map +0 -1
  417. package/dist/types/src/extensions/markdown/table.d.ts.map +0 -1
  418. package/dist/types/src/extensions/marker.d.ts.map +0 -1
  419. package/dist/types/src/extensions/mention.d.ts.map +0 -1
  420. package/dist/types/src/extensions/modal.d.ts.map +0 -1
  421. package/dist/types/src/extensions/modes.d.ts.map +0 -1
  422. package/dist/types/src/extensions/outliner/commands.d.ts +0 -10
  423. package/dist/types/src/extensions/outliner/commands.d.ts.map +0 -1
  424. package/dist/types/src/extensions/outliner/editor.d.ts.map +0 -1
  425. package/dist/types/src/extensions/outliner/editor.test.d.ts.map +0 -1
  426. package/dist/types/src/extensions/outliner/index.d.ts.map +0 -1
  427. package/dist/types/src/extensions/outliner/menu.d.ts.map +0 -1
  428. package/dist/types/src/extensions/outliner/outliner.d.ts.map +0 -1
  429. package/dist/types/src/extensions/outliner/outliner.test.d.ts.map +0 -1
  430. package/dist/types/src/extensions/outliner/selection.d.ts +0 -12
  431. package/dist/types/src/extensions/outliner/selection.d.ts.map +0 -1
  432. package/dist/types/src/extensions/outliner/tree.d.ts.map +0 -1
  433. package/dist/types/src/extensions/outliner/tree.test.d.ts.map +0 -1
  434. package/dist/types/src/extensions/pending/index.d.ts.map +0 -1
  435. package/dist/types/src/extensions/pending/pending-text-stream.d.ts.map +0 -1
  436. package/dist/types/src/extensions/pending/pending-text-stream.test.d.ts.map +0 -1
  437. package/dist/types/src/extensions/pending/pending-text.d.ts.map +0 -1
  438. package/dist/types/src/extensions/pending/pending-text.test.d.ts.map +0 -1
  439. package/dist/types/src/extensions/pos.d.ts.map +0 -1
  440. package/dist/types/src/extensions/pos.test.d.ts.map +0 -1
  441. package/dist/types/src/extensions/replacer.d.ts.map +0 -1
  442. package/dist/types/src/extensions/replacer.test.d.ts.map +0 -1
  443. package/dist/types/src/extensions/scrolling/auto-scroll.d.ts.map +0 -1
  444. package/dist/types/src/extensions/scrolling/crawler.d.ts.map +0 -1
  445. package/dist/types/src/extensions/scrolling/index.d.ts.map +0 -1
  446. package/dist/types/src/extensions/scrolling/scroll-past-end.d.ts +0 -3
  447. package/dist/types/src/extensions/scrolling/scroll-past-end.d.ts.map +0 -1
  448. package/dist/types/src/extensions/scrolling/scrollbar-autohide.d.ts.map +0 -1
  449. package/dist/types/src/extensions/scrolling/scroller.d.ts.map +0 -1
  450. package/dist/types/src/extensions/selection.d.ts.map +0 -1
  451. package/dist/types/src/extensions/selection.test.d.ts.map +0 -1
  452. package/dist/types/src/extensions/snippets.d.ts.map +0 -1
  453. package/dist/types/src/extensions/spacing.d.ts.map +0 -1
  454. package/dist/types/src/extensions/state.d.ts +0 -2
  455. package/dist/types/src/extensions/state.d.ts.map +0 -1
  456. package/dist/types/src/extensions/submit.d.ts.map +0 -1
  457. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +0 -1
  458. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +0 -1
  459. package/dist/types/src/extensions/tags/index.d.ts.map +0 -1
  460. package/dist/types/src/extensions/tags/stub.d.ts +0 -35
  461. package/dist/types/src/extensions/tags/stub.d.ts.map +0 -1
  462. package/dist/types/src/extensions/tags/widgets/anchor.d.ts.map +0 -1
  463. package/dist/types/src/extensions/tags/widgets/index.d.ts.map +0 -1
  464. package/dist/types/src/extensions/tags/xml-block-decoration.d.ts +0 -31
  465. package/dist/types/src/extensions/tags/xml-block-decoration.d.ts.map +0 -1
  466. package/dist/types/src/extensions/tags/xml-formatting.d.ts.map +0 -1
  467. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +0 -1
  468. package/dist/types/src/extensions/tags/xml-util.d.ts.map +0 -1
  469. package/dist/types/src/extensions/tags/xml-util.test.d.ts.map +0 -1
  470. package/dist/types/src/extensions/typewriter.d.ts.map +0 -1
  471. package/dist/types/src/extensions/typewriter.test.d.ts.map +0 -1
  472. package/src/extensions/autocomplete/typeahead.ts +0 -87
  473. package/src/extensions/blocks.ts +0 -131
  474. package/src/extensions/markdown/link.ts +0 -49
  475. package/src/extensions/outliner/editor.test.ts +0 -33
  476. package/src/extensions/outliner/outliner.test.ts +0 -99
  477. package/src/extensions/outliner/outliner.ts +0 -166
  478. package/src/extensions/outliner/selection.ts +0 -50
  479. package/src/extensions/state.ts +0 -7
  480. package/src/extensions/tags/stub.ts +0 -80
  481. package/src/extensions/tags/xml-block-decoration.ts +0 -123
  482. package/dist/types/src/extensions/{dnd.d.ts → behavior/dnd.d.ts} +0 -0
  483. package/dist/types/src/extensions/{submit.d.ts → behavior/submit.d.ts} +0 -0
  484. package/dist/types/src/extensions/{automerge → collab/automerge}/automerge.d.ts +0 -0
  485. package/dist/types/src/extensions/{automerge → collab/automerge}/automerge.test.d.ts +0 -0
  486. package/dist/types/src/extensions/{automerge → collab/automerge}/sync.d.ts +0 -0
  487. package/dist/types/src/extensions/{awareness → collab/awareness}/awareness-provider.d.ts +0 -0
  488. package/dist/types/src/extensions/{awareness → collab/awareness}/index.d.ts +0 -0
  489. package/dist/types/src/extensions/{autocomplete → completion}/autocomplete.d.ts +0 -0
  490. package/dist/types/src/extensions/{autocomplete → completion}/placeholder.d.ts +0 -0
  491. package/dist/types/src/extensions/{factories.test.d.ts → core/factories.test.d.ts} +0 -0
  492. package/dist/types/src/extensions/{fader.d.ts → decoration/fader.d.ts} +0 -0
  493. package/dist/types/src/extensions/{marker.d.ts → decoration/marker.d.ts} +0 -0
  494. package/dist/types/src/extensions/{pos.test.d.ts → decoration/pos.test.d.ts} +0 -0
  495. package/dist/types/src/extensions/{replacer.test.d.ts → decoration/replacer.test.d.ts} +0 -0
  496. package/dist/types/src/extensions/{snippets.d.ts → demo/snippets.d.ts} +0 -0
  497. package/dist/types/src/extensions/{markdown → language/markdown}/action.d.ts +0 -0
  498. package/dist/types/src/extensions/{markdown → language/markdown}/bundle.d.ts +0 -0
  499. package/dist/types/src/extensions/{markdown → language/markdown}/changes.test.d.ts +0 -0
  500. package/dist/types/src/extensions/{markdown → language/markdown}/formatting.test.d.ts +0 -0
  501. package/dist/types/src/extensions/{markdown → language/markdown}/image.d.ts +0 -0
  502. package/dist/types/src/extensions/{markdown → language/markdown}/image.test.d.ts +0 -0
  503. package/dist/types/src/extensions/{markdown → language/markdown}/index.d.ts +0 -0
  504. package/dist/types/src/extensions/{markdown → language/markdown}/parser.test.d.ts +0 -0
  505. package/dist/types/src/extensions/{markdown → language/markdown}/table.d.ts +0 -0
  506. package/dist/types/src/extensions/{tags → language/xml}/extended-markdown.d.ts +0 -0
  507. package/dist/types/src/extensions/{tags → language/xml}/extended-markdown.test.d.ts +0 -0
  508. package/dist/types/src/extensions/{tags → language/xml}/index.d.ts +0 -0
  509. package/dist/types/src/extensions/{tags → language/xml}/widgets/anchor.d.ts +0 -0
  510. package/dist/types/src/extensions/{tags → language/xml}/widgets/index.d.ts +0 -0
  511. package/dist/types/src/extensions/{tags → language/xml}/xml-formatting.d.ts +0 -0
  512. package/dist/types/src/extensions/{tags → language/xml}/xml-util.d.ts +0 -0
  513. package/dist/types/src/extensions/{tags → language/xml}/xml-util.test.d.ts +0 -0
  514. package/dist/types/src/extensions/{modal.d.ts → state/modal.d.ts} +0 -0
  515. package/dist/types/src/extensions/{selection.test.d.ts → state/selection.test.d.ts} +0 -0
  516. package/dist/types/src/extensions/{pending → streaming/pending}/index.d.ts +0 -0
  517. package/dist/types/src/extensions/{pending → streaming/pending}/pending-text-stream.d.ts +0 -0
  518. package/dist/types/src/extensions/{pending → streaming/pending}/pending-text-stream.test.d.ts +0 -0
  519. package/dist/types/src/extensions/{pending → streaming/pending}/pending-text.test.d.ts +0 -0
  520. package/dist/types/src/extensions/{scrolling → streaming/scrolling}/auto-scroll.d.ts +0 -0
  521. package/dist/types/src/extensions/{scrolling → streaming/scrolling}/crawler.d.ts +0 -0
  522. package/dist/types/src/extensions/{scrolling → streaming/scrolling}/index.d.ts +0 -0
  523. package/dist/types/src/extensions/{scrolling → streaming/scrolling}/scrollbar-autohide.d.ts +0 -0
  524. package/dist/types/src/extensions/{scrolling → streaming/scrolling}/scroller.d.ts +0 -0
  525. package/dist/types/src/extensions/{typewriter.test.d.ts → streaming/typewriter.test.d.ts} +0 -0
  526. package/dist/types/src/extensions/{folding.d.ts → structure/folding/folding.d.ts} +0 -0
  527. package/dist/types/src/extensions/{outliner → structure/outliner}/editor.d.ts +0 -0
  528. package/dist/types/src/extensions/{outliner → structure/outliner}/editor.test.d.ts +0 -0
  529. package/dist/types/src/extensions/{outliner → structure/outliner}/outliner.d.ts +0 -0
  530. package/dist/types/src/extensions/{outliner → structure/outliner}/outliner.test.d.ts +0 -0
  531. package/dist/types/src/extensions/{outliner → structure/outliner}/tree.test.d.ts +0 -0
  532. package/src/extensions/{dnd.ts → behavior/dnd.ts} +29 -29
  533. package/src/extensions/{awareness → collab/awareness}/index.ts +0 -0
  534. package/src/extensions/{factories.test.ts → core/factories.test.ts} +0 -0
  535. package/src/extensions/{replacer.test.ts → decoration/replacer.test.ts} +0 -0
  536. package/src/extensions/{replacer.ts → decoration/replacer.ts} +25 -25
  537. /package/src/extensions/{markdown → language/markdown}/index.ts +0 -0
  538. /package/src/extensions/{tags → language/xml}/index.ts +0 -0
  539. /package/src/extensions/{tags → language/xml}/testing/text.md +0 -0
  540. /package/src/extensions/{tags → language/xml}/testing/text.txt +0 -0
  541. /package/src/extensions/{tags → language/xml}/widgets/anchor.ts +0 -0
  542. /package/src/extensions/{tags → language/xml}/widgets/index.ts +0 -0
  543. /package/src/extensions/{tags → language/xml}/xml-util.ts +0 -0
  544. /package/src/extensions/{modal.ts → state/modal.ts} +0 -0
  545. /package/src/extensions/{selection.test.ts → state/selection.test.ts} +0 -0
  546. /package/src/extensions/{pending → streaming/pending}/index.ts +0 -0
  547. /package/src/extensions/{pending → streaming/pending}/pending-text-stream.test.ts +0 -0
  548. /package/src/extensions/{scrolling → streaming/scrolling}/crawler.ts +0 -0
  549. /package/src/extensions/{scrolling → streaming/scrolling}/index.ts +0 -0
  550. /package/src/extensions/{scrolling → streaming/scrolling}/scroller.ts +0 -0
  551. /package/src/extensions/{typewriter.test.ts → streaming/typewriter.test.ts} +0 -0
@@ -0,0 +1,97 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { EditorSelection, type Extension, Prec, RangeSetBuilder } from '@codemirror/state';
6
+ import {
7
+ type Command,
8
+ Decoration,
9
+ type DecorationSet,
10
+ type EditorView,
11
+ ViewPlugin,
12
+ type ViewUpdate,
13
+ keymap,
14
+ } from '@codemirror/view';
15
+
16
+ import { type CompletionContext } from './match';
17
+ import { PlaceholderWidget } from './placeholder';
18
+
19
+ // TODO(burdon): Option to complete only at end of line.
20
+ export type TypeaheadOptions = {
21
+ onComplete?: (context: CompletionContext) => string | undefined;
22
+ };
23
+
24
+ /**
25
+ * Shows a completion placeholder.
26
+ */
27
+ export const typeahead = ({ onComplete }: TypeaheadOptions = {}): Extension => {
28
+ // Kept per-view (not in the factory closure) so a single extension instance shared across
29
+ // multiple editors does not leak completion state between them.
30
+ const typeaheadPlugin = ViewPlugin.fromClass(
31
+ class {
32
+ decorations: DecorationSet = Decoration.none;
33
+ hint: string | undefined;
34
+ update(update: ViewUpdate) {
35
+ // Only recompute on doc/selection changes; skip unrelated updates on this per-keystroke path.
36
+ if (!update.docChanged && !update.selectionSet) {
37
+ return;
38
+ }
39
+
40
+ const builder = new RangeSetBuilder<Decoration>();
41
+ const selection = update.view.state.selection.main;
42
+ const line = update.view.state.doc.lineAt(selection.from);
43
+
44
+ // TODO(burdon): Check at end of line and matches start of previous word.
45
+ // TODO(burdon): Context grammar.
46
+ this.hint = undefined;
47
+ if (selection.from === selection.to && selection.from === line.to) {
48
+ const str = update.state.sliceDoc(line.from, selection.from);
49
+ this.hint = onComplete?.({ line: str });
50
+ if (this.hint) {
51
+ builder.add(selection.from, selection.to, Decoration.widget({ widget: new PlaceholderWidget(this.hint) }));
52
+ }
53
+ }
54
+
55
+ this.decorations = builder.finish();
56
+ }
57
+ },
58
+ {
59
+ decorations: (value) => value.decorations,
60
+ },
61
+ );
62
+
63
+ const complete: Command = (view: EditorView) => {
64
+ const hint = view.plugin(typeaheadPlugin)?.hint;
65
+ if (!hint) {
66
+ return false;
67
+ }
68
+
69
+ const selection = view.state.selection.main;
70
+ view.dispatch({
71
+ changes: [{ from: selection.from, to: selection.to, insert: hint }],
72
+ selection: EditorSelection.cursor(selection.from + hint.length),
73
+ });
74
+
75
+ return true;
76
+ };
77
+
78
+ return [
79
+ typeaheadPlugin,
80
+
81
+ // Keys.
82
+ Prec.highest(
83
+ keymap.of([
84
+ {
85
+ key: 'Tab',
86
+ preventDefault: true,
87
+ run: complete,
88
+ },
89
+ {
90
+ key: 'ArrowRight',
91
+ preventDefault: true,
92
+ run: complete,
93
+ },
94
+ ]),
95
+ ),
96
+ ];
97
+ };
@@ -25,15 +25,14 @@ import { generateName } from '@dxos/display-name';
25
25
  import { Doc } from '@dxos/echo-doc';
26
26
  import { log } from '@dxos/log';
27
27
  import { type Messenger } from '@dxos/protocols';
28
- import { type Identity } from '@dxos/protocols/proto/dxos/client/services';
29
28
  import { type ChromaticPalette, type ThemeMode } from '@dxos/ui-types';
30
29
  import { hexToHue, isTruthy } from '@dxos/util';
31
30
 
32
- import { baseTheme, createFontTheme, editorGutter } from '../styles';
33
- import { automerge } from './automerge';
34
- import { SpaceAwarenessProvider, awareness } from './awareness';
35
- import { focus } from './focus';
36
- import { scrollPastEnd } from './scrolling';
31
+ import { baseTheme, createFontTheme, editorGutter } from '../../styles';
32
+ import { automerge } from '../collab/automerge';
33
+ import { SpaceAwarenessProvider, awareness } from '../collab/awareness';
34
+ import { focus } from '../state/focus';
35
+ import { scrollPastEnd } from '../streaming/scrolling';
37
36
 
38
37
  //
39
38
  // Basic
@@ -44,6 +43,9 @@ import { scrollPastEnd } from './scrolling';
44
43
  */
45
44
  export const tabbable = EditorView.contentAttributes.of({ tabindex: '0' });
46
45
 
46
+ /**
47
+ * Transaction filter that strips characters matching the given pattern from inserted text.
48
+ */
47
49
  export const filterChars = (chars: RegExp) => {
48
50
  return EditorState.transactionFilter.of((transaction) => {
49
51
  if (!transaction.docChanged) {
@@ -122,6 +124,10 @@ const keymaps: { [key: string]: readonly KeyBinding[] } = {
122
124
  default: defaultKeymap,
123
125
  };
124
126
 
127
+ /**
128
+ * Assembles the base editor setup: keymaps, history, bracket matching/closing, drop cursor,
129
+ * read-only handling, line wrapping, and tab handling.
130
+ */
125
131
  export const createBasicExtensions = (propsProp?: BasicExtensionsOptions): Extension => {
126
132
  const props = defaultsDeep({}, propsProp, defaultBasicOptions);
127
133
  return [
@@ -209,7 +215,7 @@ export type ThemeExtensionsOptions = {
209
215
 
210
216
  export const grow: ThemeExtensionsOptions['slots'] = {
211
217
  editor: {
212
- className: 'h-full w-full',
218
+ className: 'w-full h-full',
213
219
  },
214
220
  } as const;
215
221
 
@@ -265,32 +271,48 @@ export const createThemeExtensions = ({
265
271
  // Data
266
272
  //
267
273
 
274
+ /**
275
+ * Minimal identity shape consumed by awareness. Kept structural so both the
276
+ * client identity and the `@dxos/halo` `Identity.Info` can be passed without
277
+ * this foundational editor package depending on either.
278
+ */
279
+ export type DataExtensionsIdentity = {
280
+ /** Hex-encoded identity key, used as the awareness peer id. */
281
+ identityKey?: string;
282
+ displayName?: string;
283
+ /** Free-form profile metadata (e.g. `hue`). */
284
+ data?: Record<string, unknown>;
285
+ };
286
+
268
287
  export type DataExtensionsProps<T> = {
269
288
  id: string;
270
289
  text?: Doc.Accessor<T>;
271
290
  messenger?: Messenger;
272
- identity?: Identity | null;
291
+ identity?: DataExtensionsIdentity | null;
273
292
  };
274
293
 
294
+ /**
295
+ * Wires document sync (automerge) and presence (awareness) for a text accessor.
296
+ */
275
297
  export const createDataExtensions = <T>({ id, text, messenger, identity }: DataExtensionsProps<T>): Extension[] => {
276
298
  const extensions: Extension[] = [];
277
299
  if (text) {
278
300
  extensions.push(automerge(text));
279
301
  }
280
302
 
281
- if (messenger && identity) {
282
- const peerId = identity?.identityKey.toHex();
283
- const hue = (identity?.profile?.data?.hue as ChromaticPalette | undefined) ?? hexToHue(peerId ?? '0');
303
+ if (messenger && identity?.identityKey) {
304
+ const peerId = identity.identityKey;
305
+ const hue = (identity.data?.hue as ChromaticPalette | undefined) ?? hexToHue(peerId);
284
306
  extensions.push(
285
307
  awareness(
286
308
  new SpaceAwarenessProvider({
287
309
  messenger,
288
310
  channel: `awareness.${id}`,
289
- peerId: identity.identityKey.toHex(),
311
+ peerId,
290
312
  info: {
291
313
  darkColor: `var(--color-${hue}-border)`,
292
314
  lightColor: `var(--color-${hue}-border)`,
293
- displayName: identity.profile?.displayName ?? generateName(identity.identityKey.toHex()),
315
+ displayName: identity.displayName ?? generateName(peerId),
294
316
  },
295
317
  }),
296
318
  ),
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './factories';
6
+ export * from './modes';
@@ -7,7 +7,7 @@ import { keymap } from '@codemirror/view';
7
7
  import { vim } from '@replit/codemirror-vim';
8
8
  import { vscodeKeymap } from '@replit/codemirror-vscode-keymap';
9
9
 
10
- import { singleValueFacet } from '../util';
10
+ import { singleValueFacet } from '../../util';
11
11
 
12
12
  export type EditorInputConfig = {
13
13
  type?: string;
@@ -16,6 +16,9 @@ export type EditorInputConfig = {
16
16
 
17
17
  export const editorInputMode = singleValueFacet<EditorInputConfig>({});
18
18
 
19
+ /**
20
+ * Map of input-mode keymap bundles (default, vscode, vim).
21
+ */
19
22
  export const InputModeExtensions: { [mode: string]: Extension } = {
20
23
  default: [],
21
24
  vscode: [
@@ -5,6 +5,9 @@
5
5
  import { syntaxTree } from '@codemirror/language';
6
6
  import { type EditorState, type Extension, type RangeSet, StateField, type Transaction } from '@codemirror/state';
7
7
 
8
+ /**
9
+ * Logs every syntax-tree node type on each editor update (debug only).
10
+ */
8
11
  // eslint-disable-next-line no-console
9
12
  export const debugNodeLogger = (log: (...args: any[]) => void = console.log): Extension => {
10
13
  const logTokens = (state: EditorState) => syntaxTree(state).iterate({ enter: (node) => log(node.type) });
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './debug';
@@ -5,14 +5,12 @@
5
5
  import { type Extension, RangeSetBuilder } from '@codemirror/state';
6
6
  import { Decoration, type DecorationSet, EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';
7
7
 
8
- const annotationMark = Decoration.mark({ class: 'cm-annotation' });
9
-
10
8
  export type AnnotationOptions = {
11
9
  match?: RegExp; // TODO(burdon): Update via hook (e.g., for search).
12
10
  };
13
11
 
14
12
  /**
15
- *
13
+ * Wavy-underline decoration over regex matches in the viewport.
16
14
  */
17
15
  export const annotations = ({ match }: AnnotationOptions = {}): Extension => {
18
16
  return [
@@ -44,12 +42,16 @@ export const annotations = ({ match }: AnnotationOptions = {}): Extension => {
44
42
  },
45
43
  ),
46
44
 
47
- EditorView.theme({
48
- '.cm-annotation': {
49
- textDecoration: 'underline',
50
- textDecorationStyle: 'wavy',
51
- textDecorationColor: 'var(--color-error-text)',
52
- },
53
- }),
45
+ styles,
54
46
  ];
55
47
  };
48
+
49
+ const annotationMark = Decoration.mark({ class: 'cm-annotation' });
50
+
51
+ const styles = EditorView.theme({
52
+ '.cm-annotation': {
53
+ textDecoration: 'underline',
54
+ textDecorationStyle: 'wavy',
55
+ textDecorationColor: 'var(--color-error-text)',
56
+ },
57
+ });
@@ -0,0 +1,225 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Diagnostic, forEachDiagnostic, linter, setDiagnostics } from '@codemirror/lint';
6
+ import { ChangeSet, type Extension } from '@codemirror/state';
7
+ import { EditorView } from '@codemirror/view';
8
+
9
+ import { log } from '@dxos/log';
10
+ import { safeParseJson, trim } from '@dxos/util';
11
+
12
+ export type AssistantOptions = {
13
+ /**
14
+ * Instructions to use for the language model.
15
+ */
16
+ instructions?: string;
17
+ /**
18
+ * Show panel automatically.
19
+ */
20
+ autoPanel?: boolean;
21
+ /**
22
+ * Debounce delay.
23
+ */
24
+ delay?: number;
25
+ /**
26
+ * Invoke the language model with the given prompt and return the raw text response.
27
+ */
28
+ generate: (request: { instructions: string; content: string }) => Promise<string>;
29
+ };
30
+
31
+ /**
32
+ * LLM-backed proofreading linter that draws colored underlines and populates a lint panel.
33
+ */
34
+ export const assistant = (options: AssistantOptions): Extension[] => {
35
+ const styles = getComputedStyle(document.documentElement);
36
+ const style = {
37
+ info: styles.getPropertyValue('--color-green-500').trim(),
38
+ warning: styles.getPropertyValue('--color-orange-500').trim(),
39
+ error: styles.getPropertyValue('--color-rose-500').trim(),
40
+ };
41
+
42
+ return [
43
+ assistantLinter(options),
44
+ EditorView.baseTheme({
45
+ '.cm-lintRange-info': {
46
+ backgroundImage: underline(style.info),
47
+ },
48
+ '.cm-lintRange-warning': {
49
+ backgroundImage: underline(style.warning),
50
+ },
51
+ '.cm-lintRange-error': {
52
+ backgroundImage: underline(style.error),
53
+ },
54
+
55
+ '.cm-panels-bottom': {
56
+ borderTop: '1px solid var(--color-separator) !important',
57
+ },
58
+ '.cm-panel-lint .cm-panel': {
59
+ outline: 'none !important',
60
+ },
61
+ '.cm-panel button': {
62
+ color: 'var(--color-base-fg) !important',
63
+ },
64
+ '.cm-panel.cm-panel-lint ul': {
65
+ color: 'var(--color-base-fg) !important',
66
+ backgroundColor: 'var(--color-base-surface) !important',
67
+ marginRight: '2rem !important',
68
+ },
69
+ '.cm-panel.cm-panel-lint ul [aria-selected]': {
70
+ color: 'var(--color-base-fg) !important',
71
+ backgroundColor: 'var(--color-base-surface) !important',
72
+ },
73
+ '.cm-panel.cm-panel-lint ul li': {
74
+ display: 'grid',
75
+ gridTemplateColumns: '1fr auto',
76
+ alignItems: 'center',
77
+ },
78
+ '.cm-panel.cm-panel-lint ul li .cm-diagnosticText': {
79
+ paddingRight: '8px !important',
80
+ },
81
+ '.cm-panel.cm-panel-lint ul li button.cm-diagnosticAction': {
82
+ margin: 'none !important',
83
+ },
84
+ '.cm-diagnostic': {
85
+ padding: '0px 8px !important',
86
+ whiteSpace: 'pre-wrap !important',
87
+ },
88
+ '.cm-diagnostic-info': {
89
+ border: 'none !important',
90
+ },
91
+ }),
92
+ ];
93
+ };
94
+
95
+ const underline = (color: string) => {
96
+ const svg = trim`
97
+ <svg xmlns="http://www.w3.org/2000/svg" width="6" height="3">
98
+ <path d="m0 3 l2 -2 l1 0 l2 2 l1 0" stroke="${color}" fill="none" stroke-width="1"/>
99
+ </svg>
100
+ `;
101
+
102
+ return `url('data:image/svg+xml;base64,${btoa(svg)}') !important`;
103
+ };
104
+
105
+ //
106
+ // Linter
107
+ //
108
+
109
+ type Suggestion = {
110
+ original: string;
111
+ replacement: string;
112
+ context: string;
113
+ };
114
+
115
+ const isSuggestion = (value: unknown): value is Suggestion =>
116
+ typeof value === 'object' &&
117
+ value !== null &&
118
+ typeof (value as Suggestion).original === 'string' &&
119
+ typeof (value as Suggestion).replacement === 'string' &&
120
+ typeof (value as Suggestion).context === 'string';
121
+
122
+ /**
123
+ * Find the index of `original` within `content`, using `context` to disambiguate when there are multiple occurrences.
124
+ */
125
+ const findSuggestionIndex = (content: string, suggestion: Suggestion): number => {
126
+ const firstIdx = content.indexOf(suggestion.original);
127
+ if (firstIdx === -1) {
128
+ return -1;
129
+ }
130
+
131
+ // Check for duplicate occurrences; use context to disambiguate.
132
+ const secondIdx = content.indexOf(suggestion.original, firstIdx + 1);
133
+ if (secondIdx === -1) {
134
+ return firstIdx;
135
+ }
136
+
137
+ // Find the occurrence whose surrounding text best matches the context.
138
+ const contextIdx = content.indexOf(suggestion.context);
139
+ if (contextIdx !== -1) {
140
+ const contextEnd = contextIdx + suggestion.context.length;
141
+ if (secondIdx >= contextIdx && secondIdx <= contextEnd) {
142
+ return secondIdx;
143
+ }
144
+ }
145
+
146
+ return firstIdx;
147
+ };
148
+
149
+ const replaceTextAndDropLintAtRange = (view: EditorView, from: number, to: number, insert: string) => {
150
+ const kept: Diagnostic[] = [];
151
+ forEachDiagnostic(view.state, (diagnostic, diagnosticFrom, diagnosticTo) => {
152
+ if (diagnosticFrom < to && diagnosticTo > from) {
153
+ return;
154
+ }
155
+ kept.push({ ...diagnostic, from: diagnosticFrom, to: diagnosticTo });
156
+ });
157
+ const changeSet = ChangeSet.of({ from, to, insert }, view.state.doc.length);
158
+ const next = kept.map((d) => ({
159
+ ...d,
160
+ from: changeSet.mapPos(d.from, 1),
161
+ to: changeSet.mapPos(d.to, -1),
162
+ }));
163
+ view.dispatch({
164
+ changes: { from, to, insert },
165
+ ...setDiagnostics(view.state, next),
166
+ });
167
+ };
168
+
169
+ const DEFAULT_INSTRUCTIONS = trim`
170
+ Proofread the input text below.
171
+ Identify typos and grammatical errors.
172
+ Return ONLY a valid JSON array of objects with fields: "original" (string), "replacement" (string), "context" (string, 3-5 words around match).
173
+ --
174
+ `;
175
+
176
+ const assistantLinter = ({
177
+ generate,
178
+ instructions = DEFAULT_INSTRUCTIONS,
179
+ autoPanel = true,
180
+ delay = 2_000,
181
+ }: AssistantOptions) =>
182
+ linter(
183
+ async (view) => {
184
+ try {
185
+ const content = view.state.doc.toString();
186
+ const result = await generate({ instructions, content });
187
+
188
+ const [match] = result.match(/\[.*\]/s) ?? [];
189
+ const parsed = match ? safeParseJson<unknown[]>(match, []) : [];
190
+ const suggestions = Array.isArray(parsed) ? parsed.filter(isSuggestion) : [];
191
+ if (suggestions && suggestions.length > 0) {
192
+ const diagnostics: Diagnostic[] = [];
193
+ for (const suggestion of suggestions) {
194
+ const idx = findSuggestionIndex(content, suggestion);
195
+ if (idx !== -1) {
196
+ diagnostics.push({
197
+ from: idx,
198
+ to: idx + suggestion.original.length,
199
+ severity: 'info',
200
+ message: `Suggestion: ${suggestion.replacement}`,
201
+ actions: [
202
+ {
203
+ name: 'Apply',
204
+ apply: (view, from, to) => {
205
+ replaceTextAndDropLintAtRange(view, from, to, suggestion.replacement);
206
+ },
207
+ },
208
+ ],
209
+ });
210
+ }
211
+ }
212
+
213
+ return diagnostics;
214
+ }
215
+ } catch (err) {
216
+ log.catch(err);
217
+ }
218
+
219
+ return [];
220
+ },
221
+ {
222
+ delay,
223
+ autoPanel,
224
+ },
225
+ );
@@ -5,10 +5,6 @@
5
5
  import { type Extension, StateEffect, StateField } from '@codemirror/state';
6
6
  import { Decoration, type DecorationSet, EditorView, ViewPlugin } from '@codemirror/view';
7
7
 
8
- const DEFAULT_REMOVAL_DELAY = 5_000; // ms.
9
- const DEFAULT_COALESCE_WINDOW = 100; // ms.
10
- const CLEANUP_INTERVAL = 1_000; // ms.
11
-
12
8
  export type FaderOptions = {
13
9
  /** Time window in ms to coalesce adjacent appends into a single decoration. */
14
10
  coalesce?: number;
@@ -177,19 +173,21 @@ export const fader = (options: FaderOptions = {}): Extension => {
177
173
  },
178
174
  );
179
175
 
180
- return [
181
- fadeField,
182
- cleanup,
183
- EditorView.theme({
184
- '.cm-fader': {
185
- animation: 'fader 1s ease-out forwards',
186
- },
187
- '@keyframes fader': {
188
- '0%': {
189
- textShadow: '0 0 16px rgba(100, 200, 255, 1), 0 0 32px rgba(100, 200, 255, 0.6)',
190
- },
191
- '100%': {},
192
- },
193
- }),
194
- ];
176
+ return [fadeField, cleanup, styles];
195
177
  };
178
+
179
+ const DEFAULT_REMOVAL_DELAY = 5_000; // ms.
180
+ const DEFAULT_COALESCE_WINDOW = 100; // ms.
181
+ const CLEANUP_INTERVAL = 1_000; // ms.
182
+
183
+ const styles = EditorView.theme({
184
+ '.cm-fader': {
185
+ animation: 'fader 1s ease-out forwards',
186
+ },
187
+ '@keyframes fader': {
188
+ '0%': {
189
+ textShadow: '0 0 16px rgba(100, 200, 255, 1), 0 0 32px rgba(100, 200, 255, 0.6)',
190
+ },
191
+ '100%': {},
192
+ },
193
+ });
@@ -15,28 +15,10 @@ import {
15
15
 
16
16
  import { getHashStyles, mx } from '@dxos/ui-theme';
17
17
 
18
- class TagWidget extends WidgetType {
19
- constructor(private _text: string) {
20
- super();
21
- }
22
-
23
- toDOM(): HTMLSpanElement {
24
- const span = document.createElement('span');
25
- span.className = mx('cm-tag', getHashStyles(this._text).surface);
26
- span.textContent = this._text;
27
- return span;
28
- }
29
- }
30
-
31
- const tagMatcher = new MatchDecorator({
32
- regexp: /#(\w+)\W/g,
33
- decoration: (match) =>
34
- Decoration.replace({
35
- widget: new TagWidget(match[1]),
36
- }),
37
- });
38
-
39
18
  // TODO(burdon): Autocomplete from existing tags?
19
+ /**
20
+ * Replaces `#tag` occurrences with a styled atomic widget.
21
+ */
40
22
  export const hashtag = (): Extension => [
41
23
  ViewPlugin.fromClass(
42
24
  class {
@@ -58,11 +40,36 @@ export const hashtag = (): Extension => [
58
40
  },
59
41
  ),
60
42
 
61
- EditorView.theme({
62
- '.cm-tag': {
63
- borderRadius: '4px',
64
- marginRight: '6px',
65
- padding: '2px 6px',
66
- },
67
- }),
43
+ styles,
68
44
  ];
45
+
46
+ class TagWidget extends WidgetType {
47
+ constructor(private _text: string) {
48
+ super();
49
+ }
50
+
51
+ toDOM(): HTMLSpanElement {
52
+ const span = document.createElement('span');
53
+ span.className = mx('cm-tag', getHashStyles(this._text).surface);
54
+ span.textContent = this._text;
55
+ return span;
56
+ }
57
+ }
58
+
59
+ const tagMatcher = new MatchDecorator({
60
+ // `\w+` stops at the first non-word char, so no trailing boundary is needed; requiring one
61
+ // (e.g. `\W`) would consume that char and fail to match a tag at the end of the document.
62
+ regexp: /#(\w+)/g,
63
+ decoration: (match) =>
64
+ Decoration.replace({
65
+ widget: new TagWidget(match[1]),
66
+ }),
67
+ });
68
+
69
+ const styles = EditorView.theme({
70
+ '.cm-tag': {
71
+ borderRadius: '4px',
72
+ marginRight: '6px',
73
+ padding: '2px 6px',
74
+ },
75
+ });
@@ -0,0 +1,11 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './annotations';
6
+ export * from './assistant';
7
+ export * from './fader';
8
+ export * from './hashtag';
9
+ export * from './marker';
10
+ export * from './pos';
11
+ export * from './replacer';