@dxos/react-ui-editor 0.8.4-main.5ea62a8 → 0.8.4-main.72ec0f3

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 (347) hide show
  1. package/dist/lib/browser/{chunk-22UMM3QJ.mjs → chunk-HL3YF6WC.mjs} +2 -2
  2. package/dist/lib/browser/chunk-HL3YF6WC.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +5006 -3698
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/types/index.mjs +1 -1
  7. package/dist/lib/node-esm/{chunk-YXYQPV6R.mjs → chunk-YJZGD3LY.mjs} +2 -2
  8. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs.map +7 -0
  9. package/dist/lib/node-esm/index.mjs +5006 -3698
  10. package/dist/lib/node-esm/index.mjs.map +4 -4
  11. package/dist/lib/node-esm/meta.json +1 -1
  12. package/dist/lib/node-esm/types/index.mjs +1 -1
  13. package/dist/types/src/components/Editor/Editor.d.ts +37 -15
  14. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  15. package/dist/types/src/components/Editor/Editor.stories.d.ts +20 -0
  16. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -0
  17. package/dist/types/src/components/EditorContent/EditorContent.d.ts +29 -0
  18. package/dist/types/src/components/EditorContent/EditorContent.d.ts.map +1 -0
  19. package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts +26 -0
  20. package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorContent/controller.d.ts +10 -0
  22. package/dist/types/src/components/EditorContent/controller.d.ts.map +1 -0
  23. package/dist/types/src/components/EditorContent/index.d.ts +3 -0
  24. package/dist/types/src/components/EditorContent/index.d.ts.map +1 -0
  25. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts +36 -0
  26. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -0
  27. package/dist/types/src/components/EditorMenuProvider/index.d.ts +7 -0
  28. package/dist/types/src/components/EditorMenuProvider/index.d.ts.map +1 -0
  29. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts +4 -0
  30. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -0
  31. package/dist/types/src/components/EditorMenuProvider/menu.d.ts +28 -0
  32. package/dist/types/src/components/EditorMenuProvider/menu.d.ts.map +1 -0
  33. package/dist/types/src/components/EditorMenuProvider/popover.d.ts +47 -0
  34. package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -0
  35. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts +34 -0
  36. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -0
  37. package/dist/types/src/components/EditorMenuProvider/util.d.ts +8 -0
  38. package/dist/types/src/components/EditorMenuProvider/util.d.ts.map +1 -0
  39. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +16 -0
  40. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -0
  41. package/dist/types/src/components/EditorPreviewProvider/index.d.ts +2 -0
  42. package/dist/types/src/components/EditorPreviewProvider/index.d.ts.map +1 -0
  43. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +26 -2
  44. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  45. package/dist/types/src/components/EditorToolbar/actions.d.ts +39 -0
  46. package/dist/types/src/components/EditorToolbar/actions.d.ts.map +1 -0
  47. package/dist/types/src/components/EditorToolbar/blocks.d.ts +3 -3
  48. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  49. package/dist/types/src/components/EditorToolbar/formatting.d.ts +3 -3
  50. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  51. package/dist/types/src/components/EditorToolbar/headings.d.ts +3 -3
  52. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  53. package/dist/types/src/components/EditorToolbar/index.d.ts +2 -1
  54. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  55. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts +11 -0
  56. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts.map +1 -0
  57. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +3 -3
  58. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  59. package/dist/types/src/components/index.d.ts +4 -2
  60. package/dist/types/src/components/index.d.ts.map +1 -1
  61. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +17 -0
  62. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +1 -0
  63. package/dist/types/src/extensions/autocomplete/index.d.ts +5 -0
  64. package/dist/types/src/extensions/autocomplete/index.d.ts.map +1 -0
  65. package/dist/types/src/extensions/autocomplete/match.d.ts +13 -0
  66. package/dist/types/src/extensions/autocomplete/match.d.ts.map +1 -0
  67. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +20 -0
  68. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +1 -0
  69. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +10 -0
  70. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +1 -0
  71. package/dist/types/src/extensions/automerge/automerge.d.ts +1 -1
  72. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  73. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +1 -1
  74. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  75. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  76. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  77. package/dist/types/src/extensions/automerge/sync.d.ts +3 -3
  78. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  79. package/dist/types/src/extensions/automerge/update-automerge.d.ts +1 -1
  80. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  81. package/dist/types/src/extensions/autoscroll.d.ts +20 -0
  82. package/dist/types/src/extensions/autoscroll.d.ts.map +1 -0
  83. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +1 -1
  84. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
  85. package/dist/types/src/extensions/blocks.d.ts +2 -0
  86. package/dist/types/src/extensions/blocks.d.ts.map +1 -0
  87. package/dist/types/src/extensions/bookmarks.d.ts +12 -0
  88. package/dist/types/src/extensions/bookmarks.d.ts.map +1 -0
  89. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  90. package/dist/types/src/extensions/factories.d.ts +11 -11
  91. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  92. package/dist/types/src/extensions/focus.d.ts.map +1 -1
  93. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  94. package/dist/types/src/extensions/index.d.ts +10 -1
  95. package/dist/types/src/extensions/index.d.ts.map +1 -1
  96. package/dist/types/src/extensions/json.d.ts +1 -1
  97. package/dist/types/src/extensions/json.d.ts.map +1 -1
  98. package/dist/types/src/extensions/listener.d.ts +8 -6
  99. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  100. package/dist/types/src/extensions/markdown/bundle.d.ts +6 -2
  101. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  102. package/dist/types/src/extensions/markdown/changes.d.ts +1 -1
  103. package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
  104. package/dist/types/src/extensions/markdown/decorate.d.ts +9 -1
  105. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  106. package/dist/types/src/extensions/markdown/formatting.d.ts +1 -3
  107. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  108. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
  109. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  110. package/dist/types/src/extensions/modal.d.ts +7 -0
  111. package/dist/types/src/extensions/modal.d.ts.map +1 -0
  112. package/dist/types/src/extensions/modes.d.ts +1 -1
  113. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  114. package/dist/types/src/extensions/outliner/menu.d.ts +8 -0
  115. package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -0
  116. package/dist/types/src/extensions/outliner/outliner.d.ts +1 -1
  117. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
  118. package/dist/types/src/extensions/outliner/tree.d.ts +1 -1
  119. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
  120. package/dist/types/src/extensions/preview/preview.d.ts +8 -8
  121. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  122. package/dist/types/src/extensions/replacer.d.ts +21 -0
  123. package/dist/types/src/extensions/replacer.d.ts.map +1 -0
  124. package/dist/types/src/extensions/replacer.test.d.ts +2 -0
  125. package/dist/types/src/extensions/replacer.test.d.ts.map +1 -0
  126. package/dist/types/src/extensions/scrolling.d.ts +78 -0
  127. package/dist/types/src/extensions/scrolling.d.ts.map +1 -0
  128. package/dist/types/src/extensions/state.d.ts +2 -0
  129. package/dist/types/src/extensions/state.d.ts.map +1 -0
  130. package/dist/types/src/extensions/submit.d.ts +10 -0
  131. package/dist/types/src/extensions/submit.d.ts.map +1 -0
  132. package/dist/types/src/extensions/tab.d.ts +4 -0
  133. package/dist/types/src/extensions/tab.d.ts.map +1 -0
  134. package/dist/types/src/extensions/tags/extended-markdown.d.ts +10 -0
  135. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +1 -0
  136. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +2 -0
  137. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +1 -0
  138. package/dist/types/src/extensions/tags/index.d.ts +4 -0
  139. package/dist/types/src/extensions/tags/index.d.ts.map +1 -0
  140. package/dist/types/src/extensions/tags/streamer.d.ts +12 -0
  141. package/dist/types/src/extensions/tags/streamer.d.ts.map +1 -0
  142. package/dist/types/src/extensions/tags/xml-tags.d.ts +97 -0
  143. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -0
  144. package/dist/types/src/extensions/tags/xml-util.d.ts +10 -0
  145. package/dist/types/src/extensions/tags/xml-util.d.ts.map +1 -0
  146. package/dist/types/src/hooks/useTextEditor.d.ts +5 -9
  147. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  148. package/dist/types/src/stories/{Command.stories.d.ts → CommandDialog.stories.d.ts} +2 -3
  149. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
  150. package/dist/types/src/stories/Comments.stories.d.ts +3 -4
  151. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  152. package/dist/types/src/stories/EditorToolbar.stories.d.ts +1 -2
  153. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  154. package/dist/types/src/stories/Experimental.stories.d.ts +3 -4
  155. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  156. package/dist/types/src/stories/Markdown.stories.d.ts +3 -4
  157. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  158. package/dist/types/src/stories/Outliner.stories.d.ts +0 -1
  159. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  160. package/dist/types/src/stories/{CommandMenu.stories.d.ts → Popover.stories.d.ts} +6 -6
  161. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  162. package/dist/types/src/stories/Preview.stories.d.ts +4 -4
  163. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  164. package/dist/types/src/stories/Tags.stories.d.ts +16 -0
  165. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  166. package/dist/types/src/stories/TextEditor.stories.d.ts +3 -5
  167. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  168. package/dist/types/src/stories/components/EditorStory.d.ts +7 -5
  169. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  170. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  171. package/dist/types/src/styles/theme.d.ts.map +1 -1
  172. package/dist/types/src/types/types.d.ts +2 -2
  173. package/dist/types/src/types/types.d.ts.map +1 -1
  174. package/dist/types/src/util/debug.d.ts +5 -1
  175. package/dist/types/src/util/debug.d.ts.map +1 -1
  176. package/dist/types/src/util/decorations.d.ts +4 -0
  177. package/dist/types/src/util/decorations.d.ts.map +1 -0
  178. package/dist/types/src/util/dom.d.ts +2 -12
  179. package/dist/types/src/util/dom.d.ts.map +1 -1
  180. package/dist/types/src/util/index.d.ts +1 -0
  181. package/dist/types/src/util/index.d.ts.map +1 -1
  182. package/dist/types/src/util/react.d.ts +1 -1
  183. package/dist/types/src/util/react.d.ts.map +1 -1
  184. package/dist/types/tsconfig.tsbuildinfo +1 -1
  185. package/package.json +68 -66
  186. package/src/components/Editor/Editor.stories.tsx +89 -0
  187. package/src/components/Editor/Editor.tsx +160 -25
  188. package/src/components/EditorContent/EditorContent.stories.tsx +70 -0
  189. package/src/components/EditorContent/EditorContent.tsx +70 -0
  190. package/src/components/EditorContent/controller.ts +50 -0
  191. package/src/components/EditorContent/index.ts +6 -0
  192. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +233 -0
  193. package/src/components/EditorMenuProvider/index.ts +11 -0
  194. package/src/components/EditorMenuProvider/menu-presets.ts +123 -0
  195. package/src/components/EditorMenuProvider/menu.ts +71 -0
  196. package/src/components/EditorMenuProvider/popover.ts +287 -0
  197. package/src/components/EditorMenuProvider/useEditorMenu.ts +175 -0
  198. package/src/components/EditorMenuProvider/util.ts +31 -0
  199. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +82 -0
  200. package/src/components/EditorPreviewProvider/index.ts +5 -0
  201. package/src/components/EditorToolbar/EditorToolbar.tsx +101 -91
  202. package/src/components/EditorToolbar/{lists.ts → actions.ts} +46 -16
  203. package/src/components/EditorToolbar/blocks.ts +2 -1
  204. package/src/components/EditorToolbar/formatting.ts +2 -1
  205. package/src/components/EditorToolbar/headings.ts +8 -5
  206. package/src/components/EditorToolbar/image.ts +1 -1
  207. package/src/components/EditorToolbar/index.ts +3 -7
  208. package/src/components/EditorToolbar/search.ts +1 -1
  209. package/src/components/EditorToolbar/useEditorToolbar.ts +20 -0
  210. package/src/components/EditorToolbar/view-mode.ts +2 -1
  211. package/src/components/index.ts +8 -2
  212. package/src/extensions/autocomplete/autocomplete.ts +151 -0
  213. package/src/extensions/autocomplete/index.ts +8 -0
  214. package/src/extensions/autocomplete/match.ts +46 -0
  215. package/src/extensions/{command → autocomplete}/placeholder.ts +21 -17
  216. package/src/extensions/{command → autocomplete}/typeahead.ts +6 -48
  217. package/src/extensions/automerge/automerge.stories.tsx +9 -9
  218. package/src/extensions/automerge/automerge.ts +28 -9
  219. package/src/extensions/automerge/cursor.ts +1 -1
  220. package/src/extensions/automerge/sync.ts +8 -4
  221. package/src/extensions/automerge/update-automerge.ts +1 -1
  222. package/src/extensions/autoscroll.ts +163 -0
  223. package/src/extensions/awareness/awareness-provider.ts +2 -2
  224. package/src/extensions/blocks.ts +131 -0
  225. package/src/extensions/bookmarks.ts +75 -0
  226. package/src/extensions/comments.ts +7 -2
  227. package/src/extensions/factories.ts +50 -32
  228. package/src/extensions/focus.ts +5 -4
  229. package/src/extensions/folding.tsx +3 -6
  230. package/src/extensions/hashtag.tsx +2 -2
  231. package/src/extensions/index.ts +10 -1
  232. package/src/extensions/json.ts +1 -1
  233. package/src/extensions/listener.ts +14 -20
  234. package/src/extensions/markdown/bundle.ts +37 -6
  235. package/src/extensions/markdown/decorate.ts +26 -17
  236. package/src/extensions/markdown/formatting.ts +8 -10
  237. package/src/extensions/markdown/highlight.ts +1 -1
  238. package/src/extensions/markdown/image.ts +5 -6
  239. package/src/extensions/markdown/link.ts +3 -0
  240. package/src/extensions/markdown/table.ts +13 -7
  241. package/src/extensions/modal.ts +24 -0
  242. package/src/extensions/modes.ts +2 -2
  243. package/src/extensions/{command/floating-menu.ts → outliner/menu.ts} +16 -21
  244. package/src/extensions/outliner/outliner.test.ts +1 -1
  245. package/src/extensions/outliner/outliner.ts +5 -5
  246. package/src/extensions/outliner/tree.test.ts +1 -1
  247. package/src/extensions/outliner/tree.ts +1 -1
  248. package/src/extensions/preview/index.ts +1 -1
  249. package/src/extensions/preview/preview.ts +69 -69
  250. package/src/extensions/replacer.test.ts +75 -0
  251. package/src/extensions/replacer.ts +93 -0
  252. package/src/extensions/scrolling.ts +189 -0
  253. package/src/extensions/selection.ts +3 -3
  254. package/src/extensions/state.ts +7 -0
  255. package/src/extensions/submit.ts +62 -0
  256. package/src/extensions/tab.ts +29 -0
  257. package/src/extensions/tags/extended-markdown.test.ts +262 -0
  258. package/src/extensions/tags/extended-markdown.ts +78 -0
  259. package/src/extensions/tags/index.ts +7 -0
  260. package/src/extensions/tags/streamer.ts +243 -0
  261. package/src/extensions/tags/xml-tags.ts +500 -0
  262. package/src/extensions/tags/xml-util.ts +94 -0
  263. package/src/extensions/typewriter.ts +1 -1
  264. package/src/hooks/useTextEditor.ts +31 -43
  265. package/src/stories/CommandDialog.stories.tsx +83 -0
  266. package/src/stories/Comments.stories.tsx +8 -9
  267. package/src/stories/EditorToolbar.stories.tsx +15 -14
  268. package/src/stories/Experimental.stories.tsx +7 -7
  269. package/src/stories/Markdown.stories.tsx +6 -6
  270. package/src/stories/Outliner.stories.tsx +40 -32
  271. package/src/stories/Popover.stories.tsx +162 -0
  272. package/src/stories/Preview.stories.tsx +46 -43
  273. package/src/stories/Tags.stories.tsx +95 -0
  274. package/src/stories/TextEditor.stories.tsx +10 -33
  275. package/src/stories/components/EditorStory.tsx +30 -17
  276. package/src/stories/components/util.tsx +40 -8
  277. package/src/styles/markdown.ts +1 -1
  278. package/src/styles/theme.ts +13 -11
  279. package/src/types/types.ts +1 -1
  280. package/src/util/debug.ts +7 -2
  281. package/src/util/decorations.ts +21 -0
  282. package/src/util/dom.ts +5 -27
  283. package/src/util/index.ts +1 -0
  284. package/src/util/react.tsx +1 -1
  285. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
  286. package/dist/lib/browser/testing/index.mjs +0 -6
  287. package/dist/lib/browser/testing/index.mjs.map +0 -7
  288. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  289. package/dist/lib/node-esm/testing/index.mjs +0 -8
  290. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  291. package/dist/types/src/components/EditorToolbar/lists.d.ts +0 -19
  292. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +0 -1
  293. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -51
  294. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  295. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  296. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  297. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  298. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  299. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  300. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  301. package/dist/types/src/components/Popover/index.d.ts +0 -4
  302. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  303. package/dist/types/src/extensions/autocomplete.d.ts +0 -13
  304. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  305. package/dist/types/src/extensions/command/action.d.ts +0 -17
  306. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  307. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  308. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  309. package/dist/types/src/extensions/command/command.d.ts +0 -6
  310. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  311. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  312. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  313. package/dist/types/src/extensions/command/hint.d.ts +0 -24
  314. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  315. package/dist/types/src/extensions/command/index.d.ts +0 -7
  316. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  317. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  318. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  319. package/dist/types/src/extensions/command/state.d.ts +0 -16
  320. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  321. package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
  322. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  323. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  324. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  325. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  326. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  327. package/dist/types/src/testing/index.d.ts +0 -2
  328. package/dist/types/src/testing/index.d.ts.map +0 -1
  329. package/dist/types/src/testing/util.d.ts +0 -3
  330. package/dist/types/src/testing/util.d.ts.map +0 -1
  331. package/src/components/EditorToolbar/util.ts +0 -76
  332. package/src/components/Popover/CommandMenu.tsx +0 -279
  333. package/src/components/Popover/RefDropdownMenu.tsx +0 -85
  334. package/src/components/Popover/RefPopover.tsx +0 -99
  335. package/src/components/Popover/index.ts +0 -7
  336. package/src/extensions/autocomplete.ts +0 -69
  337. package/src/extensions/command/action.ts +0 -56
  338. package/src/extensions/command/command-menu.ts +0 -211
  339. package/src/extensions/command/command.ts +0 -34
  340. package/src/extensions/command/hint.ts +0 -103
  341. package/src/extensions/command/index.ts +0 -10
  342. package/src/extensions/command/state.ts +0 -90
  343. package/src/extensions/command/useCommandMenu.ts +0 -119
  344. package/src/stories/Command.stories.tsx +0 -101
  345. package/src/stories/CommandMenu.stories.tsx +0 -161
  346. package/src/testing/index.ts +0 -5
  347. package/src/testing/util.ts +0 -7
@@ -0,0 +1,162 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useCallback, useState } from 'react';
7
+
8
+ import { Obj, Query } from '@dxos/echo';
9
+ import { faker } from '@dxos/random';
10
+ import { useClientProvider, withClientProvider } from '@dxos/react-client/testing';
11
+ import { Domino } from '@dxos/react-ui';
12
+ import { withTheme } from '@dxos/react-ui/testing';
13
+ import { Testing, type ValueGenerator, createObjectFactory } from '@dxos/schema/testing';
14
+
15
+ import {
16
+ type EditorController,
17
+ type EditorMenuGroup,
18
+ type EditorMenuItem,
19
+ EditorMenuProvider,
20
+ type UseEditorMenuProps,
21
+ createMenuGroup,
22
+ filterMenuGroups,
23
+ formattingCommands,
24
+ insertAtCursor,
25
+ insertAtLineStart,
26
+ linkSlashCommands,
27
+ useEditorMenu,
28
+ } from '../components';
29
+ import { str } from '../util';
30
+
31
+ import { EditorStory } from './components';
32
+
33
+ const generator: ValueGenerator = faker as any;
34
+
35
+ const customCompletions: EditorMenuGroup = createMenuGroup({
36
+ id: 'test',
37
+ items: ['Hello world!', 'Hello DXOS', 'Hello Composer', 'https://dxos.org'],
38
+ });
39
+
40
+ const placeholder = (trigger: string[]) =>
41
+ Domino.of('div')
42
+ .children(
43
+ Domino.of('span').text('Press'),
44
+ ...trigger.map((trigger) =>
45
+ Domino.of('span').text(trigger).classNames('border border-separator rounded-sm mx-1 pli-1 pbs-[2px] pbe-[3px]'),
46
+ ),
47
+ Domino.of('span').text('for commands'),
48
+ )
49
+ .build();
50
+
51
+ type StoryProps = Omit<UseEditorMenuProps, 'viewRef'> & { text: string };
52
+
53
+ const DefaultStory = ({ text, ...props }: StoryProps) => {
54
+ const [controller, setController] = useState<EditorController | null>(null);
55
+ const { groupsRef, extension, ...menuProps } = useEditorMenu(props);
56
+
57
+ return (
58
+ <EditorMenuProvider view={controller?.view} groups={groupsRef.current} {...menuProps}>
59
+ <EditorStory ref={setController} text={text} extensions={extension} />
60
+ </EditorMenuProvider>
61
+ );
62
+ };
63
+
64
+ const LinkStory = (args: StoryProps) => {
65
+ const { space } = useClientProvider();
66
+
67
+ const getMenu = useCallback<NonNullable<UseEditorMenuProps['getMenu']>>(
68
+ async ({ text, trigger }): Promise<EditorMenuGroup[]> => {
69
+ if (trigger === '/') {
70
+ return filterMenuGroups([linkSlashCommands], (item) =>
71
+ text ? (item.label as string).toLowerCase().includes(text.toLowerCase()) : true,
72
+ );
73
+ }
74
+
75
+ if (!space) {
76
+ return [];
77
+ }
78
+
79
+ const name = text?.startsWith('@') ? text.slice(1).toLowerCase() : (text?.toLowerCase() ?? '');
80
+ const result = await space?.db.query(Query.type(Testing.Person)).run();
81
+ const items = result.objects
82
+ .filter((object) => object.name.toLowerCase().includes(name))
83
+ .map(
84
+ (object): EditorMenuItem => ({
85
+ id: object.id,
86
+ label: object.name,
87
+ icon: 'ph--user--regular',
88
+ onSelect: ({ view, head }) => {
89
+ const link = `[${object.name}](${Obj.getDXN(object)})`;
90
+ if (text?.startsWith('@')) {
91
+ insertAtLineStart(view, head, `!${link}\n`);
92
+ } else {
93
+ insertAtCursor(view, head, `${link} `);
94
+ }
95
+ },
96
+ }),
97
+ );
98
+
99
+ return [{ id: 'test', items }];
100
+ },
101
+ [space],
102
+ );
103
+
104
+ return <DefaultStory {...args} getMenu={getMenu} />;
105
+ };
106
+
107
+ const meta = {
108
+ title: 'ui/react-ui-editor/Popover',
109
+ render: DefaultStory,
110
+ decorators: [withTheme],
111
+ parameters: {
112
+ layout: 'fullscreen',
113
+ },
114
+ } satisfies Meta<typeof DefaultStory>;
115
+
116
+ export default meta;
117
+
118
+ type Story = StoryObj<typeof meta>;
119
+
120
+ export const Default: Story = {
121
+ args: {
122
+ text: str('# Autocomplete', '', ''),
123
+ triggerKey: 'Ctrl-Space',
124
+ filter: true,
125
+ getMenu: () => [customCompletions],
126
+ },
127
+ };
128
+
129
+ export const Formatting: Story = {
130
+ args: {
131
+ text: str('# Slash command', '', ''),
132
+ trigger: '/',
133
+ placeholder: {
134
+ content: () => placeholder(['/']),
135
+ },
136
+ getMenu: () => [formattingCommands],
137
+ },
138
+ };
139
+
140
+ export const Link: Story = {
141
+ render: LinkStory,
142
+ decorators: [
143
+ withClientProvider({
144
+ createSpace: true,
145
+ onInitialized: async (client) => {
146
+ client.addTypes([Testing.Person]);
147
+ },
148
+ onCreateSpace: async ({ space }) => {
149
+ const createObjects = createObjectFactory(space.db, generator);
150
+ await createObjects([{ type: Testing.Person, count: 10 }]);
151
+ await space.db.flush({ indexes: true });
152
+ },
153
+ }),
154
+ ],
155
+ args: {
156
+ text: str('# Links', '', ''),
157
+ trigger: ['/', '@'],
158
+ placeholder: {
159
+ content: () => placeholder(['/', '@']),
160
+ },
161
+ },
162
+ };
@@ -2,8 +2,6 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { syntaxTree } from '@codemirror/language';
8
6
  import { type EditorView } from '@codemirror/view';
9
7
  import { type Meta, type StoryObj } from '@storybook/react-vite';
@@ -13,13 +11,20 @@ import { createPortal } from 'react-dom';
13
11
  import { invariant } from '@dxos/invariant';
14
12
  import { faker } from '@dxos/random';
15
13
  import { Popover } from '@dxos/react-ui';
14
+ import { withTheme } from '@dxos/react-ui/testing';
16
15
  import { Card } from '@dxos/react-ui-stack';
17
16
  import { hoverableControlItem, hoverableControlItemTransition, hoverableControls } from '@dxos/react-ui-theme';
18
- import { withLayout, withTheme } from '@dxos/storybook-utils';
19
17
  import { trim } from '@dxos/util';
20
18
 
21
- import { PreviewProvider, useRefPopover } from '../components';
22
- import { type PreviewLinkRef, type PreviewLinkTarget, getLinkRef, image, preview } from '../extensions';
19
+ import { type EditorController, EditorPreviewProvider, useEditorPreview } from '../components';
20
+ import {
21
+ type PreviewBlock,
22
+ type PreviewLinkRef,
23
+ type PreviewLinkTarget,
24
+ getLinkRef,
25
+ image,
26
+ preview,
27
+ } from '../extensions';
23
28
 
24
29
  import { EditorStory } from './components';
25
30
 
@@ -45,7 +50,7 @@ const useRefTarget = (link: PreviewLinkRef): PreviewLinkTarget | undefined => {
45
50
  };
46
51
 
47
52
  const PreviewCard = () => {
48
- const { target } = useRefPopover('PreviewCard');
53
+ const { target } = useEditorPreview('PreviewCard');
49
54
  return (
50
55
  <Popover.Portal>
51
56
  <Popover.Content onOpenAutoFocus={(event) => event.preventDefault()}>
@@ -72,7 +77,7 @@ type PreviewAction =
72
77
  link: PreviewLinkRef;
73
78
  };
74
79
 
75
- const PreviewBlock = ({ link, el, view }: { link: PreviewLinkRef; el: HTMLElement; view?: EditorView }) => {
80
+ const PreviewBlockComponent = ({ link, el, view }: { link: PreviewLinkRef; el: HTMLElement; view?: EditorView }) => {
76
81
  const target = useRefTarget(link);
77
82
 
78
83
  const handleAction = useCallback(
@@ -169,62 +174,60 @@ const PreviewBlock = ({ link, el, view }: { link: PreviewLinkRef; el: HTMLElemen
169
174
  const meta = {
170
175
  title: 'ui/react-ui-editor/Preview',
171
176
  component: EditorStory,
172
- decorators: [withTheme, withLayout({ fullscreen: true })],
173
- parameters: { layout: 'fullscreen' },
177
+ decorators: [withTheme],
178
+ parameters: {
179
+ layout: 'fullscreen',
180
+ },
174
181
  } satisfies Meta<typeof EditorStory>;
175
182
 
176
183
  export default meta;
177
184
 
178
185
  type Story = StoryObj<typeof meta>;
179
186
 
187
+ const text = trim`
188
+ # Preview
189
+
190
+ This project is part of the [DXOS](dxn:queue:data:123) SDK.
191
+
192
+ ![DXOS](dxn:queue:data:123)
193
+
194
+ It consists of [ECHO](dxn:queue:data:echo), [HALO](dxn:queue:data:halo), and [MESH](dxn:queue:data:mesh).
195
+
196
+ ## Deep dive
197
+
198
+ ![ECHO](dxn:queue:data:echo)
199
+
200
+ `;
201
+
180
202
  export const Default: Story = {
181
203
  render: () => {
182
- const [view, setView] = useState<EditorView>();
183
- const [previewBlocks, setPreviewBlocks] = useState<{ link: PreviewLinkRef; el: HTMLElement }[]>([]);
184
-
204
+ const [controller, setController] = useState<EditorController | null>(null);
205
+ const [previewBlocks, setPreviewBlocks] = useState<PreviewBlock[]>([]);
185
206
  const extensions = useMemo(() => {
186
207
  return [
187
208
  image(),
188
209
  preview({
189
- addBlockContainer: (link, el) => {
190
- setPreviewBlocks((prev) => [...prev, { link, el }]);
210
+ addBlockContainer: (block) => {
211
+ setPreviewBlocks((prev) => [...prev, block]);
191
212
  },
192
- removeBlockContainer: (link) => {
193
- setPreviewBlocks((prev) => prev.filter(({ link: prevLink }) => prevLink.ref !== link.ref));
213
+ removeBlockContainer: (block) => {
214
+ setPreviewBlocks((prev) => prev.filter(({ link: prevLink }) => prevLink.ref !== block.link.ref));
194
215
  },
195
216
  }),
196
217
  ];
197
218
  }, []);
198
219
 
199
- const handleViewRef = useCallback((instance?: EditorView | null) => {
200
- setView(instance ?? undefined);
201
- }, []);
202
-
220
+ // TODO(burdon): Migrate to Editor.Root.
221
+ // TODO(burdon): Ranges must be sorted error (decorate.enter).
203
222
  return (
204
- <PreviewProvider onLookup={handlePreviewLookup}>
205
- <EditorStory
206
- ref={handleViewRef}
207
- text={trim`
208
- # Preview
209
-
210
- This project is part of the [DXOS][dxn:queue:data:123] SDK.
211
-
212
- ![DXOS][?dxn:queue:data:123]
213
-
214
- It consists of [ECHO][dxn:queue:data:echo], [HALO][dxn:queue:data:halo], and [MESH][dxn:queue:data:mesh].
215
-
216
- ## Deep dive
217
-
218
- ![ECHO][dxn:queue:data:echo]
219
-
220
- `}
221
- extensions={extensions}
222
- />
223
+ <EditorPreviewProvider onLookup={handlePreviewLookup}>
224
+ <EditorStory ref={setController} text={text} extensions={extensions} />
223
225
  <PreviewCard />
224
- {previewBlocks.map(({ link, el }) => (
225
- <PreviewBlock key={link.ref} link={link} el={el} view={view} />
226
- ))}
227
- </PreviewProvider>
226
+ {controller?.view &&
227
+ previewBlocks.map(({ link, el }) => (
228
+ <PreviewBlockComponent key={link.ref} link={link} el={el} view={controller.view!} />
229
+ ))}
230
+ </EditorPreviewProvider>
228
231
  );
229
232
  },
230
233
  };
@@ -0,0 +1,95 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useEffect, useState } from 'react';
7
+ import { createPortal } from 'react-dom';
8
+
9
+ import { useThemeContext } from '@dxos/react-ui';
10
+ import { withTheme } from '@dxos/react-ui/testing';
11
+ import { trim } from '@dxos/util';
12
+
13
+ import {
14
+ type XmlWidgetRegistry,
15
+ type XmlWidgetState,
16
+ createBasicExtensions,
17
+ createThemeExtensions,
18
+ decorateMarkdown,
19
+ extendedMarkdown,
20
+ xmlTags,
21
+ } from '../extensions';
22
+ import { useTextEditor } from '../hooks';
23
+
24
+ const registry = {
25
+ /**
26
+ * Custom tag: <test/>
27
+ */
28
+ ['test' as const]: {
29
+ block: true,
30
+ Component: () => {
31
+ const [count, setCount] = useState(0);
32
+ useEffect(() => {
33
+ const interval = setInterval(() => {
34
+ setCount((prev) => prev + 1);
35
+ }, 1_000);
36
+ return () => clearInterval(interval);
37
+ }, []);
38
+
39
+ return <div className='p-2 border border-separator rounded'>Test {count}</div>;
40
+ },
41
+ },
42
+ } satisfies XmlWidgetRegistry;
43
+
44
+ const DefaultStory = ({ text }: { text?: string }) => {
45
+ const { themeMode } = useThemeContext();
46
+ const [widgets, setWidgets] = useState<XmlWidgetState[]>([]);
47
+ const { parentRef } = useTextEditor({
48
+ initialValue: text,
49
+ extensions: [
50
+ createThemeExtensions({ themeMode }),
51
+ createBasicExtensions({ lineWrapping: true }),
52
+ decorateMarkdown(),
53
+ extendedMarkdown({ registry }),
54
+ xmlTags({ registry, setWidgets }),
55
+ ],
56
+ });
57
+
58
+ return (
59
+ <>
60
+ <div ref={parentRef} className='is-full p-4' />
61
+ {widgets.map(({ Component, root, id, ...props }) => (
62
+ <div key={id}>{createPortal(<Component {...props} />, root)}</div>
63
+ ))}
64
+ </>
65
+ );
66
+ };
67
+
68
+ const text = trim`
69
+ # Tags
70
+
71
+ React widget below.
72
+
73
+ <test id="123" />
74
+
75
+ React widget above.
76
+ `;
77
+
78
+ const meta = {
79
+ title: 'ui/react-ui-editor/XmlTags',
80
+ render: DefaultStory,
81
+ decorators: [withTheme],
82
+ parameters: {
83
+ layout: 'fullscreen',
84
+ },
85
+ } satisfies Meta<typeof DefaultStory>;
86
+
87
+ export default meta;
88
+
89
+ type Story = StoryObj<typeof meta>;
90
+
91
+ export const Default: Story = {
92
+ args: {
93
+ text,
94
+ },
95
+ };
@@ -2,20 +2,17 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { javascript } from '@codemirror/lang-javascript';
8
6
  import { openSearchPanel } from '@codemirror/search';
9
7
  import { type Meta, type StoryObj } from '@storybook/react-vite';
10
8
  import React from 'react';
11
9
 
12
10
  import { log } from '@dxos/log';
13
- import { withLayout, withTheme } from '@dxos/storybook-utils';
11
+ import { withTheme } from '@dxos/react-ui/testing';
14
12
 
15
13
  import { editorMonospace } from '../defaults';
16
14
  import {
17
15
  InputModeExtensions,
18
- autocomplete,
19
16
  decorateMarkdown,
20
17
  folding,
21
18
  image,
@@ -25,7 +22,7 @@ import {
25
22
  staticCompletion,
26
23
  typeahead,
27
24
  } from '../extensions';
28
- import { str } from '../testing';
25
+ import { str } from '../util';
29
26
 
30
27
  import {
31
28
  EditorStory,
@@ -34,18 +31,19 @@ import {
34
31
  defaultExtensions,
35
32
  global,
36
33
  largeWithImages,
37
- links,
38
34
  longText,
39
35
  names,
40
- renderLinkButton,
41
36
  text,
42
37
  } from './components';
43
38
 
44
39
  const meta = {
45
40
  title: 'ui/react-ui-editor/TextEditor',
46
41
  component: EditorStory,
47
- decorators: [withTheme, withLayout({ fullscreen: true })],
48
- parameters: { layout: 'fullscreen', controls: { disable: true } },
42
+ decorators: [withTheme],
43
+ parameters: {
44
+ layout: 'fullscreen',
45
+ controls: { disable: true },
46
+ },
49
47
  } satisfies Meta<typeof EditorStory>;
50
48
 
51
49
  export default meta;
@@ -115,10 +113,10 @@ export const Listener: Story = {
115
113
  text={str('# Listener', '', content.footer)}
116
114
  extensions={[
117
115
  listener({
118
- onFocus: (focusing) => {
116
+ onFocus: ({ focusing }) => {
119
117
  log.info('listener', { focusing });
120
118
  },
121
- onChange: (text) => {
119
+ onChange: ({ text }) => {
122
120
  log.info('listener', { text });
123
121
  },
124
122
  }),
@@ -188,38 +186,17 @@ export const Typescript: Story = {
188
186
  ),
189
187
  };
190
188
 
191
- //
192
- // Autocomplete
193
- //
194
-
195
- export const Autocomplete: Story = {
196
- render: () => (
197
- <EditorStory
198
- text={str('# Autocomplete', '', 'Press Ctrl-Space...', content.footer)}
199
- extensions={[
200
- decorateMarkdown({ renderLinkButton }),
201
- autocomplete({
202
- onSearch: (text) => {
203
- return links.filter(({ label }) => label.toLowerCase().includes(text.toLowerCase()));
204
- },
205
- }),
206
- ]}
207
- />
208
- ),
209
- };
210
-
211
189
  //
212
190
  // Typeahead
213
191
  //
214
192
 
215
- const completions = ['type', 'AND', 'OR', 'NOT', 'dxos.org'];
193
+ const completions = ['hello world!', 'dxos.org'];
216
194
 
217
195
  export const Typeahead: Story = {
218
196
  render: () => (
219
197
  <EditorStory
220
198
  text={str('# Typeahead', '')}
221
199
  extensions={[
222
- decorateMarkdown({ renderLinkButton }),
223
200
  typeahead({
224
201
  onComplete: staticCompletion(completions, { minLength: 2 }),
225
202
  }),
@@ -3,19 +3,21 @@
3
3
  //
4
4
 
5
5
  import { type EditorView } from '@codemirror/view';
6
- import React, { type ReactNode, forwardRef, useEffect, useImperativeHandle, useMemo, useState } from 'react';
6
+ import React, { type ReactNode, forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
7
7
 
8
- import { Expando } from '@dxos/echo-schema';
8
+ import { createDocAccessor, createObject } from '@dxos/client/echo';
9
+ import { Expando } from '@dxos/echo/internal';
10
+ import { live } from '@dxos/echo/internal';
9
11
  import { invariant } from '@dxos/invariant';
10
12
  import { PublicKey } from '@dxos/keys';
11
- import { live } from '@dxos/live-object';
12
- import { createDocAccessor, createObject } from '@dxos/react-client/echo';
13
- import { useForwardedRef, useThemeContext } from '@dxos/react-ui';
13
+ import { log } from '@dxos/log';
14
+ import { useMergeRefs, useThemeContext } from '@dxos/react-ui';
14
15
  import { useAttentionAttributes } from '@dxos/react-ui-attention';
15
16
  import { JsonFilter } from '@dxos/react-ui-syntax-highlighter';
16
17
  import { mx } from '@dxos/react-ui-theme';
17
18
  import { isNonNullable } from '@dxos/util';
18
19
 
20
+ import { type EditorController, createEditorController } from '../../components';
19
21
  import { editorGutter, editorSlots } from '../../defaults';
20
22
  import {
21
23
  type DebugNode,
@@ -25,6 +27,7 @@ import {
25
27
  createMarkdownExtensions,
26
28
  createThemeExtensions,
27
29
  debugTree,
30
+ decorateMarkdown,
28
31
  } from '../../extensions';
29
32
  import { type UseTextEditorProps, useTextEditor } from '../../hooks';
30
33
 
@@ -45,25 +48,28 @@ export type StoryProps = Pick<UseTextEditorProps, 'id' | 'scrollTo' | 'selection
45
48
  onReady?: (view: EditorView) => void;
46
49
  };
47
50
 
48
- export const EditorStory = forwardRef<EditorView | undefined, StoryProps>(
49
- ({ debug, debugCustom, text, extensions: _extensions, ...props }, forwardedRef) => {
51
+ export const EditorStory = forwardRef<EditorController, StoryProps>(
52
+ ({ debug, debugCustom, text, extensions: extensionsParam, ...props }, forwardedRef) => {
53
+ const controllerRef = useRef<EditorController>(null);
54
+ const mergedRef = useMergeRefs([controllerRef, forwardedRef]);
55
+
50
56
  const attentionAttrs = useAttentionAttributes('test-panel');
51
57
  const [tree, setTree] = useState<DebugNode>();
52
58
  const [object] = useState(createObject(live(Expando, { content: text ?? '' })));
53
- const viewRef = useForwardedRef(forwardedRef);
59
+
54
60
  const extensions = useMemo(
55
- () => (debug ? [_extensions, debugTree(setTree)].filter(isNonNullable) : _extensions),
56
- [debug, _extensions],
61
+ () => (debug ? [extensionsParam, debugTree(setTree)].filter(isNonNullable) : extensionsParam),
62
+ [debug, extensionsParam],
57
63
  );
58
64
 
59
- const view = viewRef.current;
65
+ const view = controllerRef.current?.view;
60
66
  return (
61
- <div className={mx('w-full h-full grid overflow-hidden', debug && 'grid-cols-2 lg:grid-cols-[1fr_600px]')}>
62
- <EditorComponent ref={viewRef} object={object} text={text} extensions={extensions} {...props} />
67
+ <div className={mx('is-full bs-full grid overflow-hidden', debug && 'grid-cols-2 lg:grid-cols-[1fr_600px]')}>
68
+ <EditorComponent ref={mergedRef} object={object} text={text} extensions={extensions} {...props} />
63
69
 
64
70
  {debug && (
65
71
  <div
66
- className='grid h-full auto-rows-fr border-l border-separator divide-y divide-separator overflow-hidden'
72
+ className='grid bs-full auto-rows-fr border-l border-separator divide-y divide-separator overflow-hidden'
67
73
  {...attentionAttrs}
68
74
  >
69
75
  {view && debugCustom?.(view)}
@@ -82,8 +88,10 @@ export const EditorStory = forwardRef<EditorView | undefined, StoryProps>(
82
88
 
83
89
  /**
84
90
  * Default story component.
91
+ * @deprecated
85
92
  */
86
- export const EditorComponent = forwardRef<EditorView | undefined, StoryProps>(
93
+ // TODO(burdon): Replace with <Editor.Root>
94
+ export const EditorComponent = forwardRef<EditorController, StoryProps>(
87
95
  (
88
96
  {
89
97
  id = defaultId,
@@ -112,8 +120,9 @@ export const EditorComponent = forwardRef<EditorView | undefined, StoryProps>(
112
120
  extensions: [
113
121
  createDataExtensions({ id, text: createDocAccessor(object, ['content']) }),
114
122
  createBasicExtensions({ readOnly, placeholder, lineNumbers, scrollPastEnd: true, search: true }),
115
- createMarkdownExtensions({ themeMode }),
123
+ createMarkdownExtensions(),
116
124
  createThemeExtensions({ themeMode, syntaxHighlighting: true, slots }),
125
+ decorateMarkdown(),
117
126
  editorGutter,
118
127
  extensions || [],
119
128
  ],
@@ -121,7 +130,11 @@ export const EditorComponent = forwardRef<EditorView | undefined, StoryProps>(
121
130
  [id, object, extensions, themeMode],
122
131
  );
123
132
 
124
- useImperativeHandle(forwardedRef, () => view, [view]);
133
+ // External controller.
134
+ useImperativeHandle(forwardedRef, () => {
135
+ log.info('view updated', { id });
136
+ return createEditorController(view);
137
+ }, [id, view]);
125
138
 
126
139
  useEffect(() => {
127
140
  if (view) {