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

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 (416) hide show
  1. package/dist/lib/browser/index.mjs +1103 -8137
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +1103 -8136
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/components/Editor/Editor.d.ts +43 -30
  8. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  9. package/dist/types/src/components/Editor/Editor.stories.d.ts +16 -20
  10. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -1
  11. package/dist/types/src/components/EditorContent/EditorContent.d.ts +31 -0
  12. package/dist/types/src/components/EditorContent/EditorContent.d.ts.map +1 -0
  13. package/dist/types/src/components/EditorContent/controller.d.ts +10 -0
  14. package/dist/types/src/components/EditorContent/controller.d.ts.map +1 -0
  15. package/dist/types/src/components/EditorContent/index.d.ts +3 -0
  16. package/dist/types/src/components/EditorContent/index.d.ts.map +1 -0
  17. package/dist/types/src/{extensions/popover/PopoverMenuProvider.d.ts → components/EditorMenuProvider/EditorMenuProvider.d.ts} +6 -6
  18. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -0
  19. package/dist/types/src/components/EditorMenuProvider/index.d.ts +6 -0
  20. package/dist/types/src/components/EditorMenuProvider/index.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts +4 -0
  22. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -0
  23. package/dist/types/src/components/EditorMenuProvider/menu.d.ts +28 -0
  24. package/dist/types/src/components/EditorMenuProvider/menu.d.ts.map +1 -0
  25. package/dist/types/src/{extensions/popover → components/EditorMenuProvider}/popover.d.ts +1 -2
  26. package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -0
  27. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts +34 -0
  28. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -0
  29. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +16 -0
  30. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -0
  31. package/dist/types/src/components/EditorPreviewProvider/index.d.ts +2 -0
  32. package/dist/types/src/components/EditorPreviewProvider/index.d.ts.map +1 -0
  33. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +14 -3
  34. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  35. package/dist/types/src/components/EditorToolbar/actions.d.ts +24 -0
  36. package/dist/types/src/components/EditorToolbar/actions.d.ts.map +1 -0
  37. package/dist/types/src/components/EditorToolbar/blocks.d.ts +8 -7
  38. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  39. package/dist/types/src/components/EditorToolbar/formatting.d.ts +8 -7
  40. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  41. package/dist/types/src/components/EditorToolbar/headings.d.ts +8 -7
  42. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  43. package/dist/types/src/components/EditorToolbar/image.d.ts +4 -11
  44. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  45. package/dist/types/src/components/EditorToolbar/index.d.ts +2 -1
  46. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  47. package/dist/types/src/components/EditorToolbar/search.d.ts +4 -11
  48. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  49. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts +11 -0
  50. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts.map +1 -0
  51. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +9 -8
  52. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  53. package/dist/types/src/components/index.d.ts +4 -1
  54. package/dist/types/src/components/index.d.ts.map +1 -1
  55. package/dist/types/src/hooks/useTextEditor.d.ts +2 -2
  56. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  57. package/dist/types/src/index.d.ts +0 -8
  58. package/dist/types/src/index.d.ts.map +1 -1
  59. package/dist/types/src/{extensions/automerge/automerge.stories.d.ts → stories/Automerge.stories.d.ts} +5 -9
  60. package/dist/types/src/stories/Automerge.stories.d.ts.map +1 -0
  61. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -1
  62. package/dist/types/src/stories/Comments.stories.d.ts +4 -3
  63. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  64. package/dist/types/src/stories/EditorToolbar.stories.d.ts +4 -4
  65. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  66. package/dist/types/src/stories/Experimental.stories.d.ts +4 -3
  67. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  68. package/dist/types/src/stories/Markdown.stories.d.ts +4 -3
  69. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  70. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  71. package/dist/types/src/stories/Popover.stories.d.ts +2 -2
  72. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -1
  73. package/dist/types/src/stories/Preview.stories.d.ts +5 -3
  74. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  75. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -1
  76. package/dist/types/src/stories/TextEditor.stories.d.ts +4 -3
  77. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  78. package/dist/types/src/stories/Theme.stories.d.ts +8 -0
  79. package/dist/types/src/stories/Theme.stories.d.ts.map +1 -0
  80. package/dist/types/src/stories/components/EditorStory.d.ts +10 -19
  81. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  82. package/dist/types/src/stories/components/util.d.ts +3 -3
  83. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  84. package/dist/types/src/translations.d.ts +5 -5
  85. package/dist/types/src/translations.d.ts.map +1 -1
  86. package/dist/types/src/util/index.d.ts +0 -5
  87. package/dist/types/src/util/index.d.ts.map +1 -1
  88. package/dist/types/src/util/react.d.ts +5 -1
  89. package/dist/types/src/util/react.d.ts.map +1 -1
  90. package/dist/types/tsconfig.tsbuildinfo +1 -1
  91. package/package.json +63 -69
  92. package/src/components/Editor/Editor.stories.tsx +76 -50
  93. package/src/components/Editor/Editor.tsx +160 -63
  94. package/src/components/EditorContent/EditorContent.tsx +83 -0
  95. package/src/components/EditorContent/controller.ts +50 -0
  96. package/src/components/EditorContent/index.ts +6 -0
  97. package/src/{extensions/popover/PopoverMenuProvider.tsx → components/EditorMenuProvider/EditorMenuProvider.tsx} +27 -14
  98. package/src/components/EditorMenuProvider/index.ts +10 -0
  99. package/src/{extensions/popover → components/EditorMenuProvider}/menu-presets.ts +19 -19
  100. package/src/{extensions/popover → components/EditorMenuProvider}/menu.ts +21 -18
  101. package/src/{extensions/popover → components/EditorMenuProvider}/popover.ts +3 -7
  102. package/src/{extensions/popover/usePopoverMenu.ts → components/EditorMenuProvider/useEditorMenu.ts} +21 -21
  103. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +81 -0
  104. package/src/components/EditorPreviewProvider/index.ts +5 -0
  105. package/src/components/EditorToolbar/EditorToolbar.tsx +30 -17
  106. package/src/components/EditorToolbar/{lists.ts → actions.ts} +48 -17
  107. package/src/components/EditorToolbar/blocks.ts +5 -5
  108. package/src/components/EditorToolbar/formatting.ts +5 -5
  109. package/src/components/EditorToolbar/headings.ts +5 -4
  110. package/src/components/EditorToolbar/image.ts +9 -2
  111. package/src/components/EditorToolbar/index.ts +3 -7
  112. package/src/components/EditorToolbar/search.ts +9 -2
  113. package/src/components/EditorToolbar/useEditorToolbar.ts +20 -0
  114. package/src/components/EditorToolbar/view-mode.ts +5 -4
  115. package/src/components/index.ts +6 -1
  116. package/src/hooks/useTextEditor.ts +13 -7
  117. package/src/index.ts +0 -10
  118. package/src/stories/Automerge.stories.tsx +175 -0
  119. package/src/stories/CommandDialog.stories.tsx +12 -9
  120. package/src/stories/Comments.stories.tsx +47 -43
  121. package/src/stories/EditorToolbar.stories.tsx +31 -15
  122. package/src/stories/Experimental.stories.tsx +4 -6
  123. package/src/stories/Markdown.stories.tsx +14 -14
  124. package/src/stories/Outliner.stories.tsx +16 -24
  125. package/src/stories/Popover.stories.tsx +40 -45
  126. package/src/stories/Preview.stories.tsx +76 -74
  127. package/src/stories/Tags.stories.tsx +32 -9
  128. package/src/stories/TextEditor.stories.tsx +11 -17
  129. package/src/stories/Theme.stories.tsx +61 -0
  130. package/src/stories/components/EditorStory.tsx +34 -27
  131. package/src/stories/components/util.tsx +43 -11
  132. package/src/translations.ts +4 -4
  133. package/src/util/index.ts +1 -6
  134. package/src/util/react.tsx +6 -2
  135. package/dist/lib/browser/chunk-HL3YF6WC.mjs +0 -22
  136. package/dist/lib/browser/chunk-HL3YF6WC.mjs.map +0 -7
  137. package/dist/lib/browser/testing/index.mjs +0 -76
  138. package/dist/lib/browser/testing/index.mjs.map +0 -7
  139. package/dist/lib/browser/types/index.mjs +0 -13
  140. package/dist/lib/browser/types/index.mjs.map +0 -7
  141. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs +0 -24
  142. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs.map +0 -7
  143. package/dist/lib/node-esm/testing/index.mjs +0 -78
  144. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  145. package/dist/lib/node-esm/types/index.mjs +0 -14
  146. package/dist/lib/node-esm/types/index.mjs.map +0 -7
  147. package/dist/types/src/components/EditorToolbar/lists.d.ts +0 -19
  148. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +0 -1
  149. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -37
  150. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  151. package/dist/types/src/defaults.d.ts +0 -14
  152. package/dist/types/src/defaults.d.ts.map +0 -1
  153. package/dist/types/src/extensions/annotations.d.ts +0 -9
  154. package/dist/types/src/extensions/annotations.d.ts.map +0 -1
  155. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +0 -26
  156. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +0 -1
  157. package/dist/types/src/extensions/autocomplete/index.d.ts +0 -5
  158. package/dist/types/src/extensions/autocomplete/index.d.ts.map +0 -1
  159. package/dist/types/src/extensions/autocomplete/match.d.ts +0 -13
  160. package/dist/types/src/extensions/autocomplete/match.d.ts.map +0 -1
  161. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +0 -20
  162. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +0 -1
  163. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +0 -10
  164. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +0 -1
  165. package/dist/types/src/extensions/automerge/automerge.d.ts +0 -4
  166. package/dist/types/src/extensions/automerge/automerge.d.ts.map +0 -1
  167. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +0 -1
  168. package/dist/types/src/extensions/automerge/automerge.test.d.ts +0 -2
  169. package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +0 -1
  170. package/dist/types/src/extensions/automerge/cursor.d.ts +0 -4
  171. package/dist/types/src/extensions/automerge/cursor.d.ts.map +0 -1
  172. package/dist/types/src/extensions/automerge/defs.d.ts +0 -17
  173. package/dist/types/src/extensions/automerge/defs.d.ts.map +0 -1
  174. package/dist/types/src/extensions/automerge/index.d.ts +0 -2
  175. package/dist/types/src/extensions/automerge/index.d.ts.map +0 -1
  176. package/dist/types/src/extensions/automerge/sync.d.ts +0 -17
  177. package/dist/types/src/extensions/automerge/sync.d.ts.map +0 -1
  178. package/dist/types/src/extensions/automerge/update-automerge.d.ts +0 -6
  179. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +0 -1
  180. package/dist/types/src/extensions/automerge/update-codemirror.d.ts +0 -5
  181. package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +0 -1
  182. package/dist/types/src/extensions/autoscroll.d.ts +0 -10
  183. package/dist/types/src/extensions/autoscroll.d.ts.map +0 -1
  184. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +0 -31
  185. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +0 -1
  186. package/dist/types/src/extensions/awareness/awareness.d.ts +0 -46
  187. package/dist/types/src/extensions/awareness/awareness.d.ts.map +0 -1
  188. package/dist/types/src/extensions/awareness/index.d.ts +0 -3
  189. package/dist/types/src/extensions/awareness/index.d.ts.map +0 -1
  190. package/dist/types/src/extensions/blast.d.ts +0 -25
  191. package/dist/types/src/extensions/blast.d.ts.map +0 -1
  192. package/dist/types/src/extensions/comments.d.ts +0 -95
  193. package/dist/types/src/extensions/comments.d.ts.map +0 -1
  194. package/dist/types/src/extensions/debug.d.ts +0 -3
  195. package/dist/types/src/extensions/debug.d.ts.map +0 -1
  196. package/dist/types/src/extensions/dnd.d.ts +0 -9
  197. package/dist/types/src/extensions/dnd.d.ts.map +0 -1
  198. package/dist/types/src/extensions/factories.d.ts +0 -83
  199. package/dist/types/src/extensions/factories.d.ts.map +0 -1
  200. package/dist/types/src/extensions/focus.d.ts +0 -7
  201. package/dist/types/src/extensions/focus.d.ts.map +0 -1
  202. package/dist/types/src/extensions/folding.d.ts +0 -7
  203. package/dist/types/src/extensions/folding.d.ts.map +0 -1
  204. package/dist/types/src/extensions/hashtag.d.ts +0 -3
  205. package/dist/types/src/extensions/hashtag.d.ts.map +0 -1
  206. package/dist/types/src/extensions/index.d.ts +0 -26
  207. package/dist/types/src/extensions/index.d.ts.map +0 -1
  208. package/dist/types/src/extensions/json.d.ts +0 -7
  209. package/dist/types/src/extensions/json.d.ts.map +0 -1
  210. package/dist/types/src/extensions/listener.d.ts +0 -13
  211. package/dist/types/src/extensions/listener.d.ts.map +0 -1
  212. package/dist/types/src/extensions/markdown/action.d.ts +0 -12
  213. package/dist/types/src/extensions/markdown/action.d.ts.map +0 -1
  214. package/dist/types/src/extensions/markdown/bundle.d.ts +0 -22
  215. package/dist/types/src/extensions/markdown/bundle.d.ts.map +0 -1
  216. package/dist/types/src/extensions/markdown/changes.d.ts +0 -10
  217. package/dist/types/src/extensions/markdown/changes.d.ts.map +0 -1
  218. package/dist/types/src/extensions/markdown/changes.test.d.ts +0 -2
  219. package/dist/types/src/extensions/markdown/changes.test.d.ts.map +0 -1
  220. package/dist/types/src/extensions/markdown/debug.d.ts +0 -11
  221. package/dist/types/src/extensions/markdown/debug.d.ts.map +0 -1
  222. package/dist/types/src/extensions/markdown/decorate.d.ts +0 -25
  223. package/dist/types/src/extensions/markdown/decorate.d.ts.map +0 -1
  224. package/dist/types/src/extensions/markdown/formatting.d.ts +0 -62
  225. package/dist/types/src/extensions/markdown/formatting.d.ts.map +0 -1
  226. package/dist/types/src/extensions/markdown/formatting.test.d.ts +0 -3
  227. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +0 -1
  228. package/dist/types/src/extensions/markdown/highlight.d.ts +0 -37
  229. package/dist/types/src/extensions/markdown/highlight.d.ts.map +0 -1
  230. package/dist/types/src/extensions/markdown/image.d.ts +0 -7
  231. package/dist/types/src/extensions/markdown/image.d.ts.map +0 -1
  232. package/dist/types/src/extensions/markdown/index.d.ts +0 -10
  233. package/dist/types/src/extensions/markdown/index.d.ts.map +0 -1
  234. package/dist/types/src/extensions/markdown/link.d.ts +0 -7
  235. package/dist/types/src/extensions/markdown/link.d.ts.map +0 -1
  236. package/dist/types/src/extensions/markdown/parser.test.d.ts +0 -2
  237. package/dist/types/src/extensions/markdown/parser.test.d.ts.map +0 -1
  238. package/dist/types/src/extensions/markdown/styles.d.ts +0 -4
  239. package/dist/types/src/extensions/markdown/styles.d.ts.map +0 -1
  240. package/dist/types/src/extensions/markdown/table.d.ts +0 -8
  241. package/dist/types/src/extensions/markdown/table.d.ts.map +0 -1
  242. package/dist/types/src/extensions/mention.d.ts +0 -7
  243. package/dist/types/src/extensions/mention.d.ts.map +0 -1
  244. package/dist/types/src/extensions/modes.d.ts +0 -10
  245. package/dist/types/src/extensions/modes.d.ts.map +0 -1
  246. package/dist/types/src/extensions/outliner/commands.d.ts +0 -10
  247. package/dist/types/src/extensions/outliner/commands.d.ts.map +0 -1
  248. package/dist/types/src/extensions/outliner/editor.d.ts +0 -5
  249. package/dist/types/src/extensions/outliner/editor.d.ts.map +0 -1
  250. package/dist/types/src/extensions/outliner/editor.test.d.ts +0 -2
  251. package/dist/types/src/extensions/outliner/editor.test.d.ts.map +0 -1
  252. package/dist/types/src/extensions/outliner/index.d.ts +0 -4
  253. package/dist/types/src/extensions/outliner/index.d.ts.map +0 -1
  254. package/dist/types/src/extensions/outliner/menu.d.ts +0 -8
  255. package/dist/types/src/extensions/outliner/menu.d.ts.map +0 -1
  256. package/dist/types/src/extensions/outliner/outliner.d.ts +0 -11
  257. package/dist/types/src/extensions/outliner/outliner.d.ts.map +0 -1
  258. package/dist/types/src/extensions/outliner/outliner.test.d.ts +0 -2
  259. package/dist/types/src/extensions/outliner/outliner.test.d.ts.map +0 -1
  260. package/dist/types/src/extensions/outliner/selection.d.ts +0 -12
  261. package/dist/types/src/extensions/outliner/selection.d.ts.map +0 -1
  262. package/dist/types/src/extensions/outliner/tree.d.ts +0 -79
  263. package/dist/types/src/extensions/outliner/tree.d.ts.map +0 -1
  264. package/dist/types/src/extensions/outliner/tree.test.d.ts +0 -2
  265. package/dist/types/src/extensions/outliner/tree.test.d.ts.map +0 -1
  266. package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts.map +0 -1
  267. package/dist/types/src/extensions/popover/index.d.ts +0 -8
  268. package/dist/types/src/extensions/popover/index.d.ts.map +0 -1
  269. package/dist/types/src/extensions/popover/menu-presets.d.ts +0 -4
  270. package/dist/types/src/extensions/popover/menu-presets.d.ts.map +0 -1
  271. package/dist/types/src/extensions/popover/menu.d.ts +0 -24
  272. package/dist/types/src/extensions/popover/menu.d.ts.map +0 -1
  273. package/dist/types/src/extensions/popover/modal.d.ts +0 -7
  274. package/dist/types/src/extensions/popover/modal.d.ts.map +0 -1
  275. package/dist/types/src/extensions/popover/popover.d.ts.map +0 -1
  276. package/dist/types/src/extensions/popover/usePopoverMenu.d.ts +0 -34
  277. package/dist/types/src/extensions/popover/usePopoverMenu.d.ts.map +0 -1
  278. package/dist/types/src/extensions/popover/util.d.ts +0 -8
  279. package/dist/types/src/extensions/popover/util.d.ts.map +0 -1
  280. package/dist/types/src/extensions/preview/index.d.ts +0 -2
  281. package/dist/types/src/extensions/preview/index.d.ts.map +0 -1
  282. package/dist/types/src/extensions/preview/preview.d.ts +0 -32
  283. package/dist/types/src/extensions/preview/preview.d.ts.map +0 -1
  284. package/dist/types/src/extensions/selection.d.ts +0 -24
  285. package/dist/types/src/extensions/selection.d.ts.map +0 -1
  286. package/dist/types/src/extensions/state.d.ts +0 -2
  287. package/dist/types/src/extensions/state.d.ts.map +0 -1
  288. package/dist/types/src/extensions/tags/extended-markdown.d.ts +0 -10
  289. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +0 -1
  290. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +0 -2
  291. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +0 -1
  292. package/dist/types/src/extensions/tags/index.d.ts +0 -4
  293. package/dist/types/src/extensions/tags/index.d.ts.map +0 -1
  294. package/dist/types/src/extensions/tags/streamer.d.ts +0 -12
  295. package/dist/types/src/extensions/tags/streamer.d.ts.map +0 -1
  296. package/dist/types/src/extensions/tags/xml-tags.d.ts +0 -72
  297. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +0 -1
  298. package/dist/types/src/extensions/tags/xml-util.d.ts +0 -10
  299. package/dist/types/src/extensions/tags/xml-util.d.ts.map +0 -1
  300. package/dist/types/src/extensions/typewriter.d.ts +0 -10
  301. package/dist/types/src/extensions/typewriter.d.ts.map +0 -1
  302. package/dist/types/src/styles/index.d.ts +0 -4
  303. package/dist/types/src/styles/index.d.ts.map +0 -1
  304. package/dist/types/src/styles/markdown.d.ts +0 -8
  305. package/dist/types/src/styles/markdown.d.ts.map +0 -1
  306. package/dist/types/src/styles/theme.d.ts +0 -38
  307. package/dist/types/src/styles/theme.d.ts.map +0 -1
  308. package/dist/types/src/styles/tokens.d.ts +0 -3
  309. package/dist/types/src/styles/tokens.d.ts.map +0 -1
  310. package/dist/types/src/testing/PreviewPopover.d.ts +0 -20
  311. package/dist/types/src/testing/PreviewPopover.d.ts.map +0 -1
  312. package/dist/types/src/testing/index.d.ts +0 -3
  313. package/dist/types/src/testing/index.d.ts.map +0 -1
  314. package/dist/types/src/testing/util.d.ts +0 -3
  315. package/dist/types/src/testing/util.d.ts.map +0 -1
  316. package/dist/types/src/types/index.d.ts +0 -2
  317. package/dist/types/src/types/index.d.ts.map +0 -1
  318. package/dist/types/src/types/types.d.ts +0 -21
  319. package/dist/types/src/types/types.d.ts.map +0 -1
  320. package/dist/types/src/util/cursor.d.ts +0 -31
  321. package/dist/types/src/util/cursor.d.ts.map +0 -1
  322. package/dist/types/src/util/debug.d.ts +0 -17
  323. package/dist/types/src/util/debug.d.ts.map +0 -1
  324. package/dist/types/src/util/decorations.d.ts +0 -4
  325. package/dist/types/src/util/decorations.d.ts.map +0 -1
  326. package/dist/types/src/util/dom.d.ts +0 -10
  327. package/dist/types/src/util/dom.d.ts.map +0 -1
  328. package/dist/types/src/util/facet.d.ts +0 -3
  329. package/dist/types/src/util/facet.d.ts.map +0 -1
  330. package/src/components/EditorToolbar/util.ts +0 -60
  331. package/src/defaults.ts +0 -52
  332. package/src/extensions/annotations.ts +0 -55
  333. package/src/extensions/autocomplete/autocomplete.ts +0 -220
  334. package/src/extensions/autocomplete/index.ts +0 -8
  335. package/src/extensions/autocomplete/match.ts +0 -46
  336. package/src/extensions/autocomplete/placeholder.ts +0 -117
  337. package/src/extensions/autocomplete/typeahead.ts +0 -87
  338. package/src/extensions/automerge/automerge.stories.tsx +0 -149
  339. package/src/extensions/automerge/automerge.test.tsx +0 -78
  340. package/src/extensions/automerge/automerge.ts +0 -105
  341. package/src/extensions/automerge/cursor.ts +0 -28
  342. package/src/extensions/automerge/defs.ts +0 -31
  343. package/src/extensions/automerge/index.ts +0 -5
  344. package/src/extensions/automerge/sync.ts +0 -79
  345. package/src/extensions/automerge/update-automerge.ts +0 -50
  346. package/src/extensions/automerge/update-codemirror.ts +0 -115
  347. package/src/extensions/autoscroll.ts +0 -157
  348. package/src/extensions/awareness/awareness-provider.ts +0 -127
  349. package/src/extensions/awareness/awareness.ts +0 -315
  350. package/src/extensions/awareness/index.ts +0 -6
  351. package/src/extensions/blast.ts +0 -363
  352. package/src/extensions/comments.ts +0 -597
  353. package/src/extensions/debug.ts +0 -15
  354. package/src/extensions/dnd.ts +0 -37
  355. package/src/extensions/factories.ts +0 -277
  356. package/src/extensions/focus.ts +0 -36
  357. package/src/extensions/folding.tsx +0 -44
  358. package/src/extensions/hashtag.tsx +0 -68
  359. package/src/extensions/index.ts +0 -29
  360. package/src/extensions/json.ts +0 -57
  361. package/src/extensions/listener.ts +0 -32
  362. package/src/extensions/markdown/action.ts +0 -117
  363. package/src/extensions/markdown/bundle.ts +0 -105
  364. package/src/extensions/markdown/changes.test.ts +0 -26
  365. package/src/extensions/markdown/changes.ts +0 -149
  366. package/src/extensions/markdown/debug.ts +0 -44
  367. package/src/extensions/markdown/decorate.ts +0 -601
  368. package/src/extensions/markdown/formatting.test.ts +0 -498
  369. package/src/extensions/markdown/formatting.ts +0 -1267
  370. package/src/extensions/markdown/highlight.ts +0 -183
  371. package/src/extensions/markdown/image.ts +0 -118
  372. package/src/extensions/markdown/index.ts +0 -13
  373. package/src/extensions/markdown/link.ts +0 -50
  374. package/src/extensions/markdown/parser.test.ts +0 -75
  375. package/src/extensions/markdown/styles.ts +0 -135
  376. package/src/extensions/markdown/table.ts +0 -150
  377. package/src/extensions/mention.ts +0 -41
  378. package/src/extensions/modes.ts +0 -41
  379. package/src/extensions/outliner/commands.ts +0 -270
  380. package/src/extensions/outliner/editor.test.ts +0 -33
  381. package/src/extensions/outliner/editor.ts +0 -184
  382. package/src/extensions/outliner/index.ts +0 -7
  383. package/src/extensions/outliner/menu.ts +0 -128
  384. package/src/extensions/outliner/outliner.test.ts +0 -100
  385. package/src/extensions/outliner/outliner.ts +0 -167
  386. package/src/extensions/outliner/selection.ts +0 -50
  387. package/src/extensions/outliner/tree.test.ts +0 -168
  388. package/src/extensions/outliner/tree.ts +0 -317
  389. package/src/extensions/popover/index.ts +0 -12
  390. package/src/extensions/popover/modal.ts +0 -24
  391. package/src/extensions/popover/util.ts +0 -29
  392. package/src/extensions/preview/index.ts +0 -5
  393. package/src/extensions/preview/preview.ts +0 -193
  394. package/src/extensions/selection.ts +0 -100
  395. package/src/extensions/state.ts +0 -7
  396. package/src/extensions/tags/extended-markdown.test.ts +0 -261
  397. package/src/extensions/tags/extended-markdown.ts +0 -78
  398. package/src/extensions/tags/index.ts +0 -7
  399. package/src/extensions/tags/streamer.ts +0 -243
  400. package/src/extensions/tags/xml-tags.ts +0 -393
  401. package/src/extensions/tags/xml-util.ts +0 -94
  402. package/src/extensions/typewriter.ts +0 -68
  403. package/src/styles/index.ts +0 -7
  404. package/src/styles/markdown.ts +0 -26
  405. package/src/styles/theme.ts +0 -269
  406. package/src/styles/tokens.ts +0 -17
  407. package/src/testing/PreviewPopover.tsx +0 -80
  408. package/src/testing/index.ts +0 -6
  409. package/src/testing/util.ts +0 -7
  410. package/src/types/index.ts +0 -5
  411. package/src/types/types.ts +0 -32
  412. package/src/util/cursor.ts +0 -56
  413. package/src/util/debug.ts +0 -64
  414. package/src/util/decorations.ts +0 -21
  415. package/src/util/dom.ts +0 -34
  416. package/src/util/facet.ts +0 -13
@@ -0,0 +1,83 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Transaction } from '@codemirror/state';
6
+ import { EditorView } from '@codemirror/view';
7
+ import React, { forwardRef, useEffect, useImperativeHandle } 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
+
15
+ import { type EditorController, createEditorController } from './controller';
16
+
17
+ export type EditorContentProps = ThemedClassName<
18
+ {
19
+ focusable?: boolean;
20
+ value?: string;
21
+ onChange?: (value: string) => void;
22
+ } & UseTextEditorProps
23
+ >;
24
+
25
+ /**
26
+ * Minimal text editor.
27
+ * NOTE: This shouold not be used with the automerge extension.
28
+ * @deprecated Use Editor.Content
29
+ */
30
+ export const EditorContent = forwardRef<EditorController, EditorContentProps>(
31
+ ({ classNames, id, extensions, selectionEnd, focusable = true, value, onChange, ...props }, forwardedRef) => {
32
+ const { parentRef, focusAttributes, view } = useTextEditor(
33
+ () => ({
34
+ id,
35
+ initialValue: value,
36
+ selectionEnd,
37
+ extensions: [
38
+ extensions ?? [],
39
+ EditorView.updateListener.of(({ view, docChanged, transactions }) => {
40
+ const isInitialSync = transactions.some((tr) => tr.annotation(Transaction.userEvent) === initialSync.value);
41
+ if (!isInitialSync && docChanged) {
42
+ onChange?.(view.state.doc.toString());
43
+ }
44
+ }),
45
+ ],
46
+ ...props,
47
+ }),
48
+ [id, extensions, selectionEnd, onChange],
49
+ );
50
+
51
+ // External controller.
52
+ useImperativeHandle(forwardedRef, () => {
53
+ return createEditorController(view);
54
+ }, [id, view]);
55
+
56
+ // Set initial value and cursor position.
57
+ useEffect(() => {
58
+ requestAnimationFrame(() => {
59
+ view?.dispatch({
60
+ annotations: initialSync,
61
+ changes: value ? [{ from: 0, to: view?.state.doc.length ?? 0, insert: value ?? '' }] : [],
62
+ selection: selectionEnd ? { anchor: view?.state.doc.length ?? 0 } : undefined,
63
+ });
64
+
65
+ if (selectionEnd) {
66
+ view?.focus();
67
+ }
68
+ });
69
+ }, [view, value, selectionEnd]);
70
+
71
+ return (
72
+ <div
73
+ role='none'
74
+ className={mx(
75
+ 'is-full outline-none focus:border-accentSurface focus-within:border-neutralFocusIndicator',
76
+ classNames,
77
+ )}
78
+ ref={parentRef}
79
+ {...(focusable ? focusAttributes : {})}
80
+ />
81
+ );
82
+ },
83
+ );
@@ -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
+ };
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './controller';
6
+ export * from './EditorContent';
@@ -9,6 +9,7 @@ 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,
@@ -18,18 +19,18 @@ import {
18
19
  useTranslation,
19
20
  } from '@dxos/react-ui';
20
21
 
21
- import { type PopoverMenuGroup, type PopoverMenuItem } from './menu';
22
+ import { type EditorMenuGroup, type EditorMenuItem } from './menu';
22
23
 
23
- export type PopoverMenuProviderProps = PropsWithChildren<{
24
+ export type EditorMenuProviderProps = PropsWithChildren<{
24
25
  view?: EditorView | null;
25
- groups?: PopoverMenuGroup[];
26
+ groups?: EditorMenuGroup[];
26
27
  currentItem?: string;
27
28
  open?: boolean;
28
29
  defaultOpen?: boolean;
29
30
  numItems?: number;
30
31
  onOpenChange?: (event: { view: EditorView; open: boolean; trigger?: string }) => void;
31
32
  onActivate?: (event: { view: EditorView; trigger?: string }) => void;
32
- onSelect?: (event: { view: EditorView; item: PopoverMenuItem }) => void;
33
+ onSelect?: (event: { view: EditorView; item: EditorMenuItem }) => void;
33
34
  onCancel?: (event: { view: EditorView }) => void;
34
35
  }>;
35
36
 
@@ -40,25 +41,25 @@ export type PopoverMenuProviderProps = PropsWithChildren<{
40
41
  * NOTE: We don't use DropdownMenu because the command menu needs to manage focus explicitly.
41
42
  * I.e., focus must remain in the editor while displaying the menu (for type-ahead).
42
43
  */
43
- export const PopoverMenuProvider = ({
44
+ export const EditorMenuProvider = ({
44
45
  children,
45
46
  view,
46
47
  groups,
47
48
  currentItem,
48
- open: openParam,
49
+ open: openProp,
49
50
  defaultOpen,
50
51
  numItems = 8,
51
52
  onOpenChange,
52
53
  onActivate,
53
54
  onSelect,
54
55
  onCancel,
55
- }: PopoverMenuProviderProps) => {
56
+ }: EditorMenuProviderProps) => {
56
57
  const { tx } = useThemeContext();
57
58
  const triggerRef = useRef<HTMLButtonElement | null>(null);
58
- const [root, setRoot] = useState<HTMLDivElement | null>(null);
59
+
59
60
  const viewRef = useDynamicRef(view);
60
61
  const [open, setOpen] = useControllableState({
61
- prop: openParam,
62
+ prop: openProp,
62
63
  defaultProp: defaultOpen,
63
64
  onChange: (open) => {
64
65
  invariant(viewRef.current);
@@ -66,6 +67,7 @@ export const PopoverMenuProvider = ({
66
67
  },
67
68
  });
68
69
 
70
+ const [root, setRoot] = useState<HTMLDivElement | null>(null);
69
71
  useEffect(() => {
70
72
  if (!root) {
71
73
  return;
@@ -74,7 +76,7 @@ export const PopoverMenuProvider = ({
74
76
  // Listen for trigger.
75
77
  return addEventListener(
76
78
  root,
77
- 'dx-anchor-activate' as any,
79
+ DX_ANCHOR_ACTIVATE as any,
78
80
  (event: DxAnchorActivate) => {
79
81
  const { trigger, refId } = event;
80
82
 
@@ -108,6 +110,8 @@ export const PopoverMenuProvider = ({
108
110
  return (
109
111
  <Popover.Root modal={false} open={open} onOpenChange={setOpen}>
110
112
  <Popover.VirtualTrigger virtualRef={triggerRef} />
113
+
114
+ {/* Menu. */}
111
115
  <Popover.Portal>
112
116
  <Popover.Content
113
117
  align='start'
@@ -135,6 +139,7 @@ export const PopoverMenuProvider = ({
135
139
  </Popover.Content>
136
140
  </Popover.Portal>
137
141
 
142
+ {/* Content */}
138
143
  <div ref={setRoot} role='none' className='contents'>
139
144
  {children}
140
145
  </div>
@@ -147,7 +152,7 @@ export const PopoverMenuProvider = ({
147
152
  //
148
153
 
149
154
  type MenuProps = {
150
- groups: PopoverMenuGroup[];
155
+ groups: EditorMenuGroup[];
151
156
  } & Pick<MenuGroupProps, 'currentItem' | 'onSelect'>;
152
157
 
153
158
  const Menu = ({ groups, currentItem, onSelect }: MenuProps) => {
@@ -164,8 +169,12 @@ const Menu = ({ groups, currentItem, onSelect }: MenuProps) => {
164
169
  );
165
170
  };
166
171
 
172
+ //
173
+ // Menu Group
174
+ //
175
+
167
176
  type MenuGroupProps = {
168
- group: PopoverMenuGroup;
177
+ group: EditorMenuGroup;
169
178
  currentItem?: string;
170
179
  } & Pick<MenuItemProps, 'onSelect'>;
171
180
 
@@ -188,10 +197,14 @@ const MenuGroup = ({ group, currentItem, onSelect }: MenuGroupProps) => {
188
197
  );
189
198
  };
190
199
 
200
+ //
201
+ // Menu Item
202
+ //
203
+
191
204
  type MenuItemProps = {
192
- item: PopoverMenuItem;
205
+ item: EditorMenuItem;
193
206
  current: boolean;
194
- onSelect?: (item: PopoverMenuItem) => void;
207
+ onSelect?: (item: EditorMenuItem) => void;
195
208
  };
196
209
 
197
210
  const MenuItem = ({ item, current, onSelect }: MenuItemProps) => {
@@ -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,7 @@ 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
113
  view.dispatch({
114
114
  changes: { from: head, insert: '@@' },
115
115
  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,9 @@ import {
13
13
  keymap,
14
14
  } from '@codemirror/view';
15
15
 
16
+ import { type PlaceholderOptions, type Range, modalStateField, placeholder } from '@dxos/ui-editor';
16
17
  import { isNonNullable, isTruthy } from '@dxos/util';
17
18
 
18
- import { type Range } from '../../types';
19
- import { type PlaceholderOptions, placeholder } from '../autocomplete';
20
-
21
- import { modalStateField } from './modal';
22
-
23
19
  const DELIMITERS = [' ', ':'];
24
20
 
25
21
  export type PopoverOptions = {
@@ -107,8 +103,8 @@ const popoverKeymap = (options: PopoverOptions) => {
107
103
  key: trigger,
108
104
  run: (view: EditorView) => {
109
105
  // 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
106
+ // 1. Empty lines or at the beginning of a line.
107
+ // 2. When there's a preceding space.
112
108
  const selection = view.state.selection.main;
113
109
  const line = view.state.doc.lineAt(selection.head);
114
110
  if (
@@ -7,13 +7,13 @@ import { type EditorState } from '@codemirror/state';
7
7
  import { type RefObject, useCallback, useMemo, useRef, useState } from 'react';
8
8
 
9
9
  import { invariant } from '@dxos/invariant';
10
+ import { modalStateEffect } from '@dxos/ui-editor';
10
11
  import { type MaybePromise } from '@dxos/util';
11
12
 
12
- import { type PopoverMenuGroup, type PopoverMenuItem } from './menu';
13
+ import { type EditorMenuProviderProps } from './EditorMenuProvider';
14
+ import { type EditorMenuGroup, type EditorMenuItem } from './menu';
13
15
  import { filterMenuGroups, getMenuItem, getNextMenuItem, getPreviousMenuItem } from './menu';
14
- import { modalStateEffect } from './modal';
15
16
  import { type PopoverOptions, popover, popoverRangeEffect, popoverStateField } from './popover';
16
- import { type PopoverMenuProviderProps } from './PopoverMenuProvider';
17
17
 
18
18
  export type GetMenuContext = {
19
19
  state: EditorState;
@@ -22,36 +22,36 @@ export type GetMenuContext = {
22
22
  trigger?: string;
23
23
  };
24
24
 
25
- export type UsePopoverMenuProps = {
25
+ export type UseEditorMenuProps = {
26
26
  filter?: boolean;
27
- getMenu?: (context: GetMenuContext) => MaybePromise<PopoverMenuGroup[]>;
27
+ getMenu?: (context: GetMenuContext) => MaybePromise<EditorMenuGroup[]>;
28
28
  } & Pick<PopoverOptions, 'trigger' | 'triggerKey' | 'placeholder'>;
29
29
 
30
- export type UsePopoverMenu = {
31
- groupsRef: RefObject<PopoverMenuGroup[]>;
30
+ export type UseEditorMenu = {
31
+ groupsRef: RefObject<EditorMenuGroup[]>;
32
32
  extension: Extension;
33
- } & Pick<PopoverMenuProviderProps, 'currentItem' | 'open' | 'onOpenChange' | 'onActivate' | 'onSelect' | 'onCancel'>;
33
+ } & Pick<EditorMenuProviderProps, 'currentItem' | 'open' | 'onOpenChange' | 'onActivate' | 'onSelect' | 'onCancel'>;
34
34
 
35
35
  /**
36
36
  * ```tsx
37
- * const { groupsRef, extension, ...menuProps } = usePopoverMenu();
37
+ * const { groupsRef, extension, ...menuProps } = useEditorMenu();
38
38
  * const { parentRef, viewRef } = useTextEditor({ extensions: [extension] });
39
39
  * return (
40
- * <PopoverMenuProvider view={viewRef.current} groups={groupsRef.current} {...menuProps}>
40
+ * <EditorMenuProvider view={viewRef.current} groups={groupsRef.current} {...menuProps}>
41
41
  * <div ref={parentRef} />
42
- * </PopoverMenuProvider>
42
+ * </EditorMenuProvider>
43
43
  * );
44
44
  * ```
45
45
  */
46
- export const usePopoverMenu = ({
46
+ export const useEditorMenu = ({
47
47
  trigger,
48
48
  triggerKey,
49
49
  placeholder,
50
50
  filter = true,
51
51
  getMenu,
52
- }: UsePopoverMenuProps): UsePopoverMenu => {
53
- const groupsRef = useRef<PopoverMenuGroup[]>([]);
54
- const currentRef = useRef<PopoverMenuItem | null>(null);
52
+ }: UseEditorMenuProps): UseEditorMenu => {
53
+ const groupsRef = useRef<EditorMenuGroup[]>([]);
54
+ const currentRef = useRef<EditorMenuItem | null>(null);
55
55
  const [currentItem, setCurrentItem] = useState<string>();
56
56
  const [open, setOpen] = useState(false);
57
57
  const [_, refresh] = useState({});
@@ -59,7 +59,7 @@ export const usePopoverMenu = ({
59
59
  /**
60
60
  * Get filtered options.
61
61
  */
62
- const getMenuOptions = useCallback<NonNullable<UsePopoverMenuProps['getMenu']>>(
62
+ const getMenuOptions = useCallback<NonNullable<UseEditorMenuProps['getMenu']>>(
63
63
  async ({ text, trigger, ...props }) => {
64
64
  const groups = (await getMenu?.({ text, trigger, ...props })) ?? [];
65
65
  return filter
@@ -71,7 +71,7 @@ export const usePopoverMenu = ({
71
71
  [getMenu, filter],
72
72
  );
73
73
 
74
- const handleOpenChange = useCallback<NonNullable<UsePopoverMenu['onOpenChange']>>(
74
+ const handleOpenChange = useCallback<NonNullable<UseEditorMenu['onOpenChange']>>(
75
75
  async ({ view, open }) => {
76
76
  invariant(view);
77
77
  setOpen(open);
@@ -93,7 +93,7 @@ export const usePopoverMenu = ({
93
93
  [getMenuOptions],
94
94
  );
95
95
 
96
- const handleActivate = useCallback<NonNullable<UsePopoverMenu['onActivate']>>(
96
+ const handleActivate = useCallback<NonNullable<UseEditorMenu['onActivate']>>(
97
97
  async ({ view, trigger }) => {
98
98
  const item = getMenuItem(groupsRef.current, currentItem);
99
99
  if (item) {
@@ -107,11 +107,11 @@ export const usePopoverMenu = ({
107
107
  [open, handleOpenChange],
108
108
  );
109
109
 
110
- const handleSelect = useCallback<NonNullable<UsePopoverMenu['onSelect']>>(({ view, item }) => {
111
- void item.onSelect?.(view, view.state.selection.main.head);
110
+ const handleSelect = useCallback<NonNullable<UseEditorMenu['onSelect']>>(({ view, item }) => {
111
+ void item.onSelect?.({ view, head: view.state.selection.main.head });
112
112
  }, []);
113
113
 
114
- const handleCancel = useCallback<NonNullable<UsePopoverMenu['onCancel']>>(({ view }) => {
114
+ const handleCancel = useCallback<NonNullable<UseEditorMenu['onCancel']>>(({ view }) => {
115
115
  // Delete trigger.
116
116
  const { range, trigger } = view.state.field(popoverStateField) ?? {};
117
117
  if (range && trigger) {