@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
@@ -6,7 +6,7 @@ import { type Extension } from '@codemirror/state';
6
6
  import { Decoration, EditorView } from '@codemirror/view';
7
7
 
8
8
  import { Domino } from '@dxos/ui';
9
- import { hues } from '@dxos/ui-theme';
9
+ import { hues } from '@dxos/ui-types';
10
10
  import { type ChromaticPalette } from '@dxos/ui-types';
11
11
 
12
12
  /**
@@ -16,21 +16,6 @@ import { type ChromaticPalette } from '@dxos/ui-types';
16
16
  */
17
17
  export type MarkerHue = ChromaticPalette;
18
18
 
19
- const MARKED = ['.cm-marker > span', '.cm-marker-text'].join(', ');
20
-
21
- // Map `data-hue` to the standard ui-theme surface/foreground tokens (one rule per hue).
22
- const hueVars = Object.fromEntries(
23
- hues.flatMap((hue) =>
24
- ['.cm-marker', '.cm-marker-text'].map((selector) => [
25
- `${selector}[data-hue="${hue}"]`,
26
- {
27
- '--cm-marker-surface': `var(--color-${hue}-bg)`,
28
- '--cm-marker-text': `var(--color-${hue}-fg)`,
29
- },
30
- ]),
31
- ),
32
- );
33
-
34
19
  /**
35
20
  * Shared theme for hue-tinted markers and their inline button affordances. Include once per editor;
36
21
  * both `markerMark` (range marks) and `markerText` (widget spans) read from it.
@@ -39,12 +24,14 @@ export const markerTheme = (): Extension =>
39
24
  EditorView.theme({
40
25
  ...hueVars,
41
26
  // The comment-style surface "padding" is a box-shadow of the same colour so adjacent lines join.
42
- [MARKED]: {
27
+ // No `border-radius`: with `box-decoration-break: clone` every wrapped fragment would round its
28
+ // own corners, pinching the left/right edges of a multi-line span into jagged notches. Square
29
+ // corners let the per-line boxes stack into one continuous block with straight vertical edges.
30
+ '.cm-marker > span, .cm-marker-text': {
43
31
  boxDecorationBreak: 'clone',
44
32
  backgroundColor: 'var(--cm-marker-surface)',
45
33
  boxShadow: '0 0 0 3px var(--cm-marker-surface)',
46
34
  color: 'var(--cm-marker-text) !important',
47
- borderRadius: '0.25rem',
48
35
  },
49
36
  // `inline-block` (not flex) so the finalized + interim spans flow as one continuous block.
50
37
  '.cm-marker-text': {
@@ -141,3 +128,16 @@ export const markerButtons = (buttons: MarkerButton[]): Domino<HTMLElement> =>
141
128
  }),
142
129
  ),
143
130
  );
131
+
132
+ // Map `data-hue` to the standard ui-theme surface/foreground tokens (one rule per hue).
133
+ const hueVars = Object.fromEntries(
134
+ hues.flatMap((hue) =>
135
+ ['.cm-marker', '.cm-marker-text'].map((selector) => [
136
+ `${selector}[data-hue="${hue}"]`,
137
+ {
138
+ '--cm-marker-surface': `var(--color-${hue}-bg)`,
139
+ '--cm-marker-text': `var(--color-${hue}-fg)`,
140
+ },
141
+ ]),
142
+ ),
143
+ );
@@ -8,7 +8,16 @@ import { describe, test } from 'vitest';
8
8
 
9
9
  import { type Document, sourceHash } from '@dxos/nlp';
10
10
 
11
- import { clearAnalysis, pos, posAnalysisField, posDecorations, posSpans, setAnalysis, spanDiverged } from './pos';
11
+ import {
12
+ clearAnalysis,
13
+ pos,
14
+ posAnalysisField,
15
+ posDecorations,
16
+ posSpans,
17
+ posTokenAt,
18
+ setAnalysis,
19
+ spanDiverged,
20
+ } from './pos';
12
21
 
13
22
  describe('posAnalysisField', () => {
14
23
  const make = (doc = 'hello world') => EditorState.create({ doc, extensions: [posAnalysisField] });
@@ -73,6 +82,53 @@ describe('pos reactive initial parse', () => {
73
82
  });
74
83
  });
75
84
 
85
+ describe('posTokenAt', () => {
86
+ const analyzed = () => {
87
+ const text = 'XX hello world';
88
+ // Span starts at 3 so absolute token offsets exercise the span-relative mapping.
89
+ const document: Document = {
90
+ sourceHash: sourceHash('hello world'),
91
+ sentences: [
92
+ {
93
+ index: 0,
94
+ start: 0,
95
+ end: 11,
96
+ tokens: [
97
+ { index: 0, text: 'hello', upos: 'INTJ', start: 0, end: 5 },
98
+ { index: 1, text: 'world', upos: 'NOUN', start: 6, end: 11 },
99
+ ],
100
+ },
101
+ ],
102
+ };
103
+ return EditorState.create({ doc: text, extensions: [posAnalysisField] }).update({
104
+ effects: setAnalysis.of({ from: 3, to: 14, document }),
105
+ }).state;
106
+ };
107
+
108
+ test('resolves the token covering an absolute position', ({ expect }) => {
109
+ const state = analyzed();
110
+ expect(posTokenAt(state, 4)).toMatchObject({ from: 3, to: 8, upos: 'INTJ', stale: false });
111
+ expect(posTokenAt(state, 9)).toMatchObject({ from: 9, to: 14, upos: 'NOUN' });
112
+ });
113
+
114
+ test('returns undefined outside analyzed tokens', ({ expect }) => {
115
+ const state = analyzed();
116
+ expect(posTokenAt(state, 0)).toBeUndefined(); // Before the span.
117
+ expect(posTokenAt(state, 8)).toBeUndefined(); // Inter-token whitespace.
118
+ });
119
+ });
120
+
121
+ describe('pos options', () => {
122
+ test('popover option mounts alongside the underline default', ({ expect }) => {
123
+ // Both presentations are independent extensions; constructing a state with each combination
124
+ // must not throw and must retain the analysis field.
125
+ for (const options of [{ popover: true }, { underline: false, popover: true }, { underline: false }]) {
126
+ const state = EditorState.create({ doc: 'hello', extensions: [pos(options)] });
127
+ expect(posSpans(state)).toEqual([]);
128
+ }
129
+ });
130
+ });
131
+
76
132
  describe('spanDiverged', () => {
77
133
  test('detects when live span text no longer matches the stored hash', ({ expect }) => {
78
134
  const span = { from: 0, to: 5, sourceHash: sourceHash('hello'), document: docFor('hello'), stale: false };
@@ -3,11 +3,45 @@
3
3
  //
4
4
 
5
5
  import { type EditorState, type Extension, RangeSetBuilder, StateEffect, StateField } from '@codemirror/state';
6
- import { Decoration, EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';
6
+ import { Decoration, EditorView, ViewPlugin, type ViewUpdate, hoverTooltip } from '@codemirror/view';
7
7
 
8
8
  import { debounce } from '@dxos/async';
9
9
  import { type Document, type Upos, sourceHash } from '@dxos/nlp';
10
10
 
11
+ export type PosOptions = {
12
+ /** When set, the extension self-parses on idle and dispatches `setAnalysis`. */
13
+ parse?: (text: string) => Promise<Document>;
14
+ /** Idle debounce before reactive parsing (ms). */
15
+ debounceMs?: number;
16
+ /** Colored underline per UPOS tag (default true). */
17
+ underline?: boolean;
18
+ /** Hover popover naming the part of speech (default false). */
19
+ popover?: boolean;
20
+ };
21
+
22
+ /**
23
+ * Part-of-speech decoration extension.
24
+ * Renders per-word UPOS marks from analysis state held in a span-oriented state field, with
25
+ * independently switchable presentations: a colored underline per tag ({@link posTheme}) and a
26
+ * hover popover naming the part of speech ({@link posPopover}). State can be set externally via
27
+ * `setAnalysis`/`clearAnalysis`, or — when `options.parse` is supplied — self-driven on idle
28
+ * (reactive mode).
29
+ */
30
+ export const pos = ({ parse, debounceMs = 500, underline = true, popover = false }: PosOptions = {}): Extension => {
31
+ const extensions: Extension[] = [posAnalysisField, posDecorations, staleTheme];
32
+ if (underline) {
33
+ extensions.push(posTheme());
34
+ }
35
+ if (popover) {
36
+ extensions.push(posPopover());
37
+ }
38
+ if (parse) {
39
+ extensions.push(reactiveDriver(parse, debounceMs));
40
+ }
41
+
42
+ return extensions;
43
+ };
44
+
11
45
  /** One analyzed region of the document. `document` offsets are relative to the span's own text. */
12
46
  export type PosSpan = {
13
47
  from: number;
@@ -28,6 +62,10 @@ export const clearAnalysis = StateEffect.define<null>();
28
62
  /** Internal: mark a span stale (dispatched by the reactive driver on divergence). */
29
63
  export const markStale = StateEffect.define<{ from: number; to: number }>();
30
64
 
65
+ /**
66
+ * StateField holding the span-oriented part-of-speech analysis.
67
+ * Included by {@link pos}; exported for reads via {@link posSpans}.
68
+ */
31
69
  export const posAnalysisField = StateField.define<PosSpan[]>({
32
70
  create: () => [],
33
71
  update: (spans, tr) => {
@@ -67,6 +105,10 @@ export const posSpans = (state: EditorState): PosSpan[] => state.field(posAnalys
67
105
  const posMark = (upos: Upos, stale: boolean) =>
68
106
  Decoration.mark({ class: ['cm-pos', `cm-pos-${upos}`, stale && 'cm-pos-stale'].filter(Boolean).join(' ') });
69
107
 
108
+ /**
109
+ * Computes UPOS decoration marks from the analysis field.
110
+ * Included by {@link pos}.
111
+ */
70
112
  export const posDecorations = EditorView.decorations.compute([posAnalysisField], (state) => {
71
113
  const builder = new RangeSetBuilder<Decoration>();
72
114
  const spans = state.field(posAnalysisField);
@@ -109,29 +151,89 @@ const POS_HUE: Partial<Record<Upos, string>> = {
109
151
  PART: 'neutral',
110
152
  };
111
153
 
112
- export const posTheme = (): Extension =>
113
- EditorView.theme({
114
- '.cm-pos': { borderRadius: '0.125rem' },
115
- ...Object.fromEntries(
116
- Object.entries(POS_HUE).map(([upos, hue]) => [
117
- `.cm-pos-${upos}`,
118
- { borderBottom: `2px solid var(--color-${hue}-500)` },
119
- ]),
120
- ),
121
- '.cm-pos-stale': { opacity: '0.4' },
122
- });
154
+ /** Human-readable UPOS names (https://universaldependencies.org/u/pos/), shown in the hover popover. */
155
+ const UPOS_LABEL: Record<Upos, string> = {
156
+ ADJ: 'adjective',
157
+ ADP: 'adposition',
158
+ ADV: 'adverb',
159
+ AUX: 'auxiliary',
160
+ CCONJ: 'coordinating conjunction',
161
+ DET: 'determiner',
162
+ INTJ: 'interjection',
163
+ NOUN: 'noun',
164
+ NUM: 'numeral',
165
+ PART: 'particle',
166
+ PRON: 'pronoun',
167
+ PROPN: 'proper noun',
168
+ PUNCT: 'punctuation',
169
+ SCONJ: 'subordinating conjunction',
170
+ SYM: 'symbol',
171
+ VERB: 'verb',
172
+ X: 'other',
173
+ };
174
+
175
+ export type PosToken = {
176
+ from: number;
177
+ to: number;
178
+ upos: Upos;
179
+ stale: boolean;
180
+ };
181
+
182
+ /** Resolve the analyzed token covering an absolute document position, if any. */
183
+ export const posTokenAt = (state: EditorState, position: number): PosToken | undefined => {
184
+ const spans = state.field(posAnalysisField, false) ?? [];
185
+ for (const span of spans) {
186
+ if (position < span.from || position > span.to) {
187
+ continue;
188
+ }
189
+ for (const sentence of span.document.sentences) {
190
+ for (const token of sentence.tokens) {
191
+ const from = span.from + token.start;
192
+ const to = span.from + token.end;
193
+ if (position >= from && position < to && to <= state.doc.length) {
194
+ return { from, to, upos: token.upos, stale: span.stale };
195
+ }
196
+ }
197
+ }
198
+ }
199
+ return undefined;
200
+ };
201
+
202
+ /** Hover popover naming the part of speech of the token under the pointer. */
203
+ export const posPopover = (): Extension => [
204
+ hoverTooltip((view, position) => {
205
+ const token = posTokenAt(view.state, position);
206
+ if (!token) {
207
+ return null;
208
+ }
209
+ return {
210
+ pos: token.from,
211
+ end: token.to,
212
+ above: true,
213
+ create: () => {
214
+ const dom = document.createElement('div');
215
+ dom.className = 'cm-pos-popover';
216
+ const swatch = document.createElement('span');
217
+ swatch.className = 'cm-pos-swatch';
218
+ swatch.style.background = `var(--color-${POS_HUE[token.upos] ?? 'neutral'}-500)`;
219
+ const tag = document.createElement('span');
220
+ tag.className = 'cm-pos-popover-tag';
221
+ tag.textContent = token.upos;
222
+ const label = document.createElement('span');
223
+ label.className = 'cm-pos-popover-label';
224
+ label.textContent = UPOS_LABEL[token.upos];
225
+ dom.append(swatch, tag, label);
226
+ return { dom };
227
+ },
228
+ };
229
+ }),
230
+ popoverTheme,
231
+ ];
123
232
 
124
233
  /** A span has diverged when the current text under its (mapped) range no longer matches its hash. */
125
234
  export const spanDiverged = (docText: string, span: { from: number; to: number; sourceHash: string }): boolean =>
126
235
  sourceHash(docText.slice(span.from, span.to)) !== span.sourceHash;
127
236
 
128
- export type PosOptions = {
129
- /** When set, the extension self-parses on idle and dispatches `setAnalysis`. */
130
- parse?: (text: string) => Promise<Document>;
131
- /** Idle debounce before reactive parsing (ms). */
132
- debounceMs?: number;
133
- };
134
-
135
237
  /**
136
238
  * Reactive driver: on doc change, mark edit-touched spans stale (immediate visual feedback), then
137
239
  * after idle re-parse and dispatch fresh analysis. Re-hashing is bounded to spans overlapping the
@@ -192,15 +294,47 @@ const reactiveDriver = (parse: NonNullable<PosOptions['parse']>, debounceMs: num
192
294
  return [initial, onEdit];
193
295
  };
194
296
 
195
- /**
196
- * Part-of-speech decoration extension. Renders per-word UPOS marks from analysis state held in a
197
- * span-oriented state field. State can be set externally via `setAnalysis`/`clearAnalysis`, or — when
198
- * `options.parse` is supplied — self-driven on idle (reactive mode).
199
- */
200
- export const pos = (options: PosOptions = {}): Extension => {
201
- const extensions: Extension[] = [posAnalysisField, posDecorations, posTheme()];
202
- if (options.parse) {
203
- extensions.push(reactiveDriver(options.parse, options.debounceMs ?? 500));
204
- }
205
- return extensions;
206
- };
297
+ /** Colored underline per UPOS tag (stale dimming lives in the always-on base theme). */
298
+ export const posTheme = (): Extension =>
299
+ EditorView.theme({
300
+ '.cm-pos': {
301
+ borderRadius: '0.125rem',
302
+ },
303
+ ...Object.fromEntries(
304
+ Object.entries(POS_HUE).map(([upos, hue]) => [
305
+ `.cm-pos-${upos}`,
306
+ {
307
+ borderBottom: `2px solid var(--color-${hue}-500)`,
308
+ },
309
+ ]),
310
+ ),
311
+ });
312
+
313
+ // Stale dimming must apply even when the underline theme is disabled (e.g. popover-only mode), so a
314
+ // diverged span never presents confident decorations.
315
+ const staleTheme = EditorView.theme({
316
+ '.cm-pos-stale': {
317
+ opacity: '0.4',
318
+ },
319
+ });
320
+
321
+ const popoverTheme = EditorView.theme({
322
+ '.cm-pos-popover': {
323
+ display: 'flex',
324
+ alignItems: 'center',
325
+ gap: '6px',
326
+ padding: '2px 6px',
327
+ },
328
+ '.cm-pos-swatch': {
329
+ width: '8px',
330
+ height: '8px',
331
+ borderRadius: '2px',
332
+ flexShrink: '0',
333
+ },
334
+ '.cm-pos-popover-tag': {
335
+ fontWeight: '600',
336
+ },
337
+ '.cm-pos-popover-label': {
338
+ opacity: '0.7',
339
+ },
340
+ });
@@ -37,6 +37,9 @@ export const defaultOptions: BlastOptions = {
37
37
  shakeIntensity: 5,
38
38
  };
39
39
 
40
+ /**
41
+ * Particle 'code blast' cursor effect (demo/novelty).
42
+ */
40
43
  export const blast = (options: Partial<BlastOptions> = defaultOptions): Extension => {
41
44
  let blaster: Blaster | undefined;
42
45
  let last = 0;
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './blast';
6
+ export * from './snippets';
@@ -38,8 +38,12 @@ export const snippets = ({ delay = 75, items = defaultItems }: SnippetsOptions =
38
38
  run: (view) => {
39
39
  clearTimeout(timer);
40
40
  // TODO(burdon): Add space if needed.
41
+ if (items.length === 0) {
42
+ return false;
43
+ }
44
+
41
45
  const text = items[index++];
42
- if (index === items?.length) {
46
+ if (index >= items.length) {
43
47
  index = 0;
44
48
  }
45
49
 
@@ -2,38 +2,15 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export * from './annotations';
6
- export * from './autocomplete';
7
- export * from './automerge';
8
- export * from './awareness';
9
- export * from './blast';
10
- export * from './blocks';
11
- export * from './bookmarks';
12
- export * from './busy';
13
- export * from './comments';
5
+ export * from './behavior';
6
+ export * from './collab';
7
+ export * from './completion';
8
+ export * from './core';
14
9
  export * from './debug';
15
- export * from './dnd';
16
- export * from './factories';
17
- export * from './fader';
18
- export * from './focus';
19
- export * from './folding';
20
- export * from './hashtag';
21
- export * from './json';
22
- export * from './listener';
23
- export * from './marker';
24
- export * from './markdown';
25
- export * from './mention';
26
- export * from './modal';
27
- export * from './modes';
28
- export * from './outliner';
29
- export * from './pending';
30
- export * from './pos';
31
- export * from './replacer';
32
- export * from './scrolling';
33
- export * from './selection';
34
- export * from './spacing';
35
- export * from './snippets';
10
+ export * from './decoration';
11
+ export * from './demo';
12
+ export * from './language';
13
+ export * from './review';
36
14
  export * from './state';
37
- export * from './submit';
38
- export * from './tags';
39
- export * from './typewriter';
15
+ export * from './streaming';
16
+ export * from './structure';
@@ -0,0 +1,8 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './json';
6
+ export * from './markdown';
7
+ export * from './mermaid';
8
+ export * from './xml';
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './json';
@@ -2,18 +2,23 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { json, jsonParseLinter } from '@codemirror/lang-json';
5
+ import { json as jsonLanguage, jsonParseLinter } from '@codemirror/lang-json';
6
6
  import { type LintSource, linter } from '@codemirror/lint';
7
7
  import { type Extension } from '@codemirror/state';
8
8
  import Ajv, { type ValidateFunction } from 'ajv';
9
9
 
10
10
  import { type JsonSchema as JsonSchemaType } from '@dxos/echo/JsonSchema';
11
11
 
12
- export type JsonExtensionsOptions = {
12
+ export type JsonOptions = {
13
13
  schema?: JsonSchemaType;
14
14
  };
15
15
 
16
- export const createJsonExtensions = ({ schema }: JsonExtensionsOptions = {}): Extension => {
16
+ /**
17
+ * JSON editing extension: the JSON language (syntax highlighting, folding, bracket matching) plus a
18
+ * linter. When `schema` (a JSON Schema) is given the linter validates against it; otherwise it reports
19
+ * only parse errors.
20
+ */
21
+ export const json = ({ schema }: JsonOptions = {}): Extension => {
17
22
  let lintSource: LintSource = jsonParseLinter();
18
23
  if (schema) {
19
24
  // NOTE: Relaxing strict mode to allow additional custom schema properties.
@@ -22,7 +27,7 @@ export const createJsonExtensions = ({ schema }: JsonExtensionsOptions = {}): Ex
22
27
  lintSource = schemaLinter(validate);
23
28
  }
24
29
 
25
- return [json(), linter(lintSource)];
30
+ return [jsonLanguage(), linter(lintSource)];
26
31
  };
27
32
 
28
33
  const schemaLinter =
@@ -37,7 +42,7 @@ const schemaLinter =
37
42
  }
38
43
 
39
44
  return (
40
- validate.errors?.map((err: any) => ({
45
+ validate.errors?.map((err) => ({
41
46
  from: 0,
42
47
  to: jsonText.length,
43
48
  severity: 'error',
@@ -50,7 +55,7 @@ const schemaLinter =
50
55
  from: 0,
51
56
  to: view.state.doc.length,
52
57
  severity: 'error',
53
- message: 'Invalid JSON: ' + (err as Error).message,
58
+ message: 'Invalid JSON: ' + (err instanceof Error ? err.message : String(err)),
54
59
  },
55
60
  ];
56
61
  }
@@ -7,7 +7,7 @@ import { type EditorView } from '@codemirror/view';
7
7
  import { type Node } from '@dxos/app-graph';
8
8
  import { type MenuActionProperties } from '@dxos/ui-types';
9
9
 
10
- import { createComment } from '../comments';
10
+ import { createComment } from '../../review/comments';
11
11
  import {
12
12
  Inline,
13
13
  List,
@@ -11,9 +11,11 @@ import { languages } from '@codemirror/language-data';
11
11
  import { type Extension } from '@codemirror/state';
12
12
  import { keymap } from '@codemirror/view';
13
13
  import { type MarkdownConfig } from '@lezer/markdown';
14
+ import { mermaidLanguageDescription } from 'codemirror-lang-mermaid';
14
15
 
15
16
  import { isTruthy } from '@dxos/util';
16
17
 
18
+ import { mermaidHighlightStyle } from '../mermaid';
17
19
  import { markdownHighlightStyle, markdownTagsExtensions } from './highlight';
18
20
 
19
21
  export type MarkdownBundleOptions = {
@@ -47,8 +49,10 @@ export const createMarkdownExtensions = (options: MarkdownBundleOptions = {}): E
47
49
 
48
50
  // Languages for syntax highlighting fenced code blocks.
49
51
  // Caller-supplied languages are checked first so they can override defaults.
52
+ // Mermaid is registered here rather than by plugin-mermaid: `codeLanguages` is read once when
53
+ // the parser is built, so an extension contributed later cannot add a fenced-code language.
50
54
  defaultCodeLanguage: jsonLanguage,
51
- codeLanguages: [...(options.codeLanguages ?? []), ...languages],
55
+ codeLanguages: [...(options.codeLanguages ?? []), mermaidLanguageDescription, ...languages],
52
56
 
53
57
  // Don't complete HTML tags.
54
58
  completeHTMLTags: false,
@@ -66,6 +70,8 @@ export const createMarkdownExtensions = (options: MarkdownBundleOptions = {}): E
66
70
  }),
67
71
 
68
72
  // Custom styles.
73
+ // Fenced mermaid uses custom tags, so it needs its own style alongside markdown's.
74
+ syntaxHighlighting(mermaidHighlightStyle()),
69
75
  syntaxHighlighting(markdownHighlightStyle()),
70
76
 
71
77
  keymap.of(
@@ -2,7 +2,7 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { describe, expect, test } from 'vitest';
5
+ import { describe, test } from 'vitest';
6
6
 
7
7
  import { createLinkLabel } from './changes';
8
8
 
@@ -18,7 +18,7 @@ const testCases = [
18
18
  ];
19
19
 
20
20
  describe('changes', () => {
21
- test('createLinkLabel', () => {
21
+ test('createLinkLabel', ({ expect }) => {
22
22
  testCases.forEach(({ input, expected }) => {
23
23
  expect(createLinkLabel(new URL(input))).to.eq(expected);
24
24
  });
@@ -6,10 +6,10 @@ import { syntaxTree } from '@codemirror/language';
6
6
  import { type ChangeSpec, Transaction } from '@codemirror/state';
7
7
  import { type PluginValue, ViewPlugin, type ViewUpdate } from '@codemirror/view';
8
8
 
9
+ // TODO(burdon): Tests.
9
10
  /**
10
- * Monitors and augments changes.
11
+ * ViewPlugin that augments input and paste: auto-links pasted URLs and fixes task markers.
11
12
  */
12
- // TODO(burdon): Tests.
13
13
  export const adjustChanges = () => {
14
14
  return ViewPlugin.fromClass(
15
15
  class implements PluginValue {
@@ -6,6 +6,9 @@ import { syntaxTree } from '@codemirror/language';
6
6
  import { type EditorState, type Extension, StateField } from '@codemirror/state';
7
7
  import { type TreeCursor } from '@lezer/common';
8
8
 
9
+ /**
10
+ * StateField that serialises the syntax tree to JSON and invokes the callback on every state change (debug only).
11
+ */
9
12
  export const debugTree = (cb: (tree: DebugNode) => void): Extension =>
10
13
  StateField.define({
11
14
  create: (state) => cb(convertTreeToJson(state)),