@dxos/react-ui-editor 0.8.3 → 0.8.4-main.1c7ec43d41

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 (411) hide show
  1. package/dist/lib/browser/index.mjs +1414 -7503
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/browser/translations.mjs +39 -0
  5. package/dist/lib/browser/translations.mjs.map +7 -0
  6. package/dist/lib/node-esm/index.mjs +1414 -7503
  7. package/dist/lib/node-esm/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/meta.json +1 -1
  9. package/dist/lib/node-esm/translations.mjs +41 -0
  10. package/dist/lib/node-esm/translations.mjs.map +7 -0
  11. package/dist/types/src/components/Editor/Editor.d.ts +58 -0
  12. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -0
  13. package/dist/types/src/components/Editor/Editor.stories.d.ts +23 -0
  14. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -0
  15. package/dist/types/src/components/Editor/EditorView.d.ts +31 -0
  16. package/dist/types/src/components/Editor/EditorView.d.ts.map +1 -0
  17. package/dist/types/src/components/Editor/controller.d.ts +10 -0
  18. package/dist/types/src/components/Editor/controller.d.ts.map +1 -0
  19. package/dist/types/src/components/Editor/index.d.ts +2 -0
  20. package/dist/types/src/components/Editor/index.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts +34 -0
  22. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -0
  23. package/dist/types/src/components/EditorMenuProvider/index.d.ts +6 -0
  24. package/dist/types/src/components/EditorMenuProvider/index.d.ts.map +1 -0
  25. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts +4 -0
  26. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -0
  27. package/dist/types/src/components/EditorMenuProvider/menu.d.ts +28 -0
  28. package/dist/types/src/components/EditorMenuProvider/menu.d.ts.map +1 -0
  29. package/dist/types/src/components/EditorMenuProvider/popover.d.ts +47 -0
  30. package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -0
  31. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts +34 -0
  32. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -0
  33. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +16 -0
  34. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -0
  35. package/dist/types/src/components/EditorPreviewProvider/index.d.ts +2 -0
  36. package/dist/types/src/components/EditorPreviewProvider/index.d.ts.map +1 -0
  37. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +28 -2
  38. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  39. package/dist/types/src/components/EditorToolbar/blocks.d.ts +4 -17
  40. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  41. package/dist/types/src/components/EditorToolbar/formatting.d.ts +4 -17
  42. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  43. package/dist/types/src/components/EditorToolbar/headings.d.ts +4 -17
  44. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  45. package/dist/types/src/components/EditorToolbar/image.d.ts +3 -15
  46. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  47. package/dist/types/src/components/EditorToolbar/index.d.ts +1 -1
  48. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  49. package/dist/types/src/components/EditorToolbar/lists.d.ts +4 -17
  50. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -1
  51. package/dist/types/src/components/EditorToolbar/search.d.ts +3 -15
  52. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  53. package/dist/types/src/components/EditorToolbar/types.d.ts +6 -0
  54. package/dist/types/src/components/EditorToolbar/types.d.ts.map +1 -0
  55. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +5 -18
  56. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  57. package/dist/types/src/components/index.d.ts +3 -2
  58. package/dist/types/src/components/index.d.ts.map +1 -1
  59. package/dist/types/src/extensions/Assistant.stories.d.ts +10 -0
  60. package/dist/types/src/extensions/Assistant.stories.d.ts.map +1 -0
  61. package/dist/types/src/extensions/assistant-extension.d.ts +24 -0
  62. package/dist/types/src/extensions/assistant-extension.d.ts.map +1 -0
  63. package/dist/types/src/extensions/index.d.ts +1 -22
  64. package/dist/types/src/extensions/index.d.ts.map +1 -1
  65. package/dist/types/src/hooks/index.d.ts +1 -0
  66. package/dist/types/src/hooks/index.d.ts.map +1 -1
  67. package/dist/types/src/hooks/useBasicMarkdownExtensions.d.ts +25 -0
  68. package/dist/types/src/hooks/useBasicMarkdownExtensions.d.ts.map +1 -0
  69. package/dist/types/src/hooks/useTextEditor.d.ts +6 -10
  70. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  71. package/dist/types/src/index.d.ts +0 -9
  72. package/dist/types/src/index.d.ts.map +1 -1
  73. package/dist/types/src/stories/Automerge.stories.d.ts +44 -0
  74. package/dist/types/src/stories/Automerge.stories.d.ts.map +1 -0
  75. package/dist/types/src/stories/Comments.stories.d.ts +22 -10
  76. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  77. package/dist/types/src/stories/EditorToolbar.stories.d.ts +43 -5
  78. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  79. package/dist/types/src/stories/Experimental.stories.d.ts +23 -13
  80. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  81. package/dist/types/src/stories/Markdown.stories.d.ts +33 -43
  82. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  83. package/dist/types/src/stories/Outliner.stories.d.ts +16 -22
  84. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  85. package/dist/types/src/stories/Popover.stories.d.ts +20 -0
  86. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  87. package/dist/types/src/stories/Preview.stories.d.ts +23 -7
  88. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  89. package/dist/types/src/stories/Tags.stories.d.ts +16 -0
  90. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  91. package/dist/types/src/stories/TextEditor.stories.d.ts +38 -52
  92. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  93. package/dist/types/src/stories/Theme.stories.d.ts +8 -0
  94. package/dist/types/src/stories/Theme.stories.d.ts.map +1 -0
  95. package/dist/types/src/stories/components/EditorStory.d.ts +11 -23
  96. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  97. package/dist/types/src/stories/components/util.d.ts +4 -3
  98. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  99. package/dist/types/src/translations.d.ts +29 -30
  100. package/dist/types/src/translations.d.ts.map +1 -1
  101. package/dist/types/src/util/index.d.ts +0 -4
  102. package/dist/types/src/util/index.d.ts.map +1 -1
  103. package/dist/types/src/util/react.d.ts +7 -6
  104. package/dist/types/src/util/react.d.ts.map +1 -1
  105. package/dist/types/tsconfig.tsbuildinfo +1 -1
  106. package/package.json +95 -79
  107. package/src/components/Editor/Editor.stories.tsx +89 -0
  108. package/src/components/Editor/Editor.tsx +190 -0
  109. package/src/components/Editor/EditorView.tsx +103 -0
  110. package/src/components/Editor/controller.ts +50 -0
  111. package/src/components/Editor/index.ts +5 -0
  112. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +226 -0
  113. package/src/components/EditorMenuProvider/index.ts +10 -0
  114. package/src/components/EditorMenuProvider/menu-presets.ts +125 -0
  115. package/src/components/EditorMenuProvider/menu.ts +70 -0
  116. package/src/components/EditorMenuProvider/popover.ts +287 -0
  117. package/src/components/EditorMenuProvider/useEditorMenu.ts +180 -0
  118. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +79 -0
  119. package/src/components/EditorPreviewProvider/index.ts +5 -0
  120. package/src/components/EditorToolbar/EditorToolbar.tsx +92 -103
  121. package/src/components/EditorToolbar/blocks.ts +53 -48
  122. package/src/components/EditorToolbar/formatting.ts +42 -46
  123. package/src/components/EditorToolbar/headings.ts +47 -45
  124. package/src/components/EditorToolbar/image.ts +16 -10
  125. package/src/components/EditorToolbar/index.ts +2 -7
  126. package/src/components/EditorToolbar/lists.ts +40 -41
  127. package/src/components/EditorToolbar/search.ts +16 -10
  128. package/src/components/EditorToolbar/types.ts +8 -0
  129. package/src/components/EditorToolbar/view-mode.ts +40 -40
  130. package/src/components/index.ts +4 -2
  131. package/src/extensions/Assistant.stories.tsx +112 -0
  132. package/src/extensions/assistant-extension.tsx +223 -0
  133. package/src/extensions/index.ts +2 -23
  134. package/src/hooks/index.ts +1 -0
  135. package/src/hooks/useBasicMarkdownExtensions.ts +55 -0
  136. package/src/hooks/useTextEditor.ts +39 -45
  137. package/src/index.ts +0 -13
  138. package/src/stories/Automerge.stories.tsx +174 -0
  139. package/src/stories/Comments.stories.tsx +59 -51
  140. package/src/stories/EditorToolbar.stories.tsx +50 -63
  141. package/src/stories/Experimental.stories.tsx +24 -22
  142. package/src/stories/Markdown.stories.tsx +37 -33
  143. package/src/stories/Outliner.stories.tsx +54 -44
  144. package/src/stories/Popover.stories.tsx +157 -0
  145. package/src/stories/Preview.stories.tsx +114 -95
  146. package/src/stories/Tags.stories.tsx +104 -0
  147. package/src/stories/TextEditor.stories.tsx +51 -76
  148. package/src/stories/Theme.stories.tsx +61 -0
  149. package/src/stories/components/EditorStory.tsx +50 -35
  150. package/src/stories/components/util.tsx +90 -59
  151. package/src/translations.ts +34 -27
  152. package/src/util/index.ts +1 -5
  153. package/src/util/react.tsx +9 -14
  154. package/dist/lib/browser/testing/index.mjs +0 -6
  155. package/dist/lib/browser/testing/index.mjs.map +0 -7
  156. package/dist/lib/node/index.cjs +0 -7754
  157. package/dist/lib/node/index.cjs.map +0 -7
  158. package/dist/lib/node/meta.json +0 -1
  159. package/dist/lib/node/testing/index.cjs +0 -29
  160. package/dist/lib/node/testing/index.cjs.map +0 -7
  161. package/dist/lib/node-esm/testing/index.mjs +0 -8
  162. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  163. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -50
  164. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  165. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  166. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  167. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  168. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  169. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  170. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  171. package/dist/types/src/components/Popover/index.d.ts +0 -4
  172. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  173. package/dist/types/src/defaults.d.ts +0 -14
  174. package/dist/types/src/defaults.d.ts.map +0 -1
  175. package/dist/types/src/extensions/annotations.d.ts +0 -9
  176. package/dist/types/src/extensions/annotations.d.ts.map +0 -1
  177. package/dist/types/src/extensions/autocomplete.d.ts +0 -13
  178. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  179. package/dist/types/src/extensions/automerge/automerge.d.ts +0 -4
  180. package/dist/types/src/extensions/automerge/automerge.d.ts.map +0 -1
  181. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +0 -56
  182. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +0 -1
  183. package/dist/types/src/extensions/automerge/automerge.test.d.ts +0 -2
  184. package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +0 -1
  185. package/dist/types/src/extensions/automerge/cursor.d.ts +0 -4
  186. package/dist/types/src/extensions/automerge/cursor.d.ts.map +0 -1
  187. package/dist/types/src/extensions/automerge/defs.d.ts +0 -17
  188. package/dist/types/src/extensions/automerge/defs.d.ts.map +0 -1
  189. package/dist/types/src/extensions/automerge/index.d.ts +0 -2
  190. package/dist/types/src/extensions/automerge/index.d.ts.map +0 -1
  191. package/dist/types/src/extensions/automerge/sync.d.ts +0 -17
  192. package/dist/types/src/extensions/automerge/sync.d.ts.map +0 -1
  193. package/dist/types/src/extensions/automerge/update-automerge.d.ts +0 -6
  194. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +0 -1
  195. package/dist/types/src/extensions/automerge/update-codemirror.d.ts +0 -5
  196. package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +0 -1
  197. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +0 -31
  198. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +0 -1
  199. package/dist/types/src/extensions/awareness/awareness.d.ts +0 -46
  200. package/dist/types/src/extensions/awareness/awareness.d.ts.map +0 -1
  201. package/dist/types/src/extensions/awareness/index.d.ts +0 -3
  202. package/dist/types/src/extensions/awareness/index.d.ts.map +0 -1
  203. package/dist/types/src/extensions/blast.d.ts +0 -25
  204. package/dist/types/src/extensions/blast.d.ts.map +0 -1
  205. package/dist/types/src/extensions/command/action.d.ts +0 -17
  206. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  207. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  208. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  209. package/dist/types/src/extensions/command/command.d.ts +0 -6
  210. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  211. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  212. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  213. package/dist/types/src/extensions/command/hint.d.ts +0 -24
  214. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  215. package/dist/types/src/extensions/command/index.d.ts +0 -7
  216. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  217. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  218. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  219. package/dist/types/src/extensions/command/state.d.ts +0 -16
  220. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  221. package/dist/types/src/extensions/command/typeahead.d.ts +0 -17
  222. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  223. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  224. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  225. package/dist/types/src/extensions/comments.d.ts +0 -95
  226. package/dist/types/src/extensions/comments.d.ts.map +0 -1
  227. package/dist/types/src/extensions/debug.d.ts +0 -3
  228. package/dist/types/src/extensions/debug.d.ts.map +0 -1
  229. package/dist/types/src/extensions/dnd.d.ts +0 -9
  230. package/dist/types/src/extensions/dnd.d.ts.map +0 -1
  231. package/dist/types/src/extensions/factories.d.ts +0 -64
  232. package/dist/types/src/extensions/factories.d.ts.map +0 -1
  233. package/dist/types/src/extensions/focus.d.ts +0 -7
  234. package/dist/types/src/extensions/focus.d.ts.map +0 -1
  235. package/dist/types/src/extensions/folding.d.ts +0 -7
  236. package/dist/types/src/extensions/folding.d.ts.map +0 -1
  237. package/dist/types/src/extensions/hashtag.d.ts +0 -3
  238. package/dist/types/src/extensions/hashtag.d.ts.map +0 -1
  239. package/dist/types/src/extensions/json.d.ts +0 -7
  240. package/dist/types/src/extensions/json.d.ts.map +0 -1
  241. package/dist/types/src/extensions/listener.d.ts +0 -11
  242. package/dist/types/src/extensions/listener.d.ts.map +0 -1
  243. package/dist/types/src/extensions/markdown/action.d.ts +0 -12
  244. package/dist/types/src/extensions/markdown/action.d.ts.map +0 -1
  245. package/dist/types/src/extensions/markdown/bundle.d.ts +0 -16
  246. package/dist/types/src/extensions/markdown/bundle.d.ts.map +0 -1
  247. package/dist/types/src/extensions/markdown/changes.d.ts +0 -10
  248. package/dist/types/src/extensions/markdown/changes.d.ts.map +0 -1
  249. package/dist/types/src/extensions/markdown/changes.test.d.ts +0 -2
  250. package/dist/types/src/extensions/markdown/changes.test.d.ts.map +0 -1
  251. package/dist/types/src/extensions/markdown/debug.d.ts +0 -11
  252. package/dist/types/src/extensions/markdown/debug.d.ts.map +0 -1
  253. package/dist/types/src/extensions/markdown/decorate.d.ts +0 -17
  254. package/dist/types/src/extensions/markdown/decorate.d.ts.map +0 -1
  255. package/dist/types/src/extensions/markdown/formatting.d.ts +0 -63
  256. package/dist/types/src/extensions/markdown/formatting.d.ts.map +0 -1
  257. package/dist/types/src/extensions/markdown/formatting.test.d.ts +0 -3
  258. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +0 -1
  259. package/dist/types/src/extensions/markdown/highlight.d.ts +0 -37
  260. package/dist/types/src/extensions/markdown/highlight.d.ts.map +0 -1
  261. package/dist/types/src/extensions/markdown/image.d.ts +0 -7
  262. package/dist/types/src/extensions/markdown/image.d.ts.map +0 -1
  263. package/dist/types/src/extensions/markdown/index.d.ts +0 -10
  264. package/dist/types/src/extensions/markdown/index.d.ts.map +0 -1
  265. package/dist/types/src/extensions/markdown/link.d.ts +0 -7
  266. package/dist/types/src/extensions/markdown/link.d.ts.map +0 -1
  267. package/dist/types/src/extensions/markdown/parser.test.d.ts +0 -2
  268. package/dist/types/src/extensions/markdown/parser.test.d.ts.map +0 -1
  269. package/dist/types/src/extensions/markdown/styles.d.ts +0 -4
  270. package/dist/types/src/extensions/markdown/styles.d.ts.map +0 -1
  271. package/dist/types/src/extensions/markdown/table.d.ts +0 -8
  272. package/dist/types/src/extensions/markdown/table.d.ts.map +0 -1
  273. package/dist/types/src/extensions/mention.d.ts +0 -7
  274. package/dist/types/src/extensions/mention.d.ts.map +0 -1
  275. package/dist/types/src/extensions/modes.d.ts +0 -17
  276. package/dist/types/src/extensions/modes.d.ts.map +0 -1
  277. package/dist/types/src/extensions/outliner/commands.d.ts +0 -10
  278. package/dist/types/src/extensions/outliner/commands.d.ts.map +0 -1
  279. package/dist/types/src/extensions/outliner/editor.d.ts +0 -5
  280. package/dist/types/src/extensions/outliner/editor.d.ts.map +0 -1
  281. package/dist/types/src/extensions/outliner/editor.test.d.ts +0 -2
  282. package/dist/types/src/extensions/outliner/editor.test.d.ts.map +0 -1
  283. package/dist/types/src/extensions/outliner/index.d.ts +0 -4
  284. package/dist/types/src/extensions/outliner/index.d.ts.map +0 -1
  285. package/dist/types/src/extensions/outliner/outliner.d.ts +0 -11
  286. package/dist/types/src/extensions/outliner/outliner.d.ts.map +0 -1
  287. package/dist/types/src/extensions/outliner/outliner.test.d.ts +0 -2
  288. package/dist/types/src/extensions/outliner/outliner.test.d.ts.map +0 -1
  289. package/dist/types/src/extensions/outliner/selection.d.ts +0 -12
  290. package/dist/types/src/extensions/outliner/selection.d.ts.map +0 -1
  291. package/dist/types/src/extensions/outliner/tree.d.ts +0 -79
  292. package/dist/types/src/extensions/outliner/tree.d.ts.map +0 -1
  293. package/dist/types/src/extensions/outliner/tree.test.d.ts +0 -2
  294. package/dist/types/src/extensions/outliner/tree.test.d.ts.map +0 -1
  295. package/dist/types/src/extensions/preview/index.d.ts +0 -2
  296. package/dist/types/src/extensions/preview/index.d.ts.map +0 -1
  297. package/dist/types/src/extensions/preview/preview.d.ts +0 -32
  298. package/dist/types/src/extensions/preview/preview.d.ts.map +0 -1
  299. package/dist/types/src/extensions/selection.d.ts +0 -24
  300. package/dist/types/src/extensions/selection.d.ts.map +0 -1
  301. package/dist/types/src/extensions/typewriter.d.ts +0 -10
  302. package/dist/types/src/extensions/typewriter.d.ts.map +0 -1
  303. package/dist/types/src/stories/Command.stories.d.ts +0 -7
  304. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  305. package/dist/types/src/stories/CommandMenu.stories.d.ts +0 -13
  306. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  307. package/dist/types/src/styles/index.d.ts +0 -4
  308. package/dist/types/src/styles/index.d.ts.map +0 -1
  309. package/dist/types/src/styles/markdown.d.ts +0 -8
  310. package/dist/types/src/styles/markdown.d.ts.map +0 -1
  311. package/dist/types/src/styles/theme.d.ts +0 -38
  312. package/dist/types/src/styles/theme.d.ts.map +0 -1
  313. package/dist/types/src/styles/tokens.d.ts +0 -3
  314. package/dist/types/src/styles/tokens.d.ts.map +0 -1
  315. package/dist/types/src/testing/index.d.ts +0 -2
  316. package/dist/types/src/testing/index.d.ts.map +0 -1
  317. package/dist/types/src/testing/util.d.ts +0 -2
  318. package/dist/types/src/testing/util.d.ts.map +0 -1
  319. package/dist/types/src/types.d.ts +0 -14
  320. package/dist/types/src/types.d.ts.map +0 -1
  321. package/dist/types/src/util/cursor.d.ts +0 -31
  322. package/dist/types/src/util/cursor.d.ts.map +0 -1
  323. package/dist/types/src/util/debug.d.ts +0 -17
  324. package/dist/types/src/util/debug.d.ts.map +0 -1
  325. package/dist/types/src/util/dom.d.ts +0 -20
  326. package/dist/types/src/util/dom.d.ts.map +0 -1
  327. package/dist/types/src/util/facet.d.ts +0 -3
  328. package/dist/types/src/util/facet.d.ts.map +0 -1
  329. package/src/components/EditorToolbar/util.ts +0 -64
  330. package/src/components/Popover/CommandMenu.tsx +0 -279
  331. package/src/components/Popover/RefDropdownMenu.tsx +0 -79
  332. package/src/components/Popover/RefPopover.tsx +0 -99
  333. package/src/components/Popover/index.ts +0 -7
  334. package/src/defaults.ts +0 -49
  335. package/src/extensions/annotations.ts +0 -55
  336. package/src/extensions/autocomplete.ts +0 -69
  337. package/src/extensions/automerge/automerge.stories.tsx +0 -140
  338. package/src/extensions/automerge/automerge.test.tsx +0 -78
  339. package/src/extensions/automerge/automerge.ts +0 -85
  340. package/src/extensions/automerge/cursor.ts +0 -28
  341. package/src/extensions/automerge/defs.ts +0 -31
  342. package/src/extensions/automerge/index.ts +0 -5
  343. package/src/extensions/automerge/sync.ts +0 -75
  344. package/src/extensions/automerge/update-automerge.ts +0 -50
  345. package/src/extensions/automerge/update-codemirror.ts +0 -115
  346. package/src/extensions/awareness/awareness-provider.ts +0 -127
  347. package/src/extensions/awareness/awareness.ts +0 -315
  348. package/src/extensions/awareness/index.ts +0 -6
  349. package/src/extensions/blast.ts +0 -376
  350. package/src/extensions/command/action.ts +0 -56
  351. package/src/extensions/command/command-menu.ts +0 -210
  352. package/src/extensions/command/command.ts +0 -34
  353. package/src/extensions/command/floating-menu.ts +0 -133
  354. package/src/extensions/command/hint.ts +0 -102
  355. package/src/extensions/command/index.ts +0 -10
  356. package/src/extensions/command/placeholder.ts +0 -113
  357. package/src/extensions/command/state.ts +0 -89
  358. package/src/extensions/command/typeahead.ts +0 -116
  359. package/src/extensions/command/useCommandMenu.ts +0 -118
  360. package/src/extensions/comments.ts +0 -592
  361. package/src/extensions/debug.ts +0 -15
  362. package/src/extensions/dnd.ts +0 -37
  363. package/src/extensions/factories.ts +0 -240
  364. package/src/extensions/focus.ts +0 -35
  365. package/src/extensions/folding.tsx +0 -46
  366. package/src/extensions/hashtag.tsx +0 -68
  367. package/src/extensions/json.ts +0 -57
  368. package/src/extensions/listener.ts +0 -38
  369. package/src/extensions/markdown/action.ts +0 -116
  370. package/src/extensions/markdown/bundle.ts +0 -71
  371. package/src/extensions/markdown/changes.test.ts +0 -26
  372. package/src/extensions/markdown/changes.ts +0 -149
  373. package/src/extensions/markdown/debug.ts +0 -44
  374. package/src/extensions/markdown/decorate.ts +0 -591
  375. package/src/extensions/markdown/formatting.test.ts +0 -498
  376. package/src/extensions/markdown/formatting.ts +0 -1265
  377. package/src/extensions/markdown/highlight.ts +0 -183
  378. package/src/extensions/markdown/image.ts +0 -119
  379. package/src/extensions/markdown/index.ts +0 -13
  380. package/src/extensions/markdown/link.ts +0 -47
  381. package/src/extensions/markdown/parser.test.ts +0 -75
  382. package/src/extensions/markdown/styles.ts +0 -135
  383. package/src/extensions/markdown/table.ts +0 -144
  384. package/src/extensions/mention.ts +0 -41
  385. package/src/extensions/modes.ts +0 -50
  386. package/src/extensions/outliner/commands.ts +0 -270
  387. package/src/extensions/outliner/editor.test.ts +0 -33
  388. package/src/extensions/outliner/editor.ts +0 -184
  389. package/src/extensions/outliner/index.ts +0 -7
  390. package/src/extensions/outliner/outliner.test.ts +0 -99
  391. package/src/extensions/outliner/outliner.ts +0 -166
  392. package/src/extensions/outliner/selection.ts +0 -50
  393. package/src/extensions/outliner/tree.test.ts +0 -167
  394. package/src/extensions/outliner/tree.ts +0 -317
  395. package/src/extensions/preview/index.ts +0 -5
  396. package/src/extensions/preview/preview.ts +0 -193
  397. package/src/extensions/selection.ts +0 -100
  398. package/src/extensions/typewriter.ts +0 -68
  399. package/src/stories/Command.stories.tsx +0 -97
  400. package/src/stories/CommandMenu.stories.tsx +0 -159
  401. package/src/styles/index.ts +0 -7
  402. package/src/styles/markdown.ts +0 -26
  403. package/src/styles/theme.ts +0 -266
  404. package/src/styles/tokens.ts +0 -17
  405. package/src/testing/index.ts +0 -5
  406. package/src/testing/util.ts +0 -5
  407. package/src/types.ts +0 -23
  408. package/src/util/cursor.ts +0 -55
  409. package/src/util/debug.ts +0 -64
  410. package/src/util/dom.ts +0 -56
  411. package/src/util/facet.ts +0 -13
@@ -4,11 +4,12 @@
4
4
 
5
5
  import { type EditorView } from '@codemirror/view';
6
6
 
7
- import { type NodeArg } from '@dxos/app-graph';
8
- import { type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';
7
+ import { type ActionGroupBuilderFn, type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';
8
+ import { List, addList, removeList } from '@dxos/ui-editor';
9
9
 
10
- import { createEditorAction, createEditorActionGroup, type EditorToolbarState } from './util';
11
- import { addList, List, removeList } from '../../extensions';
10
+ import { translationKey } from '#translations';
11
+
12
+ import { type EditorToolbarState } from './types';
12
13
 
13
14
  const listStyles = {
14
15
  bullet: 'ph--list-bullets--regular',
@@ -16,44 +17,42 @@ const listStyles = {
16
17
  task: 'ph--list-checks--regular',
17
18
  };
18
19
 
19
- const createListGroupAction = (value: string) =>
20
- createEditorActionGroup('list', {
21
- variant: 'toggleGroup',
22
- selectCardinality: 'single',
23
- value,
24
- } as ToolbarMenuActionGroupProperties);
25
-
26
- const createListActions = (value: string, getView: () => EditorView) =>
27
- Object.entries(listStyles).map(([listStyle, icon]) => {
28
- const checked = value === listStyle;
29
- return createEditorAction(
30
- `list-${listStyle}`,
31
- () => {
32
- const view = getView();
33
- if (!view) {
34
- return;
35
- }
36
-
37
- const listType = listStyle === 'ordered' ? List.Ordered : listStyle === 'bullet' ? List.Bullet : List.Task;
38
- if (checked) {
39
- removeList(listType)(view);
40
- } else {
41
- addList(listType)(view);
20
+ /** Add list actions to the builder. */
21
+ export const addLists =
22
+ (state: EditorToolbarState, getView: () => EditorView): ActionGroupBuilderFn =>
23
+ (builder) => {
24
+ const value = state.listStyle ?? '';
25
+ builder.group(
26
+ 'list',
27
+ {
28
+ label: ['list.label', { ns: translationKey }],
29
+ iconOnly: true,
30
+ variant: 'toggleGroup',
31
+ selectCardinality: 'single',
32
+ value,
33
+ } as ToolbarMenuActionGroupProperties,
34
+ (group) => {
35
+ for (const [listStyle, icon] of Object.entries(listStyles)) {
36
+ const checked = value === listStyle;
37
+ group.action(
38
+ `list-${listStyle}`,
39
+ { label: [`list.${listStyle}.label`, { ns: translationKey }], checked, icon },
40
+ () => {
41
+ const view = getView();
42
+ if (!view) {
43
+ return;
44
+ }
45
+
46
+ const listType =
47
+ listStyle === 'ordered' ? List.Ordered : listStyle === 'bullet' ? List.Bullet : List.Task;
48
+ if (checked) {
49
+ removeList(listType)(view);
50
+ } else {
51
+ addList(listType)(view);
52
+ }
53
+ },
54
+ );
42
55
  }
43
56
  },
44
- { checked, icon },
45
57
  );
46
- });
47
-
48
- export const createLists = (state: EditorToolbarState, getView: () => EditorView) => {
49
- const value = state.listStyle ?? '';
50
- const listGroupAction = createListGroupAction(value);
51
- const listActionsMap = createListActions(value, getView);
52
- return {
53
- nodes: [listGroupAction as NodeArg<any>, ...listActionsMap],
54
- edges: [
55
- { source: 'root', target: 'list' },
56
- ...listActionsMap.map(({ id }) => ({ source: listGroupAction.id, target: id })),
57
- ],
58
58
  };
59
- };
@@ -5,15 +5,21 @@
5
5
  import { openSearchPanel } from '@codemirror/search';
6
6
  import { type EditorView } from '@codemirror/view';
7
7
 
8
- import { createEditorAction } from './util';
8
+ import { type ActionGroupBuilderFn } from '@dxos/react-ui-menu';
9
9
 
10
- const createSearchAction = (getView: () => EditorView) =>
11
- createEditorAction('search', () => openSearchPanel(getView()), {
12
- testId: 'editor.toolbar.search',
13
- icon: 'ph--magnifying-glass--regular',
14
- });
10
+ import { translationKey } from '#translations';
15
11
 
16
- export const createSearch = (getView: () => EditorView) => ({
17
- nodes: [createSearchAction(getView)],
18
- edges: [{ source: 'root', target: 'search' }],
19
- });
12
+ /** Add search action to the builder. */
13
+ export const addSearch =
14
+ (getView: () => EditorView): ActionGroupBuilderFn =>
15
+ (builder) => {
16
+ builder.action(
17
+ 'search',
18
+ {
19
+ label: ['search.label', { ns: translationKey }],
20
+ testId: 'editor.toolbar.search',
21
+ icon: 'ph--magnifying-glass--regular',
22
+ },
23
+ () => openSearchPanel(getView()),
24
+ );
25
+ };
@@ -0,0 +1,8 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Formatting } from '@dxos/ui-editor';
6
+ import { type EditorViewMode } from '@dxos/ui-editor/types';
7
+
8
+ export type EditorToolbarState = Formatting & { viewMode?: EditorViewMode };
@@ -2,48 +2,48 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { type NodeArg } from '@dxos/app-graph';
6
- import { type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';
5
+ import { type ActionGroupBuilderFn, type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';
6
+ import { type EditorViewMode } from '@dxos/ui-editor/types';
7
7
 
8
- import { createEditorAction, createEditorActionGroup, type EditorToolbarState } from './util';
9
- import { type EditorViewMode } from '../../extensions';
10
- import { translationKey } from '../../translations';
8
+ import { translationKey } from '#translations';
11
9
 
12
- const createViewModeGroupAction = (value: string) =>
13
- createEditorActionGroup(
14
- 'viewMode',
15
- {
16
- variant: 'dropdownMenu',
17
- applyActive: true,
18
- selectCardinality: 'single',
19
- value,
20
- } as ToolbarMenuActionGroupProperties,
21
- 'ph--eye--regular',
22
- );
10
+ import { type EditorToolbarState } from './types';
23
11
 
24
- const createViewModeActions = (value: string, onViewModeChange: (mode: EditorViewMode) => void) =>
25
- Object.entries({
26
- preview: 'ph--eye--regular',
27
- source: 'ph--pencil-simple--regular',
28
- readonly: 'ph--pencil-slash--regular',
29
- }).map(([viewMode, icon]) => {
30
- const checked = viewMode === value;
31
- return createEditorAction(`view-mode--${viewMode}`, () => onViewModeChange(viewMode as EditorViewMode), {
32
- label: [`${viewMode} mode label`, { ns: translationKey }],
33
- checked,
34
- icon,
35
- });
36
- });
12
+ const viewModes = {
13
+ preview: 'ph--eye--regular',
14
+ source: 'ph--pencil-simple--regular',
15
+ readonly: 'ph--pencil-slash--regular',
16
+ };
37
17
 
38
- export const createViewMode = (state: EditorToolbarState, onViewModeChange: (mode: EditorViewMode) => void) => {
39
- const value = state.viewMode ?? 'source';
40
- const viewModeGroupAction = createViewModeGroupAction(value);
41
- const viewModeActions = createViewModeActions(value, onViewModeChange);
42
- return {
43
- nodes: [viewModeGroupAction as NodeArg<any>, ...viewModeActions],
44
- edges: [
45
- { source: 'root', target: 'viewMode' },
46
- ...viewModeActions.map(({ id }) => ({ source: viewModeGroupAction.id, target: id })),
47
- ],
18
+ /** Add view mode actions to the builder. */
19
+ export const addViewMode =
20
+ (state: EditorToolbarState, onViewModeChange: (mode: EditorViewMode) => void): ActionGroupBuilderFn =>
21
+ (builder) => {
22
+ const value = state.viewMode ?? 'source';
23
+ builder.group(
24
+ 'viewMode',
25
+ {
26
+ label: ['view-mode.label', { ns: translationKey }],
27
+ icon: 'ph--eye--regular',
28
+ iconOnly: true,
29
+ variant: 'dropdownMenu',
30
+ applyActive: true,
31
+ selectCardinality: 'single',
32
+ value,
33
+ } as ToolbarMenuActionGroupProperties,
34
+ (group) => {
35
+ for (const [viewMode, icon] of Object.entries(viewModes)) {
36
+ const checked = viewMode === value;
37
+ group.action(
38
+ `view-mode--${viewMode}`,
39
+ {
40
+ label: [`view-mode.${viewMode}.label`, { ns: translationKey }],
41
+ checked,
42
+ icon,
43
+ },
44
+ () => onViewModeChange(viewMode as EditorViewMode),
45
+ );
46
+ }
47
+ },
48
+ );
48
49
  };
49
- };
@@ -2,5 +2,7 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- export * from './EditorToolbar';
6
- export * from './Popover';
5
+ export * from './Editor';
6
+
7
+ export * from './EditorMenuProvider';
8
+ export * from './EditorPreviewProvider';
@@ -0,0 +1,112 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as LanguageModel from '@effect/ai/LanguageModel';
6
+ import type { Meta, StoryObj } from '@storybook/react-vite';
7
+ import * as Effect from 'effect/Effect';
8
+ import * as Layer from 'effect/Layer';
9
+ import * as ManagedRuntime from 'effect/ManagedRuntime';
10
+ import React, { useEffect, useMemo, useState } from 'react';
11
+
12
+ import { AiService } from '@dxos/ai';
13
+ import { AiServiceTestingPreset } from '@dxos/ai/testing';
14
+ import { useThemeContext } from '@dxos/react-ui';
15
+ import { Loading, withLayout, withTheme } from '@dxos/react-ui/testing';
16
+ import { compactSlots, createBasicExtensions, createThemeExtensions } from '@dxos/ui-editor';
17
+ import { trim } from '@dxos/util';
18
+
19
+ import { translations } from '#translations';
20
+
21
+ import { Editor, type EditorViewProps } from '../components';
22
+ import { assistant, type AssistantOptions } from './assistant-extension';
23
+
24
+ // TODO(burdon): Factor out.
25
+ const useTestGenerate = () => {
26
+ const [generate, setGenerate] = useState<AssistantOptions['generate']>();
27
+ useEffect(() => {
28
+ let disposed = false;
29
+ const rt = ManagedRuntime.make(
30
+ AiService.model('@anthropic/claude-haiku-4-5').pipe(
31
+ Layer.provide(AiServiceTestingPreset('edge-remote')),
32
+ Layer.orDie,
33
+ ),
34
+ );
35
+
36
+ if (!disposed) {
37
+ setGenerate(
38
+ () =>
39
+ ({ instructions, content }: { instructions: string; content: string }) =>
40
+ rt.runPromise(
41
+ Effect.gen(function* () {
42
+ const prompt = [instructions, content].join('\n\n');
43
+ const response = yield* LanguageModel.generateText({ prompt });
44
+ return response.text;
45
+ }),
46
+ ),
47
+ );
48
+ }
49
+
50
+ return () => {
51
+ disposed = true;
52
+ void rt.dispose();
53
+ };
54
+ }, []);
55
+
56
+ return generate;
57
+ };
58
+
59
+ type DefaultStoryProps = Pick<EditorViewProps, 'value'>;
60
+
61
+ const DefaultStory = (props: DefaultStoryProps) => {
62
+ const { themeMode } = useThemeContext();
63
+ const generate = useTestGenerate();
64
+ const extensions = useMemo(
65
+ () =>
66
+ generate
67
+ ? [
68
+ createBasicExtensions({ placeholder: 'Type here...' }),
69
+ createThemeExtensions({ themeMode, slots: compactSlots }),
70
+ assistant({ generate }),
71
+ ]
72
+ : [],
73
+ [generate, themeMode],
74
+ );
75
+
76
+ if (extensions.length === 0) {
77
+ return <Loading />;
78
+ }
79
+
80
+ return (
81
+ <Editor.Root>
82
+ <Editor.View {...props} classNames='dx-container border border-subdued-separator' extensions={extensions} />
83
+ </Editor.Root>
84
+ );
85
+ };
86
+
87
+ const meta: Meta<typeof DefaultStory> = {
88
+ title: 'ui/react-ui-editor/Assistant',
89
+ render: DefaultStory,
90
+ decorators: [withTheme(), withLayout({ layout: 'column' })],
91
+ tags: ['experimental'],
92
+ parameters: {
93
+ layout: 'fullscreen',
94
+ translations,
95
+ },
96
+ };
97
+
98
+ export default meta;
99
+
100
+ type Story = StoryObj<typeof meta>;
101
+
102
+ export const Default: Story = {
103
+ args: {
104
+ value: trim`
105
+ This text has a speling mistake.
106
+
107
+ And it grammatical errors.
108
+
109
+ But we can fix it.
110
+ `,
111
+ },
112
+ };
@@ -0,0 +1,223 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Diagnostic, forEachDiagnostic, linter, setDiagnostics } from '@codemirror/lint';
6
+ import { ChangeSet, type Extension } from '@codemirror/state';
7
+ import { EditorView } from '@codemirror/view';
8
+
9
+ import { log } from '@dxos/log';
10
+ import { safeParseJson, trim } from '@dxos/util';
11
+
12
+ const DEFAULT_INSTRUCTIONS = trim`
13
+ Proofread the input text below.
14
+ Identify typos and grammatical errors.
15
+ Return ONLY a valid JSON array of objects with fields: "original" (string), "replacement" (string), "context" (string, 3-5 words around match).
16
+ --
17
+ `;
18
+
19
+ export type AssistantOptions = {
20
+ /**
21
+ * Invoke the language model with the given prompt and return the raw text response.
22
+ */
23
+ generate: (request: { instructions: string; content: string }) => Promise<string>;
24
+ /**
25
+ * Instructions to use for the language model.
26
+ */
27
+ instructions?: string;
28
+ /**
29
+ * Show panel automatically.
30
+ */
31
+ autoPanel?: boolean;
32
+ /**
33
+ * Debounce delay.
34
+ */
35
+ delay?: number;
36
+ };
37
+
38
+ const underline = (color: string) => {
39
+ const svg = trim`
40
+ <svg xmlns="http://www.w3.org/2000/svg" width="6" height="3">
41
+ <path d="m0 3 l2 -2 l1 0 l2 2 l1 0" stroke="${color}" fill="none" stroke-width="1"/>
42
+ </svg>
43
+ `;
44
+
45
+ return `url('data:image/svg+xml;base64,${btoa(svg)}') !important`;
46
+ };
47
+
48
+ export const assistant = (options: AssistantOptions): Extension[] => {
49
+ const styles = getComputedStyle(document.documentElement);
50
+ const style = {
51
+ info: styles.getPropertyValue('--color-green-500').trim(),
52
+ warning: styles.getPropertyValue('--color-orange-500').trim(),
53
+ error: styles.getPropertyValue('--color-rose-500').trim(),
54
+ };
55
+
56
+ return [
57
+ assistantLinter(options),
58
+ EditorView.baseTheme({
59
+ '.cm-lintRange-info': {
60
+ backgroundImage: underline(style.info),
61
+ },
62
+ '.cm-lintRange-warning': {
63
+ backgroundImage: underline(style.warning),
64
+ },
65
+ '.cm-lintRange-error': {
66
+ backgroundImage: underline(style.error),
67
+ },
68
+
69
+ '.cm-panels-bottom': {
70
+ borderTop: '1px solid var(--color-separator) !important',
71
+ },
72
+ '.cm-panel-lint .cm-panel': {
73
+ outline: 'none !important',
74
+ },
75
+ /** @apply dx-button */
76
+ '.cm-panel button': {
77
+ color: 'var(--color-base-surface-text) !important',
78
+ },
79
+ '.cm-panel.cm-panel-lint ul': {
80
+ color: 'var(--color-base-surface-text) !important',
81
+ backgroundColor: 'var(--color-base-surface) !important',
82
+ marginRight: '2rem !important',
83
+ },
84
+ '.cm-panel.cm-panel-lint ul [aria-selected]': {
85
+ color: 'var(--color-base-surface-text) !important',
86
+ backgroundColor: 'var(--color-base-surface) !important',
87
+ },
88
+ '.cm-panel.cm-panel-lint ul li': {
89
+ display: 'grid',
90
+ gridTemplateColumns: '1fr auto',
91
+ alignItems: 'center',
92
+ },
93
+ '.cm-panel.cm-panel-lint ul li .cm-diagnosticText': {
94
+ paddingRight: '8px !important',
95
+ },
96
+ '.cm-panel.cm-panel-lint ul li button.cm-diagnosticAction': {
97
+ margin: 'none !important',
98
+ },
99
+ '.cm-diagnostic': {
100
+ padding: '0px 8px !important',
101
+ whiteSpace: 'pre-wrap !important',
102
+ },
103
+ '.cm-diagnostic-info': {
104
+ border: 'none !important',
105
+ },
106
+ }),
107
+ ];
108
+ };
109
+
110
+ //
111
+ // Linter
112
+ //
113
+
114
+ type Suggestion = {
115
+ original: string;
116
+ replacement: string;
117
+ context: string;
118
+ };
119
+
120
+ const isSuggestion = (value: unknown): value is Suggestion =>
121
+ typeof value === 'object' &&
122
+ value !== null &&
123
+ typeof (value as Suggestion).original === 'string' &&
124
+ typeof (value as Suggestion).replacement === 'string' &&
125
+ typeof (value as Suggestion).context === 'string';
126
+
127
+ /**
128
+ * Find the index of `original` within `content`, using `context` to disambiguate when there are multiple occurrences.
129
+ */
130
+ const findSuggestionIndex = (content: string, suggestion: Suggestion): number => {
131
+ const firstIdx = content.indexOf(suggestion.original);
132
+ if (firstIdx === -1) {
133
+ return -1;
134
+ }
135
+
136
+ // Check for duplicate occurrences; use context to disambiguate.
137
+ const secondIdx = content.indexOf(suggestion.original, firstIdx + 1);
138
+ if (secondIdx === -1) {
139
+ return firstIdx;
140
+ }
141
+
142
+ // Find the occurrence whose surrounding text best matches the context.
143
+ const contextIdx = content.indexOf(suggestion.context);
144
+ if (contextIdx !== -1) {
145
+ const contextEnd = contextIdx + suggestion.context.length;
146
+ if (secondIdx >= contextIdx && secondIdx <= contextEnd) {
147
+ return secondIdx;
148
+ }
149
+ }
150
+
151
+ return firstIdx;
152
+ };
153
+
154
+ const replaceTextAndDropLintAtRange = (view: EditorView, from: number, to: number, insert: string) => {
155
+ const kept: Diagnostic[] = [];
156
+ forEachDiagnostic(view.state, (diagnostic, diagnosticFrom, diagnosticTo) => {
157
+ if (diagnosticFrom < to && diagnosticTo > from) {
158
+ return;
159
+ }
160
+ kept.push({ ...diagnostic, from: diagnosticFrom, to: diagnosticTo });
161
+ });
162
+ const changeSet = ChangeSet.of({ from, to, insert }, view.state.doc.length);
163
+ const next = kept.map((d) => ({
164
+ ...d,
165
+ from: changeSet.mapPos(d.from, 1),
166
+ to: changeSet.mapPos(d.to, -1),
167
+ }));
168
+ view.dispatch({
169
+ changes: { from, to, insert },
170
+ ...setDiagnostics(view.state, next),
171
+ });
172
+ };
173
+
174
+ const assistantLinter = ({
175
+ generate,
176
+ instructions = DEFAULT_INSTRUCTIONS,
177
+ autoPanel = true,
178
+ delay = 2_000,
179
+ }: AssistantOptions) =>
180
+ linter(
181
+ async (view) => {
182
+ try {
183
+ const content = view.state.doc.toString();
184
+ const result = await generate({ instructions, content });
185
+
186
+ const [match] = result.match(/\[.*\]/s) ?? [];
187
+ const parsed = match ? safeParseJson<unknown[]>(match, []) : [];
188
+ const suggestions = Array.isArray(parsed) ? parsed.filter(isSuggestion) : [];
189
+ if (suggestions && suggestions.length > 0) {
190
+ const diagnostics: Diagnostic[] = [];
191
+ for (const suggestion of suggestions) {
192
+ const idx = findSuggestionIndex(content, suggestion);
193
+ if (idx !== -1) {
194
+ diagnostics.push({
195
+ from: idx,
196
+ to: idx + suggestion.original.length,
197
+ severity: 'info',
198
+ message: `Suggestion: ${suggestion.replacement}`,
199
+ actions: [
200
+ {
201
+ name: 'Apply',
202
+ apply: (view, from, to) => {
203
+ replaceTextAndDropLintAtRange(view, from, to, suggestion.replacement);
204
+ },
205
+ },
206
+ ],
207
+ });
208
+ }
209
+ }
210
+
211
+ return diagnostics;
212
+ }
213
+ } catch (err) {
214
+ log.catch(err);
215
+ }
216
+
217
+ return [];
218
+ },
219
+ {
220
+ delay,
221
+ autoPanel,
222
+ },
223
+ );
@@ -1,26 +1,5 @@
1
1
  //
2
- // Copyright 2023 DXOS.org
2
+ // Copyright 2026 DXOS.org
3
3
  //
4
4
 
5
- export * from './annotations';
6
- export * from './autocomplete';
7
- export * from './automerge';
8
- export * from './awareness';
9
- export * from './blast';
10
- export * from './command';
11
- export * from './comments';
12
- export * from './debug';
13
- export * from './dnd';
14
- export * from './factories';
15
- export * from './focus';
16
- export * from './folding';
17
- export * from './hashtag';
18
- export * from './json';
19
- export * from './listener';
20
- export * from './markdown';
21
- export * from './mention';
22
- export * from './modes';
23
- export * from './outliner';
24
- export * from './preview';
25
- export * from './selection';
26
- export * from './typewriter';
5
+ export * from './assistant-extension';
@@ -2,4 +2,5 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ export * from './useBasicMarkdownExtensions';
5
6
  export * from './useTextEditor';
@@ -0,0 +1,55 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Extension } from '@codemirror/state';
6
+ import { useMemo } from 'react';
7
+
8
+ import { useThemeContext } from '@dxos/react-ui';
9
+ import {
10
+ createBasicExtensions,
11
+ createMarkdownExtensions,
12
+ createThemeExtensions,
13
+ decorateMarkdown,
14
+ } from '@dxos/ui-editor';
15
+
16
+ export type UseBasicMarkdownExtensionsOptions = {
17
+ /** Placeholder text shown when the editor is empty. */
18
+ placeholder?: string;
19
+ /** Enables markdown visual decorations. Pass `false` to disable. Defaults to `true`. */
20
+ decorate?: boolean;
21
+ /**
22
+ * Extra extensions appended to the returned array.
23
+ * Callers must memoize this array — it is used as a dependency of {@link useMemo}.
24
+ */
25
+ extensions?: Extension[];
26
+ };
27
+
28
+ /**
29
+ * Returns the standard CodeMirror extension stack for an inline markdown editor:
30
+ * basic editor behaviors, themed syntax highlighting (theme mode read from {@link useThemeContext}),
31
+ * markdown parsing, and visual decorations.
32
+ *
33
+ * Used by surfaces such as `AgentProperties` and `MagazineProperties` to render the
34
+ * `instructions` field of an object as a small editable markdown block.
35
+ *
36
+ * The memoization depends on primitive option values plus the `extensions` array reference,
37
+ * so callers passing fresh option literals each render still hit the cache.
38
+ */
39
+ export const useBasicMarkdownExtensions = ({
40
+ placeholder,
41
+ decorate = true,
42
+ extensions,
43
+ }: UseBasicMarkdownExtensionsOptions = {}): Extension[] => {
44
+ const { themeMode } = useThemeContext();
45
+ return useMemo(
46
+ () => [
47
+ createBasicExtensions({ placeholder }),
48
+ createThemeExtensions({ syntaxHighlighting: true, themeMode }),
49
+ createMarkdownExtensions(),
50
+ ...(decorate ? [decorateMarkdown()] : []),
51
+ ...(extensions ?? []),
52
+ ],
53
+ [placeholder, themeMode, decorate, extensions],
54
+ );
55
+ };