@dxos/react-ui-editor 0.8.4-main.f9ba587 → 0.8.4-main.fcc0d83b33

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 (414) hide show
  1. package/dist/lib/browser/index.mjs +1407 -7549
  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 +1407 -7548
  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 +54 -15
  12. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  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/EditorMenuProvider/EditorMenuProvider.d.ts +34 -0
  20. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorMenuProvider/index.d.ts +6 -0
  22. package/dist/types/src/components/EditorMenuProvider/index.d.ts.map +1 -0
  23. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts +4 -0
  24. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -0
  25. package/dist/types/src/components/EditorMenuProvider/menu.d.ts +28 -0
  26. package/dist/types/src/components/EditorMenuProvider/menu.d.ts.map +1 -0
  27. package/dist/types/src/components/EditorMenuProvider/popover.d.ts +47 -0
  28. package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -0
  29. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts +34 -0
  30. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -0
  31. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +16 -0
  32. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -0
  33. package/dist/types/src/components/EditorPreviewProvider/index.d.ts +2 -0
  34. package/dist/types/src/components/EditorPreviewProvider/index.d.ts.map +1 -0
  35. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +28 -2
  36. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  37. package/dist/types/src/components/EditorToolbar/blocks.d.ts +4 -17
  38. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  39. package/dist/types/src/components/EditorToolbar/formatting.d.ts +4 -17
  40. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  41. package/dist/types/src/components/EditorToolbar/headings.d.ts +4 -17
  42. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  43. package/dist/types/src/components/EditorToolbar/image.d.ts +3 -15
  44. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  45. package/dist/types/src/components/EditorToolbar/index.d.ts +1 -1
  46. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  47. package/dist/types/src/components/EditorToolbar/lists.d.ts +4 -17
  48. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -1
  49. package/dist/types/src/components/EditorToolbar/search.d.ts +3 -15
  50. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  51. package/dist/types/src/components/EditorToolbar/types.d.ts +6 -0
  52. package/dist/types/src/components/EditorToolbar/types.d.ts.map +1 -0
  53. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +5 -18
  54. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  55. package/dist/types/src/components/index.d.ts +2 -2
  56. package/dist/types/src/components/index.d.ts.map +1 -1
  57. package/dist/types/src/extensions/Assistant.stories.d.ts +10 -0
  58. package/dist/types/src/extensions/Assistant.stories.d.ts.map +1 -0
  59. package/dist/types/src/extensions/assistant-extension.d.ts +24 -0
  60. package/dist/types/src/extensions/assistant-extension.d.ts.map +1 -0
  61. package/dist/types/src/extensions/index.d.ts +1 -22
  62. package/dist/types/src/extensions/index.d.ts.map +1 -1
  63. package/dist/types/src/hooks/index.d.ts +1 -0
  64. package/dist/types/src/hooks/index.d.ts.map +1 -1
  65. package/dist/types/src/hooks/useBasicMarkdownExtensions.d.ts +25 -0
  66. package/dist/types/src/hooks/useBasicMarkdownExtensions.d.ts.map +1 -0
  67. package/dist/types/src/hooks/useTextEditor.d.ts +6 -10
  68. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  69. package/dist/types/src/index.d.ts +0 -9
  70. package/dist/types/src/index.d.ts.map +1 -1
  71. package/dist/types/src/stories/Automerge.stories.d.ts +44 -0
  72. package/dist/types/src/stories/Automerge.stories.d.ts.map +1 -0
  73. package/dist/types/src/stories/Comments.stories.d.ts +22 -10
  74. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  75. package/dist/types/src/stories/EditorToolbar.stories.d.ts +42 -4
  76. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  77. package/dist/types/src/stories/Experimental.stories.d.ts +23 -13
  78. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  79. package/dist/types/src/stories/Markdown.stories.d.ts +33 -43
  80. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  81. package/dist/types/src/stories/Outliner.stories.d.ts +16 -22
  82. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  83. package/dist/types/src/stories/Popover.stories.d.ts +20 -0
  84. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  85. package/dist/types/src/stories/Preview.stories.d.ts +23 -7
  86. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  87. package/dist/types/src/stories/Tags.stories.d.ts +16 -0
  88. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  89. package/dist/types/src/stories/TextEditor.stories.d.ts +38 -52
  90. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  91. package/dist/types/src/stories/Theme.stories.d.ts +8 -0
  92. package/dist/types/src/stories/Theme.stories.d.ts.map +1 -0
  93. package/dist/types/src/stories/components/EditorStory.d.ts +11 -23
  94. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  95. package/dist/types/src/stories/components/util.d.ts +4 -3
  96. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  97. package/dist/types/src/translations.d.ts +26 -26
  98. package/dist/types/src/translations.d.ts.map +1 -1
  99. package/dist/types/src/util/index.d.ts +0 -4
  100. package/dist/types/src/util/index.d.ts.map +1 -1
  101. package/dist/types/src/util/react.d.ts +7 -6
  102. package/dist/types/src/util/react.d.ts.map +1 -1
  103. package/dist/types/tsconfig.tsbuildinfo +1 -1
  104. package/package.json +95 -82
  105. package/src/components/Editor/Editor.stories.tsx +89 -0
  106. package/src/components/Editor/Editor.tsx +175 -24
  107. package/src/components/Editor/EditorView.tsx +84 -0
  108. package/src/components/Editor/controller.ts +50 -0
  109. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +226 -0
  110. package/src/components/EditorMenuProvider/index.ts +10 -0
  111. package/src/components/EditorMenuProvider/menu-presets.ts +125 -0
  112. package/src/components/EditorMenuProvider/menu.ts +70 -0
  113. package/src/components/EditorMenuProvider/popover.ts +286 -0
  114. package/src/components/EditorMenuProvider/useEditorMenu.ts +180 -0
  115. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +79 -0
  116. package/src/components/EditorPreviewProvider/index.ts +5 -0
  117. package/src/components/EditorToolbar/EditorToolbar.tsx +92 -103
  118. package/src/components/EditorToolbar/blocks.ts +53 -48
  119. package/src/components/EditorToolbar/formatting.ts +42 -46
  120. package/src/components/EditorToolbar/headings.ts +47 -45
  121. package/src/components/EditorToolbar/image.ts +16 -10
  122. package/src/components/EditorToolbar/index.ts +2 -7
  123. package/src/components/EditorToolbar/lists.ts +40 -41
  124. package/src/components/EditorToolbar/search.ts +16 -10
  125. package/src/components/EditorToolbar/types.ts +8 -0
  126. package/src/components/EditorToolbar/view-mode.ts +40 -40
  127. package/src/components/index.ts +3 -2
  128. package/src/extensions/Assistant.stories.tsx +112 -0
  129. package/src/extensions/assistant-extension.tsx +223 -0
  130. package/src/extensions/index.ts +2 -23
  131. package/src/hooks/index.ts +1 -0
  132. package/src/hooks/useBasicMarkdownExtensions.ts +55 -0
  133. package/src/hooks/useTextEditor.ts +39 -45
  134. package/src/index.ts +0 -13
  135. package/src/stories/Automerge.stories.tsx +174 -0
  136. package/src/stories/Comments.stories.tsx +59 -51
  137. package/src/stories/EditorToolbar.stories.tsx +50 -62
  138. package/src/stories/Experimental.stories.tsx +24 -22
  139. package/src/stories/Markdown.stories.tsx +37 -33
  140. package/src/stories/Outliner.stories.tsx +54 -44
  141. package/src/stories/Popover.stories.tsx +157 -0
  142. package/src/stories/Preview.stories.tsx +114 -95
  143. package/src/stories/Tags.stories.tsx +104 -0
  144. package/src/stories/TextEditor.stories.tsx +50 -75
  145. package/src/stories/Theme.stories.tsx +61 -0
  146. package/src/stories/components/EditorStory.tsx +50 -35
  147. package/src/stories/components/util.tsx +90 -59
  148. package/src/translations.ts +30 -25
  149. package/src/util/index.ts +1 -5
  150. package/src/util/react.tsx +9 -14
  151. package/dist/lib/browser/chunk-22UMM3QJ.mjs +0 -22
  152. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
  153. package/dist/lib/browser/testing/index.mjs +0 -6
  154. package/dist/lib/browser/testing/index.mjs.map +0 -7
  155. package/dist/lib/browser/types/index.mjs +0 -13
  156. package/dist/lib/browser/types/index.mjs.map +0 -7
  157. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs +0 -24
  158. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  159. package/dist/lib/node-esm/testing/index.mjs +0 -8
  160. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  161. package/dist/lib/node-esm/types/index.mjs +0 -14
  162. package/dist/lib/node-esm/types/index.mjs.map +0 -7
  163. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -51
  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 -22
  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 -82
  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 -10
  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/index.d.ts +0 -2
  320. package/dist/types/src/types/index.d.ts.map +0 -1
  321. package/dist/types/src/types/types.d.ts +0 -21
  322. package/dist/types/src/types/types.d.ts.map +0 -1
  323. package/dist/types/src/util/cursor.d.ts +0 -31
  324. package/dist/types/src/util/cursor.d.ts.map +0 -1
  325. package/dist/types/src/util/debug.d.ts +0 -17
  326. package/dist/types/src/util/debug.d.ts.map +0 -1
  327. package/dist/types/src/util/dom.d.ts +0 -20
  328. package/dist/types/src/util/dom.d.ts.map +0 -1
  329. package/dist/types/src/util/facet.d.ts +0 -3
  330. package/dist/types/src/util/facet.d.ts.map +0 -1
  331. package/src/components/EditorToolbar/util.ts +0 -65
  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/defaults.ts +0 -49
  337. package/src/extensions/annotations.ts +0 -55
  338. package/src/extensions/autocomplete.ts +0 -69
  339. package/src/extensions/automerge/automerge.stories.tsx +0 -142
  340. package/src/extensions/automerge/automerge.test.tsx +0 -78
  341. package/src/extensions/automerge/automerge.ts +0 -85
  342. package/src/extensions/automerge/cursor.ts +0 -28
  343. package/src/extensions/automerge/defs.ts +0 -31
  344. package/src/extensions/automerge/index.ts +0 -5
  345. package/src/extensions/automerge/sync.ts +0 -75
  346. package/src/extensions/automerge/update-automerge.ts +0 -50
  347. package/src/extensions/automerge/update-codemirror.ts +0 -115
  348. package/src/extensions/awareness/awareness-provider.ts +0 -127
  349. package/src/extensions/awareness/awareness.ts +0 -315
  350. package/src/extensions/awareness/index.ts +0 -6
  351. package/src/extensions/blast.ts +0 -363
  352. package/src/extensions/command/action.ts +0 -56
  353. package/src/extensions/command/command-menu.ts +0 -210
  354. package/src/extensions/command/command.ts +0 -34
  355. package/src/extensions/command/floating-menu.ts +0 -133
  356. package/src/extensions/command/hint.ts +0 -102
  357. package/src/extensions/command/index.ts +0 -10
  358. package/src/extensions/command/placeholder.ts +0 -113
  359. package/src/extensions/command/state.ts +0 -89
  360. package/src/extensions/command/typeahead.ts +0 -129
  361. package/src/extensions/command/useCommandMenu.ts +0 -118
  362. package/src/extensions/comments.ts +0 -592
  363. package/src/extensions/debug.ts +0 -15
  364. package/src/extensions/dnd.ts +0 -37
  365. package/src/extensions/factories.ts +0 -259
  366. package/src/extensions/focus.ts +0 -35
  367. package/src/extensions/folding.tsx +0 -46
  368. package/src/extensions/hashtag.tsx +0 -68
  369. package/src/extensions/json.ts +0 -57
  370. package/src/extensions/listener.ts +0 -38
  371. package/src/extensions/markdown/action.ts +0 -116
  372. package/src/extensions/markdown/bundle.ts +0 -71
  373. package/src/extensions/markdown/changes.test.ts +0 -26
  374. package/src/extensions/markdown/changes.ts +0 -149
  375. package/src/extensions/markdown/debug.ts +0 -44
  376. package/src/extensions/markdown/decorate.ts +0 -591
  377. package/src/extensions/markdown/formatting.test.ts +0 -498
  378. package/src/extensions/markdown/formatting.ts +0 -1267
  379. package/src/extensions/markdown/highlight.ts +0 -183
  380. package/src/extensions/markdown/image.ts +0 -119
  381. package/src/extensions/markdown/index.ts +0 -13
  382. package/src/extensions/markdown/link.ts +0 -47
  383. package/src/extensions/markdown/parser.test.ts +0 -75
  384. package/src/extensions/markdown/styles.ts +0 -135
  385. package/src/extensions/markdown/table.ts +0 -144
  386. package/src/extensions/mention.ts +0 -41
  387. package/src/extensions/modes.ts +0 -41
  388. package/src/extensions/outliner/commands.ts +0 -270
  389. package/src/extensions/outliner/editor.test.ts +0 -33
  390. package/src/extensions/outliner/editor.ts +0 -184
  391. package/src/extensions/outliner/index.ts +0 -7
  392. package/src/extensions/outliner/outliner.test.ts +0 -99
  393. package/src/extensions/outliner/outliner.ts +0 -166
  394. package/src/extensions/outliner/selection.ts +0 -50
  395. package/src/extensions/outliner/tree.test.ts +0 -167
  396. package/src/extensions/outliner/tree.ts +0 -317
  397. package/src/extensions/preview/index.ts +0 -5
  398. package/src/extensions/preview/preview.ts +0 -193
  399. package/src/extensions/selection.ts +0 -100
  400. package/src/extensions/typewriter.ts +0 -68
  401. package/src/stories/Command.stories.tsx +0 -97
  402. package/src/stories/CommandMenu.stories.tsx +0 -159
  403. package/src/styles/index.ts +0 -7
  404. package/src/styles/markdown.ts +0 -26
  405. package/src/styles/theme.ts +0 -266
  406. package/src/styles/tokens.ts +0 -17
  407. package/src/testing/index.ts +0 -5
  408. package/src/testing/util.ts +0 -5
  409. package/src/types/index.ts +0 -5
  410. package/src/types/types.ts +0 -32
  411. package/src/util/cursor.ts +0 -55
  412. package/src/util/debug.ts +0 -64
  413. package/src/util/dom.ts +0 -56
  414. package/src/util/facet.ts +0 -13
@@ -4,8 +4,8 @@
4
4
 
5
5
  import { EditorState, type EditorStateConfig, type Text } from '@codemirror/state';
6
6
  import { EditorView } from '@codemirror/view';
7
- import { useFocusableGroup, type TabsterTypes } from '@fluentui/react-tabster';
8
7
  import {
8
+ type ComponentPropsWithoutRef,
9
9
  type DependencyList,
10
10
  type KeyboardEventHandler,
11
11
  type RefObject,
@@ -17,10 +17,14 @@ import {
17
17
  } from 'react';
18
18
 
19
19
  import { log } from '@dxos/log';
20
- import { getProviderValue, isNotFalsy, type MaybeProvider } from '@dxos/util';
21
-
22
- import { type EditorSelection, documentId, createEditorStateTransaction, editorInputMode } from '../extensions';
23
- import { debugDispatcher } from '../util';
20
+ import {
21
+ type EditorSelection,
22
+ createEditorStateTransaction,
23
+ debugDispatcher,
24
+ documentId,
25
+ modalStateField,
26
+ } from '@dxos/ui-editor';
27
+ import { type MaybeProvider, getProviderValue, isTruthy } from '@dxos/util';
24
28
 
25
29
  let instanceCount = 0;
26
30
 
@@ -34,13 +38,9 @@ export type CursorInfo = {
34
38
  };
35
39
 
36
40
  export type UseTextEditor = {
37
- // TODO(burdon): Rename.
38
- parentRef: RefObject<HTMLDivElement>;
39
- view?: EditorView;
40
- focusAttributes?: TabsterTypes.TabsterDOMAttribute & {
41
- tabIndex: 0;
42
- onKeyUp: KeyboardEventHandler<HTMLDivElement>;
43
- };
41
+ parentRef: RefObject<HTMLDivElement | null>;
42
+ view: EditorView | null;
43
+ focusAttributes?: ComponentPropsWithoutRef<'div'>;
44
44
  };
45
45
 
46
46
  export type UseTextEditorProps = Pick<EditorStateConfig, 'extensions'> & {
@@ -50,7 +50,7 @@ export type UseTextEditorProps = Pick<EditorStateConfig, 'extensions'> & {
50
50
  autoFocus?: boolean;
51
51
  scrollTo?: number;
52
52
  selection?: EditorSelection;
53
- moveToEndOfLine?: boolean;
53
+ selectionEnd?: boolean;
54
54
  debug?: boolean;
55
55
  };
56
56
 
@@ -61,16 +61,16 @@ export const useTextEditor = (
61
61
  props: MaybeProvider<UseTextEditorProps> = {},
62
62
  deps: DependencyList = [],
63
63
  ): UseTextEditor => {
64
- const { id, doc, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } =
64
+ const { id, doc, initialValue, extensions, autoFocus, scrollTo, selection, selectionEnd, debug } =
65
65
  useMemo<UseTextEditorProps>(() => getProviderValue(props), deps ?? []);
66
66
 
67
67
  // NOTE: Increments by 2 in strict mode.
68
68
  const [instanceId] = useState(() => `text-editor-${++instanceCount}`);
69
- const [view, setView] = useState<EditorView>();
69
+ const [view, setView] = useState<EditorView | null>(null);
70
70
  const parentRef = useRef<HTMLDivElement>(null);
71
71
 
72
72
  useEffect(() => {
73
- let view: EditorView;
73
+ let view: EditorView | null = null;
74
74
  if (parentRef.current) {
75
75
  log('create', { id, instanceId, doc: initialValue?.length ?? 0 });
76
76
 
@@ -79,7 +79,7 @@ export const useTextEditor = (
79
79
  if (selection.anchor <= initialValue.length && (selection?.head ?? 0) <= initialValue.length) {
80
80
  initialSelection = selection;
81
81
  }
82
- } else if (moveToEndOfLine && selection === undefined) {
82
+ } else if (selectionEnd && selection === undefined) {
83
83
  const index = initialValue?.indexOf('\n');
84
84
  const anchor = !index || index === -1 ? 0 : index;
85
85
  initialSelection = { anchor };
@@ -96,19 +96,7 @@ export const useTextEditor = (
96
96
  EditorView.exceptionSink.of((err) => {
97
97
  log.catch(err);
98
98
  }),
99
- // TODO(burdon): Factor out debug inspector.
100
- // ViewPlugin.fromClass(
101
- // class {
102
- // constructor(_view: EditorView) {
103
- // log('construct', { id });
104
- // }
105
- //
106
- // destroy() {
107
- // log('destroy', { id });
108
- // }
109
- // },
110
- // ),
111
- ].filter(isNotFalsy),
99
+ ].filter(isTruthy),
112
100
  });
113
101
 
114
102
  // https://codemirror.net/docs/ref/#view.EditorViewConfig
@@ -120,7 +108,7 @@ export const useTextEditor = (
120
108
  });
121
109
 
122
110
  // Move to end of line after document loaded (unless selection is specified).
123
- if (moveToEndOfLine && !initialSelection) {
111
+ if (selectionEnd && !initialSelection) {
124
112
  const { to } = view.state.doc.lineAt(0);
125
113
  if (to) {
126
114
  view.dispatch({ selection: { anchor: to } });
@@ -155,23 +143,30 @@ export const useTextEditor = (
155
143
  }
156
144
  }, [autoFocus, view]);
157
145
 
158
- const focusableGroupAttrs = useFocusableGroup({
159
- tabBehavior: 'limited',
160
- ignoreDefaultKeydown: {
161
- Escape: view?.state.facet(editorInputMode).noTabster,
162
- },
163
- });
164
-
165
146
  // Focus editor on Enter (e.g., when tabbing to this component).
166
- const handleKeyUp = useCallback<KeyboardEventHandler<HTMLDivElement>>(
147
+ const handleKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(
167
148
  (event) => {
168
149
  const { key, target, currentTarget } = event;
169
- if (target === currentTarget) {
170
- switch (key) {
171
- case 'Enter': {
150
+ switch (key) {
151
+ case 'Escape': {
152
+ // Check if popover is open.
153
+ const modal = view?.state.field(modalStateField, false);
154
+ if (modal) {
155
+ return;
156
+ }
157
+
158
+ // Focus the closest focusable parent.
159
+ const element = view?.contentDOM.closest('[tabindex="0"]') as HTMLDivElement | null;
160
+ element?.focus();
161
+ break;
162
+ }
163
+
164
+ case 'Enter': {
165
+ event.preventDefault();
166
+ if (target === currentTarget) {
172
167
  view?.focus();
173
- break;
174
168
  }
169
+ break;
175
170
  }
176
171
  }
177
172
  },
@@ -183,8 +178,7 @@ export const useTextEditor = (
183
178
  view,
184
179
  focusAttributes: {
185
180
  tabIndex: 0 as const,
186
- ...focusableGroupAttrs,
187
- onKeyUp: handleKeyUp,
181
+ onKeyDown: handleKeyDown,
188
182
  },
189
183
  };
190
184
  };
package/src/index.ts CHANGED
@@ -2,19 +2,6 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { translations } from './translations';
6
-
7
- export { type Extension, EditorState } from '@codemirror/state';
8
- export { EditorView, keymap } from '@codemirror/view';
9
- export { tags } from '@lezer/highlight';
10
-
11
- export { TextKind } from '@dxos/protocols/proto/dxos/echo/model/text';
12
-
13
5
  export * from './components';
14
- export * from './defaults';
15
6
  export * from './extensions';
16
7
  export * from './hooks';
17
- export * from './types';
18
- export * from './util';
19
-
20
- export { translations };
@@ -0,0 +1,174 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { Repo } from '@automerge/automerge-repo';
6
+ import { BroadcastChannelNetworkAdapter } from '@automerge/automerge-repo-network-broadcastchannel';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
+ import React, { useCallback, useEffect, useState } from 'react';
9
+
10
+ import { Obj, Ref } from '@dxos/echo';
11
+ import { DocAccessor, createDocAccessor } from '@dxos/echo-db';
12
+ import { TestSchema } from '@dxos/echo/testing';
13
+ import { log } from '@dxos/log';
14
+ import { type Messenger } from '@dxos/protocols';
15
+ import { Query, useQuery, useSpace } from '@dxos/react-client/echo';
16
+ import { type Identity, useIdentity } from '@dxos/react-client/halo';
17
+ import { useClientStory, withMultiClientProvider } from '@dxos/react-client/testing';
18
+ import { Button, useThemeContext } from '@dxos/react-ui';
19
+ import { withLayout, withTheme, Loading } from '@dxos/react-ui/testing';
20
+ import { createBasicExtensions, createDataExtensions, createThemeExtensions } from '@dxos/ui-editor';
21
+
22
+ import { translations } from '#translations';
23
+
24
+ import { useTextEditor } from '../hooks';
25
+
26
+ const initialContent = 'Hello world!';
27
+
28
+ type TestObject = {
29
+ text: string;
30
+ };
31
+
32
+ type EditorProps = {
33
+ source: DocAccessor;
34
+ messenger?: Messenger;
35
+ identity?: Identity;
36
+ autoFocus?: boolean;
37
+ };
38
+
39
+ const Editor = ({ source, messenger, identity, autoFocus }: EditorProps) => {
40
+ const { themeMode } = useThemeContext();
41
+ const { parentRef } = useTextEditor(
42
+ () => ({
43
+ autoFocus,
44
+ initialValue: DocAccessor.getValue(source),
45
+ extensions: [
46
+ createBasicExtensions({ placeholder: 'Type here...', search: true }),
47
+ createThemeExtensions({ themeMode, slots: { scroller: { className: 'p-2' } } }),
48
+ createDataExtensions({ id: 'test', text: source, messenger, identity }),
49
+ ],
50
+ }),
51
+ [source, themeMode],
52
+ );
53
+
54
+ return <div ref={parentRef} className='flex w-full' />;
55
+ };
56
+
57
+ const DefaultStory = () => {
58
+ const [object1, setObject1] = useState<DocAccessor<TestObject>>();
59
+ const [object2, setObject2] = useState<DocAccessor<TestObject>>();
60
+
61
+ useEffect(() => {
62
+ queueMicrotask(async () => {
63
+ const repo1 = new Repo({ network: [new BroadcastChannelNetworkAdapter()] });
64
+ const repo2 = new Repo({ network: [new BroadcastChannelNetworkAdapter()] });
65
+
66
+ const object1 = repo1.create<TestObject>();
67
+ object1.change((doc: TestObject) => {
68
+ doc.text = initialContent;
69
+ });
70
+
71
+ const object2 = await repo2.find<TestObject>(object1.url);
72
+ await object2.whenReady();
73
+
74
+ setObject1({ handle: object1, path: ['text'] });
75
+ setObject2({ handle: object2, path: ['text'] });
76
+ });
77
+ }, []);
78
+
79
+ if (!object1 || !object2) {
80
+ return <Loading data={{ object1: !!object1, object2: !!object2 }} />;
81
+ }
82
+
83
+ return (
84
+ <div className='h-full w-full grid grid-cols-2 gap-4'>
85
+ <Editor source={object1} autoFocus />
86
+ <Editor source={object2} />
87
+ </div>
88
+ );
89
+ };
90
+
91
+ const EchoStory = () => {
92
+ const { spaceId, index } = useClientStory();
93
+ const identity = useIdentity();
94
+ const space = useSpace(spaceId);
95
+ const objects = useQuery(space?.db, Query.type(TestSchema.Expando, { type: 'test' }));
96
+
97
+ const [source, setSource] = useState<DocAccessor>();
98
+ const init = useCallback(() => {
99
+ const content = objects[0]?.content.target;
100
+ if (!content) {
101
+ if (objects.length) {
102
+ // TODO(burdon): Initially ref isn't ready.
103
+ log.warn('no content', { index, objects: JSON.stringify(objects) });
104
+ }
105
+ return;
106
+ }
107
+
108
+ setSource(createDocAccessor(content, ['content']));
109
+ }, [objects]);
110
+
111
+ useEffect(() => {
112
+ if (source) {
113
+ return;
114
+ }
115
+
116
+ init();
117
+ }, [objects, source]);
118
+
119
+ return (
120
+ <div className='h-full w-full flex flex-col overflow-hidden'>
121
+ <pre className='p-2 text-xs text-subdued'>
122
+ {JSON.stringify({ index, identity: identity?.identityKey.truncate(), spaceId, objects }, null, 2)}
123
+ </pre>
124
+ {identity && source ? (
125
+ <div className='p-2 flex grow overflow-hidden'>
126
+ <Editor identity={identity} messenger={space} source={source} />
127
+ </div>
128
+ ) : (
129
+ <div className='p-2'>
130
+ <Button onClick={init}>Init</Button>
131
+ </div>
132
+ )}
133
+ </div>
134
+ );
135
+ };
136
+
137
+ const meta = {
138
+ title: 'ui/react-ui-editor/Automerge',
139
+ component: Editor as any,
140
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
141
+ parameters: {
142
+ layout: 'fullscreen',
143
+ translations,
144
+ },
145
+ } satisfies Meta<typeof DefaultStory>;
146
+
147
+ export default meta;
148
+
149
+ type Story = StoryObj<typeof meta>;
150
+
151
+ // TODO(burdon): ERROR: factories.ts:126 Error: Non-base58 character
152
+ export const Default: Story = {
153
+ render: DefaultStory,
154
+ };
155
+
156
+ // TODO(burdon): Failing (doesn't sync)
157
+ export const WithEcho: Story = {
158
+ decorators: [
159
+ withMultiClientProvider({
160
+ numClients: 2,
161
+ createIdentity: true,
162
+ createSpace: true,
163
+ onCreateSpace: async ({ space }) => {
164
+ space.db.add(
165
+ Obj.make(TestSchema.Expando, {
166
+ type: 'test',
167
+ content: Ref.make(Obj.make(TestSchema.Expando, { content: initialContent })),
168
+ }),
169
+ );
170
+ },
171
+ }),
172
+ ],
173
+ render: EchoStory,
174
+ };
@@ -2,81 +2,89 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { effect, useSignal } from '@preact/signals-react';
8
- import React, { type FC } from 'react';
5
+ import { Atom, RegistryContext } from '@effect-atom/atom-react';
6
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
+ import React, { type FC, useContext, useMemo } from 'react';
9
8
 
10
9
  import { keySymbols, parseShortcut } from '@dxos/keyboard';
11
10
  import { PublicKey } from '@dxos/keys';
12
11
  import { log } from '@dxos/log';
13
- import { withLayout, withTheme, type Meta } from '@dxos/storybook-utils';
12
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
13
+ import { withRegistry } from '@dxos/storybook-utils';
14
+ import { annotations, comments, createExternalCommentSync } from '@dxos/ui-editor';
15
+ import { type Comment } from '@dxos/ui-editor/types';
14
16
 
17
+ import { createRenderer, str } from '../util';
15
18
  import { EditorStory, content, longText } from './components';
16
- import { annotations, comments, createExternalCommentSync } from '../extensions';
17
- import { str } from '../testing';
18
- import { type Comment } from '../types';
19
- import { createRenderer } from '../util';
20
19
 
21
- const meta: Meta<typeof EditorStory> = {
20
+ const meta = {
22
21
  title: 'ui/react-ui-editor/Comments',
23
22
  component: EditorStory,
24
- decorators: [withTheme, withLayout({ fullscreen: true })],
25
- parameters: { layout: 'fullscreen' },
26
- };
23
+ decorators: [withRegistry, withTheme(), withLayout({ layout: 'fullscreen' })],
24
+ parameters: {
25
+ layout: 'fullscreen',
26
+ },
27
+ } satisfies Meta<typeof EditorStory>;
27
28
 
28
29
  export default meta;
29
30
 
31
+ type Story = StoryObj<typeof meta>;
32
+
30
33
  //
31
34
  // Comments
32
35
  //
33
36
 
34
- export const Comments = {
35
- render: () => {
36
- const _comments = useSignal<Comment[]>([]);
37
- return (
38
- <EditorStory
39
- text={str('# Comments', '', content.paragraphs, content.footer)}
40
- extensions={[
41
- createExternalCommentSync(
42
- 'test',
43
- (sink) => effect(() => sink()),
44
- () => _comments.value,
45
- ),
46
- comments({
47
- id: 'test',
48
- renderTooltip: createRenderer(CommentTooltip),
49
- onCreate: ({ cursor }) => {
50
- const id = PublicKey.random().toHex();
51
- _comments.value = [..._comments.value, { id, cursor }];
52
- return id;
53
- },
54
- onSelect: (state) => {
55
- const debug = false;
56
- if (debug) {
57
- log.info('update', {
58
- comments: state.comments.length,
59
- active: state.selection.current?.slice(0, 8),
60
- closest: state.selection.closest?.slice(0, 8),
61
- });
62
- }
63
- },
64
- }),
65
- ]}
66
- />
67
- );
68
- },
37
+ const CommentsStory = () => {
38
+ const registry = useContext(RegistryContext);
39
+ const commentsAtom = useMemo(() => Atom.make<Comment[]>([]), []);
40
+
41
+ return (
42
+ <EditorStory
43
+ text={str('# Comments', '', content.paragraphs, content.footer)}
44
+ extensions={[
45
+ createExternalCommentSync(
46
+ 'test',
47
+ (sink) => registry.subscribe(commentsAtom, () => sink()),
48
+ () => registry.get(commentsAtom),
49
+ ),
50
+ comments({
51
+ id: 'test',
52
+ renderTooltip: createRenderer(CommentTooltip),
53
+ onCreate: ({ cursor }) => {
54
+ const id = PublicKey.random().toHex();
55
+ const current = registry.get(commentsAtom);
56
+ registry.set(commentsAtom, [...current, { id, cursor }]);
57
+ return id;
58
+ },
59
+ onSelect: (state) => {
60
+ const debug = false;
61
+ if (debug) {
62
+ log.info('update', {
63
+ comments: state.comments.length,
64
+ active: state.selection.current?.slice(0, 8),
65
+ closest: state.selection.closest?.slice(0, 8),
66
+ });
67
+ }
68
+ },
69
+ }),
70
+ ]}
71
+ />
72
+ );
73
+ };
74
+
75
+ export const Comments: Story = {
76
+ render: () => <CommentsStory />,
69
77
  };
70
78
 
71
79
  const Key: FC<{ char: string }> = ({ char }) => (
72
- <span className='flex justify-center items-center w-[24px] h-[24px] rounded text-xs bg-neutral-200 text-black'>
80
+ <span className='flex justify-center items-center w-[24px] h-[24px] rounded-sm text-xs bg-neutral-200 text-black'>
73
81
  {char}
74
82
  </span>
75
83
  );
76
84
 
77
85
  const CommentTooltip: FC<{ shortcut: string }> = ({ shortcut }) => {
78
86
  return (
79
- <div className='flex items-center gap-2 px-2 py-2 bg-neutral-700 text-white text-xs rounded'>
87
+ <div className='flex items-center gap-2 px-2 py-2 bg-neutral-700 text-white text-xs rounded-sm'>
80
88
  <div>Create comment</div>
81
89
  <div className='flex gap-1'>
82
90
  {keySymbols(parseShortcut(shortcut)).map((char) => (
@@ -91,7 +99,7 @@ const CommentTooltip: FC<{ shortcut: string }> = ({ shortcut }) => {
91
99
  // Annotations
92
100
  //
93
101
 
94
- export const Annotations = {
102
+ export const Annotations: Story = {
95
103
  render: () => (
96
104
  <EditorStory text={str('# Annotations', '', longText)} extensions={[annotations({ match: /volup/gi })]} />
97
105
  ),
@@ -2,85 +2,73 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useMemo } from 'react';
6
7
 
7
- import { type StoryObj } from '@storybook/react-vite';
8
- import React, { useCallback, useState } from 'react';
9
-
10
- import { invariant } from '@dxos/invariant';
11
8
  import { useThemeContext } from '@dxos/react-ui';
12
- import { attentionSurface, mx } from '@dxos/react-ui-theme';
13
- import { type Meta, withLayout, withTheme } from '@dxos/storybook-utils';
14
-
15
- import { EditorToolbar, useEditorToolbarState } from '../components';
16
- import { editorWidth } from '../defaults';
9
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
10
+ import { withRegistry } from '@dxos/storybook-utils';
17
11
  import {
18
- InputModeExtensions,
19
- createMarkdownExtensions,
20
12
  createBasicExtensions,
13
+ createMarkdownExtensions,
21
14
  createThemeExtensions,
22
15
  decorateMarkdown,
16
+ documentSlots,
23
17
  formattingKeymap,
24
- useFormattingState,
25
- } from '../extensions';
26
- import { useTextEditor, type UseTextEditorProps } from '../hooks';
27
- import { translations } from '../translations';
28
- import { type EditorInputMode, type EditorViewMode } from '../types';
18
+ } from '@dxos/ui-editor';
19
+ import { type EditorViewMode } from '@dxos/ui-editor/types';
29
20
 
30
- type StoryProps = { placeholder?: string } & UseTextEditorProps;
21
+ import { translations } from '#translations';
31
22
 
32
- const DefaultStory = ({ autoFocus, initialValue, placeholder }: StoryProps) => {
33
- const { themeMode } = useThemeContext();
34
- const toolbarState = useEditorToolbarState({ viewMode: 'source' });
35
- const viewMode = toolbarState.viewMode;
36
- const trackFormatting = useFormattingState(toolbarState);
37
- // TODO(wittjosiah): Provide way to change the input mode.
38
- const [editorInputMode, _setEditorInputMode] = useState<EditorInputMode>('default');
39
- const { parentRef, view } = useTextEditor(
40
- () => ({
41
- autoFocus,
42
- initialValue,
43
- moveToEndOfLine: true,
44
- extensions: [
45
- editorInputMode ? InputModeExtensions[editorInputMode] : [],
46
- createBasicExtensions({ placeholder, lineWrapping: true, readOnly: viewMode === 'readonly' }),
47
- createMarkdownExtensions({ themeMode }),
48
- createThemeExtensions({ themeMode, syntaxHighlighting: true }),
49
- viewMode === 'source' ? [] : decorateMarkdown(),
50
- formattingKeymap(),
51
- trackFormatting,
52
- ],
53
- }),
54
- [editorInputMode, viewMode, themeMode, placeholder],
55
- );
23
+ import { Editor } from '../components';
24
+ import { type UseTextEditorProps } from '../hooks';
56
25
 
57
- const getView = useCallback(() => {
58
- invariant(view);
59
- return view;
60
- }, [view]);
26
+ type DefaultStoryProps = { placeholder?: string; viewMode?: EditorViewMode } & UseTextEditorProps;
61
27
 
62
- const handleViewModeChange = useCallback((mode: EditorViewMode) => {
63
- toolbarState.viewMode = mode;
64
- }, []);
28
+ const DefaultStory = ({ autoFocus, initialValue, placeholder, viewMode = 'source' }: DefaultStoryProps) => {
29
+ const { themeMode } = useThemeContext();
30
+
31
+ const extensions = useMemo(
32
+ () => [
33
+ createBasicExtensions({
34
+ placeholder,
35
+ lineWrapping: true,
36
+ readOnly: viewMode === 'readonly',
37
+ search: true,
38
+ }),
39
+ createThemeExtensions({
40
+ themeMode,
41
+ syntaxHighlighting: true,
42
+ slots: documentSlots,
43
+ }),
44
+ createMarkdownExtensions(),
45
+ viewMode === 'source' ? [] : decorateMarkdown(),
46
+ formattingKeymap(),
47
+ ],
48
+ [viewMode, themeMode, placeholder],
49
+ );
65
50
 
66
- // TODO(marijn): This doesn't update the state on view changes.
67
- // Also not sure if view is even guaranteed to exist at this point.
68
51
  return (
69
- <div role='none' className={mx('fixed inset-0 flex flex-col')}>
70
- {toolbarState && <EditorToolbar state={toolbarState} getView={getView} viewMode={handleViewModeChange} />}
71
- <div role='none' className={mx('grow overflow-hidden', attentionSurface)}>
72
- <div className={mx(editorWidth)} ref={parentRef} />
73
- </div>
74
- </div>
52
+ <Editor.Root extensions={extensions} viewMode={viewMode}>
53
+ <Editor.Content>
54
+ <Editor.Toolbar classNames='dx-document' />
55
+ <div role='none' className='dx-container dx-document bg-base-surface'>
56
+ <Editor.View autoFocus={autoFocus} initialValue={initialValue} selectionEnd />
57
+ </div>
58
+ </Editor.Content>
59
+ </Editor.Root>
75
60
  );
76
61
  };
77
62
 
78
- const meta: Meta<StoryProps> = {
63
+ const meta = {
79
64
  title: 'ui/react-ui-editor/EditorToolbar',
80
65
  render: DefaultStory,
81
- decorators: [withTheme, withLayout({ fullscreen: true })],
82
- parameters: { translations, layout: 'fullscreen' },
83
- };
66
+ decorators: [withRegistry, withTheme(), withLayout({ layout: 'fullscreen', classNames: 'bg-sidebar-surface' })],
67
+ parameters: {
68
+ layout: 'fullscreen',
69
+ translations,
70
+ },
71
+ } satisfies Meta<typeof DefaultStory>;
84
72
 
85
73
  export default meta;
86
74
 
@@ -90,6 +78,6 @@ export const Default: Story = {
90
78
  args: {
91
79
  autoFocus: true,
92
80
  placeholder: 'Text...',
93
- initialValue: '# Demo\n\nThis is a document.\n\n',
81
+ initialValue: '# Demo\n\nThis is a **document**.\n\n',
94
82
  },
95
83
  };