@dxos/react-ui-editor 0.8.4-main.ae835ea → 0.8.4-main.bc2380dfbc

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 (432) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/browser/index.mjs +1466 -8456
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/translations.mjs +39 -0
  7. package/dist/lib/browser/translations.mjs.map +7 -0
  8. package/dist/lib/node-esm/index.mjs +1466 -8455
  9. package/dist/lib/node-esm/index.mjs.map +4 -4
  10. package/dist/lib/node-esm/meta.json +1 -1
  11. package/dist/lib/node-esm/translations.mjs +41 -0
  12. package/dist/lib/node-esm/translations.mjs.map +7 -0
  13. package/dist/types/src/components/Editor/Editor.d.ts +53 -29
  14. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  15. package/dist/types/src/components/Editor/Editor.stories.d.ts +16 -20
  16. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -1
  17. package/dist/types/src/components/Editor/EditorView.d.ts +31 -0
  18. package/dist/types/src/components/Editor/EditorView.d.ts.map +1 -0
  19. package/dist/types/src/components/Editor/controller.d.ts +10 -0
  20. package/dist/types/src/components/Editor/controller.d.ts.map +1 -0
  21. package/dist/types/src/{extensions/popover/PopoverMenuProvider.d.ts → components/EditorMenuProvider/EditorMenuProvider.d.ts} +7 -9
  22. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -0
  23. package/dist/types/src/components/EditorMenuProvider/index.d.ts +6 -0
  24. package/dist/types/src/components/EditorMenuProvider/index.d.ts.map +1 -0
  25. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts +4 -0
  26. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -0
  27. package/dist/types/src/components/EditorMenuProvider/menu.d.ts +28 -0
  28. package/dist/types/src/components/EditorMenuProvider/menu.d.ts.map +1 -0
  29. package/dist/types/src/{extensions/popover → components/EditorMenuProvider}/popover.d.ts +2 -2
  30. package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -0
  31. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts +34 -0
  32. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -0
  33. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +16 -0
  34. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -0
  35. package/dist/types/src/components/EditorPreviewProvider/index.d.ts +2 -0
  36. package/dist/types/src/components/EditorPreviewProvider/index.d.ts.map +1 -0
  37. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +14 -3
  38. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  39. package/dist/types/src/components/EditorToolbar/blocks.d.ts +4 -17
  40. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  41. package/dist/types/src/components/EditorToolbar/formatting.d.ts +4 -17
  42. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  43. package/dist/types/src/components/EditorToolbar/headings.d.ts +4 -17
  44. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  45. package/dist/types/src/components/EditorToolbar/image.d.ts +3 -15
  46. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  47. package/dist/types/src/components/EditorToolbar/index.d.ts +1 -1
  48. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  49. package/dist/types/src/components/EditorToolbar/lists.d.ts +4 -17
  50. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -1
  51. package/dist/types/src/components/EditorToolbar/search.d.ts +3 -15
  52. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  53. package/dist/types/src/components/EditorToolbar/types.d.ts +6 -0
  54. package/dist/types/src/components/EditorToolbar/types.d.ts.map +1 -0
  55. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +5 -18
  56. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  57. package/dist/types/src/components/index.d.ts +2 -1
  58. package/dist/types/src/components/index.d.ts.map +1 -1
  59. package/dist/types/src/extensions/Assistant.stories.d.ts +10 -0
  60. package/dist/types/src/extensions/Assistant.stories.d.ts.map +1 -0
  61. package/dist/types/src/extensions/assistant-extension.d.ts +24 -0
  62. package/dist/types/src/extensions/assistant-extension.d.ts.map +1 -0
  63. package/dist/types/src/extensions/index.d.ts +1 -25
  64. package/dist/types/src/extensions/index.d.ts.map +1 -1
  65. package/dist/types/src/hooks/index.d.ts +1 -0
  66. package/dist/types/src/hooks/index.d.ts.map +1 -1
  67. package/dist/types/src/hooks/useBasicMarkdownExtensions.d.ts +25 -0
  68. package/dist/types/src/hooks/useBasicMarkdownExtensions.d.ts.map +1 -0
  69. package/dist/types/src/hooks/useTextEditor.d.ts +2 -2
  70. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  71. package/dist/types/src/index.d.ts +0 -9
  72. package/dist/types/src/index.d.ts.map +1 -1
  73. package/dist/types/src/stories/Automerge.stories.d.ts +44 -0
  74. package/dist/types/src/stories/Automerge.stories.d.ts.map +1 -0
  75. package/dist/types/src/stories/Comments.stories.d.ts +4 -3
  76. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  77. package/dist/types/src/stories/EditorToolbar.stories.d.ts +29 -27
  78. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  79. package/dist/types/src/stories/Experimental.stories.d.ts +5 -4
  80. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  81. package/dist/types/src/stories/Markdown.stories.d.ts +4 -3
  82. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  83. package/dist/types/src/stories/Outliner.stories.d.ts +2 -2
  84. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  85. package/dist/types/src/stories/Popover.stories.d.ts +3 -3
  86. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -1
  87. package/dist/types/src/stories/Preview.stories.d.ts +5 -3
  88. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  89. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -1
  90. package/dist/types/src/stories/TextEditor.stories.d.ts +4 -3
  91. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  92. package/dist/types/src/stories/Theme.stories.d.ts +8 -0
  93. package/dist/types/src/stories/Theme.stories.d.ts.map +1 -0
  94. package/dist/types/src/stories/components/EditorStory.d.ts +11 -20
  95. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  96. package/dist/types/src/stories/components/util.d.ts +4 -3
  97. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  98. package/dist/types/src/translations.d.ts +26 -26
  99. package/dist/types/src/translations.d.ts.map +1 -1
  100. package/dist/types/src/util/index.d.ts +0 -5
  101. package/dist/types/src/util/index.d.ts.map +1 -1
  102. package/dist/types/src/util/react.d.ts +6 -5
  103. package/dist/types/src/util/react.d.ts.map +1 -1
  104. package/dist/types/tsconfig.tsbuildinfo +1 -1
  105. package/package.json +80 -77
  106. package/src/components/Editor/Editor.stories.tsx +69 -49
  107. package/src/components/Editor/Editor.tsx +165 -61
  108. package/src/components/Editor/EditorView.tsx +102 -0
  109. package/src/components/Editor/controller.ts +50 -0
  110. package/src/{extensions/popover/PopoverMenuProvider.tsx → components/EditorMenuProvider/EditorMenuProvider.tsx} +48 -42
  111. package/src/components/EditorMenuProvider/index.ts +10 -0
  112. package/src/{extensions/popover → components/EditorMenuProvider}/menu-presets.ts +20 -19
  113. package/src/{extensions/popover → components/EditorMenuProvider}/menu.ts +21 -18
  114. package/src/{extensions/popover → components/EditorMenuProvider}/popover.ts +5 -7
  115. package/src/{extensions/popover/usePopoverMenu.ts → components/EditorMenuProvider/useEditorMenu.ts} +29 -22
  116. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +79 -0
  117. package/src/components/EditorPreviewProvider/index.ts +5 -0
  118. package/src/components/EditorToolbar/EditorToolbar.tsx +47 -69
  119. package/src/components/EditorToolbar/blocks.ts +55 -47
  120. package/src/components/EditorToolbar/formatting.ts +44 -45
  121. package/src/components/EditorToolbar/headings.ts +45 -50
  122. package/src/components/EditorToolbar/image.ts +16 -14
  123. package/src/components/EditorToolbar/index.ts +2 -7
  124. package/src/components/EditorToolbar/lists.ts +42 -40
  125. package/src/components/EditorToolbar/search.ts +16 -14
  126. package/src/components/EditorToolbar/types.ts +8 -0
  127. package/src/components/EditorToolbar/view-mode.ts +37 -42
  128. package/src/components/index.ts +3 -1
  129. package/src/extensions/Assistant.stories.tsx +112 -0
  130. package/src/extensions/assistant-extension.tsx +223 -0
  131. package/src/extensions/index.ts +2 -26
  132. package/src/hooks/index.ts +1 -0
  133. package/src/hooks/useBasicMarkdownExtensions.ts +55 -0
  134. package/src/hooks/useTextEditor.ts +13 -7
  135. package/src/index.ts +0 -13
  136. package/src/stories/Automerge.stories.tsx +177 -0
  137. package/src/stories/Comments.stories.tsx +49 -45
  138. package/src/stories/EditorToolbar.stories.tsx +41 -53
  139. package/src/stories/Experimental.stories.tsx +14 -16
  140. package/src/stories/Markdown.stories.tsx +16 -16
  141. package/src/stories/Outliner.stories.tsx +20 -29
  142. package/src/stories/Popover.stories.tsx +47 -53
  143. package/src/stories/Preview.stories.tsx +91 -80
  144. package/src/stories/Tags.stories.tsx +36 -13
  145. package/src/stories/TextEditor.stories.tsx +13 -19
  146. package/src/stories/Theme.stories.tsx +61 -0
  147. package/src/stories/components/EditorStory.tsx +46 -32
  148. package/src/stories/components/util.tsx +90 -59
  149. package/src/translations.ts +30 -25
  150. package/src/util/index.ts +1 -6
  151. package/src/util/react.tsx +8 -13
  152. package/dist/lib/browser/chunk-HL3YF6WC.mjs +0 -22
  153. package/dist/lib/browser/chunk-HL3YF6WC.mjs.map +0 -7
  154. package/dist/lib/browser/testing/index.mjs +0 -76
  155. package/dist/lib/browser/testing/index.mjs.map +0 -7
  156. package/dist/lib/browser/types/index.mjs +0 -13
  157. package/dist/lib/browser/types/index.mjs.map +0 -7
  158. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs +0 -24
  159. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs.map +0 -7
  160. package/dist/lib/node-esm/testing/index.mjs +0 -78
  161. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  162. package/dist/lib/node-esm/types/index.mjs +0 -14
  163. package/dist/lib/node-esm/types/index.mjs.map +0 -7
  164. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -37
  165. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  166. package/dist/types/src/defaults.d.ts +0 -14
  167. package/dist/types/src/defaults.d.ts.map +0 -1
  168. package/dist/types/src/extensions/annotations.d.ts +0 -9
  169. package/dist/types/src/extensions/annotations.d.ts.map +0 -1
  170. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +0 -26
  171. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +0 -1
  172. package/dist/types/src/extensions/autocomplete/index.d.ts +0 -5
  173. package/dist/types/src/extensions/autocomplete/index.d.ts.map +0 -1
  174. package/dist/types/src/extensions/autocomplete/match.d.ts +0 -13
  175. package/dist/types/src/extensions/autocomplete/match.d.ts.map +0 -1
  176. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +0 -20
  177. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +0 -1
  178. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +0 -10
  179. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +0 -1
  180. package/dist/types/src/extensions/automerge/automerge.d.ts +0 -4
  181. package/dist/types/src/extensions/automerge/automerge.d.ts.map +0 -1
  182. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +0 -47
  183. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +0 -1
  184. package/dist/types/src/extensions/automerge/automerge.test.d.ts +0 -2
  185. package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +0 -1
  186. package/dist/types/src/extensions/automerge/cursor.d.ts +0 -4
  187. package/dist/types/src/extensions/automerge/cursor.d.ts.map +0 -1
  188. package/dist/types/src/extensions/automerge/defs.d.ts +0 -17
  189. package/dist/types/src/extensions/automerge/defs.d.ts.map +0 -1
  190. package/dist/types/src/extensions/automerge/index.d.ts +0 -2
  191. package/dist/types/src/extensions/automerge/index.d.ts.map +0 -1
  192. package/dist/types/src/extensions/automerge/sync.d.ts +0 -17
  193. package/dist/types/src/extensions/automerge/sync.d.ts.map +0 -1
  194. package/dist/types/src/extensions/automerge/update-automerge.d.ts +0 -6
  195. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +0 -1
  196. package/dist/types/src/extensions/automerge/update-codemirror.d.ts +0 -5
  197. package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +0 -1
  198. package/dist/types/src/extensions/autoscroll.d.ts +0 -10
  199. package/dist/types/src/extensions/autoscroll.d.ts.map +0 -1
  200. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +0 -31
  201. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +0 -1
  202. package/dist/types/src/extensions/awareness/awareness.d.ts +0 -46
  203. package/dist/types/src/extensions/awareness/awareness.d.ts.map +0 -1
  204. package/dist/types/src/extensions/awareness/index.d.ts +0 -3
  205. package/dist/types/src/extensions/awareness/index.d.ts.map +0 -1
  206. package/dist/types/src/extensions/blast.d.ts +0 -25
  207. package/dist/types/src/extensions/blast.d.ts.map +0 -1
  208. package/dist/types/src/extensions/comments.d.ts +0 -95
  209. package/dist/types/src/extensions/comments.d.ts.map +0 -1
  210. package/dist/types/src/extensions/debug.d.ts +0 -3
  211. package/dist/types/src/extensions/debug.d.ts.map +0 -1
  212. package/dist/types/src/extensions/dnd.d.ts +0 -9
  213. package/dist/types/src/extensions/dnd.d.ts.map +0 -1
  214. package/dist/types/src/extensions/factories.d.ts +0 -83
  215. package/dist/types/src/extensions/factories.d.ts.map +0 -1
  216. package/dist/types/src/extensions/focus.d.ts +0 -7
  217. package/dist/types/src/extensions/focus.d.ts.map +0 -1
  218. package/dist/types/src/extensions/folding.d.ts +0 -7
  219. package/dist/types/src/extensions/folding.d.ts.map +0 -1
  220. package/dist/types/src/extensions/hashtag.d.ts +0 -3
  221. package/dist/types/src/extensions/hashtag.d.ts.map +0 -1
  222. package/dist/types/src/extensions/json.d.ts +0 -7
  223. package/dist/types/src/extensions/json.d.ts.map +0 -1
  224. package/dist/types/src/extensions/listener.d.ts +0 -13
  225. package/dist/types/src/extensions/listener.d.ts.map +0 -1
  226. package/dist/types/src/extensions/markdown/action.d.ts +0 -12
  227. package/dist/types/src/extensions/markdown/action.d.ts.map +0 -1
  228. package/dist/types/src/extensions/markdown/bundle.d.ts +0 -22
  229. package/dist/types/src/extensions/markdown/bundle.d.ts.map +0 -1
  230. package/dist/types/src/extensions/markdown/changes.d.ts +0 -10
  231. package/dist/types/src/extensions/markdown/changes.d.ts.map +0 -1
  232. package/dist/types/src/extensions/markdown/changes.test.d.ts +0 -2
  233. package/dist/types/src/extensions/markdown/changes.test.d.ts.map +0 -1
  234. package/dist/types/src/extensions/markdown/debug.d.ts +0 -11
  235. package/dist/types/src/extensions/markdown/debug.d.ts.map +0 -1
  236. package/dist/types/src/extensions/markdown/decorate.d.ts +0 -25
  237. package/dist/types/src/extensions/markdown/decorate.d.ts.map +0 -1
  238. package/dist/types/src/extensions/markdown/formatting.d.ts +0 -62
  239. package/dist/types/src/extensions/markdown/formatting.d.ts.map +0 -1
  240. package/dist/types/src/extensions/markdown/formatting.test.d.ts +0 -3
  241. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +0 -1
  242. package/dist/types/src/extensions/markdown/highlight.d.ts +0 -37
  243. package/dist/types/src/extensions/markdown/highlight.d.ts.map +0 -1
  244. package/dist/types/src/extensions/markdown/image.d.ts +0 -7
  245. package/dist/types/src/extensions/markdown/image.d.ts.map +0 -1
  246. package/dist/types/src/extensions/markdown/index.d.ts +0 -10
  247. package/dist/types/src/extensions/markdown/index.d.ts.map +0 -1
  248. package/dist/types/src/extensions/markdown/link.d.ts +0 -7
  249. package/dist/types/src/extensions/markdown/link.d.ts.map +0 -1
  250. package/dist/types/src/extensions/markdown/parser.test.d.ts +0 -2
  251. package/dist/types/src/extensions/markdown/parser.test.d.ts.map +0 -1
  252. package/dist/types/src/extensions/markdown/styles.d.ts +0 -4
  253. package/dist/types/src/extensions/markdown/styles.d.ts.map +0 -1
  254. package/dist/types/src/extensions/markdown/table.d.ts +0 -8
  255. package/dist/types/src/extensions/markdown/table.d.ts.map +0 -1
  256. package/dist/types/src/extensions/mention.d.ts +0 -7
  257. package/dist/types/src/extensions/mention.d.ts.map +0 -1
  258. package/dist/types/src/extensions/modes.d.ts +0 -10
  259. package/dist/types/src/extensions/modes.d.ts.map +0 -1
  260. package/dist/types/src/extensions/outliner/commands.d.ts +0 -10
  261. package/dist/types/src/extensions/outliner/commands.d.ts.map +0 -1
  262. package/dist/types/src/extensions/outliner/editor.d.ts +0 -5
  263. package/dist/types/src/extensions/outliner/editor.d.ts.map +0 -1
  264. package/dist/types/src/extensions/outliner/editor.test.d.ts +0 -2
  265. package/dist/types/src/extensions/outliner/editor.test.d.ts.map +0 -1
  266. package/dist/types/src/extensions/outliner/index.d.ts +0 -4
  267. package/dist/types/src/extensions/outliner/index.d.ts.map +0 -1
  268. package/dist/types/src/extensions/outliner/menu.d.ts +0 -8
  269. package/dist/types/src/extensions/outliner/menu.d.ts.map +0 -1
  270. package/dist/types/src/extensions/outliner/outliner.d.ts +0 -11
  271. package/dist/types/src/extensions/outliner/outliner.d.ts.map +0 -1
  272. package/dist/types/src/extensions/outliner/outliner.test.d.ts +0 -2
  273. package/dist/types/src/extensions/outliner/outliner.test.d.ts.map +0 -1
  274. package/dist/types/src/extensions/outliner/selection.d.ts +0 -12
  275. package/dist/types/src/extensions/outliner/selection.d.ts.map +0 -1
  276. package/dist/types/src/extensions/outliner/tree.d.ts +0 -79
  277. package/dist/types/src/extensions/outliner/tree.d.ts.map +0 -1
  278. package/dist/types/src/extensions/outliner/tree.test.d.ts +0 -2
  279. package/dist/types/src/extensions/outliner/tree.test.d.ts.map +0 -1
  280. package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts.map +0 -1
  281. package/dist/types/src/extensions/popover/index.d.ts +0 -8
  282. package/dist/types/src/extensions/popover/index.d.ts.map +0 -1
  283. package/dist/types/src/extensions/popover/menu-presets.d.ts +0 -4
  284. package/dist/types/src/extensions/popover/menu-presets.d.ts.map +0 -1
  285. package/dist/types/src/extensions/popover/menu.d.ts +0 -24
  286. package/dist/types/src/extensions/popover/menu.d.ts.map +0 -1
  287. package/dist/types/src/extensions/popover/modal.d.ts +0 -7
  288. package/dist/types/src/extensions/popover/modal.d.ts.map +0 -1
  289. package/dist/types/src/extensions/popover/popover.d.ts.map +0 -1
  290. package/dist/types/src/extensions/popover/usePopoverMenu.d.ts +0 -34
  291. package/dist/types/src/extensions/popover/usePopoverMenu.d.ts.map +0 -1
  292. package/dist/types/src/extensions/popover/util.d.ts +0 -8
  293. package/dist/types/src/extensions/popover/util.d.ts.map +0 -1
  294. package/dist/types/src/extensions/preview/index.d.ts +0 -2
  295. package/dist/types/src/extensions/preview/index.d.ts.map +0 -1
  296. package/dist/types/src/extensions/preview/preview.d.ts +0 -32
  297. package/dist/types/src/extensions/preview/preview.d.ts.map +0 -1
  298. package/dist/types/src/extensions/selection.d.ts +0 -24
  299. package/dist/types/src/extensions/selection.d.ts.map +0 -1
  300. package/dist/types/src/extensions/state.d.ts +0 -2
  301. package/dist/types/src/extensions/state.d.ts.map +0 -1
  302. package/dist/types/src/extensions/tags/extended-markdown.d.ts +0 -10
  303. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +0 -1
  304. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +0 -2
  305. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +0 -1
  306. package/dist/types/src/extensions/tags/index.d.ts +0 -4
  307. package/dist/types/src/extensions/tags/index.d.ts.map +0 -1
  308. package/dist/types/src/extensions/tags/streamer.d.ts +0 -12
  309. package/dist/types/src/extensions/tags/streamer.d.ts.map +0 -1
  310. package/dist/types/src/extensions/tags/xml-tags.d.ts +0 -72
  311. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +0 -1
  312. package/dist/types/src/extensions/tags/xml-util.d.ts +0 -10
  313. package/dist/types/src/extensions/tags/xml-util.d.ts.map +0 -1
  314. package/dist/types/src/extensions/typewriter.d.ts +0 -10
  315. package/dist/types/src/extensions/typewriter.d.ts.map +0 -1
  316. package/dist/types/src/stories/CommandDialog.stories.d.ts +0 -14
  317. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +0 -1
  318. package/dist/types/src/styles/index.d.ts +0 -4
  319. package/dist/types/src/styles/index.d.ts.map +0 -1
  320. package/dist/types/src/styles/markdown.d.ts +0 -8
  321. package/dist/types/src/styles/markdown.d.ts.map +0 -1
  322. package/dist/types/src/styles/theme.d.ts +0 -38
  323. package/dist/types/src/styles/theme.d.ts.map +0 -1
  324. package/dist/types/src/styles/tokens.d.ts +0 -3
  325. package/dist/types/src/styles/tokens.d.ts.map +0 -1
  326. package/dist/types/src/testing/PreviewPopover.d.ts +0 -20
  327. package/dist/types/src/testing/PreviewPopover.d.ts.map +0 -1
  328. package/dist/types/src/testing/index.d.ts +0 -3
  329. package/dist/types/src/testing/index.d.ts.map +0 -1
  330. package/dist/types/src/testing/util.d.ts +0 -3
  331. package/dist/types/src/testing/util.d.ts.map +0 -1
  332. package/dist/types/src/types/index.d.ts +0 -2
  333. package/dist/types/src/types/index.d.ts.map +0 -1
  334. package/dist/types/src/types/types.d.ts +0 -21
  335. package/dist/types/src/types/types.d.ts.map +0 -1
  336. package/dist/types/src/util/cursor.d.ts +0 -31
  337. package/dist/types/src/util/cursor.d.ts.map +0 -1
  338. package/dist/types/src/util/debug.d.ts +0 -17
  339. package/dist/types/src/util/debug.d.ts.map +0 -1
  340. package/dist/types/src/util/decorations.d.ts +0 -4
  341. package/dist/types/src/util/decorations.d.ts.map +0 -1
  342. package/dist/types/src/util/dom.d.ts +0 -10
  343. package/dist/types/src/util/dom.d.ts.map +0 -1
  344. package/dist/types/src/util/facet.d.ts +0 -3
  345. package/dist/types/src/util/facet.d.ts.map +0 -1
  346. package/src/components/EditorToolbar/util.ts +0 -60
  347. package/src/defaults.ts +0 -52
  348. package/src/extensions/annotations.ts +0 -55
  349. package/src/extensions/autocomplete/autocomplete.ts +0 -220
  350. package/src/extensions/autocomplete/index.ts +0 -8
  351. package/src/extensions/autocomplete/match.ts +0 -46
  352. package/src/extensions/autocomplete/placeholder.ts +0 -117
  353. package/src/extensions/autocomplete/typeahead.ts +0 -87
  354. package/src/extensions/automerge/automerge.stories.tsx +0 -149
  355. package/src/extensions/automerge/automerge.test.tsx +0 -78
  356. package/src/extensions/automerge/automerge.ts +0 -105
  357. package/src/extensions/automerge/cursor.ts +0 -28
  358. package/src/extensions/automerge/defs.ts +0 -31
  359. package/src/extensions/automerge/index.ts +0 -5
  360. package/src/extensions/automerge/sync.ts +0 -79
  361. package/src/extensions/automerge/update-automerge.ts +0 -50
  362. package/src/extensions/automerge/update-codemirror.ts +0 -115
  363. package/src/extensions/autoscroll.ts +0 -157
  364. package/src/extensions/awareness/awareness-provider.ts +0 -127
  365. package/src/extensions/awareness/awareness.ts +0 -315
  366. package/src/extensions/awareness/index.ts +0 -6
  367. package/src/extensions/blast.ts +0 -363
  368. package/src/extensions/comments.ts +0 -597
  369. package/src/extensions/debug.ts +0 -15
  370. package/src/extensions/dnd.ts +0 -37
  371. package/src/extensions/factories.ts +0 -277
  372. package/src/extensions/focus.ts +0 -36
  373. package/src/extensions/folding.tsx +0 -44
  374. package/src/extensions/hashtag.tsx +0 -68
  375. package/src/extensions/json.ts +0 -57
  376. package/src/extensions/listener.ts +0 -32
  377. package/src/extensions/markdown/action.ts +0 -117
  378. package/src/extensions/markdown/bundle.ts +0 -105
  379. package/src/extensions/markdown/changes.test.ts +0 -26
  380. package/src/extensions/markdown/changes.ts +0 -149
  381. package/src/extensions/markdown/debug.ts +0 -44
  382. package/src/extensions/markdown/decorate.ts +0 -601
  383. package/src/extensions/markdown/formatting.test.ts +0 -498
  384. package/src/extensions/markdown/formatting.ts +0 -1267
  385. package/src/extensions/markdown/highlight.ts +0 -183
  386. package/src/extensions/markdown/image.ts +0 -118
  387. package/src/extensions/markdown/index.ts +0 -13
  388. package/src/extensions/markdown/link.ts +0 -50
  389. package/src/extensions/markdown/parser.test.ts +0 -75
  390. package/src/extensions/markdown/styles.ts +0 -135
  391. package/src/extensions/markdown/table.ts +0 -150
  392. package/src/extensions/mention.ts +0 -41
  393. package/src/extensions/modes.ts +0 -41
  394. package/src/extensions/outliner/commands.ts +0 -270
  395. package/src/extensions/outliner/editor.test.ts +0 -33
  396. package/src/extensions/outliner/editor.ts +0 -184
  397. package/src/extensions/outliner/index.ts +0 -7
  398. package/src/extensions/outliner/menu.ts +0 -128
  399. package/src/extensions/outliner/outliner.test.ts +0 -100
  400. package/src/extensions/outliner/outliner.ts +0 -167
  401. package/src/extensions/outliner/selection.ts +0 -50
  402. package/src/extensions/outliner/tree.test.ts +0 -168
  403. package/src/extensions/outliner/tree.ts +0 -317
  404. package/src/extensions/popover/index.ts +0 -12
  405. package/src/extensions/popover/modal.ts +0 -24
  406. package/src/extensions/popover/util.ts +0 -29
  407. package/src/extensions/preview/index.ts +0 -5
  408. package/src/extensions/preview/preview.ts +0 -193
  409. package/src/extensions/selection.ts +0 -100
  410. package/src/extensions/state.ts +0 -7
  411. package/src/extensions/tags/extended-markdown.test.ts +0 -261
  412. package/src/extensions/tags/extended-markdown.ts +0 -78
  413. package/src/extensions/tags/index.ts +0 -7
  414. package/src/extensions/tags/streamer.ts +0 -243
  415. package/src/extensions/tags/xml-tags.ts +0 -393
  416. package/src/extensions/tags/xml-util.ts +0 -94
  417. package/src/extensions/typewriter.ts +0 -68
  418. package/src/stories/CommandDialog.stories.tsx +0 -78
  419. package/src/styles/index.ts +0 -7
  420. package/src/styles/markdown.ts +0 -26
  421. package/src/styles/theme.ts +0 -269
  422. package/src/styles/tokens.ts +0 -17
  423. package/src/testing/PreviewPopover.tsx +0 -80
  424. package/src/testing/index.ts +0 -6
  425. package/src/testing/util.ts +0 -7
  426. package/src/types/index.ts +0 -5
  427. package/src/types/types.ts +0 -32
  428. package/src/util/cursor.ts +0 -56
  429. package/src/util/debug.ts +0 -64
  430. package/src/util/decorations.ts +0 -21
  431. package/src/util/dom.ts +0 -34
  432. package/src/util/facet.ts +0 -13
@@ -0,0 +1,102 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Transaction } from '@codemirror/state';
6
+ import { EditorView as NaturalEditorView } from '@codemirror/view';
7
+ import React, { forwardRef, useEffect, useImperativeHandle, useRef } from 'react';
8
+
9
+ import { type ThemedClassName } from '@dxos/react-ui';
10
+ import { initialSync } from '@dxos/ui-editor';
11
+ import { mx } from '@dxos/ui-theme';
12
+
13
+ import { type UseTextEditorProps, useTextEditor } from '../../hooks';
14
+ import { type EditorController, createEditorController, noopController } from './controller';
15
+
16
+ export type EditorViewProps = ThemedClassName<
17
+ {
18
+ focusable?: boolean;
19
+ value?: string;
20
+ onChange?: (value: string) => void;
21
+ } & UseTextEditorProps
22
+ >;
23
+
24
+ /**
25
+ * Minimal text editor.
26
+ * NOTE: This shouold not be used with the automerge extension.
27
+ */
28
+ // TODO(burdon): Move controller to Root component, then make composable.
29
+ export const EditorView = forwardRef<EditorController, EditorViewProps>(
30
+ ({ classNames, id, extensions, selectionEnd, focusable = true, value, onChange, ...props }, forwardedRef) => {
31
+ // Hold the latest onChange in a ref so callers may pass an inline callback
32
+ // without forcing the underlying editor to be destroyed and recreated on
33
+ // every render — which would blur the focused input on each keystroke.
34
+ const onChangeRef = useRef(onChange);
35
+ onChangeRef.current = onChange;
36
+
37
+ const { parentRef, focusAttributes, view } = useTextEditor(
38
+ () => ({
39
+ id,
40
+ initialValue: value,
41
+ selectionEnd,
42
+ extensions: [
43
+ extensions ?? [],
44
+ NaturalEditorView.updateListener.of(({ view, docChanged, transactions }) => {
45
+ const isInitialSync = transactions.some((tr) => tr.annotation(Transaction.userEvent) === initialSync.value);
46
+ if (!isInitialSync && docChanged) {
47
+ onChangeRef.current?.(view.state.doc.toString());
48
+ }
49
+ }),
50
+ ],
51
+ ...props,
52
+ }),
53
+ [id, extensions, selectionEnd],
54
+ );
55
+
56
+ // External controller.
57
+ useImperativeHandle(forwardedRef, () => {
58
+ return createEditorController(view);
59
+ }, [id, view]);
60
+
61
+ // Sync the editor doc to the controlled `value` prop, but only when they
62
+ // disagree. After internal typing the prop will already match the editor's
63
+ // doc, and dispatching anyway would race fast keystrokes — a stale rAF
64
+ // closure can replace doc content with an older value, dropping characters.
65
+ useEffect(() => {
66
+ if (!view) {
67
+ return;
68
+ }
69
+ const next = value ?? '';
70
+ if (view.state.doc.toString() === next) {
71
+ return;
72
+ }
73
+ requestAnimationFrame(() => {
74
+ if (view.state.doc.toString() === next) {
75
+ return;
76
+ }
77
+ view.dispatch({
78
+ annotations: initialSync,
79
+ changes: [{ from: 0, to: view.state.doc.length, insert: next }],
80
+ selection: selectionEnd ? { anchor: next.length } : undefined,
81
+ });
82
+
83
+ if (selectionEnd) {
84
+ view.focus();
85
+ }
86
+ });
87
+ }, [view, value, selectionEnd]);
88
+
89
+ return (
90
+ <div
91
+ className={mx(
92
+ 'w-full outline-hidden focus:border-accent-surface focus-within:border-focus-ring-subtle',
93
+ classNames,
94
+ )}
95
+ {...(focusable ? focusAttributes : {})}
96
+ ref={parentRef}
97
+ />
98
+ );
99
+ },
100
+ );
101
+
102
+ export { type EditorController, createEditorController, noopController };
@@ -0,0 +1,50 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type EditorView } from '@codemirror/view';
6
+
7
+ export interface EditorController {
8
+ get view(): EditorView | null;
9
+ getText: () => string;
10
+ setText: (text: string, focus?: boolean) => void;
11
+ focus: () => void;
12
+ }
13
+
14
+ export const noopController: EditorController = {
15
+ get view() {
16
+ return null;
17
+ },
18
+ getText: () => '',
19
+ setText: () => {},
20
+ focus: () => {},
21
+ };
22
+
23
+ export const createEditorController = (view: EditorView | null): EditorController => {
24
+ return {
25
+ get view() {
26
+ return view;
27
+ },
28
+ getText: () => {
29
+ return view?.state.doc.toString() ?? '';
30
+ },
31
+ setText: (text: string, focus?: boolean) => {
32
+ view?.dispatch({
33
+ changes: {
34
+ from: 0,
35
+ to: view?.state.doc.length ?? 0,
36
+ insert: text,
37
+ },
38
+ selection: {
39
+ anchor: text.length,
40
+ head: text.length,
41
+ },
42
+ });
43
+
44
+ if (focus) {
45
+ view?.focus();
46
+ }
47
+ },
48
+ focus: () => view?.focus(),
49
+ };
50
+ };
@@ -9,56 +9,56 @@ import React, { Fragment, type PropsWithChildren, useCallback, useEffect, useRef
9
9
  import { addEventListener } from '@dxos/async';
10
10
  import { invariant } from '@dxos/invariant';
11
11
  import {
12
+ DX_ANCHOR_ACTIVATE,
12
13
  type DxAnchorActivate,
13
14
  Icon,
14
15
  Popover,
16
+ ScrollArea,
15
17
  toLocalizedString,
16
18
  useDynamicRef,
17
19
  useThemeContext,
18
20
  useTranslation,
19
21
  } from '@dxos/react-ui';
20
22
 
21
- import { type PopoverMenuGroup, type PopoverMenuItem } from './menu';
23
+ import { type EditorMenuGroup, type EditorMenuItem } from './menu';
22
24
 
23
- export type PopoverMenuProviderProps = PropsWithChildren<{
25
+ export type EditorMenuProviderProps = PropsWithChildren<{
24
26
  view?: EditorView | null;
25
- groups?: PopoverMenuGroup[];
27
+ groups?: EditorMenuGroup[];
26
28
  currentItem?: string;
27
29
  open?: boolean;
28
30
  defaultOpen?: boolean;
29
31
  numItems?: number;
30
32
  onOpenChange?: (event: { view: EditorView; open: boolean; trigger?: string }) => void;
31
33
  onActivate?: (event: { view: EditorView; trigger?: string }) => void;
32
- onSelect?: (event: { view: EditorView; item: PopoverMenuItem }) => void;
34
+ onSelect?: (event: { view: EditorView; item: EditorMenuItem }) => void;
33
35
  onCancel?: (event: { view: EditorView }) => void;
34
36
  }>;
35
37
 
36
38
  /**
37
- * Implements the Popover and listens for the `dx-anchor-activate` event from the
38
- * `popover` extension's decoration.
39
- *
39
+ * Implements the Popover and listens for the `dx-anchor-activate` event from the `popover` extension's decoration.
40
40
  * NOTE: We don't use DropdownMenu because the command menu needs to manage focus explicitly.
41
41
  * I.e., focus must remain in the editor while displaying the menu (for type-ahead).
42
42
  */
43
- export const PopoverMenuProvider = ({
43
+ export const EditorMenuProvider = ({
44
44
  children,
45
45
  view,
46
46
  groups,
47
47
  currentItem,
48
- open: openParam,
48
+ open: openProp,
49
49
  defaultOpen,
50
50
  numItems = 8,
51
51
  onOpenChange,
52
52
  onActivate,
53
53
  onSelect,
54
54
  onCancel,
55
- }: PopoverMenuProviderProps) => {
55
+ }: EditorMenuProviderProps) => {
56
56
  const { tx } = useThemeContext();
57
57
  const triggerRef = useRef<HTMLButtonElement | null>(null);
58
- const [root, setRoot] = useState<HTMLDivElement | null>(null);
58
+
59
59
  const viewRef = useDynamicRef(view);
60
60
  const [open, setOpen] = useControllableState({
61
- prop: openParam,
61
+ prop: openProp,
62
62
  defaultProp: defaultOpen,
63
63
  onChange: (open) => {
64
64
  invariant(viewRef.current);
@@ -66,6 +66,7 @@ export const PopoverMenuProvider = ({
66
66
  },
67
67
  });
68
68
 
69
+ const [root, setRoot] = useState<HTMLDivElement | null>(null);
69
70
  useEffect(() => {
70
71
  if (!root) {
71
72
  return;
@@ -74,12 +75,10 @@ export const PopoverMenuProvider = ({
74
75
  // Listen for trigger.
75
76
  return addEventListener(
76
77
  root,
77
- 'dx-anchor-activate' as any,
78
+ DX_ANCHOR_ACTIVATE as any,
78
79
  (event: DxAnchorActivate) => {
79
- const { trigger, refId } = event;
80
-
81
- // If this has a `refId`, then it’s probably a URL or DXN and out of scope for this component.
82
- if (!refId) {
80
+ const { trigger, dxn } = event;
81
+ if (!dxn) {
83
82
  triggerRef.current = trigger as HTMLButtonElement;
84
83
  if (onActivate) {
85
84
  onActivate({ view: viewRef.current!, trigger: trigger.getAttribute('data-trigger') ?? undefined });
@@ -108,34 +107,37 @@ export const PopoverMenuProvider = ({
108
107
  return (
109
108
  <Popover.Root modal={false} open={open} onOpenChange={setOpen}>
110
109
  <Popover.VirtualTrigger virtualRef={triggerRef} />
110
+
111
+ {/* Menu. */}
111
112
  <Popover.Portal>
112
113
  <Popover.Content
113
114
  align='start'
114
- classNames={tx('menu.content', 'menu--exotic-unfocusable', { elevation: 'positioned' }, [
115
- 'overflow-y-auto',
116
- !menuGroups.length && 'hidden',
117
- ])}
115
+ classNames={['flex flex-col', !menuGroups.length && 'hidden']}
118
116
  style={{
119
117
  maxBlockSize: 36 * numItems + 10,
120
118
  }}
121
- /**
122
- * NOTE: We keep the focus in the editor, but Radix routes escape key.
123
- */
119
+ // NOTE: We keep the focus in the editor, but Radix routes escape key.
124
120
  onEscapeKeyDown={() => {
125
- // NOTE: Able to cancel if not in valid state.
126
- // event.preventDefault();
127
- onCancel?.({ view: view! });
121
+ const currentView = viewRef.current;
122
+ if (currentView) {
123
+ onCancel?.({ view: currentView });
124
+ }
128
125
  }}
129
126
  onOpenAutoFocus={(event) => event.preventDefault()}
130
127
  >
131
- <Popover.Viewport classNames={tx('menu.viewport', 'menu__viewport--exotic-unfocusable', {})}>
132
- <Menu groups={menuGroups} currentItem={currentItem} onSelect={handleSelect} />
128
+ <Popover.Viewport asChild classNames='dx-container'>
129
+ <ScrollArea.Root thin>
130
+ <ScrollArea.Viewport>
131
+ <Menu groups={menuGroups} currentItem={currentItem} onSelect={handleSelect} />
132
+ </ScrollArea.Viewport>
133
+ </ScrollArea.Root>
133
134
  </Popover.Viewport>
134
135
  <Popover.Arrow />
135
136
  </Popover.Content>
136
137
  </Popover.Portal>
137
138
 
138
- <div ref={setRoot} role='none' className='contents'>
139
+ {/* Content */}
140
+ <div className='contents' ref={setRoot}>
139
141
  {children}
140
142
  </div>
141
143
  </Popover.Root>
@@ -147,7 +149,7 @@ export const PopoverMenuProvider = ({
147
149
  //
148
150
 
149
151
  type MenuProps = {
150
- groups: PopoverMenuGroup[];
152
+ groups: EditorMenuGroup[];
151
153
  } & Pick<MenuGroupProps, 'currentItem' | 'onSelect'>;
152
154
 
153
155
  const Menu = ({ groups, currentItem, onSelect }: MenuProps) => {
@@ -157,15 +159,19 @@ const Menu = ({ groups, currentItem, onSelect }: MenuProps) => {
157
159
  {groups.map((group, index) => (
158
160
  <Fragment key={group.id}>
159
161
  <MenuGroup group={group} currentItem={currentItem} onSelect={onSelect} />
160
- {index < groups.length - 1 && <div className={tx('menu.separator', 'menu__item', {})} />}
162
+ {index < groups.length - 1 && <div className={tx('menu.separator', {})} />}
161
163
  </Fragment>
162
164
  ))}
163
165
  </ul>
164
166
  );
165
167
  };
166
168
 
169
+ //
170
+ // Menu Group
171
+ //
172
+
167
173
  type MenuGroupProps = {
168
- group: PopoverMenuGroup;
174
+ group: EditorMenuGroup;
169
175
  currentItem?: string;
170
176
  } & Pick<MenuItemProps, 'onSelect'>;
171
177
 
@@ -176,7 +182,7 @@ const MenuGroup = ({ group, currentItem, onSelect }: MenuGroupProps) => {
176
182
  return (
177
183
  <>
178
184
  {group.label && (
179
- <div className={tx('menu.groupLabel', 'menu__group__label', {})}>
185
+ <div className={tx('menu.groupLabel', {})}>
180
186
  <span>{toLocalizedString(group.label, t)}</span>
181
187
  </div>
182
188
  )}
@@ -188,10 +194,14 @@ const MenuGroup = ({ group, currentItem, onSelect }: MenuGroupProps) => {
188
194
  );
189
195
  };
190
196
 
197
+ //
198
+ // Menu Item
199
+ //
200
+
191
201
  type MenuItemProps = {
192
- item: PopoverMenuItem;
202
+ item: EditorMenuItem;
193
203
  current: boolean;
194
- onSelect?: (item: PopoverMenuItem) => void;
204
+ onSelect?: (item: EditorMenuItem) => void;
195
205
  };
196
206
 
197
207
  const MenuItem = ({ item, current, onSelect }: MenuItemProps) => {
@@ -208,12 +218,8 @@ const MenuItem = ({ item, current, onSelect }: MenuItemProps) => {
208
218
  const handleSelect = useCallback(() => onSelect?.(item), [item, onSelect]);
209
219
 
210
220
  return (
211
- <li
212
- ref={listRef}
213
- className={tx('menu.item', 'menu__item--exotic-unfocusable', {}, [current && 'bg-hoverSurface'])}
214
- onClick={handleSelect}
215
- >
216
- {item.icon && <Icon icon={item.icon} size={5} />}
221
+ <li ref={listRef} className={tx('menu.item', {}, [current && 'bg-hover-surface'])} onClick={handleSelect}>
222
+ {item.icon && <Icon icon={item.icon} />}
217
223
  <span className='grow truncate'>{toLocalizedString(item.label, t)}</span>
218
224
  </li>
219
225
  );
@@ -0,0 +1,10 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './menu';
6
+ export * from './menu-presets';
7
+ export * from './popover';
8
+
9
+ export * from './EditorMenuProvider';
10
+ export * from './useEditorMenu';
@@ -2,12 +2,12 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { popoverRangeEffect } from '../../extensions';
5
+ import { insertAtLineStart } from '@dxos/ui-editor';
6
6
 
7
- import { type PopoverMenuGroup } from './menu';
8
- import { insertAtLineStart } from './util';
7
+ import { type EditorMenuGroup } from './menu';
8
+ import { popoverRangeEffect } from './popover';
9
9
 
10
- export const formattingCommands: PopoverMenuGroup = {
10
+ export const formattingCommands: EditorMenuGroup = {
11
11
  id: 'markdown',
12
12
  label: 'Markdown',
13
13
  items: [
@@ -15,78 +15,78 @@ export const formattingCommands: PopoverMenuGroup = {
15
15
  id: 'heading-1',
16
16
  label: 'Heading 1',
17
17
  icon: 'ph--text-h-one--regular',
18
- onSelect: (view, head) => insertAtLineStart(view, head, '# '),
18
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '# '),
19
19
  },
20
20
  {
21
21
  id: 'heading-2',
22
22
  label: 'Heading 2',
23
23
  icon: 'ph--text-h-two--regular',
24
- onSelect: (view, head) => insertAtLineStart(view, head, '## '),
24
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '## '),
25
25
  },
26
26
  {
27
27
  id: 'heading-3',
28
28
  label: 'Heading 3',
29
29
  icon: 'ph--text-h-three--regular',
30
- onSelect: (view, head) => insertAtLineStart(view, head, '### '),
30
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '### '),
31
31
  },
32
32
  {
33
33
  id: 'heading-4',
34
34
  label: 'Heading 4',
35
35
  icon: 'ph--text-h-four--regular',
36
- onSelect: (view, head) => insertAtLineStart(view, head, '#### '),
36
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '#### '),
37
37
  },
38
38
  {
39
39
  id: 'heading-5',
40
40
  label: 'Heading 5',
41
41
  icon: 'ph--text-h-five--regular',
42
- onSelect: (view, head) => insertAtLineStart(view, head, '##### '),
42
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '##### '),
43
43
  },
44
44
  {
45
45
  id: 'heading-6',
46
46
  label: 'Heading 6',
47
47
  icon: 'ph--text-h-six--regular',
48
- onSelect: (view, head) => insertAtLineStart(view, head, '###### '),
48
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '###### '),
49
49
  },
50
50
  {
51
51
  id: 'bullet-list',
52
52
  label: 'Bullet List',
53
53
  icon: 'ph--list-bullets--regular',
54
- onSelect: (view, head) => insertAtLineStart(view, head, '- '),
54
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '- '),
55
55
  },
56
56
  {
57
57
  id: 'numbered-list',
58
58
  label: 'Numbered List',
59
59
  icon: 'ph--list-numbers--regular',
60
- onSelect: (view, head) => insertAtLineStart(view, head, '1. '),
60
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '1. '),
61
61
  },
62
62
  {
63
63
  id: 'task-list',
64
64
  label: 'Task List',
65
65
  icon: 'ph--list-checks--regular',
66
- onSelect: (view, head) => insertAtLineStart(view, head, '- [ ] '),
66
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '- [ ] '),
67
67
  },
68
68
  {
69
69
  id: 'quote',
70
70
  label: 'Quote',
71
71
  icon: 'ph--quotes--regular',
72
- onSelect: (view, head) => insertAtLineStart(view, head, '> '),
72
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '> '),
73
73
  },
74
74
  {
75
75
  id: 'code-block',
76
76
  label: 'Code Block',
77
77
  icon: 'ph--code-block--regular',
78
- onSelect: (view, head) => insertAtLineStart(view, head, '```\n\n```'),
78
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '```\n\n```'),
79
79
  },
80
80
  {
81
81
  id: 'table',
82
82
  label: 'Table',
83
83
  icon: 'ph--table--regular',
84
- onSelect: (view, head) => insertAtLineStart(view, head, '| | | |\n|---|---|---|\n| | | |'),
84
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '| | | |\n|---|---|---|\n| | | |'),
85
85
  },
86
86
  ],
87
87
  };
88
88
 
89
- export const linkSlashCommands: PopoverMenuGroup = {
89
+ export const linkSlashCommands: EditorMenuGroup = {
90
90
  id: 'link',
91
91
  label: 'Link',
92
92
  items: [
@@ -94,7 +94,7 @@ export const linkSlashCommands: PopoverMenuGroup = {
94
94
  id: 'inline-link',
95
95
  label: 'Inline link',
96
96
  icon: 'ph--link--regular',
97
- onSelect: (view, head) => {
97
+ onSelect: ({ view, head }) => {
98
98
  view.dispatch({
99
99
  changes: { from: head, insert: '@' },
100
100
  selection: { anchor: head + 1, head: head + 1 },
@@ -109,7 +109,8 @@ export const linkSlashCommands: PopoverMenuGroup = {
109
109
  id: 'block-embed',
110
110
  label: 'Block embed',
111
111
  icon: 'ph--lego--regular',
112
- onSelect: (view, head) => {
112
+ onSelect: ({ view, head }) => {
113
+ // Seed the same query shape as typing "@@" manually.
113
114
  view.dispatch({
114
115
  changes: { from: head, insert: '@@' },
115
116
  selection: { anchor: head + 2, head: head + 2 },
@@ -5,34 +5,33 @@
5
5
  import { type EditorView } from '@codemirror/view';
6
6
 
7
7
  import { type Label } from '@dxos/react-ui';
8
+ import { insertAtCursor } from '@dxos/ui-editor';
8
9
  import { type MaybePromise } from '@dxos/util';
9
10
 
10
- import { insertAtCursor } from './util';
11
-
12
- export type PopoverMenuGroup = {
11
+ export type EditorMenuGroup = {
13
12
  id: string;
14
13
  label?: Label;
15
- items: PopoverMenuItem[];
14
+ items: EditorMenuItem[];
16
15
  };
17
16
 
18
- export type PopoverMenuItem = {
17
+ export type EditorMenuItem = {
19
18
  id: string;
20
19
  label: Label;
21
20
  icon?: string;
22
- onSelect?: (view: EditorView, head: number) => MaybePromise<void>;
21
+ onSelect?: (event: { view: EditorView; head: number }) => MaybePromise<void>;
23
22
  };
24
23
 
25
- export const getMenuItem = (groups: PopoverMenuGroup[], id?: string): PopoverMenuItem | undefined => {
24
+ export const getMenuItem = (groups: EditorMenuGroup[], id?: string): EditorMenuItem | undefined => {
26
25
  return groups.flatMap((group) => group.items).find((item) => item.id === id);
27
26
  };
28
27
 
29
- export const getNextMenuItem = (groups: PopoverMenuGroup[], id?: string): PopoverMenuItem => {
28
+ export const getNextMenuItem = (groups: EditorMenuGroup[], id?: string): EditorMenuItem => {
30
29
  const items = groups.flatMap((group) => group.items);
31
30
  const index = items.findIndex((item) => item.id === id);
32
31
  return index < items.length - 1 ? items[index + 1] : items[index];
33
32
  };
34
33
 
35
- export const getPreviousMenuItem = (groups: PopoverMenuGroup[], id?: string): PopoverMenuItem => {
34
+ export const getPreviousMenuItem = (groups: EditorMenuGroup[], id?: string): EditorMenuItem => {
36
35
  const items = groups.flatMap((group) => group.items);
37
36
  const index = items.findIndex((item) => item.id === id);
38
37
  return index > 0 ? items[index - 1] : items[index];
@@ -41,25 +40,29 @@ export const getPreviousMenuItem = (groups: PopoverMenuGroup[], id?: string): Po
41
40
  export const createMenuGroup = ({
42
41
  id = 'menu',
43
42
  label,
43
+ filter,
44
44
  items,
45
45
  }: {
46
46
  id?: string;
47
47
  label?: Label;
48
+ filter?: string;
48
49
  items: string[];
49
- }): PopoverMenuGroup => ({
50
+ }): EditorMenuGroup => ({
50
51
  id,
51
52
  label,
52
- items: items.map((item, i) => ({
53
- id: `${id}-${i}`,
54
- label: item,
55
- onSelect: (view, head) => insertAtCursor(view, head, item),
56
- })),
53
+ items: items
54
+ .filter((item) => !filter || item.toLowerCase().includes(filter.toLowerCase()))
55
+ .map((item, i) => ({
56
+ id: `${id}-${i}`,
57
+ label: item,
58
+ onSelect: ({ view, head }) => insertAtCursor(view, head, item),
59
+ })),
57
60
  });
58
61
 
59
62
  export const filterMenuGroups = (
60
- groups: PopoverMenuGroup[],
61
- filter: (item: PopoverMenuItem) => boolean,
62
- ): PopoverMenuGroup[] => {
63
+ groups: EditorMenuGroup[],
64
+ filter: (item: EditorMenuItem) => boolean,
65
+ ): EditorMenuGroup[] => {
63
66
  return groups.map((group) => ({
64
67
  ...group,
65
68
  items: group.items.filter(filter),
@@ -13,13 +13,10 @@ import {
13
13
  keymap,
14
14
  } from '@codemirror/view';
15
15
 
16
+ import { type PlaceholderOptions, modalStateField, placeholder } from '@dxos/ui-editor';
17
+ import { type Range } from '@dxos/ui-editor/types';
16
18
  import { isNonNullable, isTruthy } from '@dxos/util';
17
19
 
18
- import { type Range } from '../../types';
19
- import { type PlaceholderOptions, placeholder } from '../autocomplete';
20
-
21
- import { modalStateField } from './modal';
22
-
23
20
  const DELIMITERS = [' ', ':'];
24
21
 
25
22
  export type PopoverOptions = {
@@ -56,6 +53,7 @@ export const popover = (options: PopoverOptions = {}): Extension => {
56
53
  placeholder({
57
54
  // TODO(burdon): Translations.
58
55
  content: `Press '${Array.isArray(options.trigger) ? options.trigger[0] : options.trigger}' for commands`,
56
+ focusOnly: true,
59
57
  ...options.placeholder,
60
58
  }),
61
59
  ].filter(isTruthy);
@@ -107,8 +105,8 @@ const popoverKeymap = (options: PopoverOptions) => {
107
105
  key: trigger,
108
106
  run: (view: EditorView) => {
109
107
  // Determine if we should trigger the popover:
110
- // 1. Empty lines or at the beginning of a line
111
- // 2. When there's a preceding space
108
+ // 1. Empty lines or at the beginning of a line.
109
+ // 2. When there's a preceding space.
112
110
  const selection = view.state.selection.main;
113
111
  const line = view.state.doc.lineAt(selection.head);
114
112
  if (