@dxos/react-ui-editor 0.8.4-main.fd6878d → 0.8.4-main.fffef41

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 (356) 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 +7471 -5897
  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 +7471 -5897
  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/sync.d.ts +3 -3
  81. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  82. package/dist/types/src/extensions/automerge/update-automerge.d.ts +1 -1
  83. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  84. package/dist/types/src/extensions/autoscroll.d.ts +20 -0
  85. package/dist/types/src/extensions/autoscroll.d.ts.map +1 -0
  86. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +1 -1
  87. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
  88. package/dist/types/src/extensions/blocks.d.ts +2 -0
  89. package/dist/types/src/extensions/blocks.d.ts.map +1 -0
  90. package/dist/types/src/extensions/bookmarks.d.ts +12 -0
  91. package/dist/types/src/extensions/bookmarks.d.ts.map +1 -0
  92. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  93. package/dist/types/src/extensions/factories.d.ts +11 -11
  94. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  95. package/dist/types/src/extensions/focus.d.ts.map +1 -1
  96. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  97. package/dist/types/src/extensions/index.d.ts +10 -1
  98. package/dist/types/src/extensions/index.d.ts.map +1 -1
  99. package/dist/types/src/extensions/json.d.ts +1 -1
  100. package/dist/types/src/extensions/json.d.ts.map +1 -1
  101. package/dist/types/src/extensions/listener.d.ts +8 -6
  102. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  103. package/dist/types/src/extensions/markdown/bundle.d.ts +8 -2
  104. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  105. package/dist/types/src/extensions/markdown/changes.d.ts +1 -1
  106. package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
  107. package/dist/types/src/extensions/markdown/decorate.d.ts +9 -1
  108. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  109. package/dist/types/src/extensions/markdown/formatting.d.ts +1 -3
  110. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  111. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
  112. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  113. package/dist/types/src/extensions/modal.d.ts +7 -0
  114. package/dist/types/src/extensions/modal.d.ts.map +1 -0
  115. package/dist/types/src/extensions/modes.d.ts +1 -1
  116. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  117. package/dist/types/src/extensions/outliner/menu.d.ts +8 -0
  118. package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -0
  119. package/dist/types/src/extensions/outliner/outliner.d.ts +1 -1
  120. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
  121. package/dist/types/src/extensions/outliner/tree.d.ts +1 -1
  122. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
  123. package/dist/types/src/extensions/preview/preview.d.ts +8 -8
  124. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  125. package/dist/types/src/extensions/replacer.d.ts +21 -0
  126. package/dist/types/src/extensions/replacer.d.ts.map +1 -0
  127. package/dist/types/src/extensions/replacer.test.d.ts +2 -0
  128. package/dist/types/src/extensions/replacer.test.d.ts.map +1 -0
  129. package/dist/types/src/extensions/scrolling.d.ts +78 -0
  130. package/dist/types/src/extensions/scrolling.d.ts.map +1 -0
  131. package/dist/types/src/extensions/state.d.ts +2 -0
  132. package/dist/types/src/extensions/state.d.ts.map +1 -0
  133. package/dist/types/src/extensions/submit.d.ts +10 -0
  134. package/dist/types/src/extensions/submit.d.ts.map +1 -0
  135. package/dist/types/src/extensions/tab.d.ts +4 -0
  136. package/dist/types/src/extensions/tab.d.ts.map +1 -0
  137. package/dist/types/src/extensions/tags/extended-markdown.d.ts +10 -0
  138. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +1 -0
  139. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +2 -0
  140. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +1 -0
  141. package/dist/types/src/extensions/tags/index.d.ts +4 -0
  142. package/dist/types/src/extensions/tags/index.d.ts.map +1 -0
  143. package/dist/types/src/extensions/tags/streamer.d.ts +12 -0
  144. package/dist/types/src/extensions/tags/streamer.d.ts.map +1 -0
  145. package/dist/types/src/extensions/tags/xml-tags.d.ts +97 -0
  146. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -0
  147. package/dist/types/src/extensions/tags/xml-util.d.ts +10 -0
  148. package/dist/types/src/extensions/tags/xml-util.d.ts.map +1 -0
  149. package/dist/types/src/hooks/useTextEditor.d.ts +5 -9
  150. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  151. package/dist/types/src/stories/CommandDialog.stories.d.ts +14 -0
  152. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
  153. package/dist/types/src/stories/Comments.stories.d.ts +21 -10
  154. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  155. package/dist/types/src/stories/EditorToolbar.stories.d.ts +39 -3
  156. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  157. package/dist/types/src/stories/Experimental.stories.d.ts +22 -13
  158. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  159. package/dist/types/src/stories/Markdown.stories.d.ts +32 -43
  160. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  161. package/dist/types/src/stories/Outliner.stories.d.ts +15 -21
  162. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  163. package/dist/types/src/stories/Popover.stories.d.ts +20 -0
  164. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  165. package/dist/types/src/stories/Preview.stories.d.ts +22 -7
  166. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  167. package/dist/types/src/stories/Tags.stories.d.ts +16 -0
  168. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  169. package/dist/types/src/stories/TextEditor.stories.d.ts +37 -52
  170. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  171. package/dist/types/src/stories/components/EditorStory.d.ts +8 -9
  172. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  173. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  174. package/dist/types/src/styles/theme.d.ts.map +1 -1
  175. package/dist/types/src/translations.d.ts +1 -1
  176. package/dist/types/src/types/types.d.ts +2 -2
  177. package/dist/types/src/types/types.d.ts.map +1 -1
  178. package/dist/types/src/util/debug.d.ts +5 -1
  179. package/dist/types/src/util/debug.d.ts.map +1 -1
  180. package/dist/types/src/util/decorations.d.ts +4 -0
  181. package/dist/types/src/util/decorations.d.ts.map +1 -0
  182. package/dist/types/src/util/dom.d.ts +2 -12
  183. package/dist/types/src/util/dom.d.ts.map +1 -1
  184. package/dist/types/src/util/index.d.ts +1 -0
  185. package/dist/types/src/util/index.d.ts.map +1 -1
  186. package/dist/types/src/util/react.d.ts +1 -1
  187. package/dist/types/src/util/react.d.ts.map +1 -1
  188. package/dist/types/tsconfig.tsbuildinfo +1 -1
  189. package/package.json +70 -68
  190. package/src/components/Editor/Editor.stories.tsx +89 -0
  191. package/src/components/Editor/Editor.tsx +160 -25
  192. package/src/components/EditorContent/EditorContent.stories.tsx +70 -0
  193. package/src/components/EditorContent/EditorContent.tsx +70 -0
  194. package/src/components/EditorContent/controller.ts +50 -0
  195. package/src/components/EditorContent/index.ts +6 -0
  196. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +233 -0
  197. package/src/components/EditorMenuProvider/index.ts +11 -0
  198. package/src/components/EditorMenuProvider/menu-presets.ts +123 -0
  199. package/src/components/EditorMenuProvider/menu.ts +71 -0
  200. package/src/components/EditorMenuProvider/popover.ts +287 -0
  201. package/src/components/EditorMenuProvider/useEditorMenu.ts +175 -0
  202. package/src/components/EditorMenuProvider/util.ts +31 -0
  203. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +82 -0
  204. package/src/components/EditorPreviewProvider/index.ts +5 -0
  205. package/src/components/EditorToolbar/EditorToolbar.tsx +116 -96
  206. package/src/components/EditorToolbar/actions.ts +86 -0
  207. package/src/components/EditorToolbar/blocks.ts +20 -23
  208. package/src/components/EditorToolbar/formatting.ts +21 -24
  209. package/src/components/EditorToolbar/headings.ts +16 -9
  210. package/src/components/EditorToolbar/image.ts +9 -5
  211. package/src/components/EditorToolbar/index.ts +3 -7
  212. package/src/components/EditorToolbar/search.ts +9 -5
  213. package/src/components/EditorToolbar/useEditorToolbar.ts +20 -0
  214. package/src/components/EditorToolbar/view-mode.ts +11 -6
  215. package/src/components/index.ts +8 -2
  216. package/src/defaults.ts +5 -2
  217. package/src/extensions/autocomplete/autocomplete.ts +151 -0
  218. package/src/extensions/autocomplete/index.ts +8 -0
  219. package/src/extensions/autocomplete/match.ts +46 -0
  220. package/src/extensions/{command → autocomplete}/placeholder.ts +21 -17
  221. package/src/extensions/{command → autocomplete}/typeahead.ts +6 -48
  222. package/src/extensions/automerge/automerge.stories.tsx +28 -21
  223. package/src/extensions/automerge/automerge.ts +28 -9
  224. package/src/extensions/automerge/cursor.ts +1 -1
  225. package/src/extensions/automerge/sync.ts +8 -4
  226. package/src/extensions/automerge/update-automerge.ts +1 -1
  227. package/src/extensions/autoscroll.ts +163 -0
  228. package/src/extensions/awareness/awareness-provider.ts +2 -2
  229. package/src/extensions/blocks.ts +131 -0
  230. package/src/extensions/bookmarks.ts +75 -0
  231. package/src/extensions/comments.ts +13 -8
  232. package/src/extensions/factories.ts +50 -32
  233. package/src/extensions/focus.ts +5 -4
  234. package/src/extensions/folding.tsx +3 -6
  235. package/src/extensions/hashtag.tsx +2 -2
  236. package/src/extensions/index.ts +10 -1
  237. package/src/extensions/json.ts +1 -1
  238. package/src/extensions/listener.ts +14 -20
  239. package/src/extensions/markdown/bundle.ts +39 -5
  240. package/src/extensions/markdown/decorate.ts +26 -17
  241. package/src/extensions/markdown/formatting.ts +8 -10
  242. package/src/extensions/markdown/highlight.ts +1 -1
  243. package/src/extensions/markdown/image.ts +5 -6
  244. package/src/extensions/markdown/link.ts +3 -0
  245. package/src/extensions/markdown/table.ts +13 -7
  246. package/src/extensions/modal.ts +24 -0
  247. package/src/extensions/modes.ts +2 -2
  248. package/src/extensions/{command/floating-menu.ts → outliner/menu.ts} +16 -21
  249. package/src/extensions/outliner/outliner.test.ts +1 -1
  250. package/src/extensions/outliner/outliner.ts +5 -5
  251. package/src/extensions/outliner/tree.test.ts +1 -1
  252. package/src/extensions/outliner/tree.ts +1 -1
  253. package/src/extensions/preview/index.ts +1 -1
  254. package/src/extensions/preview/preview.ts +69 -69
  255. package/src/extensions/replacer.test.ts +75 -0
  256. package/src/extensions/replacer.ts +93 -0
  257. package/src/extensions/scrolling.ts +189 -0
  258. package/src/extensions/selection.ts +3 -3
  259. package/src/extensions/state.ts +7 -0
  260. package/src/extensions/submit.ts +62 -0
  261. package/src/extensions/tab.ts +29 -0
  262. package/src/extensions/tags/extended-markdown.test.ts +262 -0
  263. package/src/extensions/tags/extended-markdown.ts +78 -0
  264. package/src/extensions/tags/index.ts +7 -0
  265. package/src/extensions/tags/streamer.ts +243 -0
  266. package/src/extensions/tags/xml-tags.ts +500 -0
  267. package/src/extensions/tags/xml-util.ts +94 -0
  268. package/src/extensions/typewriter.ts +1 -1
  269. package/src/hooks/useTextEditor.ts +31 -43
  270. package/src/stories/CommandDialog.stories.tsx +83 -0
  271. package/src/stories/Comments.stories.tsx +15 -13
  272. package/src/stories/EditorToolbar.stories.tsx +18 -17
  273. package/src/stories/Experimental.stories.tsx +15 -12
  274. package/src/stories/Markdown.stories.tsx +24 -21
  275. package/src/stories/Outliner.stories.tsx +50 -39
  276. package/src/stories/Popover.stories.tsx +162 -0
  277. package/src/stories/Preview.stories.tsx +52 -46
  278. package/src/stories/Tags.stories.tsx +95 -0
  279. package/src/stories/TextEditor.stories.tsx +30 -50
  280. package/src/stories/components/EditorStory.tsx +32 -20
  281. package/src/stories/components/util.tsx +40 -8
  282. package/src/styles/markdown.ts +1 -1
  283. package/src/styles/theme.ts +16 -13
  284. package/src/translations.ts +1 -1
  285. package/src/types/types.ts +1 -1
  286. package/src/util/debug.ts +7 -2
  287. package/src/util/decorations.ts +21 -0
  288. package/src/util/dom.ts +5 -27
  289. package/src/util/index.ts +1 -0
  290. package/src/util/react.tsx +1 -1
  291. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
  292. package/dist/lib/browser/testing/index.mjs +0 -6
  293. package/dist/lib/browser/testing/index.mjs.map +0 -7
  294. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  295. package/dist/lib/node-esm/testing/index.mjs +0 -8
  296. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  297. package/dist/types/src/components/EditorToolbar/lists.d.ts +0 -19
  298. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +0 -1
  299. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -51
  300. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  301. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  302. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  303. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  304. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  305. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  306. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  307. package/dist/types/src/components/Popover/index.d.ts +0 -4
  308. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  309. package/dist/types/src/extensions/autocomplete.d.ts +0 -13
  310. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  311. package/dist/types/src/extensions/command/action.d.ts +0 -17
  312. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  313. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  314. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  315. package/dist/types/src/extensions/command/command.d.ts +0 -6
  316. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  317. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  318. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  319. package/dist/types/src/extensions/command/hint.d.ts +0 -24
  320. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  321. package/dist/types/src/extensions/command/index.d.ts +0 -7
  322. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  323. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  324. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  325. package/dist/types/src/extensions/command/state.d.ts +0 -16
  326. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  327. package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
  328. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  329. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  330. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  331. package/dist/types/src/stories/Command.stories.d.ts +0 -7
  332. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  333. package/dist/types/src/stories/CommandMenu.stories.d.ts +0 -13
  334. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  335. package/dist/types/src/testing/index.d.ts +0 -2
  336. package/dist/types/src/testing/index.d.ts.map +0 -1
  337. package/dist/types/src/testing/util.d.ts +0 -3
  338. package/dist/types/src/testing/util.d.ts.map +0 -1
  339. package/src/components/EditorToolbar/lists.ts +0 -60
  340. package/src/components/EditorToolbar/util.ts +0 -65
  341. package/src/components/Popover/CommandMenu.tsx +0 -279
  342. package/src/components/Popover/RefDropdownMenu.tsx +0 -85
  343. package/src/components/Popover/RefPopover.tsx +0 -99
  344. package/src/components/Popover/index.ts +0 -7
  345. package/src/extensions/autocomplete.ts +0 -69
  346. package/src/extensions/command/action.ts +0 -56
  347. package/src/extensions/command/command-menu.ts +0 -211
  348. package/src/extensions/command/command.ts +0 -34
  349. package/src/extensions/command/hint.ts +0 -103
  350. package/src/extensions/command/index.ts +0 -10
  351. package/src/extensions/command/state.ts +0 -90
  352. package/src/extensions/command/useCommandMenu.ts +0 -119
  353. package/src/stories/Command.stories.tsx +0 -98
  354. package/src/stories/CommandMenu.stories.tsx +0 -160
  355. package/src/testing/index.ts +0 -5
  356. package/src/testing/util.ts +0 -7
@@ -4,10 +4,12 @@
4
4
 
5
5
  export * from './annotations';
6
6
  export * from './autocomplete';
7
+ export * from './autoscroll';
7
8
  export * from './automerge';
8
9
  export * from './awareness';
9
10
  export * from './blast';
10
- export * from './command';
11
+ export * from './blocks';
12
+ export * from './bookmarks';
11
13
  export * from './comments';
12
14
  export * from './debug';
13
15
  export * from './dnd';
@@ -19,8 +21,15 @@ export * from './json';
19
21
  export * from './listener';
20
22
  export * from './markdown';
21
23
  export * from './mention';
24
+ export * from './modal';
22
25
  export * from './modes';
23
26
  export * from './outliner';
24
27
  export * from './preview';
28
+ export * from './replacer';
25
29
  export * from './selection';
30
+ export * from './scrolling';
31
+ export * from './state';
32
+ export * from './submit';
33
+ export * from './tab';
34
+ export * from './tags';
26
35
  export * from './typewriter';
@@ -7,7 +7,7 @@ import { type LintSource, linter } from '@codemirror/lint';
7
7
  import { type Extension } from '@codemirror/state';
8
8
  import Ajv, { type ValidateFunction } from 'ajv';
9
9
 
10
- import { type JsonSchemaType } from '@dxos/echo-schema';
10
+ import { type JsonSchemaType } from '@dxos/echo/internal';
11
11
 
12
12
  export type JsonExtensionsOptions = {
13
13
  schema?: JsonSchemaType;
@@ -5,34 +5,28 @@
5
5
  import { type Extension } from '@codemirror/state';
6
6
  import { EditorView } from '@codemirror/view';
7
7
 
8
+ import { isNonNullable } from '@dxos/util';
9
+
8
10
  import { documentId } from './selection';
9
11
 
10
12
  export type ListenerOptions = {
11
- onFocus?: (focusing: boolean) => void;
12
- onChange?: (text: string, id: string) => void;
13
+ onFocus?: (event: { id: string; focusing: boolean }) => void;
14
+ onChange?: (event: { id: string; text: string }) => void;
13
15
  };
14
16
 
15
- /**
16
- * Event listener.
17
- * @deprecated Use EditorView.updateListener and listen for specific update events.
18
- */
19
17
  export const listener = ({ onFocus, onChange }: ListenerOptions): Extension => {
20
- const extensions: Extension[] = [];
21
-
22
- onFocus &&
23
- extensions.push(
24
- EditorView.focusChangeEffect.of((_, focusing) => {
25
- onFocus(focusing);
18
+ return [
19
+ onFocus &&
20
+ EditorView.focusChangeEffect.of((state, focusing) => {
21
+ onFocus({ id: state.facet(documentId), focusing });
26
22
  return null;
27
23
  }),
28
- );
29
24
 
30
- onChange &&
31
- extensions.push(
32
- EditorView.updateListener.of((update) => {
33
- onChange(update.state.doc.toString(), update.state.facet(documentId));
25
+ onChange &&
26
+ EditorView.updateListener.of(({ state, docChanged }) => {
27
+ if (docChanged) {
28
+ onChange({ id: state.facet(documentId), text: state.doc.toString() });
29
+ }
34
30
  }),
35
- );
36
-
37
- return extensions;
31
+ ].filter(isNonNullable);
38
32
  };
@@ -4,20 +4,23 @@
4
4
 
5
5
  import { completionKeymap } from '@codemirror/autocomplete';
6
6
  import { defaultKeymap, indentWithTab } from '@codemirror/commands';
7
+ import { jsonLanguage } from '@codemirror/lang-json';
7
8
  import { markdown, markdownLanguage } from '@codemirror/lang-markdown';
8
- import { syntaxHighlighting } from '@codemirror/language';
9
+ import { xml } from '@codemirror/lang-xml';
10
+ import { LanguageDescription, syntaxHighlighting } from '@codemirror/language';
9
11
  import { languages } from '@codemirror/language-data';
10
12
  import { type Extension } from '@codemirror/state';
11
13
  import { keymap } from '@codemirror/view';
14
+ import { type MarkdownConfig } from '@lezer/markdown';
12
15
 
13
- import { type ThemeMode } from '@dxos/react-ui';
14
- import { isNotFalsy } from '@dxos/util';
16
+ import { isTruthy } from '@dxos/util';
15
17
 
16
18
  import { markdownHighlightStyle, markdownTagsExtensions } from './highlight';
17
19
 
18
20
  export type MarkdownBundleOptions = {
19
- themeMode?: ThemeMode;
21
+ extensions?: MarkdownConfig[];
20
22
  indentWithTab?: boolean;
23
+ setextHeading?: boolean;
21
24
  };
22
25
 
23
26
  /**
@@ -42,6 +45,7 @@ export const createMarkdownExtensions = (options: MarkdownBundleOptions = {}): E
42
45
  base: markdownLanguage,
43
46
 
44
47
  // Languages for syntax highlighting fenced code blocks.
48
+ defaultCodeLanguage: jsonLanguage,
45
49
  codeLanguages: languages,
46
50
 
47
51
  // Don't complete HTML tags.
@@ -51,6 +55,7 @@ export const createMarkdownExtensions = (options: MarkdownBundleOptions = {}): E
51
55
  extensions: [
52
56
  // GFM provided by default.
53
57
  markdownTagsExtensions,
58
+ ...(options.extensions ?? defaultExtensions()),
54
59
  ],
55
60
  }),
56
61
 
@@ -64,8 +69,37 @@ export const createMarkdownExtensions = (options: MarkdownBundleOptions = {}): E
64
69
 
65
70
  // https://codemirror.net/docs/ref/#commands.defaultKeymap
66
71
  ...defaultKeymap,
72
+
73
+ // TODO(burdon): Remove?
67
74
  ...completionKeymap,
68
- ].filter(isNotFalsy),
75
+ ].filter(isTruthy),
69
76
  ),
70
77
  ];
71
78
  };
79
+
80
+ const xmlLanguageDesc = LanguageDescription.of({
81
+ name: 'xml',
82
+ alias: ['html', 'xhtml'],
83
+ extensions: ['xml', 'xhtml'],
84
+ load: async () => xml(),
85
+ });
86
+
87
+ /**
88
+ * Default customizations.
89
+ * https://github.com/lezer-parser/markdown/blob/main/src/markdown.ts
90
+ */
91
+ export const defaultExtensions = (): MarkdownConfig[] => [noSetExtHeading, noHtml];
92
+
93
+ /**
94
+ * Remove SetextHeading (e.g., headings created from "---").
95
+ */
96
+ const noSetExtHeading: MarkdownConfig = {
97
+ remove: ['SetextHeading'],
98
+ };
99
+
100
+ /**
101
+ * Remove HTML and XML parsing.
102
+ */
103
+ const noHtml: MarkdownConfig = {
104
+ // remove: ['HTMLBlock', 'HTMLTag'],
105
+ };
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { syntaxTree } from '@codemirror/language';
6
- import { type EditorState, RangeSetBuilder, StateEffect } from '@codemirror/state';
6
+ import { type EditorState, Prec, RangeSetBuilder, StateEffect } from '@codemirror/state';
7
7
  import { Decoration, type DecorationSet, EditorView, ViewPlugin, type ViewUpdate, WidgetType } from '@codemirror/view';
8
8
  import { type SyntaxNodeRef } from '@lezer/common';
9
9
 
@@ -52,12 +52,12 @@ class LinkButton extends WidgetType {
52
52
  super();
53
53
  }
54
54
 
55
- override eq(other: this): boolean {
55
+ override eq(other: this) {
56
56
  return this.url === other.url;
57
57
  }
58
58
 
59
59
  // TODO(burdon): Create icon and link directly without react?
60
- override toDOM(view: EditorView): HTMLSpanElement {
60
+ override toDOM(view: EditorView) {
61
61
  const el = document.createElement('span');
62
62
  this.render(el, { url: this.url }, view);
63
63
  return el;
@@ -69,11 +69,15 @@ class CheckboxWidget extends WidgetType {
69
69
  super();
70
70
  }
71
71
 
72
- override eq(other: this): boolean {
72
+ override eq(other: this) {
73
73
  return this._checked === other._checked;
74
74
  }
75
75
 
76
- override toDOM(view: EditorView): HTMLSpanElement {
76
+ override ignoreEvent() {
77
+ return false;
78
+ }
79
+
80
+ override toDOM(view: EditorView) {
77
81
  const input = document.createElement('input');
78
82
  input.className = 'cm-task-checkbox dx-checkbox';
79
83
  input.type = 'checkbox';
@@ -105,10 +109,6 @@ class CheckboxWidget extends WidgetType {
105
109
  span.appendChild(input);
106
110
  return span;
107
111
  }
108
-
109
- override ignoreEvent(): boolean {
110
- return false;
111
- }
112
112
  }
113
113
 
114
114
  class TextWidget extends WidgetType {
@@ -234,7 +234,7 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
234
234
  const mark = node.node.firstChild!;
235
235
  if (mark?.name === 'HeaderMark') {
236
236
  const { from, to = 6 } = options.numberedHeadings ?? {};
237
- const text = view.state.sliceDoc(node.from, node.to);
237
+ const text = state.sliceDoc(node.from, node.to);
238
238
  const len = text.match(/[#\s]+/)![0].length;
239
239
  if (!from || level < from || level > to) {
240
240
  atomicDeco.add(mark.from, mark.from + len, hide);
@@ -427,6 +427,9 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
427
427
  const editing = editingRange(state, node, focus);
428
428
  if (urlNode && marks.length >= 2) {
429
429
  const url = state.sliceDoc(urlNode.from, urlNode.to);
430
+ if (options.skip?.({ name: 'Link', url })) {
431
+ break;
432
+ }
430
433
  if (!editing) {
431
434
  atomicDeco.add(node.from, marks[0].to, hide);
432
435
  }
@@ -444,6 +447,7 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
444
447
  },
445
448
  }),
446
449
  );
450
+
447
451
  if (!editing) {
448
452
  atomicDeco.add(
449
453
  marks[1].from,
@@ -494,15 +498,15 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
494
498
  tree.iterate({
495
499
  from,
496
500
  to,
497
- enter: wrapWithCatch(enterNode),
498
- leave: wrapWithCatch(leaveNode),
501
+ enter: wrapWithCatch(enterNode, 'decorate.enter'),
502
+ leave: wrapWithCatch(leaveNode, 'decorate.leave'),
499
503
  });
500
504
  }
501
505
  } else {
502
506
  // NOTE: If line numbering then we must iterate from the start of document.
503
507
  tree.iterate({
504
- enter: wrapWithCatch(enterNode),
505
- leave: wrapWithCatch(leaveNode),
508
+ enter: wrapWithCatch(enterNode, 'decorate.enter'),
509
+ leave: wrapWithCatch(leaveNode, 'decorate.leave'),
506
510
  });
507
511
  }
508
512
 
@@ -514,15 +518,20 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
514
518
 
515
519
  const forceUpdate = StateEffect.define<null>();
516
520
 
521
+ export type NodeData = { name: 'Link'; url: string } | { name: 'Image'; url: string };
522
+
517
523
  export interface DecorateOptions {
518
524
  /**
519
525
  * Prevents triggering decorations as the cursor moves through the document.
520
526
  */
521
527
  selectionChangeDelay?: number;
522
528
  numberedHeadings?: { from: number; to?: number };
523
- renderLinkButton?: RenderCallback<{ url: string }>;
524
529
  // TODO(burdon): Additional padding for each line.
525
530
  listPaddingLeft?: number;
531
+ // TODO(burdon): Use consistently.
532
+ skip?: (node: NodeData) => boolean;
533
+ // TODO(burdon): Remove.
534
+ renderLinkButton?: RenderCallback<{ url: string }>;
526
535
  }
527
536
 
528
537
  export const decorateMarkdown = (options: DecorateOptions = {}) => {
@@ -578,9 +587,9 @@ export const decorateMarkdown = (options: DecorateOptions = {}) => {
578
587
  },
579
588
  {
580
589
  provide: (plugin) => [
581
- EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? Decoration.none),
590
+ Prec.low(EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? Decoration.none)),
582
591
  EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? Decoration.none),
583
- EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? Decoration.none),
592
+ EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? Decoration.none),
584
593
  ],
585
594
  },
586
595
  ),
@@ -15,12 +15,8 @@ import {
15
15
  } from '@codemirror/state';
16
16
  import { EditorView, type ViewUpdate, keymap } from '@codemirror/view';
17
17
  import { type SyntaxNode, type SyntaxNodeRef } from '@lezer/common';
18
- import { useCallback, useMemo } from 'react';
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
  };
@@ -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
  }
@@ -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,7 +6,7 @@ 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 '../../testing';
9
+ import { str } from '../../util';
10
10
  import { createMarkdownExtensions } from '../markdown';
11
11
 
12
12
  import { indentItemLess, indentItemMore, moveItemDown, moveItemUp } from './commands';
@@ -7,11 +7,11 @@ import { Decoration, type DecorationSet, EditorView, ViewPlugin, type ViewUpdate
7
7
 
8
8
  import { mx } from '@dxos/react-ui-theme';
9
9
 
10
- import { floatingMenu } from '../command';
11
10
  import { decorateMarkdown } from '../markdown';
12
11
 
13
12
  import { commands } from './commands';
14
13
  import { editor } from './editor';
14
+ import { menu } from './menu';
15
15
  import { selectionCompartment, selectionEquals, selectionFacet } from './selection';
16
16
  import { outlinerTree, treeFacet } from './tree';
17
17
 
@@ -38,7 +38,7 @@ export type OutlinerProps = {};
38
38
  * - Constrains editor to outline structure.
39
39
  * - Supports smart cut-and-paste.
40
40
  */
41
- export const outliner = (options: OutlinerProps = {}): Extension => [
41
+ export const outliner = (_options: OutlinerProps = {}): Extension => [
42
42
  // Commands.
43
43
  Prec.highest(commands()),
44
44
 
@@ -52,7 +52,7 @@ export const outliner = (options: OutlinerProps = {}): Extension => [
52
52
  editor(),
53
53
 
54
54
  // Floating menu.
55
- floatingMenu(),
55
+ menu(),
56
56
 
57
57
  // Line decorations.
58
58
  decorations(),
@@ -157,9 +157,9 @@ const decorations = () => [
157
157
  },
158
158
 
159
159
  '.cm-list-item-focused': {
160
- borderColor: 'var(--dx-accentFocusIndicator)',
160
+ borderColor: 'var(--dx-neutralFocusIndicator)',
161
161
  },
162
- '[data-has-focus] & .cm-list-item-selected': {
162
+ '&:focus-within .cm-list-item-selected': {
163
163
  borderColor: 'var(--dx-separator)',
164
164
  },
165
165
  }),
@@ -6,8 +6,8 @@ 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 { str } from '../../testing';
10
9
  import { type Range } from '../../types';
10
+ import { str } from '../../util';
11
11
 
12
12
  import { type Item, listItemToString, outlinerTree, treeFacet } from './tree';
13
13
 
@@ -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';