@dxos/react-ui-editor 0.8.4-main.3a94e84 → 0.8.4-main.3c1ae3b

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 (378) hide show
  1. package/dist/lib/browser/{chunk-22UMM3QJ.mjs → chunk-HL3YF6WC.mjs} +2 -2
  2. package/dist/lib/browser/chunk-HL3YF6WC.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +4541 -2844
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/types/index.mjs +1 -1
  7. package/dist/lib/node-esm/{chunk-YXYQPV6R.mjs → chunk-YJZGD3LY.mjs} +2 -2
  8. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs.map +7 -0
  9. package/dist/lib/node-esm/index.mjs +4541 -2844
  10. package/dist/lib/node-esm/index.mjs.map +4 -4
  11. package/dist/lib/node-esm/meta.json +1 -1
  12. package/dist/lib/node-esm/types/index.mjs +1 -1
  13. package/dist/types/src/components/Editor/Editor.d.ts +37 -15
  14. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  15. package/dist/types/src/components/Editor/Editor.stories.d.ts +20 -0
  16. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -0
  17. package/dist/types/src/components/EditorContent/EditorContent.d.ts +29 -0
  18. package/dist/types/src/components/EditorContent/EditorContent.d.ts.map +1 -0
  19. package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts +26 -0
  20. package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorContent/controller.d.ts +10 -0
  22. package/dist/types/src/components/EditorContent/controller.d.ts.map +1 -0
  23. package/dist/types/src/components/EditorContent/index.d.ts +3 -0
  24. package/dist/types/src/components/EditorContent/index.d.ts.map +1 -0
  25. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts +36 -0
  26. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -0
  27. package/dist/types/src/components/EditorMenuProvider/index.d.ts +7 -0
  28. package/dist/types/src/components/EditorMenuProvider/index.d.ts.map +1 -0
  29. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts +4 -0
  30. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -0
  31. package/dist/types/src/components/EditorMenuProvider/menu.d.ts +28 -0
  32. package/dist/types/src/components/EditorMenuProvider/menu.d.ts.map +1 -0
  33. package/dist/types/src/components/EditorMenuProvider/popover.d.ts +47 -0
  34. package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -0
  35. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts +34 -0
  36. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -0
  37. package/dist/types/src/components/EditorMenuProvider/util.d.ts +8 -0
  38. package/dist/types/src/components/EditorMenuProvider/util.d.ts.map +1 -0
  39. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +16 -0
  40. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -0
  41. package/dist/types/src/components/EditorPreviewProvider/index.d.ts +2 -0
  42. package/dist/types/src/components/EditorPreviewProvider/index.d.ts.map +1 -0
  43. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +26 -2
  44. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  45. package/dist/types/src/components/EditorToolbar/actions.d.ts +39 -0
  46. package/dist/types/src/components/EditorToolbar/actions.d.ts.map +1 -0
  47. package/dist/types/src/components/EditorToolbar/blocks.d.ts +3 -3
  48. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  49. package/dist/types/src/components/EditorToolbar/formatting.d.ts +3 -3
  50. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  51. package/dist/types/src/components/EditorToolbar/headings.d.ts +3 -3
  52. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  53. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  54. package/dist/types/src/components/EditorToolbar/index.d.ts +2 -1
  55. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  56. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  57. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts +11 -0
  58. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts.map +1 -0
  59. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +3 -3
  60. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  61. package/dist/types/src/components/index.d.ts +4 -2
  62. package/dist/types/src/components/index.d.ts.map +1 -1
  63. package/dist/types/src/defaults.d.ts +0 -2
  64. package/dist/types/src/defaults.d.ts.map +1 -1
  65. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +17 -0
  66. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +1 -0
  67. package/dist/types/src/extensions/autocomplete/index.d.ts +5 -0
  68. package/dist/types/src/extensions/autocomplete/index.d.ts.map +1 -0
  69. package/dist/types/src/extensions/autocomplete/match.d.ts +13 -0
  70. package/dist/types/src/extensions/autocomplete/match.d.ts.map +1 -0
  71. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +20 -0
  72. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +1 -0
  73. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +10 -0
  74. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +1 -0
  75. package/dist/types/src/extensions/automerge/automerge.d.ts +1 -1
  76. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  77. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +10 -19
  78. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  79. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  80. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  81. package/dist/types/src/extensions/automerge/defs.d.ts +1 -1
  82. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
  83. package/dist/types/src/extensions/automerge/sync.d.ts +3 -3
  84. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  85. package/dist/types/src/extensions/automerge/update-automerge.d.ts +1 -1
  86. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  87. package/dist/types/src/extensions/autoscroll.d.ts +20 -0
  88. package/dist/types/src/extensions/autoscroll.d.ts.map +1 -0
  89. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +4 -4
  90. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
  91. package/dist/types/src/extensions/blocks.d.ts +2 -0
  92. package/dist/types/src/extensions/blocks.d.ts.map +1 -0
  93. package/dist/types/src/extensions/bookmarks.d.ts +12 -0
  94. package/dist/types/src/extensions/bookmarks.d.ts.map +1 -0
  95. package/dist/types/src/extensions/comments.d.ts +1 -1
  96. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  97. package/dist/types/src/extensions/dnd.d.ts.map +1 -1
  98. package/dist/types/src/extensions/factories.d.ts +15 -16
  99. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  100. package/dist/types/src/extensions/focus.d.ts.map +1 -1
  101. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  102. package/dist/types/src/extensions/index.d.ts +10 -1
  103. package/dist/types/src/extensions/index.d.ts.map +1 -1
  104. package/dist/types/src/extensions/json.d.ts +1 -1
  105. package/dist/types/src/extensions/json.d.ts.map +1 -1
  106. package/dist/types/src/extensions/listener.d.ts +8 -6
  107. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  108. package/dist/types/src/extensions/markdown/action.d.ts.map +1 -1
  109. package/dist/types/src/extensions/markdown/bundle.d.ts +8 -2
  110. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  111. package/dist/types/src/extensions/markdown/changes.d.ts +1 -1
  112. package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
  113. package/dist/types/src/extensions/markdown/decorate.d.ts +9 -1
  114. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  115. package/dist/types/src/extensions/markdown/formatting.d.ts +2 -4
  116. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  117. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +1 -1
  118. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
  119. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
  120. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  121. package/dist/types/src/extensions/modal.d.ts +7 -0
  122. package/dist/types/src/extensions/modal.d.ts.map +1 -0
  123. package/dist/types/src/extensions/modes.d.ts +1 -1
  124. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  125. package/dist/types/src/extensions/outliner/menu.d.ts +8 -0
  126. package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -0
  127. package/dist/types/src/extensions/outliner/outliner.d.ts +1 -1
  128. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
  129. package/dist/types/src/extensions/outliner/selection.d.ts.map +1 -1
  130. package/dist/types/src/extensions/outliner/tree.d.ts +2 -2
  131. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
  132. package/dist/types/src/extensions/preview/preview.d.ts +8 -8
  133. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  134. package/dist/types/src/extensions/replacer.d.ts +21 -0
  135. package/dist/types/src/extensions/replacer.d.ts.map +1 -0
  136. package/dist/types/src/extensions/replacer.test.d.ts +2 -0
  137. package/dist/types/src/extensions/replacer.test.d.ts.map +1 -0
  138. package/dist/types/src/extensions/scrolling.d.ts +78 -0
  139. package/dist/types/src/extensions/scrolling.d.ts.map +1 -0
  140. package/dist/types/src/extensions/state.d.ts +2 -0
  141. package/dist/types/src/extensions/state.d.ts.map +1 -0
  142. package/dist/types/src/extensions/submit.d.ts +10 -0
  143. package/dist/types/src/extensions/submit.d.ts.map +1 -0
  144. package/dist/types/src/extensions/tab.d.ts +4 -0
  145. package/dist/types/src/extensions/tab.d.ts.map +1 -0
  146. package/dist/types/src/extensions/tags/extended-markdown.d.ts +10 -0
  147. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +1 -0
  148. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +2 -0
  149. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +1 -0
  150. package/dist/types/src/extensions/tags/index.d.ts +4 -0
  151. package/dist/types/src/extensions/tags/index.d.ts.map +1 -0
  152. package/dist/types/src/extensions/tags/streamer.d.ts +12 -0
  153. package/dist/types/src/extensions/tags/streamer.d.ts.map +1 -0
  154. package/dist/types/src/extensions/tags/xml-tags.d.ts +97 -0
  155. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -0
  156. package/dist/types/src/extensions/tags/xml-util.d.ts +10 -0
  157. package/dist/types/src/extensions/tags/xml-util.d.ts.map +1 -0
  158. package/dist/types/src/hooks/useTextEditor.d.ts +5 -9
  159. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  160. package/dist/types/src/stories/CommandDialog.stories.d.ts +14 -0
  161. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
  162. package/dist/types/src/stories/Comments.stories.d.ts +22 -10
  163. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  164. package/dist/types/src/stories/EditorToolbar.stories.d.ts +39 -3
  165. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  166. package/dist/types/src/stories/Experimental.stories.d.ts +23 -13
  167. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  168. package/dist/types/src/stories/Markdown.stories.d.ts +33 -43
  169. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  170. package/dist/types/src/stories/Outliner.stories.d.ts +15 -21
  171. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  172. package/dist/types/src/stories/Popover.stories.d.ts +20 -0
  173. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  174. package/dist/types/src/stories/Preview.stories.d.ts +23 -7
  175. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  176. package/dist/types/src/stories/Tags.stories.d.ts +16 -0
  177. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  178. package/dist/types/src/stories/TextEditor.stories.d.ts +38 -52
  179. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  180. package/dist/types/src/stories/components/EditorStory.d.ts +15 -12
  181. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  182. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  183. package/dist/types/src/styles/markdown.d.ts +1 -1
  184. package/dist/types/src/styles/markdown.d.ts.map +1 -1
  185. package/dist/types/src/styles/theme.d.ts +6 -3
  186. package/dist/types/src/styles/theme.d.ts.map +1 -1
  187. package/dist/types/src/translations.d.ts +1 -1
  188. package/dist/types/src/types/types.d.ts +2 -2
  189. package/dist/types/src/types/types.d.ts.map +1 -1
  190. package/dist/types/src/util/cursor.d.ts.map +1 -1
  191. package/dist/types/src/util/debug.d.ts +5 -1
  192. package/dist/types/src/util/debug.d.ts.map +1 -1
  193. package/dist/types/src/util/decorations.d.ts +4 -0
  194. package/dist/types/src/util/decorations.d.ts.map +1 -0
  195. package/dist/types/src/util/dom.d.ts +2 -12
  196. package/dist/types/src/util/dom.d.ts.map +1 -1
  197. package/dist/types/src/util/index.d.ts +1 -0
  198. package/dist/types/src/util/index.d.ts.map +1 -1
  199. package/dist/types/src/util/react.d.ts +1 -1
  200. package/dist/types/src/util/react.d.ts.map +1 -1
  201. package/dist/types/tsconfig.tsbuildinfo +1 -1
  202. package/package.json +74 -68
  203. package/src/components/Editor/Editor.stories.tsx +89 -0
  204. package/src/components/Editor/Editor.tsx +160 -25
  205. package/src/components/EditorContent/EditorContent.stories.tsx +70 -0
  206. package/src/components/EditorContent/EditorContent.tsx +70 -0
  207. package/src/components/EditorContent/controller.ts +50 -0
  208. package/src/components/EditorContent/index.ts +6 -0
  209. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +233 -0
  210. package/src/components/EditorMenuProvider/index.ts +11 -0
  211. package/src/components/EditorMenuProvider/menu-presets.ts +123 -0
  212. package/src/components/EditorMenuProvider/menu.ts +71 -0
  213. package/src/components/EditorMenuProvider/popover.ts +287 -0
  214. package/src/components/EditorMenuProvider/useEditorMenu.ts +175 -0
  215. package/src/components/EditorMenuProvider/util.ts +31 -0
  216. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +82 -0
  217. package/src/components/EditorPreviewProvider/index.ts +5 -0
  218. package/src/components/EditorToolbar/EditorToolbar.tsx +116 -96
  219. package/src/components/EditorToolbar/actions.ts +86 -0
  220. package/src/components/EditorToolbar/blocks.ts +22 -24
  221. package/src/components/EditorToolbar/formatting.ts +23 -25
  222. package/src/components/EditorToolbar/headings.ts +17 -9
  223. package/src/components/EditorToolbar/image.ts +9 -5
  224. package/src/components/EditorToolbar/index.ts +3 -7
  225. package/src/components/EditorToolbar/search.ts +9 -5
  226. package/src/components/EditorToolbar/useEditorToolbar.ts +20 -0
  227. package/src/components/EditorToolbar/view-mode.ts +12 -6
  228. package/src/components/index.ts +8 -2
  229. package/src/defaults.ts +2 -17
  230. package/src/extensions/autocomplete/autocomplete.ts +151 -0
  231. package/src/extensions/autocomplete/index.ts +8 -0
  232. package/src/extensions/autocomplete/match.ts +46 -0
  233. package/src/extensions/{command → autocomplete}/placeholder.ts +22 -18
  234. package/src/extensions/{command → autocomplete}/typeahead.ts +8 -50
  235. package/src/extensions/automerge/automerge.stories.tsx +34 -26
  236. package/src/extensions/automerge/automerge.ts +31 -11
  237. package/src/extensions/automerge/cursor.ts +1 -1
  238. package/src/extensions/automerge/defs.ts +1 -1
  239. package/src/extensions/automerge/sync.ts +9 -5
  240. package/src/extensions/automerge/update-automerge.ts +2 -2
  241. package/src/extensions/autoscroll.ts +163 -0
  242. package/src/extensions/awareness/awareness-provider.ts +12 -12
  243. package/src/extensions/awareness/awareness.ts +2 -2
  244. package/src/extensions/blocks.ts +131 -0
  245. package/src/extensions/bookmarks.ts +75 -0
  246. package/src/extensions/comments.ts +20 -14
  247. package/src/extensions/dnd.ts +1 -1
  248. package/src/extensions/factories.ts +64 -46
  249. package/src/extensions/focus.ts +5 -4
  250. package/src/extensions/folding.tsx +3 -6
  251. package/src/extensions/hashtag.tsx +2 -2
  252. package/src/extensions/index.ts +10 -1
  253. package/src/extensions/json.ts +1 -1
  254. package/src/extensions/listener.ts +14 -20
  255. package/src/extensions/markdown/action.ts +2 -1
  256. package/src/extensions/markdown/bundle.ts +40 -6
  257. package/src/extensions/markdown/changes.ts +1 -1
  258. package/src/extensions/markdown/decorate.ts +95 -64
  259. package/src/extensions/markdown/formatting.test.ts +6 -6
  260. package/src/extensions/markdown/formatting.ts +11 -13
  261. package/src/extensions/markdown/highlight.ts +13 -13
  262. package/src/extensions/markdown/image.ts +5 -6
  263. package/src/extensions/markdown/link.ts +3 -0
  264. package/src/extensions/markdown/table.ts +13 -7
  265. package/src/extensions/mention.ts +1 -1
  266. package/src/extensions/modal.ts +24 -0
  267. package/src/extensions/modes.ts +2 -2
  268. package/src/extensions/{command/floating-menu.ts → outliner/menu.ts} +16 -21
  269. package/src/extensions/outliner/outliner.test.ts +3 -2
  270. package/src/extensions/outliner/outliner.ts +8 -7
  271. package/src/extensions/outliner/selection.ts +1 -1
  272. package/src/extensions/outliner/tree.test.ts +3 -2
  273. package/src/extensions/outliner/tree.ts +2 -2
  274. package/src/extensions/preview/index.ts +1 -1
  275. package/src/extensions/preview/preview.ts +69 -69
  276. package/src/extensions/replacer.test.ts +75 -0
  277. package/src/extensions/replacer.ts +93 -0
  278. package/src/extensions/scrolling.ts +189 -0
  279. package/src/extensions/selection.ts +3 -3
  280. package/src/extensions/state.ts +7 -0
  281. package/src/extensions/submit.ts +62 -0
  282. package/src/extensions/tab.ts +29 -0
  283. package/src/extensions/tags/extended-markdown.test.ts +263 -0
  284. package/src/extensions/tags/extended-markdown.ts +78 -0
  285. package/src/extensions/tags/index.ts +7 -0
  286. package/src/extensions/tags/streamer.ts +243 -0
  287. package/src/extensions/tags/xml-tags.ts +500 -0
  288. package/src/extensions/tags/xml-util.ts +94 -0
  289. package/src/extensions/typewriter.ts +1 -1
  290. package/src/hooks/useTextEditor.ts +31 -43
  291. package/src/stories/CommandDialog.stories.tsx +83 -0
  292. package/src/stories/Comments.stories.tsx +17 -14
  293. package/src/stories/EditorToolbar.stories.tsx +21 -20
  294. package/src/stories/Experimental.stories.tsx +17 -13
  295. package/src/stories/Markdown.stories.tsx +26 -22
  296. package/src/stories/Outliner.stories.tsx +51 -39
  297. package/src/stories/Popover.stories.tsx +162 -0
  298. package/src/stories/Preview.stories.tsx +56 -51
  299. package/src/stories/Tags.stories.tsx +95 -0
  300. package/src/stories/TextEditor.stories.tsx +43 -67
  301. package/src/stories/components/EditorStory.tsx +40 -29
  302. package/src/stories/components/util.tsx +40 -8
  303. package/src/styles/markdown.ts +2 -2
  304. package/src/styles/theme.ts +229 -209
  305. package/src/translations.ts +1 -1
  306. package/src/types/types.ts +1 -1
  307. package/src/util/cursor.ts +2 -1
  308. package/src/util/debug.ts +7 -2
  309. package/src/util/decorations.ts +21 -0
  310. package/src/util/dom.ts +5 -27
  311. package/src/util/index.ts +1 -0
  312. package/src/util/react.tsx +1 -1
  313. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
  314. package/dist/lib/browser/testing/index.mjs +0 -6
  315. package/dist/lib/browser/testing/index.mjs.map +0 -7
  316. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  317. package/dist/lib/node-esm/testing/index.mjs +0 -8
  318. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  319. package/dist/types/src/components/EditorToolbar/lists.d.ts +0 -19
  320. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +0 -1
  321. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -51
  322. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  323. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  324. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  325. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  326. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  327. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  328. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  329. package/dist/types/src/components/Popover/index.d.ts +0 -4
  330. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  331. package/dist/types/src/extensions/autocomplete.d.ts +0 -13
  332. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  333. package/dist/types/src/extensions/command/action.d.ts +0 -17
  334. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  335. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  336. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  337. package/dist/types/src/extensions/command/command.d.ts +0 -6
  338. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  339. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  340. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  341. package/dist/types/src/extensions/command/hint.d.ts +0 -24
  342. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  343. package/dist/types/src/extensions/command/index.d.ts +0 -7
  344. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  345. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  346. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  347. package/dist/types/src/extensions/command/state.d.ts +0 -16
  348. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  349. package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
  350. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  351. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  352. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  353. package/dist/types/src/stories/Command.stories.d.ts +0 -7
  354. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  355. package/dist/types/src/stories/CommandMenu.stories.d.ts +0 -13
  356. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  357. package/dist/types/src/testing/index.d.ts +0 -2
  358. package/dist/types/src/testing/index.d.ts.map +0 -1
  359. package/dist/types/src/testing/util.d.ts +0 -2
  360. package/dist/types/src/testing/util.d.ts.map +0 -1
  361. package/src/components/EditorToolbar/lists.ts +0 -59
  362. package/src/components/EditorToolbar/util.ts +0 -65
  363. package/src/components/Popover/CommandMenu.tsx +0 -279
  364. package/src/components/Popover/RefDropdownMenu.tsx +0 -85
  365. package/src/components/Popover/RefPopover.tsx +0 -99
  366. package/src/components/Popover/index.ts +0 -7
  367. package/src/extensions/autocomplete.ts +0 -69
  368. package/src/extensions/command/action.ts +0 -56
  369. package/src/extensions/command/command-menu.ts +0 -210
  370. package/src/extensions/command/command.ts +0 -34
  371. package/src/extensions/command/hint.ts +0 -102
  372. package/src/extensions/command/index.ts +0 -10
  373. package/src/extensions/command/state.ts +0 -89
  374. package/src/extensions/command/useCommandMenu.ts +0 -118
  375. package/src/stories/Command.stories.tsx +0 -97
  376. package/src/stories/CommandMenu.stories.tsx +0 -159
  377. package/src/testing/index.ts +0 -5
  378. package/src/testing/util.ts +0 -5
@@ -3,20 +3,21 @@
3
3
  //
4
4
 
5
5
  import { syntaxTree } from '@codemirror/language';
6
- import { RangeSetBuilder, type EditorState, StateEffect } from '@codemirror/state';
7
- import { EditorView, Decoration, type DecorationSet, WidgetType, ViewPlugin, type ViewUpdate } from '@codemirror/view';
6
+ import { type EditorState, Prec, RangeSetBuilder, StateEffect } from '@codemirror/state';
7
+ import { Decoration, type DecorationSet, EditorView, ViewPlugin, type ViewUpdate, WidgetType } from '@codemirror/view';
8
8
  import { type SyntaxNodeRef } from '@lezer/common';
9
9
 
10
10
  import { invariant } from '@dxos/invariant';
11
11
  import { mx } from '@dxos/react-ui-theme';
12
12
 
13
+ import { type HeadingLevel, markdownTheme } from '../../styles';
14
+ import { type RenderCallback } from '../../types';
15
+ import { wrapWithCatch } from '../../util';
16
+
13
17
  import { adjustChanges } from './changes';
14
18
  import { image } from './image';
15
- import { formattingStyles, bulletListIndentationWidth, orderedListIndentationWidth } from './styles';
19
+ import { bulletListIndentationWidth, formattingStyles, orderedListIndentationWidth } from './styles';
16
20
  import { table } from './table';
17
- import { theme, type HeadingLevel } from '../../styles';
18
- import { type RenderCallback } from '../../types';
19
- import { wrapWithCatch } from '../../util';
20
21
 
21
22
  /**
22
23
  * Unicode characters.
@@ -51,12 +52,12 @@ class LinkButton extends WidgetType {
51
52
  super();
52
53
  }
53
54
 
54
- override eq(other: this): boolean {
55
+ override eq(other: this) {
55
56
  return this.url === other.url;
56
57
  }
57
58
 
58
59
  // TODO(burdon): Create icon and link directly without react?
59
- override toDOM(view: EditorView): HTMLSpanElement {
60
+ override toDOM(view: EditorView) {
60
61
  const el = document.createElement('span');
61
62
  this.render(el, { url: this.url }, view);
62
63
  return el;
@@ -68,11 +69,15 @@ class CheckboxWidget extends WidgetType {
68
69
  super();
69
70
  }
70
71
 
71
- override eq(other: this): boolean {
72
+ override eq(other: this) {
72
73
  return this._checked === other._checked;
73
74
  }
74
75
 
75
- override toDOM(view: EditorView): HTMLSpanElement {
76
+ override ignoreEvent() {
77
+ return false;
78
+ }
79
+
80
+ override toDOM(view: EditorView) {
76
81
  const input = document.createElement('input');
77
82
  input.className = 'cm-task-checkbox dx-checkbox';
78
83
  input.type = 'checkbox';
@@ -104,10 +109,6 @@ class CheckboxWidget extends WidgetType {
104
109
  span.appendChild(input);
105
110
  return span;
106
111
  }
107
-
108
- override ignoreEvent(): boolean {
109
- return false;
110
- }
111
112
  }
112
113
 
113
114
  class TextWidget extends WidgetType {
@@ -168,8 +169,8 @@ const autoHideTags = new Set([
168
169
  type NumberingLevel = { type: string; from: number; to: number; level: number; number: number };
169
170
 
170
171
  const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boolean) => {
171
- const deco = new RangeSetBuilder<Decoration>();
172
- const atomicDeco = new RangeSetBuilder<Decoration>();
172
+ const decoRanges: { from: number; to: number; deco: Decoration }[] = [];
173
+ const atomicDecoRanges: { from: number; to: number; deco: Decoration }[] = [];
173
174
  const { state } = view;
174
175
 
175
176
  // Header numbering.
@@ -233,10 +234,10 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
233
234
  const mark = node.node.firstChild!;
234
235
  if (mark?.name === 'HeaderMark') {
235
236
  const { from, to = 6 } = options.numberedHeadings ?? {};
236
- const text = view.state.sliceDoc(node.from, node.to);
237
+ const text = state.sliceDoc(node.from, node.to);
237
238
  const len = text.match(/[#\s]+/)![0].length;
238
239
  if (!from || level < from || level > to) {
239
- atomicDeco.add(mark.from, mark.from + len, hide);
240
+ atomicDecoRanges.push({ from: mark.from, to: mark.from + len, deco: hide });
240
241
  } else {
241
242
  // TODO(burdon): Number format/style.
242
243
  const num =
@@ -246,13 +247,13 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
246
247
  .join('.') + ' ';
247
248
 
248
249
  if (num.length) {
249
- atomicDeco.add(
250
- mark.from,
251
- mark.from + len,
252
- Decoration.replace({
253
- widget: new TextWidget(num, theme.heading(level)),
250
+ atomicDecoRanges.push({
251
+ from: mark.from,
252
+ to: mark.from + len,
253
+ deco: Decoration.replace({
254
+ widget: new TextWidget(num, markdownTheme.heading(level)),
254
255
  }),
255
- );
256
+ });
256
257
  }
257
258
  }
258
259
  }
@@ -285,16 +286,16 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
285
286
 
286
287
  // Add line decoration for the continuation indent.
287
288
  // TODO(burdon): Bug if indentation is more than one indentation unit (e.g., 4 spaces) from the previous line.
288
- deco.add(
289
- line.from,
290
- line.from,
291
- Decoration.line({
289
+ decoRanges.push({
290
+ from: line.from,
291
+ to: line.from,
292
+ deco: Decoration.line({
292
293
  class: 'cm-list-item',
293
294
  attributes: {
294
295
  style: `padding-left: ${offset}px; text-indent: -${width}px;`,
295
296
  },
296
297
  }),
297
- );
298
+ });
298
299
 
299
300
  break;
300
301
  }
@@ -313,16 +314,16 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
313
314
  const label = list.type === 'OrderedList' ? `${++list.number}.` : Unicode.bulletSmall;
314
315
  const line = state.doc.lineAt(node.from);
315
316
  const to = state.doc.sliceString(node.to, node.to + 1) === ' ' ? node.to + 1 : node.to;
316
- atomicDeco.add(
317
- line.from,
317
+ atomicDecoRanges.push({
318
+ from: line.from,
318
319
  to,
319
- Decoration.replace({
320
+ deco: Decoration.replace({
320
321
  widget: new TextWidget(
321
322
  label,
322
323
  list.type === 'OrderedList' ? 'cm-list-mark cm-list-mark-ordered' : 'cm-list-mark cm-list-mark-bullet',
323
324
  ),
324
325
  }),
325
- );
326
+ });
326
327
  break;
327
328
  }
328
329
 
@@ -331,7 +332,7 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
331
332
  // Check if the next character is a space and if so, include it in the replacement.
332
333
  const line = state.doc.lineAt(node.from);
333
334
  const to = state.doc.sliceString(node.to, node.to + 1) === ' ' ? node.to + 1 : node.to;
334
- atomicDeco.add(line.from, to, checked ? checkedTask : uncheckedTask);
335
+ atomicDecoRanges.push({ from: line.from, to, deco: checked ? checkedTask : uncheckedTask });
335
336
  break;
336
337
  }
337
338
 
@@ -344,7 +345,7 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
344
345
  const quoteMark = node.node.getChild('QuoteMark');
345
346
  const paragraph = node.node.getChild('Paragraph');
346
347
  if (!editing && quoteMark && paragraph) {
347
- atomicDeco.add(quoteMark.from, paragraph.from, hide);
348
+ atomicDecoRanges.push({ from: quoteMark.from, to: paragraph.from, deco: hide });
348
349
  }
349
350
 
350
351
  for (const block of view.viewportLineBlocks) {
@@ -355,7 +356,7 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
355
356
  break;
356
357
  }
357
358
 
358
- deco.add(block.from, block.from, blockQuote);
359
+ decoRanges.push({ from: block.from, to: block.from, deco: blockQuote });
359
360
  }
360
361
 
361
362
  break;
@@ -378,14 +379,14 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
378
379
  const isFirst = block.from <= node.from;
379
380
  const isLast = block.to >= node.to && /^(\s>)*-->$/.test(state.doc.sliceString(block.from, block.to));
380
381
 
381
- deco.add(
382
- block.from,
383
- block.from,
384
- isFirst ? commentBlockLineFirst : isLast ? commentBlockLineLast : commentBlockLine,
385
- );
382
+ decoRanges.push({
383
+ from: block.from,
384
+ to: block.from,
385
+ deco: isFirst ? commentBlockLineFirst : isLast ? commentBlockLineLast : commentBlockLine,
386
+ });
386
387
 
387
388
  if (!editing && (isFirst || isLast)) {
388
- atomicDeco.add(block.from, block.to, hide);
389
+ atomicDecoRanges.push({ from: block.from, to: block.to, deco: hide });
389
390
  }
390
391
  }
391
392
  break;
@@ -406,11 +407,15 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
406
407
 
407
408
  const first = block.from <= node.from;
408
409
  const last = block.to >= node.to && /```$/.test(state.doc.sliceString(block.from, block.to));
409
- deco.add(block.from, block.from, first ? fencedCodeLineFirst : last ? fencedCodeLineLast : fencedCodeLine);
410
+ decoRanges.push({
411
+ from: block.from,
412
+ to: block.from,
413
+ deco: first ? fencedCodeLineFirst : last ? fencedCodeLineLast : fencedCodeLine,
414
+ });
410
415
 
411
416
  const editing = editingRange(state, node, focus);
412
417
  if (!editing && (first || last)) {
413
- atomicDeco.add(block.from, block.to, hide);
418
+ atomicDecoRanges.push({ from: block.from, to: block.to, deco: hide });
414
419
  }
415
420
  }
416
421
  return false;
@@ -426,14 +431,17 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
426
431
  const editing = editingRange(state, node, focus);
427
432
  if (urlNode && marks.length >= 2) {
428
433
  const url = state.sliceDoc(urlNode.from, urlNode.to);
434
+ if (options.skip?.({ name: 'Link', url })) {
435
+ break;
436
+ }
429
437
  if (!editing) {
430
- atomicDeco.add(node.from, marks[0].to, hide);
438
+ atomicDecoRanges.push({ from: node.from, to: marks[0].to, deco: hide });
431
439
  }
432
440
 
433
- deco.add(
434
- marks[0].to,
435
- marks[1].from,
436
- Decoration.mark({
441
+ decoRanges.push({
442
+ from: marks[0].to,
443
+ to: marks[1].from,
444
+ deco: Decoration.mark({
437
445
  tagName: 'a',
438
446
  attributes: {
439
447
  class: 'cm-link',
@@ -442,15 +450,16 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
442
450
  target: '_blank',
443
451
  },
444
452
  }),
445
- );
453
+ });
454
+
446
455
  if (!editing) {
447
- atomicDeco.add(
448
- marks[1].from,
449
- node.to,
450
- options.renderLinkButton
456
+ atomicDecoRanges.push({
457
+ from: marks[1].from,
458
+ to: node.to,
459
+ deco: options.renderLinkButton
451
460
  ? Decoration.replace({ widget: new LinkButton(url, options.renderLinkButton) })
452
461
  : hide,
453
- );
462
+ });
454
463
  }
455
464
  }
456
465
  break;
@@ -462,7 +471,7 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
462
471
 
463
472
  case 'HorizontalRule': {
464
473
  if (!editingRange(state, node, focus)) {
465
- deco.add(node.from, node.to, horizontalRule);
474
+ decoRanges.push({ from: node.from, to: node.to, deco: horizontalRule });
466
475
  }
467
476
  break;
468
477
  }
@@ -470,7 +479,7 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
470
479
  default: {
471
480
  if (autoHideTags.has(node.name)) {
472
481
  if (!editingRange(state, node.node.parent!, focus)) {
473
- atomicDeco.add(node.from, node.to, hide);
482
+ atomicDecoRanges.push({ from: node.from, to: node.to, deco: hide });
474
483
  }
475
484
  }
476
485
  }
@@ -493,18 +502,35 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
493
502
  tree.iterate({
494
503
  from,
495
504
  to,
496
- enter: wrapWithCatch(enterNode),
497
- leave: wrapWithCatch(leaveNode),
505
+ enter: wrapWithCatch(enterNode, 'decorate.enter'),
506
+ leave: wrapWithCatch(leaveNode, 'decorate.leave'),
498
507
  });
499
508
  }
500
509
  } else {
501
510
  // NOTE: If line numbering then we must iterate from the start of document.
502
511
  tree.iterate({
503
- enter: wrapWithCatch(enterNode),
504
- leave: wrapWithCatch(leaveNode),
512
+ enter: wrapWithCatch(enterNode, 'decorate.enter'),
513
+ leave: wrapWithCatch(leaveNode, 'decorate.leave'),
505
514
  });
506
515
  }
507
516
 
517
+ // Sort and build decoration sets.
518
+ const sortRanges = (a: { from: number; to: number }, b: { from: number; to: number }) =>
519
+ a.from - b.from || a.to - b.to;
520
+
521
+ decoRanges.sort(sortRanges);
522
+ atomicDecoRanges.sort(sortRanges);
523
+
524
+ const deco = new RangeSetBuilder<Decoration>();
525
+ for (const { from, to, deco: d } of decoRanges) {
526
+ deco.add(from, to, d);
527
+ }
528
+
529
+ const atomicDeco = new RangeSetBuilder<Decoration>();
530
+ for (const { from, to, deco: d } of atomicDecoRanges) {
531
+ atomicDeco.add(from, to, d);
532
+ }
533
+
508
534
  return {
509
535
  deco: deco.finish(),
510
536
  atomicDeco: atomicDeco.finish(),
@@ -513,15 +539,20 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
513
539
 
514
540
  const forceUpdate = StateEffect.define<null>();
515
541
 
542
+ export type NodeData = { name: 'Link'; url: string } | { name: 'Image'; url: string };
543
+
516
544
  export interface DecorateOptions {
517
545
  /**
518
546
  * Prevents triggering decorations as the cursor moves through the document.
519
547
  */
520
548
  selectionChangeDelay?: number;
521
549
  numberedHeadings?: { from: number; to?: number };
522
- renderLinkButton?: RenderCallback<{ url: string }>;
523
550
  // TODO(burdon): Additional padding for each line.
524
551
  listPaddingLeft?: number;
552
+ // TODO(burdon): Use consistently.
553
+ skip?: (node: NodeData) => boolean;
554
+ // TODO(burdon): Remove.
555
+ renderLinkButton?: RenderCallback<{ url: string }>;
525
556
  }
526
557
 
527
558
  export const decorateMarkdown = (options: DecorateOptions = {}) => {
@@ -577,9 +608,9 @@ export const decorateMarkdown = (options: DecorateOptions = {}) => {
577
608
  },
578
609
  {
579
610
  provide: (plugin) => [
580
- EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? Decoration.none),
611
+ Prec.low(EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? Decoration.none)),
581
612
  EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? Decoration.none),
582
- EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? Decoration.none),
613
+ EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? Decoration.none),
583
614
  ],
584
615
  },
585
616
  ),
@@ -7,21 +7,21 @@ import { EditorState, type StateCommand } from '@codemirror/state';
7
7
  import { describe, expect, test } from 'vitest';
8
8
 
9
9
  import {
10
+ type Formatting,
11
+ Inline,
12
+ List,
10
13
  addBlockquote,
11
14
  addCodeblock,
12
15
  addLink,
13
16
  addList,
14
17
  addStyle,
15
18
  getFormatting,
16
- removeStyle,
17
- removeLink,
18
- removeList,
19
19
  removeBlockquote,
20
20
  removeCodeblock,
21
+ removeLink,
22
+ removeList,
23
+ removeStyle,
21
24
  setHeading,
22
- Inline,
23
- List,
24
- type Formatting,
25
25
  } from './formatting';
26
26
 
27
27
  export const emptyFormatting: Formatting = {
@@ -7,20 +7,16 @@ import { syntaxTree } from '@codemirror/language';
7
7
  import {
8
8
  type ChangeSpec,
9
9
  EditorSelection,
10
- type Extension,
11
10
  type EditorState,
11
+ type Extension,
12
12
  type Line,
13
13
  type StateCommand,
14
14
  type Text,
15
15
  } from '@codemirror/state';
16
- import { EditorView, keymap, type ViewUpdate } from '@codemirror/view';
17
- import { type SyntaxNodeRef, type SyntaxNode } from '@lezer/common';
18
- import { useCallback, useMemo } from 'react';
16
+ import { EditorView, type ViewUpdate, keymap } from '@codemirror/view';
17
+ import { type SyntaxNode, type SyntaxNodeRef } from '@lezer/common';
19
18
 
20
19
  import { debounceAndThrottle } from '@dxos/async';
21
- import { type Live } from '@dxos/live-object';
22
-
23
- import { type EditorToolbarState } from '../../components';
24
20
 
25
21
  // Markdown refs:
26
22
  // https://github.github.com/gfm
@@ -1251,17 +1247,19 @@ export const getFormatting = (state: EditorState): Formatting => {
1251
1247
  /**
1252
1248
  * Hook provides an extension to compute the current formatting state.
1253
1249
  */
1254
- export const useFormattingState = (state: Live<EditorToolbarState>): Extension => {
1255
- const handleUpdate = useCallback(
1250
+ export const formattingListener = (stateProvider: () => Formatting | undefined, delay = 100): Extension => {
1251
+ return EditorView.updateListener.of(
1256
1252
  debounceAndThrottle((update: ViewUpdate) => {
1257
1253
  if (update.docChanged || update.selectionSet) {
1254
+ const state = stateProvider();
1255
+ if (!state) {
1256
+ return;
1257
+ }
1258
+
1258
1259
  Object.entries(getFormatting(update.state)).forEach(([key, active]) => {
1259
1260
  state[key as keyof Formatting] = active as any;
1260
1261
  });
1261
1262
  }
1262
- }, 100),
1263
- [state],
1263
+ }, delay),
1264
1264
  );
1265
-
1266
- return useMemo(() => EditorView.updateListener.of(handleUpdate), [handleUpdate]);
1267
1265
  };
@@ -4,10 +4,10 @@
4
4
 
5
5
  import { markdownLanguage } from '@codemirror/lang-markdown';
6
6
  import { HighlightStyle } from '@codemirror/language';
7
- import { tags, styleTags, Tag } from '@lezer/highlight';
7
+ import { Tag, styleTags, tags } from '@lezer/highlight';
8
8
  import { type MarkdownConfig, Table } from '@lezer/markdown';
9
9
 
10
- import { fontBody, theme } from '../../styles';
10
+ import { fontBody, markdownTheme } from '../../styles';
11
11
 
12
12
  /**
13
13
  * Custom tags defined and processed by the GFM lezer extension.
@@ -114,7 +114,7 @@ export const markdownHighlightStyle = (_options: HighlightOptions = {}) => {
114
114
  markdownTags.LinkReference,
115
115
  markdownTags.ListMark,
116
116
  ],
117
- class: theme.mark,
117
+ class: markdownTheme.mark,
118
118
  },
119
119
 
120
120
  // Markdown marks.
@@ -126,7 +126,7 @@ export const markdownHighlightStyle = (_options: HighlightOptions = {}) => {
126
126
  markdownTags.QuoteMark,
127
127
  markdownTags.EmphasisMark,
128
128
  ],
129
- class: theme.mark,
129
+ class: markdownTheme.mark,
130
130
  },
131
131
 
132
132
  // E.g., code block language (after ```).
@@ -136,22 +136,22 @@ export const markdownHighlightStyle = (_options: HighlightOptions = {}) => {
136
136
  tags.function(tags.variableName),
137
137
  tags.labelName,
138
138
  ],
139
- class: theme.codeMark,
139
+ class: markdownTheme.codeMark,
140
140
  },
141
141
 
142
142
  // Fonts.
143
143
  {
144
- tag: [tags.monospace],
144
+ tag: [tags.monospace, tags.comment],
145
145
  class: 'font-mono',
146
146
  },
147
147
 
148
148
  // Headings.
149
- { tag: tags.heading1, class: theme.heading(1) },
150
- { tag: tags.heading2, class: theme.heading(2) },
151
- { tag: tags.heading3, class: theme.heading(3) },
152
- { tag: tags.heading4, class: theme.heading(4) },
153
- { tag: tags.heading5, class: theme.heading(5) },
154
- { tag: tags.heading6, class: theme.heading(6) },
149
+ { tag: tags.heading1, class: markdownTheme.heading(1) },
150
+ { tag: tags.heading2, class: markdownTheme.heading(2) },
151
+ { tag: tags.heading3, class: markdownTheme.heading(3) },
152
+ { tag: tags.heading4, class: markdownTheme.heading(4) },
153
+ { tag: tags.heading5, class: markdownTheme.heading(5) },
154
+ { tag: tags.heading6, class: markdownTheme.heading(6) },
155
155
 
156
156
  // Emphasis.
157
157
  { tag: tags.emphasis, class: 'italic' },
@@ -165,7 +165,7 @@ export const markdownHighlightStyle = (_options: HighlightOptions = {}) => {
165
165
  // IMPORTANT: Therefore, the fenced code block will use the base editor font unless changed by an extension.
166
166
  {
167
167
  tag: [markdownTags.CodeText, markdownTags.InlineCode],
168
- class: theme.code,
168
+ class: markdownTheme.code,
169
169
  },
170
170
 
171
171
  {
@@ -17,8 +17,7 @@ export const image = (_options: ImageOptions = {}): Extension => {
17
17
  return [
18
18
  StateField.define<DecorationSet>({
19
19
  create: (state) => {
20
- // Process all images.
21
- return Decoration.set(buildDecorations(0, state.doc.length, state));
20
+ return Decoration.set(buildDecorations(state, 0, state.doc.length));
22
21
  },
23
22
  update: (value: DecorationSet, tr: Transaction) => {
24
23
  if (!tr.docChanged && !tr.selection) {
@@ -43,7 +42,7 @@ export const image = (_options: ImageOptions = {}): Extension => {
43
42
  filterFrom: from,
44
43
  filterTo: to,
45
44
  filter: () => false,
46
- add: buildDecorations(from, to, tr.state),
45
+ add: buildDecorations(tr.state, from, to),
47
46
  });
48
47
  },
49
48
  provide: (field) => EditorView.decorations.from(field),
@@ -51,7 +50,7 @@ export const image = (_options: ImageOptions = {}): Extension => {
51
50
  ];
52
51
  };
53
52
 
54
- const buildDecorations = (from: number, to: number, state: EditorState) => {
53
+ const buildDecorations = (state: EditorState, from: number, to: number) => {
55
54
  const decorations: Range<Decoration>[] = [];
56
55
  const cursor = state.selection.main.head;
57
56
  syntaxTree(state).iterate({
@@ -99,11 +98,11 @@ class ImageWidget extends WidgetType {
99
98
  super();
100
99
  }
101
100
 
102
- override eq(other: this): boolean {
101
+ override eq(other: this) {
103
102
  return this._url === other._url;
104
103
  }
105
104
 
106
- override toDOM(view: EditorView): HTMLImageElement {
105
+ override toDOM(view: EditorView) {
107
106
  const img = document.createElement('img');
108
107
  img.setAttribute('src', this._url);
109
108
  img.setAttribute('class', 'cm-image');
@@ -26,6 +26,9 @@ export const linkTooltip = (renderTooltip: RenderCallback<{ url: string }>) => {
26
26
  }
27
27
 
28
28
  const urlText = view.state.sliceDoc(url.from, url.to);
29
+ if (urlText.startsWith('dxn')) {
30
+ return null;
31
+ }
29
32
  return {
30
33
  pos: link.from,
31
34
  end: link.to,
@@ -94,7 +94,13 @@ const update = (state: EditorState, _options: TableOptions) => {
94
94
  } else {
95
95
  // Add class for styling.
96
96
  // TODO(burdon): Apply to each line?
97
- builder.add(table.from, table.to, Decoration.mark({ class: 'cm-table' }));
97
+ builder.add(
98
+ table.from,
99
+ table.to,
100
+ Decoration.mark({
101
+ class: 'cm-table',
102
+ }),
103
+ );
98
104
  }
99
105
  });
100
106
 
@@ -106,14 +112,18 @@ class TableWidget extends WidgetType {
106
112
  super();
107
113
  }
108
114
 
109
- override eq(other: this): boolean {
115
+ override eq(other: this) {
110
116
  return (
111
117
  this._table.header?.join() === other._table.header?.join() &&
112
118
  this._table.rows?.join() === other._table.rows?.join()
113
119
  );
114
120
  }
115
121
 
116
- override toDOM(view: EditorView): HTMLDivElement {
122
+ override ignoreEvent(e: Event): boolean {
123
+ return !/^mouse/.test(e.type);
124
+ }
125
+
126
+ override toDOM(_view: EditorView) {
117
127
  const div = document.createElement('div');
118
128
  const table = div.appendChild(document.createElement('table'));
119
129
 
@@ -137,8 +147,4 @@ class TableWidget extends WidgetType {
137
147
 
138
148
  return div;
139
149
  }
140
-
141
- override ignoreEvent(e: Event): boolean {
142
- return !/^mouse/.test(e.type);
143
- }
144
150
  }
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { autocompletion, type CompletionContext, type CompletionResult } from '@codemirror/autocomplete';
5
+ import { type CompletionContext, type CompletionResult, autocompletion } from '@codemirror/autocomplete';
6
6
  import type { Extension } from '@codemirror/state';
7
7
 
8
8
  import { log } from '@dxos/log';
@@ -0,0 +1,24 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { StateEffect, StateField } from '@codemirror/state';
6
+
7
+ export const modalStateEffect = StateEffect.define<boolean>();
8
+
9
+ /**
10
+ * Determines if a modal dialog (e.g., popover) is active.
11
+ */
12
+ export const modalStateField = StateField.define<boolean>({
13
+ create: () => false,
14
+ update: (value, tr) => {
15
+ let newValue = value;
16
+ for (const effect of tr.effects) {
17
+ if (effect.is(modalStateEffect)) {
18
+ newValue = effect.value;
19
+ }
20
+ }
21
+
22
+ return newValue;
23
+ },
24
+ });
@@ -11,7 +11,7 @@ import { singleValueFacet } from '../util';
11
11
 
12
12
  export type EditorInputConfig = {
13
13
  type?: string;
14
- noTabster?: boolean;
14
+ ignoreEscape?: boolean;
15
15
  };
16
16
 
17
17
  export const editorInputMode = singleValueFacet<EditorInputConfig>({});
@@ -26,7 +26,7 @@ export const InputModeExtensions: { [mode: string]: Extension } = {
26
26
  vim: [
27
27
  // https://github.com/replit/codemirror-vim
28
28
  vim(),
29
- editorInputMode.of({ type: 'vim', noTabster: true }),
29
+ editorInputMode.of({ type: 'vim', ignoreEscape: true }),
30
30
  keymap.of([
31
31
  {
32
32
  key: 'Alt-Escape',