@dxos/react-ui-editor 0.8.4-main.dedc0f3 → 0.8.4-main.e8ec1fe

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 (317) 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 +5638 -5200
  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 +5638 -5200
  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 +14 -4
  82. package/dist/types/src/extensions/autoscroll.d.ts.map +1 -1
  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 +10 -5
  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 +8 -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.map +1 -1
  101. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  102. package/dist/types/src/extensions/markdown/formatting.d.ts +1 -3
  103. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  104. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  105. package/dist/types/src/extensions/modal.d.ts +7 -0
  106. package/dist/types/src/extensions/modal.d.ts.map +1 -0
  107. package/dist/types/src/extensions/modes.d.ts +1 -1
  108. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  109. package/dist/types/src/extensions/outliner/menu.d.ts +8 -0
  110. package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -0
  111. package/dist/types/src/extensions/preview/preview.d.ts +6 -4
  112. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  113. package/dist/types/src/extensions/replacer.d.ts +21 -0
  114. package/dist/types/src/extensions/replacer.d.ts.map +1 -0
  115. package/dist/types/src/extensions/replacer.test.d.ts +2 -0
  116. package/dist/types/src/extensions/replacer.test.d.ts.map +1 -0
  117. package/dist/types/src/extensions/scrolling.d.ts +78 -0
  118. package/dist/types/src/extensions/scrolling.d.ts.map +1 -0
  119. package/dist/types/src/extensions/state.d.ts +2 -0
  120. package/dist/types/src/extensions/state.d.ts.map +1 -0
  121. package/dist/types/src/extensions/submit.d.ts +10 -0
  122. package/dist/types/src/extensions/submit.d.ts.map +1 -0
  123. package/dist/types/src/extensions/tab.d.ts +4 -0
  124. package/dist/types/src/extensions/tab.d.ts.map +1 -0
  125. package/dist/types/src/extensions/tags/streamer.d.ts.map +1 -1
  126. package/dist/types/src/extensions/tags/xml-tags.d.ts +42 -16
  127. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -1
  128. package/dist/types/src/hooks/useTextEditor.d.ts +5 -9
  129. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  130. package/dist/types/src/stories/{Command.stories.d.ts → CommandDialog.stories.d.ts} +2 -3
  131. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
  132. package/dist/types/src/stories/Comments.stories.d.ts +3 -4
  133. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  134. package/dist/types/src/stories/EditorToolbar.stories.d.ts +1 -2
  135. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  136. package/dist/types/src/stories/Experimental.stories.d.ts +3 -4
  137. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  138. package/dist/types/src/stories/Markdown.stories.d.ts +3 -4
  139. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  140. package/dist/types/src/stories/Outliner.stories.d.ts +0 -1
  141. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  142. package/dist/types/src/stories/{CommandMenu.stories.d.ts → Popover.stories.d.ts} +6 -6
  143. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  144. package/dist/types/src/stories/Preview.stories.d.ts +4 -4
  145. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  146. package/dist/types/src/stories/Tags.stories.d.ts +0 -1
  147. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -1
  148. package/dist/types/src/stories/TextEditor.stories.d.ts +3 -5
  149. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  150. package/dist/types/src/stories/components/EditorStory.d.ts +7 -5
  151. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  152. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  153. package/dist/types/src/styles/theme.d.ts.map +1 -1
  154. package/dist/types/src/types/types.d.ts +1 -1
  155. package/dist/types/src/types/types.d.ts.map +1 -1
  156. package/dist/types/src/util/debug.d.ts +4 -0
  157. package/dist/types/src/util/debug.d.ts.map +1 -1
  158. package/dist/types/src/util/index.d.ts +0 -1
  159. package/dist/types/src/util/index.d.ts.map +1 -1
  160. package/dist/types/tsconfig.tsbuildinfo +1 -1
  161. package/package.json +58 -59
  162. package/src/components/Editor/Editor.stories.tsx +89 -0
  163. package/src/components/Editor/Editor.tsx +160 -25
  164. package/src/components/EditorContent/EditorContent.stories.tsx +70 -0
  165. package/src/components/EditorContent/EditorContent.tsx +70 -0
  166. package/src/components/EditorContent/controller.ts +50 -0
  167. package/src/components/EditorContent/index.ts +6 -0
  168. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +233 -0
  169. package/src/components/EditorMenuProvider/index.ts +11 -0
  170. package/src/components/EditorMenuProvider/menu-presets.ts +123 -0
  171. package/src/components/EditorMenuProvider/menu.ts +71 -0
  172. package/src/components/EditorMenuProvider/popover.ts +287 -0
  173. package/src/components/EditorMenuProvider/useEditorMenu.ts +175 -0
  174. package/src/components/EditorMenuProvider/util.ts +31 -0
  175. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +82 -0
  176. package/src/components/EditorPreviewProvider/index.ts +5 -0
  177. package/src/components/EditorToolbar/EditorToolbar.tsx +101 -91
  178. package/src/components/EditorToolbar/{lists.ts → actions.ts} +46 -16
  179. package/src/components/EditorToolbar/blocks.ts +2 -1
  180. package/src/components/EditorToolbar/formatting.ts +2 -1
  181. package/src/components/EditorToolbar/headings.ts +8 -5
  182. package/src/components/EditorToolbar/image.ts +1 -1
  183. package/src/components/EditorToolbar/index.ts +3 -7
  184. package/src/components/EditorToolbar/search.ts +1 -1
  185. package/src/components/EditorToolbar/useEditorToolbar.ts +20 -0
  186. package/src/components/EditorToolbar/view-mode.ts +2 -1
  187. package/src/components/index.ts +8 -2
  188. package/src/extensions/{autocomplete.ts → autocomplete/autocomplete.ts} +8 -76
  189. package/src/extensions/autocomplete/index.ts +8 -0
  190. package/src/extensions/autocomplete/match.ts +46 -0
  191. package/src/extensions/{command → autocomplete}/placeholder.ts +21 -17
  192. package/src/extensions/{command → autocomplete}/typeahead.ts +6 -48
  193. package/src/extensions/automerge/automerge.stories.tsx +9 -9
  194. package/src/extensions/automerge/automerge.ts +28 -9
  195. package/src/extensions/automerge/cursor.ts +1 -1
  196. package/src/extensions/automerge/sync.ts +8 -4
  197. package/src/extensions/automerge/update-automerge.ts +1 -1
  198. package/src/extensions/autoscroll.ts +98 -86
  199. package/src/extensions/awareness/awareness-provider.ts +2 -2
  200. package/src/extensions/blocks.ts +131 -0
  201. package/src/extensions/bookmarks.ts +75 -0
  202. package/src/extensions/comments.ts +2 -1
  203. package/src/extensions/factories.ts +47 -16
  204. package/src/extensions/focus.ts +5 -4
  205. package/src/extensions/folding.tsx +3 -6
  206. package/src/extensions/hashtag.tsx +2 -2
  207. package/src/extensions/index.ts +8 -1
  208. package/src/extensions/json.ts +1 -1
  209. package/src/extensions/listener.ts +14 -20
  210. package/src/extensions/markdown/bundle.ts +16 -4
  211. package/src/extensions/markdown/decorate.ts +9 -8
  212. package/src/extensions/markdown/formatting.ts +8 -10
  213. package/src/extensions/markdown/highlight.ts +1 -1
  214. package/src/extensions/markdown/image.ts +2 -2
  215. package/src/extensions/markdown/link.ts +3 -0
  216. package/src/extensions/markdown/table.ts +6 -6
  217. package/src/extensions/modal.ts +24 -0
  218. package/src/extensions/modes.ts +2 -2
  219. package/src/extensions/{command/floating-menu.ts → outliner/menu.ts} +15 -20
  220. package/src/extensions/outliner/outliner.test.ts +1 -1
  221. package/src/extensions/outliner/outliner.ts +4 -4
  222. package/src/extensions/outliner/tree.test.ts +1 -1
  223. package/src/extensions/preview/index.ts +1 -1
  224. package/src/extensions/preview/preview.ts +14 -14
  225. package/src/extensions/replacer.test.ts +75 -0
  226. package/src/extensions/replacer.ts +93 -0
  227. package/src/extensions/scrolling.ts +189 -0
  228. package/src/extensions/selection.ts +3 -3
  229. package/src/extensions/state.ts +7 -0
  230. package/src/extensions/submit.ts +62 -0
  231. package/src/extensions/tab.ts +29 -0
  232. package/src/extensions/tags/extended-markdown.test.ts +2 -1
  233. package/src/extensions/tags/streamer.ts +4 -5
  234. package/src/extensions/tags/xml-tags.ts +320 -155
  235. package/src/extensions/typewriter.ts +1 -1
  236. package/src/hooks/useTextEditor.ts +31 -43
  237. package/src/stories/{Command.stories.tsx → CommandDialog.stories.tsx} +20 -27
  238. package/src/stories/Comments.stories.tsx +8 -9
  239. package/src/stories/EditorToolbar.stories.tsx +14 -13
  240. package/src/stories/Experimental.stories.tsx +7 -7
  241. package/src/stories/Markdown.stories.tsx +6 -6
  242. package/src/stories/Outliner.stories.tsx +40 -31
  243. package/src/stories/Popover.stories.tsx +162 -0
  244. package/src/stories/Preview.stories.tsx +46 -42
  245. package/src/stories/Tags.stories.tsx +24 -10
  246. package/src/stories/TextEditor.stories.tsx +10 -35
  247. package/src/stories/components/EditorStory.tsx +29 -16
  248. package/src/stories/components/util.tsx +40 -8
  249. package/src/styles/markdown.ts +1 -1
  250. package/src/styles/theme.ts +13 -11
  251. package/src/types/types.ts +1 -1
  252. package/src/util/debug.ts +5 -0
  253. package/src/util/index.ts +0 -1
  254. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
  255. package/dist/lib/browser/testing/index.mjs +0 -6
  256. package/dist/lib/browser/testing/index.mjs.map +0 -7
  257. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  258. package/dist/lib/node-esm/testing/index.mjs +0 -8
  259. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  260. package/dist/types/src/components/EditorToolbar/lists.d.ts +0 -19
  261. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +0 -1
  262. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -51
  263. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  264. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  265. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  266. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -14
  267. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  268. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -37
  269. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  270. package/dist/types/src/components/Popover/index.d.ts +0 -4
  271. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  272. package/dist/types/src/extensions/autocomplete.d.ts +0 -26
  273. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  274. package/dist/types/src/extensions/command/action.d.ts +0 -17
  275. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  276. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  277. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  278. package/dist/types/src/extensions/command/command.d.ts +0 -6
  279. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  280. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  281. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  282. package/dist/types/src/extensions/command/hint.d.ts +0 -19
  283. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  284. package/dist/types/src/extensions/command/index.d.ts +0 -7
  285. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  286. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  287. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  288. package/dist/types/src/extensions/command/state.d.ts +0 -16
  289. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  290. package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
  291. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  292. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  293. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  294. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  295. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  296. package/dist/types/src/testing/index.d.ts +0 -2
  297. package/dist/types/src/testing/index.d.ts.map +0 -1
  298. package/dist/types/src/testing/util.d.ts +0 -3
  299. package/dist/types/src/testing/util.d.ts.map +0 -1
  300. package/dist/types/src/util/domino.d.ts +0 -18
  301. package/dist/types/src/util/domino.d.ts.map +0 -1
  302. package/src/components/EditorToolbar/util.ts +0 -76
  303. package/src/components/Popover/CommandMenu.tsx +0 -279
  304. package/src/components/Popover/RefDropdownMenu.tsx +0 -89
  305. package/src/components/Popover/RefPopover.tsx +0 -117
  306. package/src/components/Popover/index.ts +0 -7
  307. package/src/extensions/command/action.ts +0 -56
  308. package/src/extensions/command/command-menu.ts +0 -211
  309. package/src/extensions/command/command.ts +0 -34
  310. package/src/extensions/command/hint.ts +0 -103
  311. package/src/extensions/command/index.ts +0 -10
  312. package/src/extensions/command/state.ts +0 -90
  313. package/src/extensions/command/useCommandMenu.ts +0 -119
  314. package/src/stories/CommandMenu.stories.tsx +0 -160
  315. package/src/testing/index.ts +0 -5
  316. package/src/testing/util.ts +0 -7
  317. package/src/util/domino.ts +0 -51
@@ -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,61 +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 }[]>([]);
204
+ const [controller, setController] = useState<EditorController | null>(null);
205
+ const [previewBlocks, setPreviewBlocks] = useState<PreviewBlock[]>([]);
184
206
  const extensions = useMemo(() => {
185
207
  return [
186
208
  image(),
187
209
  preview({
188
- addBlockContainer: (link, el) => {
189
- setPreviewBlocks((prev) => [...prev, { link, el }]);
210
+ addBlockContainer: (block) => {
211
+ setPreviewBlocks((prev) => [...prev, block]);
190
212
  },
191
- removeBlockContainer: (link) => {
192
- 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));
193
215
  },
194
216
  }),
195
217
  ];
196
218
  }, []);
197
219
 
198
- const handleViewRef = useCallback((instance?: EditorView | null) => {
199
- setView(instance ?? undefined);
200
- }, []);
201
-
220
+ // TODO(burdon): Migrate to Editor.Root.
221
+ // TODO(burdon): Ranges must be sorted error (decorate.enter).
202
222
  return (
203
- <PreviewProvider onLookup={handlePreviewLookup}>
204
- <EditorStory
205
- ref={handleViewRef}
206
- text={trim`
207
- # Preview
208
-
209
- This project is part of the [DXOS](dxn:queue:data:123) SDK.
210
-
211
- ![DXOS](dxn:queue:data:123)
212
-
213
- It consists of [ECHO](dxn:queue:data:echo), [HALO](dxn:queue:data:halo), and [MESH](dxn:queue:data:mesh).
214
-
215
- ## Deep dive
216
-
217
- ![ECHO](dxn:queue:data:echo)
218
-
219
- `}
220
- extensions={extensions}
221
- />
223
+ <EditorPreviewProvider onLookup={handlePreviewLookup}>
224
+ <EditorStory ref={setController} text={text} extensions={extensions} />
222
225
  <PreviewCard />
223
- {previewBlocks.map(({ link, el }) => (
224
- <PreviewBlock key={link.ref} link={link} el={el} view={view} />
225
- ))}
226
- </PreviewProvider>
226
+ {controller?.view &&
227
+ previewBlocks.map(({ link, el }) => (
228
+ <PreviewBlockComponent key={link.ref} link={link} el={el} view={controller.view!} />
229
+ ))}
230
+ </EditorPreviewProvider>
227
231
  );
228
232
  },
229
233
  };
@@ -2,14 +2,12 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
- import React, { useState } from 'react';
6
+ import React, { useEffect, useState } from 'react';
9
7
  import { createPortal } from 'react-dom';
10
8
 
11
9
  import { useThemeContext } from '@dxos/react-ui';
12
- import { withLayout, withTheme } from '@dxos/storybook-utils';
10
+ import { withTheme } from '@dxos/react-ui/testing';
13
11
  import { trim } from '@dxos/util';
14
12
 
15
13
  import {
@@ -24,10 +22,22 @@ import {
24
22
  import { useTextEditor } from '../hooks';
25
23
 
26
24
  const registry = {
27
- // <test/>
25
+ /**
26
+ * Custom tag: <test/>
27
+ */
28
28
  ['test' as const]: {
29
29
  block: true,
30
- Component: () => <div className='p-2 border border-separator rounded'>Test</div>,
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
+ },
31
41
  },
32
42
  } satisfies XmlWidgetRegistry;
33
43
 
@@ -38,7 +48,7 @@ const DefaultStory = ({ text }: { text?: string }) => {
38
48
  initialValue: text,
39
49
  extensions: [
40
50
  createThemeExtensions({ themeMode }),
41
- createBasicExtensions({ lineWrapping: true, readOnly: true }),
51
+ createBasicExtensions({ lineWrapping: true }),
42
52
  decorateMarkdown(),
43
53
  extendedMarkdown({ registry }),
44
54
  xmlTags({ registry, setWidgets }),
@@ -58,16 +68,20 @@ const DefaultStory = ({ text }: { text?: string }) => {
58
68
  const text = trim`
59
69
  # Tags
60
70
 
71
+ React widget below.
72
+
61
73
  <test id="123" />
62
74
 
63
75
  React widget above.
64
76
  `;
65
77
 
66
78
  const meta = {
67
- title: 'ui/react-ui-editor/Tags',
79
+ title: 'ui/react-ui-editor/XmlTags',
68
80
  render: DefaultStory,
69
- decorators: [withTheme, withLayout({ fullscreen: true })],
70
- parameters: { layout: 'fullscreen' },
81
+ decorators: [withTheme],
82
+ parameters: {
83
+ layout: 'fullscreen',
84
+ },
71
85
  } satisfies Meta<typeof DefaultStory>;
72
86
 
73
87
  export default meta;
@@ -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,40 +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
- onSuggest: (text) => {
203
- return links
204
- .filter(({ label }) => label.toLowerCase().includes(text.toLowerCase()))
205
- .map(({ label }) => label);
206
- },
207
- }),
208
- ]}
209
- />
210
- ),
211
- };
212
-
213
189
  //
214
190
  // Typeahead
215
191
  //
216
192
 
217
- const completions = ['type', 'AND', 'OR', 'NOT', 'dxos.org'];
193
+ const completions = ['hello world!', 'dxos.org'];
218
194
 
219
195
  export const Typeahead: Story = {
220
196
  render: () => (
221
197
  <EditorStory
222
198
  text={str('# Typeahead', '')}
223
199
  extensions={[
224
- decorateMarkdown({ renderLinkButton }),
225
200
  typeahead({
226
201
  onComplete: staticCompletion(completions, { minLength: 2 }),
227
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,
@@ -114,6 +122,7 @@ export const EditorComponent = forwardRef<EditorView | undefined, StoryProps>(
114
122
  createBasicExtensions({ readOnly, placeholder, lineNumbers, scrollPastEnd: true, search: true }),
115
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) {