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

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 +1143 -8466
  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 +1143 -8465
  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 +28 -2
  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 -68
  92. package/src/components/Editor/Editor.stories.tsx +76 -50
  93. package/src/components/Editor/Editor.tsx +166 -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} +30 -20
  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 -9
  102. package/src/{extensions/popover/usePopoverMenu.ts → components/EditorMenuProvider/useEditorMenu.ts} +21 -21
  103. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +79 -0
  104. package/src/components/EditorPreviewProvider/index.ts +5 -0
  105. package/src/components/EditorToolbar/EditorToolbar.tsx +104 -92
  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 +11 -8
  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 +13 -10
  120. package/src/stories/Comments.stories.tsx +47 -43
  121. package/src/stories/EditorToolbar.stories.tsx +34 -19
  122. package/src/stories/Experimental.stories.tsx +5 -7
  123. package/src/stories/Markdown.stories.tsx +15 -15
  124. package/src/stories/Outliner.stories.tsx +17 -25
  125. package/src/stories/Popover.stories.tsx +41 -46
  126. package/src/stories/Preview.stories.tsx +94 -84
  127. package/src/stories/Tags.stories.tsx +33 -10
  128. package/src/stories/TextEditor.stories.tsx +14 -20
  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 -51
  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 -11
  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 -63
  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 -28
  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 -76
  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 -276
  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 -38
  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 -188
  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,13 +76,10 @@ 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
- 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) {
81
+ const { trigger, dxn } = event;
82
+ if (!dxn) {
84
83
  triggerRef.current = trigger as HTMLButtonElement;
85
84
  if (onActivate) {
86
85
  onActivate({ view: viewRef.current!, trigger: trigger.getAttribute('data-trigger') ?? undefined });
@@ -104,11 +103,13 @@ export const PopoverMenuProvider = ({
104
103
  [viewRef, onSelect],
105
104
  );
106
105
 
107
- const menuGroups = groups.filter((group) => group.items.length > 0);
106
+ const menuGroups = groups?.filter((group) => group.items.length > 0) ?? [];
108
107
 
109
108
  return (
110
109
  <Popover.Root modal={false} open={open} onOpenChange={setOpen}>
111
110
  <Popover.VirtualTrigger virtualRef={triggerRef} />
111
+
112
+ {/* Menu. */}
112
113
  <Popover.Portal>
113
114
  <Popover.Content
114
115
  align='start'
@@ -136,6 +137,7 @@ export const PopoverMenuProvider = ({
136
137
  </Popover.Content>
137
138
  </Popover.Portal>
138
139
 
140
+ {/* Content */}
139
141
  <div ref={setRoot} role='none' className='contents'>
140
142
  {children}
141
143
  </div>
@@ -148,7 +150,7 @@ export const PopoverMenuProvider = ({
148
150
  //
149
151
 
150
152
  type MenuProps = {
151
- groups: PopoverMenuGroup[];
153
+ groups: EditorMenuGroup[];
152
154
  } & Pick<MenuGroupProps, 'currentItem' | 'onSelect'>;
153
155
 
154
156
  const Menu = ({ groups, currentItem, onSelect }: MenuProps) => {
@@ -165,8 +167,12 @@ const Menu = ({ groups, currentItem, onSelect }: MenuProps) => {
165
167
  );
166
168
  };
167
169
 
170
+ //
171
+ // Menu Group
172
+ //
173
+
168
174
  type MenuGroupProps = {
169
- group: PopoverMenuGroup;
175
+ group: EditorMenuGroup;
170
176
  currentItem?: string;
171
177
  } & Pick<MenuItemProps, 'onSelect'>;
172
178
 
@@ -189,10 +195,14 @@ const MenuGroup = ({ group, currentItem, onSelect }: MenuGroupProps) => {
189
195
  );
190
196
  };
191
197
 
198
+ //
199
+ // Menu Item
200
+ //
201
+
192
202
  type MenuItemProps = {
193
- item: PopoverMenuItem;
203
+ item: EditorMenuItem;
194
204
  current: boolean;
195
- onSelect?: (item: PopoverMenuItem) => void;
205
+ onSelect?: (item: EditorMenuItem) => void;
196
206
  };
197
207
 
198
208
  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 (
@@ -149,7 +145,6 @@ const popoverKeymap = (options: PopoverOptions) => {
149
145
 
150
146
  // Create anchor even if zero length (append space).
151
147
  const from = line.from + idx;
152
- console.log('effect', from + 1, selection.head);
153
148
  view.dispatch({
154
149
  effects: popoverRangeEffect.of({ range: { from: from + 1, to: selection.head } }),
155
150
  changes:
@@ -223,7 +218,6 @@ const popoverAnchorDecoration = (options: PopoverOptions) => {
223
218
  // Check if we should show the widget (only if cursor is within the active command range).
224
219
  const selection = view.state.selection.main;
225
220
  const showWidget = selection.head >= range.from && selection.head <= range.to;
226
- console.log('update', showWidget, range.from, range.to + 1);
227
221
  if (showWidget) {
228
222
  builder.add(
229
223
  range.from,
@@ -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) {