@dxos/ui-editor 0.10.0 → 0.11.0

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
@@ -7,47 +7,7 @@ import { HighlightStyle } from '@codemirror/language';
7
7
  import { Tag, styleTags, tags } from '@lezer/highlight';
8
8
  import { type MarkdownConfig, Table } from '@lezer/markdown';
9
9
 
10
- import { fontBody, markdownTheme } from '../../styles';
11
-
12
- /**
13
- * Custom tags defined and processed by the GFM lezer extension.
14
- * https://github.com/lezer-parser/markdown
15
- * https://github.com/lezer-parser/markdown/blob/main/src/markdown.ts
16
- */
17
- export const markdownTags = {
18
- Blockquote: Tag.define(),
19
- CodeMark: Tag.define(),
20
- CodeText: Tag.define(),
21
- EmphasisMark: Tag.define(),
22
- HeaderMark: Tag.define(),
23
- InlineCode: Tag.define(),
24
- LinkLabel: Tag.define(),
25
- LinkReference: Tag.define(),
26
- ListMark: Tag.define(),
27
- QuoteMark: Tag.define(),
28
- URL: Tag.define(),
29
-
30
- // Custom.
31
- TableCell: Tag.define(),
32
- };
33
-
34
- // TODO(burdon): Customize table parser (make all content monospace).
35
- // https://github.com/lezer-parser/markdown/blob/main/src/extension.ts
36
- Table.defineNodes?.forEach((node: any) => {
37
- switch (node?.name) {
38
- case 'TableCell': {
39
- node.style = markdownTags.TableCell;
40
- break;
41
- }
42
- }
43
- });
44
-
45
- export const markdownTagsExtensions: MarkdownConfig[] = [
46
- Table,
47
- {
48
- props: [styleTags(markdownTags)],
49
- },
50
- ];
10
+ import { fontBody, markdownTheme } from '../../../styles';
51
11
 
52
12
  export type HighlightOptions = {};
53
13
 
@@ -189,3 +149,44 @@ export const markdownHighlightStyle = (_options: HighlightOptions = {}) => {
189
149
  },
190
150
  );
191
151
  };
152
+
153
+ /**
154
+ * Custom tags defined and processed by the GFM lezer extension.
155
+ * https://github.com/lezer-parser/markdown
156
+ * https://github.com/lezer-parser/markdown/blob/main/src/markdown.ts
157
+ */
158
+ export const markdownTags = {
159
+ Blockquote: Tag.define(),
160
+ CodeMark: Tag.define(),
161
+ CodeText: Tag.define(),
162
+ EmphasisMark: Tag.define(),
163
+ HeaderMark: Tag.define(),
164
+ InlineCode: Tag.define(),
165
+ LinkLabel: Tag.define(),
166
+ LinkReference: Tag.define(),
167
+ ListMark: Tag.define(),
168
+ QuoteMark: Tag.define(),
169
+ URL: Tag.define(),
170
+
171
+ // Custom.
172
+ TableCell: Tag.define(),
173
+ };
174
+
175
+ // TODO(burdon): Customize table parser (make all content monospace).
176
+ // https://github.com/lezer-parser/markdown/blob/main/src/extension.ts
177
+ Table.defineNodes?.forEach((node) => {
178
+ if (typeof node === 'object' && node !== null && node.name === 'TableCell') {
179
+ node.style = markdownTags.TableCell;
180
+ }
181
+ });
182
+
183
+ /**
184
+ * Lezer MarkdownConfig entries (GFM Table plus styleTags) contributed to the parser.
185
+ * Note: this is parser config, not an editor Extension.
186
+ */
187
+ export const markdownTagsExtensions: MarkdownConfig[] = [
188
+ Table,
189
+ {
190
+ props: [styleTags(markdownTags)],
191
+ },
192
+ ];
@@ -7,7 +7,7 @@ import { EditorState } from '@codemirror/state';
7
7
  import { EditorView } from '@codemirror/view';
8
8
  import { describe, test } from 'vitest';
9
9
 
10
- import { focus } from '../focus';
10
+ import { focus } from '../../state/focus';
11
11
  import { image } from './image';
12
12
 
13
13
  const createView = (doc: string, extensions: any[]) => {
@@ -13,12 +13,7 @@ import {
13
13
  } from '@codemirror/state';
14
14
  import { Decoration, type DecorationSet, EditorView, ViewPlugin, WidgetType } from '@codemirror/view';
15
15
 
16
- import { focusField } from '../focus';
17
-
18
- // Effect dispatched when the viewport extends (e.g., scrolling reveals new content). The state
19
- // field listens for this and rebuilds decorations across the full doc so images outside the
20
- // initial parse range get widgetized.
21
- const rebuildEffect = StateEffect.define<void>();
16
+ import { focusField } from '../../state/focus';
22
17
 
23
18
  export type ImageNodeData = { name: 'Image'; url: string };
24
19
 
@@ -85,6 +80,11 @@ export const image = (options: ImageOptions = {}): Extension => {
85
80
  ];
86
81
  };
87
82
 
83
+ // Effect dispatched when the viewport extends (e.g., scrolling reveals new content). The state
84
+ // field listens for this and rebuilds decorations across the full doc so images outside the
85
+ // initial parse range get widgetized.
86
+ const rebuildEffect = StateEffect.define<void>();
87
+
88
88
  const buildDecorations = (state: EditorState, from: number, to: number, options: ImageOptions = {}) => {
89
89
  const decorations: Range<Decoration>[] = [];
90
90
  const cursor = state.selection.main.head;
@@ -0,0 +1,58 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { EditorState } from '@codemirror/state';
6
+ import { EditorView } from '@codemirror/view';
7
+ import { describe, test } from 'vitest';
8
+
9
+ import { createMarkdownExtensions } from './bundle';
10
+ import { syncLinkLabels } from './link';
11
+
12
+ describe('syncLinkLabels', () => {
13
+ test('rewrites a label that has drifted from its target', ({ expect }) => {
14
+ const { doc, changed } = run('- [Old title](dxn:echo:@:01ABC)', () => 'New title');
15
+ expect(changed).to.be.true;
16
+ expect(doc).to.eq('- [New title](dxn:echo:@:01ABC)');
17
+ });
18
+
19
+ test('leaves the document alone when the label already matches', ({ expect }) => {
20
+ const { doc, changed } = run('- [Same](dxn:echo:@:01ABC)', () => 'Same');
21
+ expect(changed).to.be.false;
22
+ expect(doc).to.eq('- [Same](dxn:echo:@:01ABC)');
23
+ });
24
+
25
+ test('leaves unresolved links alone', ({ expect }) => {
26
+ const { doc, changed } = run('- [Docs](https://dxos.org)', () => undefined);
27
+ expect(changed).to.be.false;
28
+ expect(doc).to.eq('- [Docs](https://dxos.org)');
29
+ });
30
+
31
+ test('rewrites every stale link in the document', ({ expect }) => {
32
+ const labels: Record<string, string> = { 'dxn:echo:@:01A': 'First', 'dxn:echo:@:01B': 'Second' };
33
+ const { doc } = run('- [a](dxn:echo:@:01A)\n- [b](dxn:echo:@:01B)', (url) => labels[url]);
34
+ expect(doc).to.eq('- [First](dxn:echo:@:01A)\n- [Second](dxn:echo:@:01B)');
35
+ });
36
+
37
+ test('escapes brackets and newlines in the resolved label', ({ expect }) => {
38
+ const { doc } = run('- [a](dxn:echo:@:01A)', () => 'a [b]\n c');
39
+ expect(doc).to.eq('- [a b c](dxn:echo:@:01A)');
40
+ });
41
+
42
+ test('keeps the existing label when the resolved one is empty', ({ expect }) => {
43
+ // `[](url)` no longer parses as a Link, so the node would become invisible to later passes.
44
+ const { doc, changed } = run('- [Old title](dxn:echo:@:01ABC)', () => ' ');
45
+ expect(changed).to.be.false;
46
+ expect(doc).to.eq('- [Old title](dxn:echo:@:01ABC)');
47
+ });
48
+ });
49
+
50
+ const run = (doc: string, resolve: (url: string) => string | undefined): { doc: string; changed: boolean } => {
51
+ const view = new EditorView({ state: EditorState.create({ doc, extensions: [createMarkdownExtensions()] }) });
52
+ try {
53
+ const changed = syncLinkLabels(view, resolve);
54
+ return { doc: view.state.doc.toString(), changed };
55
+ } finally {
56
+ view.destroy();
57
+ }
58
+ };
@@ -0,0 +1,109 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ // Copyright CodeMirror
4
+ //
5
+
6
+ import { syntaxTree } from '@codemirror/language';
7
+ import { type ChangeSpec } from '@codemirror/state';
8
+ import { type EditorView, hoverTooltip } from '@codemirror/view';
9
+ import { type SyntaxNode } from '@lezer/common';
10
+
11
+ import { mx, surfaceShadow } from '@dxos/ui-theme';
12
+
13
+ import { type RenderCallback } from '../../../types';
14
+
15
+ export type LinkTooltipProps = {
16
+ render: RenderCallback<{ url: string }>;
17
+ };
18
+
19
+ // Internal object links render their own inline/block preview, so a raw-URI hover tooltip is noise.
20
+ const INTERNAL_SCHEMES = ['dxn:', 'echo:'];
21
+
22
+ /**
23
+ * Hover tooltip showing a rendered preview for markdown links (skips internal object URIs).
24
+ */
25
+ export const linkTooltip = ({ render }: LinkTooltipProps) => {
26
+ return hoverTooltip((view, pos, side) => {
27
+ const syntax = syntaxTree(view.state).resolveInner(pos, side);
28
+ let link = null;
29
+ for (let i = 0, node: SyntaxNode | null = syntax; !link && node && i < 5; node = node.parent, i++) {
30
+ link = node.name === 'Link' ? node : null;
31
+ }
32
+
33
+ const url = link && link.getChild('URL');
34
+ if (!url || !link) {
35
+ return null;
36
+ }
37
+
38
+ const urlText = view.state.sliceDoc(url.from, url.to);
39
+ if (INTERNAL_SCHEMES.some((scheme) => urlText.startsWith(scheme))) {
40
+ return null;
41
+ }
42
+
43
+ return {
44
+ pos: link.from,
45
+ end: link.to,
46
+ above: true,
47
+ create: () => {
48
+ const el = document.createElement('div');
49
+ el.className = tooltipClassName;
50
+ render(el, { url: urlText }, view);
51
+ return { dom: el, offset: { x: 0, y: 4 } };
52
+ },
53
+ };
54
+ });
55
+ };
56
+
57
+ /** Brackets and newlines would terminate the inline link, so they are folded into the label text. */
58
+ export const escapeLinkLabel = (label: string): string => label.replace(/[[\]]/g, '').replace(/\s+/g, ' ').trim();
59
+
60
+ /**
61
+ * Rewrites link labels that have drifted from their target's current label.
62
+ * The document holds the label so that it stays searchable and readable as plain markdown; this
63
+ * reconciles it whenever the caller can resolve a newer one.
64
+ *
65
+ * @param resolve Returns the target's label, or `undefined` when it is unknown (left untouched).
66
+ * @returns true if the document was changed.
67
+ */
68
+ export const syncLinkLabels = (view: EditorView, resolve: (url: string) => string | undefined): boolean => {
69
+ const { state } = view;
70
+ const changes: ChangeSpec[] = [];
71
+ syntaxTree(state).iterate({
72
+ enter: (node) => {
73
+ if (node.name !== 'Link') {
74
+ return;
75
+ }
76
+
77
+ const marks = node.node.getChildren('LinkMark');
78
+ const urlNode = node.node.getChild('URL');
79
+ if (!urlNode || marks.length < 2) {
80
+ return;
81
+ }
82
+
83
+ const label = resolve(state.sliceDoc(urlNode.from, urlNode.to));
84
+ if (label === undefined) {
85
+ return;
86
+ }
87
+
88
+ const [from, to] = [marks[0].to, marks[1].from];
89
+ const escaped = escapeLinkLabel(label);
90
+ // An empty label leaves `[](url)`, which no longer parses as a Link — the node would then be
91
+ // invisible to this pass, so a later rename could never repair it.
92
+ if (escaped.length > 0 && state.sliceDoc(from, to) !== escaped) {
93
+ changes.push({ from, to, insert: escaped });
94
+ }
95
+ },
96
+ });
97
+
98
+ if (changes.length === 0) {
99
+ return false;
100
+ }
101
+
102
+ view.dispatch({ changes, userEvent: 'sync.link' });
103
+ return true;
104
+ };
105
+
106
+ const tooltipClassName = mx(
107
+ 'inline-flex items-center p-1 max-w-64 text-sm bg-inverse-surface text-inverse-fg rounded-sm',
108
+ surfaceShadow({ elevation: 'positioned' }),
109
+ );
@@ -7,34 +7,6 @@ import { parser } from '@lezer/markdown';
7
7
  import { describe, test } from 'vitest';
8
8
 
9
9
  describe('parser', () => {
10
- // test.only('list-mark', () => {
11
- // const newParser = parser.configure({
12
- // parseBlock: [
13
- // {
14
- // name: 'ListItem',
15
- // parse: (cx, line) => {
16
- // console.log(`[${line.text}]`, cx.lineStart, line.text.length);
17
- // // line.skipSpace(1);
18
- // return true;
19
- // },
20
- // },
21
- // ],
22
- // });
23
- //
24
- // {
25
- // const result = newParser.parse(' - ');
26
- // testTree(result, 'Document(BulletList(ListItem(ListMark)))');
27
- // }
28
- // {
29
- // const result = newParser.parse('-x');
30
- // testTree(result, 'Document(Paragraph)');
31
- // }
32
- // {
33
- // const result = newParser.parse('- x');
34
- // testTree(result, 'Document(BulletList(ListItem(ListMark,Paragraph)))');
35
- // }
36
- // });
37
-
38
10
  // https://www.markdownguide.org/basic-syntax/#lists-1
39
11
  test('lists', () => {
40
12
  // Indented list must have 4 spaces.
@@ -4,11 +4,14 @@
4
4
 
5
5
  import { EditorView } from '@codemirror/view';
6
6
 
7
- import { fontMono } from '../../styles';
7
+ import { fontBody, fontMono } from '../../../styles';
8
8
 
9
9
  export const bulletListIndentationWidth = 24;
10
10
  export const orderedListIndentationWidth = 36; // TODO(burdon): Make variable length based on number of digits.
11
11
 
12
+ /**
13
+ * EditorView theme with CSS for horizontal rules, lists, blockquotes, code, tasks, tables, and images.
14
+ */
12
15
  export const formattingStyles = EditorView.theme({
13
16
  /**
14
17
  * Horizontal rule.
@@ -27,13 +30,29 @@ export const formattingStyles = EditorView.theme({
27
30
  */
28
31
  '& .cm-list-item': {},
29
32
  '& .cm-list-mark': {
33
+ // Must be inline-block so the fixed width applies and the first-line text start matches the
34
+ // hanging indent (`text-indent: -width`) set on `.cm-list-item`.
30
35
  display: 'inline-block',
31
36
  textAlign: 'right',
32
37
  paddingRight: '0.5em',
38
+ // Being inline-block makes this a block container, so it would otherwise inherit the row's
39
+ // hanging indent and lay its own glyph out against a shifted line box.
40
+ textIndent: 0,
33
41
  fontVariant: 'tabular-nums',
42
+ // Anchor to the line top (not the baseline) so the inline-block marker — whose height already
43
+ // equals the line-height — fills the line box exactly instead of extending it and making a
44
+ // bulleted line taller than a plain one.
45
+ verticalAlign: 'top',
46
+ lineHeight: 'inherit',
34
47
  },
35
48
  '& .cm-list-mark-bullet': {
36
49
  width: `${bulletListIndentationWidth}px`,
50
+ // Centered (not right-aligned like an ordered marker, whose digits align on the last column) so
51
+ // the glyph lands on the same axis as a task checkbox, which fills the same box from its start.
52
+ textAlign: 'center',
53
+ // The rendered bullet widget sits inside the `ListMark` font-mono highlight span; a direct
54
+ // font-family on the widget overrides that inherited monospace so the bullet uses the body font.
55
+ fontFamily: fontBody,
37
56
  },
38
57
  '& .cm-list-mark-ordered': {
39
58
  width: `${orderedListIndentationWidth}px`,
@@ -111,26 +130,38 @@ export const formattingStyles = EditorView.theme({
111
130
  /**
112
131
  * Table.
113
132
  */
133
+ '.cm-table': {
134
+ borderCollapse: 'separate',
135
+ borderSpacing: '2px',
136
+ },
114
137
  '.cm-table *': {
115
- fontFamily: fontMono,
116
138
  lineHeight: 1.5,
117
- textDecoration: 'none !important',
139
+ },
140
+ '.cm-table-editor *': {
141
+ fontFamily: fontMono,
118
142
  },
119
143
  '.cm-table-head': {
120
- padding: '2px 16px 2px 0px',
144
+ padding: '4px 8px',
145
+ paddingRight: '24px',
121
146
  overflowWrap: 'break-word',
122
147
  whiteSpace: 'pre-wrap',
123
148
  wordBreak: 'keep-all',
124
149
  textAlign: 'left',
125
- color: 'var(--color-subdued)',
126
- borderBottom: '1px solid var(--color-cm-separator)',
150
+ textDecoration: 'none !important',
151
+ fontSize: 'small',
152
+ textTransform: 'uppercase',
153
+ color: 'var(--color-description)',
154
+ backgroundColor: 'var(--color-input-surface)',
155
+ // borderBottom: '1px solid var(--color-cm-separator)',
127
156
  },
128
157
  '.cm-table-cell': {
129
- padding: '2px 16px 2px 0px',
158
+ padding: '4px 8px',
130
159
  overflowWrap: 'break-word',
131
160
  whiteSpace: 'pre-wrap',
132
161
  wordBreak: 'keep-all',
133
162
  verticalAlign: 'top',
163
+ backgroundColor: 'var(--color-base-surface)',
164
+ fontVariantNumeric: 'tabular-nums',
134
165
  },
135
166
 
136
167
  /**
@@ -83,6 +83,7 @@ const update = (state: EditorState, _options: TableOptions) => {
83
83
  tables.forEach((table) => {
84
84
  const replace = state.readOnly || cursor < table.from || cursor > table.to;
85
85
  if (replace) {
86
+ // TODO(burdon): Compute left/right alignment based on column syntax.
86
87
  builder.add(
87
88
  table.from,
88
89
  table.to,
@@ -92,13 +93,11 @@ const update = (state: EditorState, _options: TableOptions) => {
92
93
  }),
93
94
  );
94
95
  } else {
95
- // Add class for styling.
96
- // TODO(burdon): Apply to each line?
97
96
  builder.add(
98
97
  table.from,
99
98
  table.to,
100
99
  Decoration.mark({
101
- class: 'cm-table',
100
+ class: 'cm-table-editor',
102
101
  }),
103
102
  );
104
103
  }
@@ -136,8 +135,8 @@ class TableWidget extends WidgetType {
136
135
 
137
136
  override eq(other: this) {
138
137
  return (
139
- this._table.header?.join() === other._table.header?.join() &&
140
- this._table.rows?.join() === other._table.rows?.join()
138
+ JSON.stringify(this._table.header) === JSON.stringify(other._table.header) &&
139
+ JSON.stringify(this._table.rows) === JSON.stringify(other._table.rows)
141
140
  );
142
141
  }
143
142
 
@@ -148,6 +147,7 @@ class TableWidget extends WidgetType {
148
147
  override toDOM(_view: EditorView) {
149
148
  const div = document.createElement('div');
150
149
  const table = div.appendChild(document.createElement('table'));
150
+ table.setAttribute('class', 'cm-table');
151
151
 
152
152
  const header = table.appendChild(document.createElement('thead'));
153
153
  const tr = header.appendChild(document.createElement('tr'));
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './mermaid';
@@ -0,0 +1,44 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { HighlightStyle, syntaxHighlighting } from '@codemirror/language';
6
+ import { type Extension } from '@codemirror/state';
7
+ import { flowchartTags, mermaid as mermaidLanguage, mermaidTags } from 'codemirror-lang-mermaid';
8
+
9
+ export type MermaidHighlightOptions = {};
10
+
11
+ /**
12
+ * `codemirror-lang-mermaid` emits its own tags rather than the standard `@lezer/highlight` ones, so
13
+ * no default highlight style matches them and the source renders unstyled without this.
14
+ *
15
+ * Only the distinctions worth drawing are styled — header, connectors, labels, comments — and the
16
+ * rest inherits, as in `markdownHighlightStyle`. Classes are semantic theme tokens so the palette
17
+ * follows light/dark rather than pinning syntax hues.
18
+ */
19
+ export const mermaidHighlightStyle = (_options: MermaidHighlightOptions = {}) =>
20
+ HighlightStyle.define([
21
+ // `flowchart`/`graph` and its direction, plus the `subgraph`/`end` keywords.
22
+ {
23
+ tag: [mermaidTags.diagramName, flowchartTags.diagramName, flowchartTags.keyword, flowchartTags.orientation],
24
+ class: 'text-primary-500',
25
+ },
26
+ // Connectors recede; the nodes they join are the content. `link` is the arrow itself (`-->`),
27
+ // so it must not be underlined — that reads as a hyperlink.
28
+ { tag: [flowchartTags.link, flowchartTags.nodeEdge], class: 'text-subdued' },
29
+ // Labels, on nodes and on edges. Node ids are left inheriting, as the backbone of the source.
30
+ {
31
+ tag: [flowchartTags.nodeText, flowchartTags.nodeEdgeText, flowchartTags.string, flowchartTags.number],
32
+ class: 'text-accent',
33
+ },
34
+ { tag: [flowchartTags.lineComment], class: 'text-description' },
35
+ ]);
36
+
37
+ /**
38
+ * Mermaid language support for a document that is entirely mermaid. For a fenced block inside
39
+ * markdown use `createMarkdownExtensions`, which registers mermaid as a fenced-code language.
40
+ */
41
+ export const createMermaidExtensions = (options: MermaidHighlightOptions = {}): Extension[] => [
42
+ mermaidLanguage(),
43
+ syntaxHighlighting(mermaidHighlightStyle(options)),
44
+ ];
@@ -7,7 +7,7 @@ a `WidgetType.toDOM()` creates a DOM placeholder, and React portals render conte
7
7
 
8
8
  ## `xmlTags` / `StubWidget`
9
9
 
10
- **Source:** `packages/ui/ui-editor/src/extensions/tags/xml-tags.ts`
10
+ **Source:** `packages/ui/ui-editor/src/extensions/language/xml/xml-tags.ts`
11
11
 
12
12
  **How it works:**
13
13
 
@@ -37,14 +37,14 @@ a `WidgetType.toDOM()` creates a DOM placeholder, and React portals render conte
37
37
 
38
38
  | File | Role |
39
39
  | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
40
- | `packages/ui/ui-editor/src/extensions/tags/xml-tags.ts` | Definition |
40
+ | `packages/ui/ui-editor/src/extensions/language/xml/xml-tags.ts` | Definition |
41
41
  | `packages/ui/react-ui-markdown/src/MarkdownStream/MarkdownStream.tsx` | Chat thread renderer — XML tags + dxn:/echo: url-scheme widgets |
42
42
  | `packages/plugins/plugin-assistant/src/components/ChatThread/registry.tsx` | Defines component registry (summary, surface, toolCall, toolResult, toolkit, json, inline factories) |
43
43
  | `packages/plugins/plugin-markdown/src/hooks/useExtensions.tsx` | Editor — registers `dxn-preview` (block) and `link-preview` (inline) url-scheme widgets |
44
44
  | `packages/plugins/plugin-inbox/src/components/MarkdownViewer/MarkdownViewer.tsx` | Read-only viewer — inline anchor chips via url-scheme registry |
45
45
  | `packages/ui/react-ui-transcription/src/components/Transcription/Transcription.tsx` | Transcription viewer — inline anchor chips via url-scheme registry |
46
46
  | `packages/ui/react-ui-editor/src/stories/Widgets.stories.tsx` | Stories: `XmlTags` (XML tag registry) and `Preview` (url-scheme registry with `EditorPreviewProvider`) |
47
- | `packages/ui/ui-editor/src/extensions/tags/xml-util.test.ts` | Unit tests |
47
+ | `packages/ui/ui-editor/src/extensions/language/xml/xml-tags.test.ts` | Unit tests |
48
48
  | `packages/ui/react-ui-markdown/src/MarkdownStream/MarkdownStream.stories.tsx` | Story defining dom-widget (factory) and react-widget (Component) |
49
49
 
50
50
  ---
@@ -10,6 +10,7 @@ import { describe, test } from 'vitest';
10
10
  import { trim } from '@dxos/util';
11
11
 
12
12
  import { extendedMarkdown } from './extended-markdown';
13
+ import { type XmlWidgetRegistry } from './xml-tags';
13
14
  import { nodeToJson } from './xml-util';
14
15
 
15
16
  const testRegistry = {
@@ -26,7 +27,7 @@ const testRegistry = {
26
27
  };
27
28
 
28
29
  describe('extended-markdown', () => {
29
- const createEditorState = (doc: string, registry?: Record<string, any>) => {
30
+ const createEditorState = (doc: string, registry?: XmlWidgetRegistry) => {
30
31
  return EditorState.create({
31
32
  doc,
32
33
  extensions: [extendedMarkdown({ registry: registry ?? testRegistry })],
@@ -7,6 +7,7 @@ import { type Extension } from '@codemirror/state';
7
7
  import { type ParseWrapper, parseMixed } from '@lezer/common';
8
8
  import { type BlockParser } from '@lezer/markdown';
9
9
 
10
+ import { escapeRegExpSource } from '../../../util';
10
11
  import { createMarkdownExtensions } from '../markdown';
11
12
  import { type XmlWidgetRegistry } from './xml-tags';
12
13
 
@@ -14,9 +15,6 @@ export type ExtendedMarkdownOptions = {
14
15
  registry?: XmlWidgetRegistry;
15
16
  };
16
17
 
17
- /** Escapes a string for safe embedding in RegExp source. */
18
- const escapeRegExpSource = (value: string) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
19
-
20
18
  /**
21
19
  * Extended markdown parser with mixed parser for custom rendering of XML tags.
22
20
  */
@@ -120,7 +118,7 @@ const xmlBlockParsers = (registry?: XmlWidgetRegistry): BlockParser[] => {
120
118
  */
121
119
  const mixedParser = (registry?: XmlWidgetRegistry): ParseWrapper => {
122
120
  const customTags = Object.keys(registry ?? {});
123
- const tagPattern = new RegExp(`<(${customTags.join('|')})`);
121
+ const tagPattern = new RegExp(`<(${customTags.map(escapeRegExpSource).join('|')})`);
124
122
 
125
123
  return parseMixed((node, input) => {
126
124
  switch (node.name) {