@dxos/react-ui-editor 0.8.4-main.ead640a → 0.8.4-main.effb148878

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 +1105 -8387
  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 +1105 -8386
  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 +28 -2
  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 +94 -90
  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} +49 -44
  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 -9
  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 +90 -112
  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 +47 -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 +42 -55
  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 +48 -54
  143. package/src/stories/Preview.stories.tsx +103 -85
  144. package/src/stories/Tags.stories.tsx +36 -13
  145. package/src/stories/TextEditor.stories.tsx +15 -21
  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 -51
  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 -11
  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 -63
  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 -28
  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 -76
  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 -276
  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 -38
  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 -188
  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,13 +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
- console.log('update', trigger, refId);
81
-
82
- // If this has a `refId`, then it’s probably a URL or DXN and out of scope for this component.
83
- if (!refId) {
80
+ const { trigger, dxn } = event;
81
+ if (!dxn) {
84
82
  triggerRef.current = trigger as HTMLButtonElement;
85
83
  if (onActivate) {
86
84
  onActivate({ view: viewRef.current!, trigger: trigger.getAttribute('data-trigger') ?? undefined });
@@ -104,39 +102,42 @@ export const PopoverMenuProvider = ({
104
102
  [viewRef, onSelect],
105
103
  );
106
104
 
107
- const menuGroups = groups.filter((group) => group.items.length > 0);
105
+ const menuGroups = groups?.filter((group) => group.items.length > 0) ?? [];
108
106
 
109
107
  return (
110
108
  <Popover.Root modal={false} open={open} onOpenChange={setOpen}>
111
109
  <Popover.VirtualTrigger virtualRef={triggerRef} />
110
+
111
+ {/* Menu. */}
112
112
  <Popover.Portal>
113
113
  <Popover.Content
114
114
  align='start'
115
- classNames={tx('menu.content', 'menu--exotic-unfocusable', { elevation: 'positioned' }, [
116
- 'overflow-y-auto',
117
- !menuGroups.length && 'hidden',
118
- ])}
115
+ classNames={['flex flex-col', !menuGroups.length && 'hidden']}
119
116
  style={{
120
117
  maxBlockSize: 36 * numItems + 10,
121
118
  }}
122
- /**
123
- * NOTE: We keep the focus in the editor, but Radix routes escape key.
124
- */
119
+ // NOTE: We keep the focus in the editor, but Radix routes escape key.
125
120
  onEscapeKeyDown={() => {
126
- // NOTE: Able to cancel if not in valid state.
127
- // event.preventDefault();
128
- onCancel?.({ view: view! });
121
+ const currentView = viewRef.current;
122
+ if (currentView) {
123
+ onCancel?.({ view: currentView });
124
+ }
129
125
  }}
130
126
  onOpenAutoFocus={(event) => event.preventDefault()}
131
127
  >
132
- <Popover.Viewport classNames={tx('menu.viewport', 'menu__viewport--exotic-unfocusable', {})}>
133
- <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>
134
134
  </Popover.Viewport>
135
135
  <Popover.Arrow />
136
136
  </Popover.Content>
137
137
  </Popover.Portal>
138
138
 
139
- <div ref={setRoot} role='none' className='contents'>
139
+ {/* Content */}
140
+ <div className='contents' ref={setRoot}>
140
141
  {children}
141
142
  </div>
142
143
  </Popover.Root>
@@ -148,7 +149,7 @@ export const PopoverMenuProvider = ({
148
149
  //
149
150
 
150
151
  type MenuProps = {
151
- groups: PopoverMenuGroup[];
152
+ groups: EditorMenuGroup[];
152
153
  } & Pick<MenuGroupProps, 'currentItem' | 'onSelect'>;
153
154
 
154
155
  const Menu = ({ groups, currentItem, onSelect }: MenuProps) => {
@@ -158,15 +159,19 @@ const Menu = ({ groups, currentItem, onSelect }: MenuProps) => {
158
159
  {groups.map((group, index) => (
159
160
  <Fragment key={group.id}>
160
161
  <MenuGroup group={group} currentItem={currentItem} onSelect={onSelect} />
161
- {index < groups.length - 1 && <div className={tx('menu.separator', 'menu__item', {})} />}
162
+ {index < groups.length - 1 && <div className={tx('menu.separator', {})} />}
162
163
  </Fragment>
163
164
  ))}
164
165
  </ul>
165
166
  );
166
167
  };
167
168
 
169
+ //
170
+ // Menu Group
171
+ //
172
+
168
173
  type MenuGroupProps = {
169
- group: PopoverMenuGroup;
174
+ group: EditorMenuGroup;
170
175
  currentItem?: string;
171
176
  } & Pick<MenuItemProps, 'onSelect'>;
172
177
 
@@ -177,7 +182,7 @@ const MenuGroup = ({ group, currentItem, onSelect }: MenuGroupProps) => {
177
182
  return (
178
183
  <>
179
184
  {group.label && (
180
- <div className={tx('menu.groupLabel', 'menu__group__label', {})}>
185
+ <div className={tx('menu.groupLabel', {})}>
181
186
  <span>{toLocalizedString(group.label, t)}</span>
182
187
  </div>
183
188
  )}
@@ -189,10 +194,14 @@ const MenuGroup = ({ group, currentItem, onSelect }: MenuGroupProps) => {
189
194
  );
190
195
  };
191
196
 
197
+ //
198
+ // Menu Item
199
+ //
200
+
192
201
  type MenuItemProps = {
193
- item: PopoverMenuItem;
202
+ item: EditorMenuItem;
194
203
  current: boolean;
195
- onSelect?: (item: PopoverMenuItem) => void;
204
+ onSelect?: (item: EditorMenuItem) => void;
196
205
  };
197
206
 
198
207
  const MenuItem = ({ item, current, onSelect }: MenuItemProps) => {
@@ -209,12 +218,8 @@ const MenuItem = ({ item, current, onSelect }: MenuItemProps) => {
209
218
  const handleSelect = useCallback(() => onSelect?.(item), [item, onSelect]);
210
219
 
211
220
  return (
212
- <li
213
- ref={listRef}
214
- className={tx('menu.item', 'menu__item--exotic-unfocusable', {}, [current && 'bg-hoverSurface'])}
215
- onClick={handleSelect}
216
- >
217
- {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} />}
218
223
  <span className='grow truncate'>{toLocalizedString(item.label, t)}</span>
219
224
  </li>
220
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 (
@@ -149,7 +147,6 @@ const popoverKeymap = (options: PopoverOptions) => {
149
147
 
150
148
  // Create anchor even if zero length (append space).
151
149
  const from = line.from + idx;
152
- console.log('effect', from + 1, selection.head);
153
150
  view.dispatch({
154
151
  effects: popoverRangeEffect.of({ range: { from: from + 1, to: selection.head } }),
155
152
  changes:
@@ -223,7 +220,6 @@ const popoverAnchorDecoration = (options: PopoverOptions) => {
223
220
  // Check if we should show the widget (only if cursor is within the active command range).
224
221
  const selection = view.state.selection.main;
225
222
  const showWidget = selection.head >= range.from && selection.head <= range.to;
226
- console.log('update', showWidget, range.from, range.to + 1);
227
223
  if (showWidget) {
228
224
  builder.add(
229
225
  range.from,