@dxos/react-ui-editor 0.8.4-main.67995b8 → 0.8.4-main.72ec0f3

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 (374) 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 +8336 -6712
  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 +8336 -6712
  10. package/dist/lib/node-esm/index.mjs.map +4 -4
  11. package/dist/lib/node-esm/meta.json +1 -1
  12. package/dist/lib/node-esm/types/index.mjs +1 -1
  13. package/dist/types/src/components/Editor/Editor.d.ts +37 -15
  14. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  15. package/dist/types/src/components/Editor/Editor.stories.d.ts +20 -0
  16. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -0
  17. package/dist/types/src/components/EditorContent/EditorContent.d.ts +29 -0
  18. package/dist/types/src/components/EditorContent/EditorContent.d.ts.map +1 -0
  19. package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts +26 -0
  20. package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorContent/controller.d.ts +10 -0
  22. package/dist/types/src/components/EditorContent/controller.d.ts.map +1 -0
  23. package/dist/types/src/components/EditorContent/index.d.ts +3 -0
  24. package/dist/types/src/components/EditorContent/index.d.ts.map +1 -0
  25. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts +36 -0
  26. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -0
  27. package/dist/types/src/components/EditorMenuProvider/index.d.ts +7 -0
  28. package/dist/types/src/components/EditorMenuProvider/index.d.ts.map +1 -0
  29. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts +4 -0
  30. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -0
  31. package/dist/types/src/components/EditorMenuProvider/menu.d.ts +28 -0
  32. package/dist/types/src/components/EditorMenuProvider/menu.d.ts.map +1 -0
  33. package/dist/types/src/components/EditorMenuProvider/popover.d.ts +47 -0
  34. package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -0
  35. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts +34 -0
  36. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -0
  37. package/dist/types/src/components/EditorMenuProvider/util.d.ts +8 -0
  38. package/dist/types/src/components/EditorMenuProvider/util.d.ts.map +1 -0
  39. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +16 -0
  40. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -0
  41. package/dist/types/src/components/EditorPreviewProvider/index.d.ts +2 -0
  42. package/dist/types/src/components/EditorPreviewProvider/index.d.ts.map +1 -0
  43. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +26 -2
  44. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  45. package/dist/types/src/components/EditorToolbar/actions.d.ts +39 -0
  46. package/dist/types/src/components/EditorToolbar/actions.d.ts.map +1 -0
  47. package/dist/types/src/components/EditorToolbar/blocks.d.ts +3 -3
  48. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  49. package/dist/types/src/components/EditorToolbar/formatting.d.ts +3 -3
  50. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  51. package/dist/types/src/components/EditorToolbar/headings.d.ts +3 -3
  52. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  53. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  54. package/dist/types/src/components/EditorToolbar/index.d.ts +2 -1
  55. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  56. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  57. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts +11 -0
  58. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts.map +1 -0
  59. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +3 -3
  60. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  61. package/dist/types/src/components/index.d.ts +4 -2
  62. package/dist/types/src/components/index.d.ts.map +1 -1
  63. package/dist/types/src/defaults.d.ts.map +1 -1
  64. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +17 -0
  65. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +1 -0
  66. package/dist/types/src/extensions/autocomplete/index.d.ts +5 -0
  67. package/dist/types/src/extensions/autocomplete/index.d.ts.map +1 -0
  68. package/dist/types/src/extensions/autocomplete/match.d.ts +13 -0
  69. package/dist/types/src/extensions/autocomplete/match.d.ts.map +1 -0
  70. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +20 -0
  71. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +1 -0
  72. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +10 -0
  73. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +1 -0
  74. package/dist/types/src/extensions/automerge/automerge.d.ts +1 -1
  75. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  76. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +10 -19
  77. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  78. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  79. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  80. package/dist/types/src/extensions/automerge/defs.d.ts +1 -1
  81. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
  82. package/dist/types/src/extensions/automerge/sync.d.ts +3 -3
  83. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  84. package/dist/types/src/extensions/automerge/update-automerge.d.ts +1 -1
  85. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  86. package/dist/types/src/extensions/autoscroll.d.ts +20 -0
  87. package/dist/types/src/extensions/autoscroll.d.ts.map +1 -0
  88. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +1 -1
  89. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
  90. package/dist/types/src/extensions/blocks.d.ts +2 -0
  91. package/dist/types/src/extensions/blocks.d.ts.map +1 -0
  92. package/dist/types/src/extensions/bookmarks.d.ts +12 -0
  93. package/dist/types/src/extensions/bookmarks.d.ts.map +1 -0
  94. package/dist/types/src/extensions/comments.d.ts +1 -1
  95. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  96. package/dist/types/src/extensions/dnd.d.ts.map +1 -1
  97. package/dist/types/src/extensions/factories.d.ts +11 -11
  98. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  99. package/dist/types/src/extensions/focus.d.ts.map +1 -1
  100. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  101. package/dist/types/src/extensions/index.d.ts +10 -1
  102. package/dist/types/src/extensions/index.d.ts.map +1 -1
  103. package/dist/types/src/extensions/json.d.ts +1 -1
  104. package/dist/types/src/extensions/json.d.ts.map +1 -1
  105. package/dist/types/src/extensions/listener.d.ts +8 -6
  106. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  107. package/dist/types/src/extensions/markdown/action.d.ts.map +1 -1
  108. package/dist/types/src/extensions/markdown/bundle.d.ts +8 -2
  109. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  110. package/dist/types/src/extensions/markdown/changes.d.ts +1 -1
  111. package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
  112. package/dist/types/src/extensions/markdown/decorate.d.ts +9 -1
  113. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  114. package/dist/types/src/extensions/markdown/formatting.d.ts +2 -4
  115. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  116. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +1 -1
  117. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
  118. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
  119. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  120. package/dist/types/src/extensions/modal.d.ts +7 -0
  121. package/dist/types/src/extensions/modal.d.ts.map +1 -0
  122. package/dist/types/src/extensions/modes.d.ts +1 -1
  123. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  124. package/dist/types/src/extensions/outliner/menu.d.ts +8 -0
  125. package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -0
  126. package/dist/types/src/extensions/outliner/outliner.d.ts +1 -1
  127. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
  128. package/dist/types/src/extensions/outliner/selection.d.ts.map +1 -1
  129. package/dist/types/src/extensions/outliner/tree.d.ts +2 -2
  130. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
  131. package/dist/types/src/extensions/preview/preview.d.ts +8 -8
  132. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  133. package/dist/types/src/extensions/replacer.d.ts +21 -0
  134. package/dist/types/src/extensions/replacer.d.ts.map +1 -0
  135. package/dist/types/src/extensions/replacer.test.d.ts +2 -0
  136. package/dist/types/src/extensions/replacer.test.d.ts.map +1 -0
  137. package/dist/types/src/extensions/scrolling.d.ts +78 -0
  138. package/dist/types/src/extensions/scrolling.d.ts.map +1 -0
  139. package/dist/types/src/extensions/state.d.ts +2 -0
  140. package/dist/types/src/extensions/state.d.ts.map +1 -0
  141. package/dist/types/src/extensions/submit.d.ts +10 -0
  142. package/dist/types/src/extensions/submit.d.ts.map +1 -0
  143. package/dist/types/src/extensions/tab.d.ts +4 -0
  144. package/dist/types/src/extensions/tab.d.ts.map +1 -0
  145. package/dist/types/src/extensions/tags/extended-markdown.d.ts +10 -0
  146. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +1 -0
  147. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +2 -0
  148. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +1 -0
  149. package/dist/types/src/extensions/tags/index.d.ts +4 -0
  150. package/dist/types/src/extensions/tags/index.d.ts.map +1 -0
  151. package/dist/types/src/extensions/tags/streamer.d.ts +12 -0
  152. package/dist/types/src/extensions/tags/streamer.d.ts.map +1 -0
  153. package/dist/types/src/extensions/tags/xml-tags.d.ts +97 -0
  154. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -0
  155. package/dist/types/src/extensions/tags/xml-util.d.ts +10 -0
  156. package/dist/types/src/extensions/tags/xml-util.d.ts.map +1 -0
  157. package/dist/types/src/hooks/useTextEditor.d.ts +5 -9
  158. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  159. package/dist/types/src/stories/CommandDialog.stories.d.ts +14 -0
  160. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
  161. package/dist/types/src/stories/Comments.stories.d.ts +21 -10
  162. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  163. package/dist/types/src/stories/EditorToolbar.stories.d.ts +39 -3
  164. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  165. package/dist/types/src/stories/Experimental.stories.d.ts +22 -13
  166. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  167. package/dist/types/src/stories/Markdown.stories.d.ts +32 -43
  168. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  169. package/dist/types/src/stories/Outliner.stories.d.ts +15 -21
  170. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  171. package/dist/types/src/stories/Popover.stories.d.ts +20 -0
  172. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  173. package/dist/types/src/stories/Preview.stories.d.ts +22 -7
  174. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  175. package/dist/types/src/stories/Tags.stories.d.ts +16 -0
  176. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  177. package/dist/types/src/stories/TextEditor.stories.d.ts +37 -52
  178. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  179. package/dist/types/src/stories/components/EditorStory.d.ts +8 -9
  180. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  181. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  182. package/dist/types/src/styles/theme.d.ts.map +1 -1
  183. package/dist/types/src/translations.d.ts +1 -1
  184. package/dist/types/src/types/types.d.ts +2 -2
  185. package/dist/types/src/types/types.d.ts.map +1 -1
  186. package/dist/types/src/util/cursor.d.ts.map +1 -1
  187. package/dist/types/src/util/debug.d.ts +5 -1
  188. package/dist/types/src/util/debug.d.ts.map +1 -1
  189. package/dist/types/src/util/decorations.d.ts +4 -0
  190. package/dist/types/src/util/decorations.d.ts.map +1 -0
  191. package/dist/types/src/util/dom.d.ts +2 -12
  192. package/dist/types/src/util/dom.d.ts.map +1 -1
  193. package/dist/types/src/util/index.d.ts +1 -0
  194. package/dist/types/src/util/index.d.ts.map +1 -1
  195. package/dist/types/src/util/react.d.ts +1 -1
  196. package/dist/types/src/util/react.d.ts.map +1 -1
  197. package/dist/types/tsconfig.tsbuildinfo +1 -1
  198. package/package.json +74 -72
  199. package/src/components/Editor/Editor.stories.tsx +89 -0
  200. package/src/components/Editor/Editor.tsx +160 -25
  201. package/src/components/EditorContent/EditorContent.stories.tsx +70 -0
  202. package/src/components/EditorContent/EditorContent.tsx +70 -0
  203. package/src/components/EditorContent/controller.ts +50 -0
  204. package/src/components/EditorContent/index.ts +6 -0
  205. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +233 -0
  206. package/src/components/EditorMenuProvider/index.ts +11 -0
  207. package/src/components/EditorMenuProvider/menu-presets.ts +123 -0
  208. package/src/components/EditorMenuProvider/menu.ts +71 -0
  209. package/src/components/EditorMenuProvider/popover.ts +287 -0
  210. package/src/components/EditorMenuProvider/useEditorMenu.ts +175 -0
  211. package/src/components/EditorMenuProvider/util.ts +31 -0
  212. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +82 -0
  213. package/src/components/EditorPreviewProvider/index.ts +5 -0
  214. package/src/components/EditorToolbar/EditorToolbar.tsx +116 -96
  215. package/src/components/EditorToolbar/actions.ts +86 -0
  216. package/src/components/EditorToolbar/blocks.ts +22 -24
  217. package/src/components/EditorToolbar/formatting.ts +23 -25
  218. package/src/components/EditorToolbar/headings.ts +17 -9
  219. package/src/components/EditorToolbar/image.ts +9 -5
  220. package/src/components/EditorToolbar/index.ts +3 -7
  221. package/src/components/EditorToolbar/search.ts +9 -5
  222. package/src/components/EditorToolbar/useEditorToolbar.ts +20 -0
  223. package/src/components/EditorToolbar/view-mode.ts +12 -6
  224. package/src/components/index.ts +8 -2
  225. package/src/defaults.ts +5 -2
  226. package/src/extensions/autocomplete/autocomplete.ts +151 -0
  227. package/src/extensions/autocomplete/index.ts +8 -0
  228. package/src/extensions/autocomplete/match.ts +46 -0
  229. package/src/extensions/{command → autocomplete}/placeholder.ts +22 -18
  230. package/src/extensions/{command → autocomplete}/typeahead.ts +8 -50
  231. package/src/extensions/automerge/automerge.stories.tsx +32 -25
  232. package/src/extensions/automerge/automerge.ts +31 -11
  233. package/src/extensions/automerge/cursor.ts +1 -1
  234. package/src/extensions/automerge/defs.ts +1 -1
  235. package/src/extensions/automerge/sync.ts +9 -5
  236. package/src/extensions/automerge/update-automerge.ts +2 -2
  237. package/src/extensions/autoscroll.ts +163 -0
  238. package/src/extensions/awareness/awareness-provider.ts +2 -2
  239. package/src/extensions/awareness/awareness.ts +2 -2
  240. package/src/extensions/blocks.ts +131 -0
  241. package/src/extensions/bookmarks.ts +75 -0
  242. package/src/extensions/comments.ts +20 -14
  243. package/src/extensions/dnd.ts +1 -1
  244. package/src/extensions/factories.ts +54 -35
  245. package/src/extensions/focus.ts +5 -4
  246. package/src/extensions/folding.tsx +3 -6
  247. package/src/extensions/hashtag.tsx +2 -2
  248. package/src/extensions/index.ts +10 -1
  249. package/src/extensions/json.ts +1 -1
  250. package/src/extensions/listener.ts +14 -20
  251. package/src/extensions/markdown/action.ts +2 -1
  252. package/src/extensions/markdown/bundle.ts +40 -6
  253. package/src/extensions/markdown/changes.ts +1 -1
  254. package/src/extensions/markdown/decorate.ts +32 -22
  255. package/src/extensions/markdown/formatting.test.ts +6 -6
  256. package/src/extensions/markdown/formatting.ts +11 -13
  257. package/src/extensions/markdown/highlight.ts +2 -2
  258. package/src/extensions/markdown/image.ts +5 -6
  259. package/src/extensions/markdown/link.ts +3 -0
  260. package/src/extensions/markdown/table.ts +13 -7
  261. package/src/extensions/mention.ts +1 -1
  262. package/src/extensions/modal.ts +24 -0
  263. package/src/extensions/modes.ts +2 -2
  264. package/src/extensions/{command/floating-menu.ts → outliner/menu.ts} +16 -21
  265. package/src/extensions/outliner/outliner.test.ts +3 -2
  266. package/src/extensions/outliner/outliner.ts +8 -7
  267. package/src/extensions/outliner/selection.ts +1 -1
  268. package/src/extensions/outliner/tree.test.ts +3 -2
  269. package/src/extensions/outliner/tree.ts +2 -2
  270. package/src/extensions/preview/index.ts +1 -1
  271. package/src/extensions/preview/preview.ts +69 -69
  272. package/src/extensions/replacer.test.ts +75 -0
  273. package/src/extensions/replacer.ts +93 -0
  274. package/src/extensions/scrolling.ts +189 -0
  275. package/src/extensions/selection.ts +3 -3
  276. package/src/extensions/state.ts +7 -0
  277. package/src/extensions/submit.ts +62 -0
  278. package/src/extensions/tab.ts +29 -0
  279. package/src/extensions/tags/extended-markdown.test.ts +262 -0
  280. package/src/extensions/tags/extended-markdown.ts +78 -0
  281. package/src/extensions/tags/index.ts +7 -0
  282. package/src/extensions/tags/streamer.ts +243 -0
  283. package/src/extensions/tags/xml-tags.ts +500 -0
  284. package/src/extensions/tags/xml-util.ts +94 -0
  285. package/src/extensions/typewriter.ts +1 -1
  286. package/src/hooks/useTextEditor.ts +31 -43
  287. package/src/stories/CommandDialog.stories.tsx +83 -0
  288. package/src/stories/Comments.stories.tsx +17 -14
  289. package/src/stories/EditorToolbar.stories.tsx +21 -20
  290. package/src/stories/Experimental.stories.tsx +17 -13
  291. package/src/stories/Markdown.stories.tsx +26 -22
  292. package/src/stories/Outliner.stories.tsx +51 -39
  293. package/src/stories/Popover.stories.tsx +162 -0
  294. package/src/stories/Preview.stories.tsx +56 -51
  295. package/src/stories/Tags.stories.tsx +95 -0
  296. package/src/stories/TextEditor.stories.tsx +42 -61
  297. package/src/stories/components/EditorStory.tsx +36 -24
  298. package/src/stories/components/util.tsx +40 -8
  299. package/src/styles/markdown.ts +1 -1
  300. package/src/styles/theme.ts +16 -12
  301. package/src/translations.ts +1 -1
  302. package/src/types/types.ts +1 -1
  303. package/src/util/cursor.ts +2 -1
  304. package/src/util/debug.ts +7 -2
  305. package/src/util/decorations.ts +21 -0
  306. package/src/util/dom.ts +5 -27
  307. package/src/util/index.ts +1 -0
  308. package/src/util/react.tsx +1 -1
  309. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
  310. package/dist/lib/browser/testing/index.mjs +0 -6
  311. package/dist/lib/browser/testing/index.mjs.map +0 -7
  312. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  313. package/dist/lib/node-esm/testing/index.mjs +0 -8
  314. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  315. package/dist/types/src/components/EditorToolbar/lists.d.ts +0 -19
  316. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +0 -1
  317. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -51
  318. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  319. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  320. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  321. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  322. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  323. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  324. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  325. package/dist/types/src/components/Popover/index.d.ts +0 -4
  326. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  327. package/dist/types/src/extensions/autocomplete.d.ts +0 -13
  328. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  329. package/dist/types/src/extensions/command/action.d.ts +0 -17
  330. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  331. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  332. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  333. package/dist/types/src/extensions/command/command.d.ts +0 -6
  334. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  335. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  336. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  337. package/dist/types/src/extensions/command/hint.d.ts +0 -24
  338. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  339. package/dist/types/src/extensions/command/index.d.ts +0 -7
  340. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  341. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  342. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  343. package/dist/types/src/extensions/command/state.d.ts +0 -16
  344. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  345. package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
  346. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  347. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  348. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  349. package/dist/types/src/stories/Command.stories.d.ts +0 -7
  350. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  351. package/dist/types/src/stories/CommandMenu.stories.d.ts +0 -13
  352. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  353. package/dist/types/src/testing/index.d.ts +0 -2
  354. package/dist/types/src/testing/index.d.ts.map +0 -1
  355. package/dist/types/src/testing/util.d.ts +0 -2
  356. package/dist/types/src/testing/util.d.ts.map +0 -1
  357. package/src/components/EditorToolbar/lists.ts +0 -59
  358. package/src/components/EditorToolbar/util.ts +0 -65
  359. package/src/components/Popover/CommandMenu.tsx +0 -279
  360. package/src/components/Popover/RefDropdownMenu.tsx +0 -85
  361. package/src/components/Popover/RefPopover.tsx +0 -99
  362. package/src/components/Popover/index.ts +0 -7
  363. package/src/extensions/autocomplete.ts +0 -69
  364. package/src/extensions/command/action.ts +0 -56
  365. package/src/extensions/command/command-menu.ts +0 -210
  366. package/src/extensions/command/command.ts +0 -34
  367. package/src/extensions/command/hint.ts +0 -102
  368. package/src/extensions/command/index.ts +0 -10
  369. package/src/extensions/command/state.ts +0 -89
  370. package/src/extensions/command/useCommandMenu.ts +0 -118
  371. package/src/stories/Command.stories.tsx +0 -97
  372. package/src/stories/CommandMenu.stories.tsx +0 -159
  373. package/src/testing/index.ts +0 -5
  374. package/src/testing/util.ts +0 -5
@@ -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,7 +4,7 @@
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
10
  import { fontBody, theme } from '../../styles';
@@ -141,7 +141,7 @@ export const markdownHighlightStyle = (_options: HighlightOptions = {}) => {
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
 
@@ -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',
@@ -2,19 +2,19 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import { type Extension } from '@codemirror/state';
5
6
  import { EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';
6
7
 
7
8
  import { type CleanupFn, addEventListener } from '@dxos/async';
8
9
 
9
- import { closeEffect, openEffect } from './action';
10
-
11
- export type FloatingMenuOptions = {
10
+ export type MenuOptions = {
12
11
  icon?: string;
13
12
  height?: number;
14
13
  padding?: number;
15
14
  };
16
15
 
17
- export const floatingMenu = (options: FloatingMenuOptions = {}) => [
16
+ // TODO(burdon): Replace with popover.
17
+ export const menu = (options: MenuOptions = {}): Extension => [
18
18
  ViewPlugin.fromClass(
19
19
  class {
20
20
  view: EditorView;
@@ -34,12 +34,10 @@ export const floatingMenu = (options: FloatingMenuOptions = {}) => [
34
34
  {
35
35
  const icon = document.createElement('dx-icon');
36
36
  icon.setAttribute('icon', options.icon ?? 'ph--dots-three-vertical--regular');
37
- const button = document.createElement('button');
38
- button.appendChild(icon);
39
37
 
40
- this.tag = document.createElement('dx-ref-tag');
41
- this.tag.classList.add('cm-ref-tag');
42
- this.tag.appendChild(button);
38
+ this.tag = document.createElement('dx-anchor');
39
+ this.tag.classList.add('cm-popover-trigger');
40
+ this.tag.appendChild(icon);
43
41
  }
44
42
 
45
43
  container.appendChild(this.tag);
@@ -65,12 +63,12 @@ export const floatingMenu = (options: FloatingMenuOptions = {}) => [
65
63
  }
66
64
 
67
65
  // TODO(burdon): Timer to fade in/out.
68
- if (update.transactions.some((tr) => tr.effects.some((effect) => effect.is(openEffect)))) {
66
+ /*if (update.transactions.some((tr) => tr.effects.some((effect) => effect.is(openEffect)))) {
69
67
  this.tag.style.display = 'none';
70
68
  this.tag.classList.add('opacity-10');
71
69
  } else if (update.transactions.some((tr) => tr.effects.some((effect) => effect.is(closeEffect)))) {
72
- this.tag.style.display = 'block';
73
- } else if (
70
+ this.tag.style.display = '';
71
+ } else */ if (
74
72
  update.docChanged ||
75
73
  update.focusChanged ||
76
74
  update.geometryChanged ||
@@ -99,7 +97,7 @@ export const floatingMenu = (options: FloatingMenuOptions = {}) => [
99
97
 
100
98
  this.tag.style.top = `${offsetTop}px`;
101
99
  this.tag.style.left = `${offsetLeft}px`;
102
- this.tag.style.display = 'block';
100
+ this.tag.style.display = '';
103
101
  }
104
102
 
105
103
  scheduleUpdate() {
@@ -113,21 +111,18 @@ export const floatingMenu = (options: FloatingMenuOptions = {}) => [
113
111
  ),
114
112
 
115
113
  EditorView.theme({
116
- '.cm-ref-tag': {
114
+ '.cm-popover-trigger': {
117
115
  position: 'fixed',
118
116
  padding: '0',
119
117
  border: 'none',
120
118
  opacity: '0',
121
- },
122
- '[data-has-focus] & .cm-ref-tag': {
123
- opacity: '1',
124
- },
125
- '.cm-ref-tag button': {
126
119
  display: 'grid',
127
- alignItems: 'center',
128
- justifyContent: 'center',
120
+ placeContent: 'center',
129
121
  width: '2rem',
130
122
  height: '2rem',
131
123
  },
124
+ '&:focus-within .cm-popover-trigger': {
125
+ opacity: '1',
126
+ },
132
127
  }),
133
128
  ];
@@ -6,10 +6,11 @@ import { EditorSelection, EditorState } from '@codemirror/state';
6
6
  import { EditorView } from '@codemirror/view';
7
7
  import { describe, test } from 'vitest';
8
8
 
9
+ import { str } from '../../util';
10
+ import { createMarkdownExtensions } from '../markdown';
11
+
9
12
  import { indentItemLess, indentItemMore, moveItemDown, moveItemUp } from './commands';
10
13
  import { listItemToString, outlinerTree, treeFacet } from './tree';
11
- import { str } from '../../testing';
12
- import { createMarkdownExtensions } from '../markdown';
13
14
 
14
15
  const lines = [
15
16
  '- [ ] 1',
@@ -7,12 +7,13 @@ import { Decoration, type DecorationSet, EditorView, ViewPlugin, type ViewUpdate
7
7
 
8
8
  import { mx } from '@dxos/react-ui-theme';
9
9
 
10
+ import { decorateMarkdown } from '../markdown';
11
+
10
12
  import { commands } from './commands';
11
13
  import { editor } from './editor';
12
- import { selectionCompartment, selectionFacet, selectionEquals } from './selection';
14
+ import { menu } from './menu';
15
+ import { selectionCompartment, selectionEquals, selectionFacet } from './selection';
13
16
  import { outlinerTree, treeFacet } from './tree';
14
- import { floatingMenu } from '../command';
15
- import { decorateMarkdown } from '../markdown';
16
17
 
17
18
  // ISSUES:
18
19
  // TODO(burdon): Remove requirement for continuous lines to be indented (so that user's can't accidentally delete them and break the layout).
@@ -37,7 +38,7 @@ export type OutlinerProps = {};
37
38
  * - Constrains editor to outline structure.
38
39
  * - Supports smart cut-and-paste.
39
40
  */
40
- export const outliner = (options: OutlinerProps = {}): Extension => [
41
+ export const outliner = (_options: OutlinerProps = {}): Extension => [
41
42
  // Commands.
42
43
  Prec.highest(commands()),
43
44
 
@@ -51,7 +52,7 @@ export const outliner = (options: OutlinerProps = {}): Extension => [
51
52
  editor(),
52
53
 
53
54
  // Floating menu.
54
- floatingMenu(),
55
+ menu(),
55
56
 
56
57
  // Line decorations.
57
58
  decorations(),
@@ -156,9 +157,9 @@ const decorations = () => [
156
157
  },
157
158
 
158
159
  '.cm-list-item-focused': {
159
- borderColor: 'var(--dx-accentFocusIndicator)',
160
+ borderColor: 'var(--dx-neutralFocusIndicator)',
160
161
  },
161
- '[data-has-focus] & .cm-list-item-selected': {
162
+ '&:focus-within .cm-list-item-selected': {
162
163
  borderColor: 'var(--dx-separator)',
163
164
  },
164
165
  }),
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { Compartment, type EditorState, Facet, type SelectionRange } from '@codemirror/state';
6
- import { type EditorView, type Command } from '@codemirror/view';
6
+ import { type Command, type EditorView } from '@codemirror/view';
7
7
 
8
8
  import { treeFacet } from './tree';
9
9
 
@@ -6,9 +6,10 @@ import { markdown, markdownLanguage } from '@codemirror/lang-markdown';
6
6
  import { EditorState } from '@codemirror/state';
7
7
  import { beforeEach, describe, test } from 'vitest';
8
8
 
9
- import { outlinerTree, treeFacet, listItemToString, type Item } from './tree';
10
- import { str } from '../../testing';
11
9
  import { type Range } from '../../types';
10
+ import { str } from '../../util';
11
+
12
+ import { type Item, listItemToString, outlinerTree, treeFacet } from './tree';
12
13
 
13
14
  const lines = [
14
15
  '- [ ] 1',
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { syntaxTree } from '@codemirror/language';
6
- import { StateField, type Transaction, type Extension, type EditorState } from '@codemirror/state';
6
+ import { type EditorState, type Extension, StateField, type Transaction } from '@codemirror/state';
7
7
  import { Facet } from '@codemirror/state';
8
8
  import { type SyntaxNode } from '@lezer/common';
9
9
 
@@ -195,7 +195,7 @@ export type TreeOptions = {};
195
195
  * This adds overhead relative to the markdown AST, but allows for efficient traversal of the list items.
196
196
  * NOTE: Requires markdown parser to be enabled.
197
197
  */
198
- export const outlinerTree = (options: TreeOptions = {}): Extension => {
198
+ export const outlinerTree = (_options: TreeOptions = {}): Extension => {
199
199
  const buildTree = (state: EditorState): Tree => {
200
200
  let tree: Tree | undefined;
201
201
  let parent: Item | undefined;
@@ -1,5 +1,5 @@
1
1
  //
2
- // Copyright 2024 DXOS.org
2
+ // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
5
  export * from './preview';
@@ -2,20 +2,16 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos/lit-ui/dx-ref-tag.pcss';
6
-
7
5
  import { syntaxTree } from '@codemirror/language';
8
- import {
9
- type EditorState,
10
- type Extension,
11
- type RangeSet,
12
- RangeSetBuilder,
13
- StateField,
14
- type Transaction,
15
- } from '@codemirror/state';
6
+ import { type EditorState, type Extension, RangeSetBuilder, StateField } from '@codemirror/state';
16
7
  import { Decoration, type DecorationSet, EditorView, WidgetType } from '@codemirror/view';
17
8
  import { type SyntaxNode } from '@lezer/common';
18
9
 
10
+ export type PreviewBlock = {
11
+ link: PreviewLinkRef;
12
+ el: HTMLElement;
13
+ };
14
+
19
15
  export type PreviewLinkRef = {
20
16
  suggest?: boolean;
21
17
  block?: boolean;
@@ -29,13 +25,9 @@ export type PreviewLinkTarget = {
29
25
  object?: any;
30
26
  };
31
27
 
32
- // TODO(wittjosiah): Remove.
33
- // TODO(burdon): Handle error.
34
- export type PreviewLookup = (link: PreviewLinkRef) => Promise<PreviewLinkTarget | null | undefined>;
35
-
36
28
  export type PreviewOptions = {
37
- addBlockContainer?: (link: PreviewLinkRef, el: HTMLElement) => void;
38
- removeBlockContainer?: (link: PreviewLinkRef) => void;
29
+ addBlockContainer?: (block: PreviewBlock) => void;
30
+ removeBlockContainer?: (block: PreviewBlock) => void;
39
31
  };
40
32
 
41
33
  /**
@@ -44,10 +36,16 @@ export type PreviewOptions = {
44
36
  export const preview = (options: PreviewOptions = {}): Extension => {
45
37
  return [
46
38
  // NOTE: Atomic block decorations must be created from a state field, now a widget, otherwise it results in the following error:
47
- // "Block decorations may not be specified via plugins"
39
+ // "Block decorations may not be specified via plugins".
48
40
  StateField.define<DecorationSet>({
49
41
  create: (state) => buildDecorations(state, options),
50
- update: (_: RangeSet<Decoration>, tr: Transaction) => buildDecorations(tr.state, options),
42
+ update: (decorations, tr) => {
43
+ if (tr.docChanged) {
44
+ return buildDecorations(tr.state, options);
45
+ }
46
+
47
+ return decorations.map(tr.changes);
48
+ },
51
49
  provide: (field) => [
52
50
  EditorView.decorations.from(field),
53
51
  EditorView.atomicRanges.of((view) => view.state.field(field)),
@@ -56,42 +54,19 @@ export const preview = (options: PreviewOptions = {}): Extension => {
56
54
  ];
57
55
  };
58
56
 
59
- /**
60
- * Link references.
61
- *
62
- * [Label][dxn:echo:123] Inline reference
63
- * ![Label][dxn:echo:123] Block reference
64
- * ![Label][?dxn:echo:123] Suggestion
65
- */
66
- export const getLinkRef = (state: EditorState, node: SyntaxNode): PreviewLinkRef | undefined => {
67
- const mark = node.getChild('LinkMark');
68
- const label = node.getChild('LinkLabel');
69
- if (mark && label) {
70
- const ref = state.sliceDoc(label.from + 1, label.to - 1);
71
- return {
72
- suggest: ref.startsWith('?'),
73
- block: state.sliceDoc(mark.from, mark.from + 1) === '!',
74
- label: state.sliceDoc(mark.to, label.from - 1),
75
- ref: ref.startsWith('?') ? ref.slice(1) : ref,
76
- };
77
- }
78
- };
79
-
80
57
  /**
81
58
  * Echo references are represented as markdown reference links.
82
59
  * https://www.markdownguide.org/basic-syntax/#reference-style-links
83
- * [Label|block][dxn:echo:123]
84
- * [Label|inline][dxn:echo:123]
85
60
  */
86
- const buildDecorations = (state: EditorState, options: PreviewOptions) => {
61
+ const buildDecorations = (state: EditorState, options: PreviewOptions): DecorationSet => {
87
62
  const builder = new RangeSetBuilder<Decoration>();
88
63
 
89
64
  syntaxTree(state).iterate({
90
65
  enter: (node) => {
91
66
  switch (node.name) {
92
67
  //
93
- // Decoration.
94
- // [Label][dxn:echo:123]
68
+ // Inline widget.
69
+ // [Label](dxn:echo:123)
95
70
  //
96
71
  case 'Link': {
97
72
  const link = getLinkRef(state, node.node);
@@ -101,29 +76,32 @@ const buildDecorations = (state: EditorState, options: PreviewOptions) => {
101
76
  node.to,
102
77
  Decoration.replace({
103
78
  widget: new PreviewInlineWidget(options, link),
79
+ side: 1,
104
80
  }),
105
81
  );
106
82
  }
107
- break;
83
+ return false;
108
84
  }
85
+
109
86
  //
110
- // Block widget.
111
- // ![Label][dxn:echo:123]
87
+ // Block widget (transclusion).
88
+ // ![Label](dxn:echo:123)
112
89
  //
113
90
  case 'Image': {
114
- const link = getLinkRef(state, node.node);
115
- if (options.addBlockContainer && options.removeBlockContainer && link) {
116
- builder.add(
117
- node.from,
118
- node.to,
119
- Decoration.replace({
120
- block: true,
121
- // atomic: true,
122
- widget: new PreviewBlockWidget(options, link),
123
- }),
124
- );
91
+ if (options.addBlockContainer && options.removeBlockContainer) {
92
+ const link = getLinkRef(state, node.node);
93
+ if (link) {
94
+ builder.add(
95
+ node.from,
96
+ node.to,
97
+ Decoration.replace({
98
+ block: true,
99
+ widget: new PreviewBlockWidget(options, link),
100
+ }),
101
+ );
102
+ }
125
103
  }
126
- break;
104
+ return false;
127
105
  }
128
106
  }
129
107
  },
@@ -132,9 +110,30 @@ const buildDecorations = (state: EditorState, options: PreviewOptions) => {
132
110
  return builder.finish();
133
111
  };
134
112
 
113
+ /**
114
+ * Link references.
115
+ * [Label](dxn:echo:123) Inline reference
116
+ * ![Label](dxn:echo:123) Block reference
117
+ */
118
+ export const getLinkRef = (state: EditorState, node: SyntaxNode): PreviewLinkRef | undefined => {
119
+ const mark = node.getChildren('LinkMark');
120
+ const urlNode = node.getChild('URL');
121
+ if (mark && urlNode) {
122
+ const url = state.sliceDoc(urlNode.from, urlNode.to);
123
+ if (url.startsWith('dxn:')) {
124
+ const label = state.sliceDoc(mark[0].to, mark[1].from);
125
+ return {
126
+ block: state.sliceDoc(mark[0].from, mark[0].from + 1) === '!',
127
+ label,
128
+ ref: url,
129
+ };
130
+ }
131
+ }
132
+ };
133
+
135
134
  /**
136
135
  * Inline widget.
137
- * [Label][dxn:echo:123]
136
+ * [Label](dxn:echo:123)
138
137
  */
139
138
  class PreviewInlineWidget extends WidgetType {
140
139
  constructor(
@@ -148,12 +147,13 @@ class PreviewInlineWidget extends WidgetType {
148
147
  // return false;
149
148
  // }
150
149
 
151
- override eq(other: this): boolean {
150
+ override eq(other: this) {
152
151
  return this._link.ref === other._link.ref && this._link.label === other._link.label;
153
152
  }
154
153
 
155
- override toDOM(view: EditorView): HTMLElement {
156
- const root = document.createElement('dx-ref-tag');
154
+ override toDOM(_view: EditorView) {
155
+ const root = document.createElement('dx-anchor');
156
+ root.classList.add('dx-tag--anchor');
157
157
  root.textContent = this._link.label;
158
158
  root.setAttribute('refId', this._link.ref);
159
159
  return root;
@@ -161,7 +161,7 @@ class PreviewInlineWidget extends WidgetType {
161
161
  }
162
162
 
163
163
  /**
164
- * Block widget.
164
+ * Block widget (e.g., for surfaces).
165
165
  * ![Label][dxn:echo:123]
166
166
  */
167
167
  class PreviewBlockWidget extends WidgetType {
@@ -176,18 +176,18 @@ class PreviewBlockWidget extends WidgetType {
176
176
  // return true;
177
177
  // }
178
178
 
179
- override eq(other: this): boolean {
179
+ override eq(other: this) {
180
180
  return this._link.ref === other._link.ref;
181
181
  }
182
182
 
183
- override toDOM(view: EditorView): HTMLDivElement {
183
+ override toDOM(_view: EditorView) {
184
184
  const root = document.createElement('div');
185
185
  root.classList.add('cm-preview-block', 'density-coarse');
186
- this._options.addBlockContainer?.(this._link, root);
186
+ this._options.addBlockContainer?.({ link: this._link, el: root });
187
187
  return root;
188
188
  }
189
189
 
190
- override destroy() {
191
- this._options.removeBlockContainer?.(this._link);
190
+ override destroy(root: HTMLDivElement) {
191
+ this._options.removeBlockContainer?.({ link: this._link, el: root });
192
192
  }
193
193
  }