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

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 (269) hide show
  1. package/dist/lib/browser/chunk-22UMM3QJ.mjs +22 -0
  2. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +2498 -1380
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +72 -2
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/browser/types/index.mjs +13 -0
  9. package/dist/lib/browser/types/index.mjs.map +7 -0
  10. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs +24 -0
  11. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +7 -0
  12. package/dist/lib/node-esm/index.mjs +2500 -1383
  13. package/dist/lib/node-esm/index.mjs.map +4 -4
  14. package/dist/lib/node-esm/meta.json +1 -1
  15. package/dist/lib/node-esm/testing/index.mjs +72 -2
  16. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  17. package/dist/lib/node-esm/types/index.mjs +14 -0
  18. package/dist/lib/node-esm/types/index.mjs.map +7 -0
  19. package/dist/types/src/components/{Popover → CommandMenu}/CommandMenu.d.ts +10 -6
  20. package/dist/types/src/components/CommandMenu/CommandMenu.d.ts.map +1 -0
  21. package/dist/types/src/components/CommandMenu/index.d.ts +2 -0
  22. package/dist/types/src/components/CommandMenu/index.d.ts.map +1 -0
  23. package/dist/types/src/components/Editor/Editor.d.ts +19 -0
  24. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -0
  25. package/dist/types/src/components/Editor/index.d.ts +2 -0
  26. package/dist/types/src/components/Editor/index.d.ts.map +1 -0
  27. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  28. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  29. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  30. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  31. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  32. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -1
  33. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  34. package/dist/types/src/components/EditorToolbar/util.d.ts +6 -5
  35. package/dist/types/src/components/EditorToolbar/util.d.ts.map +1 -1
  36. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +1 -1
  37. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  38. package/dist/types/src/components/index.d.ts +2 -1
  39. package/dist/types/src/components/index.d.ts.map +1 -1
  40. package/dist/types/src/defaults.d.ts.map +1 -1
  41. package/dist/types/src/extensions/autocomplete.d.ts +20 -7
  42. package/dist/types/src/extensions/autocomplete.d.ts.map +1 -1
  43. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  44. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +36 -45
  45. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  46. package/dist/types/src/extensions/automerge/defs.d.ts +1 -1
  47. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
  48. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  49. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  50. package/dist/types/src/extensions/autoscroll.d.ts +10 -0
  51. package/dist/types/src/extensions/autoscroll.d.ts.map +1 -0
  52. package/dist/types/src/extensions/blast.d.ts.map +1 -1
  53. package/dist/types/src/extensions/command/action.d.ts +1 -1
  54. package/dist/types/src/extensions/command/action.d.ts.map +1 -1
  55. package/dist/types/src/extensions/command/command-menu.d.ts +1 -1
  56. package/dist/types/src/extensions/command/command-menu.d.ts.map +1 -1
  57. package/dist/types/src/extensions/command/command.d.ts.map +1 -1
  58. package/dist/types/src/extensions/command/floating-menu.d.ts.map +1 -1
  59. package/dist/types/src/extensions/command/hint.d.ts +2 -7
  60. package/dist/types/src/extensions/command/hint.d.ts.map +1 -1
  61. package/dist/types/src/extensions/command/index.d.ts +1 -1
  62. package/dist/types/src/extensions/command/index.d.ts.map +1 -1
  63. package/dist/types/src/extensions/command/state.d.ts +1 -1
  64. package/dist/types/src/extensions/command/state.d.ts.map +1 -1
  65. package/dist/types/src/extensions/command/typeahead.d.ts +7 -2
  66. package/dist/types/src/extensions/command/typeahead.d.ts.map +1 -1
  67. package/dist/types/src/extensions/command/useCommandMenu.d.ts +3 -4
  68. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +1 -1
  69. package/dist/types/src/extensions/comments.d.ts +1 -1
  70. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  71. package/dist/types/src/extensions/dnd.d.ts.map +1 -1
  72. package/dist/types/src/extensions/factories.d.ts +15 -1
  73. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  74. package/dist/types/src/extensions/index.d.ts +2 -0
  75. package/dist/types/src/extensions/index.d.ts.map +1 -1
  76. package/dist/types/src/extensions/markdown/action.d.ts.map +1 -1
  77. package/dist/types/src/extensions/markdown/bundle.d.ts +8 -2
  78. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  79. package/dist/types/src/extensions/markdown/changes.d.ts +1 -1
  80. package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
  81. package/dist/types/src/extensions/markdown/decorate.d.ts +9 -1
  82. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  83. package/dist/types/src/extensions/markdown/formatting.d.ts +1 -1
  84. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  85. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +1 -1
  86. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
  87. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
  88. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  89. package/dist/types/src/extensions/modes.d.ts +0 -7
  90. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  91. package/dist/types/src/extensions/outliner/outliner.d.ts +1 -1
  92. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
  93. package/dist/types/src/extensions/outliner/selection.d.ts.map +1 -1
  94. package/dist/types/src/extensions/outliner/tree.d.ts +2 -2
  95. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
  96. package/dist/types/src/extensions/preview/preview.d.ts +3 -6
  97. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  98. package/dist/types/src/extensions/tags/extended-markdown.d.ts +10 -0
  99. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +1 -0
  100. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +2 -0
  101. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +1 -0
  102. package/dist/types/src/extensions/tags/index.d.ts +4 -0
  103. package/dist/types/src/extensions/tags/index.d.ts.map +1 -0
  104. package/dist/types/src/extensions/tags/streamer.d.ts +12 -0
  105. package/dist/types/src/extensions/tags/streamer.d.ts.map +1 -0
  106. package/dist/types/src/extensions/tags/xml-tags.d.ts +71 -0
  107. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -0
  108. package/dist/types/src/extensions/tags/xml-util.d.ts +10 -0
  109. package/dist/types/src/extensions/tags/xml-util.d.ts.map +1 -0
  110. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  111. package/dist/types/src/index.d.ts +1 -1
  112. package/dist/types/src/index.d.ts.map +1 -1
  113. package/dist/types/src/stories/Command.stories.d.ts +12 -4
  114. package/dist/types/src/stories/Command.stories.d.ts.map +1 -1
  115. package/dist/types/src/stories/CommandMenu.stories.d.ts +11 -4
  116. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +1 -1
  117. package/dist/types/src/stories/Comments.stories.d.ts +21 -9
  118. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  119. package/dist/types/src/stories/EditorToolbar.stories.d.ts +40 -3
  120. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  121. package/dist/types/src/stories/Experimental.stories.d.ts +22 -12
  122. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  123. package/dist/types/src/stories/Markdown.stories.d.ts +32 -42
  124. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  125. package/dist/types/src/stories/Outliner.stories.d.ts +15 -20
  126. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  127. package/dist/types/src/stories/Preview.stories.d.ts +21 -6
  128. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  129. package/dist/types/src/stories/Tags.stories.d.ts +17 -0
  130. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  131. package/dist/types/src/stories/TextEditor.stories.d.ts +38 -51
  132. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  133. package/dist/types/src/stories/components/EditorStory.d.ts +3 -6
  134. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  135. package/dist/types/src/styles/theme.d.ts.map +1 -1
  136. package/dist/types/src/testing/PreviewPopover.d.ts +20 -0
  137. package/dist/types/src/testing/PreviewPopover.d.ts.map +1 -0
  138. package/dist/types/src/testing/index.d.ts +1 -0
  139. package/dist/types/src/testing/index.d.ts.map +1 -1
  140. package/dist/types/src/testing/util.d.ts +1 -0
  141. package/dist/types/src/testing/util.d.ts.map +1 -1
  142. package/dist/types/src/translations.d.ts +28 -29
  143. package/dist/types/src/translations.d.ts.map +1 -1
  144. package/dist/types/src/types/index.d.ts +2 -0
  145. package/dist/types/src/types/index.d.ts.map +1 -0
  146. package/dist/types/src/types/types.d.ts +21 -0
  147. package/dist/types/src/types/types.d.ts.map +1 -0
  148. package/dist/types/src/util/cursor.d.ts.map +1 -1
  149. package/dist/types/src/util/debug.d.ts +1 -1
  150. package/dist/types/src/util/debug.d.ts.map +1 -1
  151. package/dist/types/src/util/decorations.d.ts +4 -0
  152. package/dist/types/src/util/decorations.d.ts.map +1 -0
  153. package/dist/types/src/util/dom.d.ts +2 -12
  154. package/dist/types/src/util/dom.d.ts.map +1 -1
  155. package/dist/types/src/util/domino.d.ts +18 -0
  156. package/dist/types/src/util/domino.d.ts.map +1 -0
  157. package/dist/types/src/util/index.d.ts +2 -0
  158. package/dist/types/src/util/index.d.ts.map +1 -1
  159. package/dist/types/src/util/react.d.ts +1 -1
  160. package/dist/types/src/util/react.d.ts.map +1 -1
  161. package/dist/types/tsconfig.tsbuildinfo +1 -1
  162. package/package.json +64 -55
  163. package/src/components/{Popover → CommandMenu}/CommandMenu.tsx +93 -26
  164. package/src/components/{Popover → CommandMenu}/index.ts +0 -2
  165. package/src/components/Editor/Editor.tsx +39 -0
  166. package/src/components/Editor/index.ts +5 -0
  167. package/src/components/EditorToolbar/EditorToolbar.tsx +40 -30
  168. package/src/components/EditorToolbar/blocks.ts +22 -25
  169. package/src/components/EditorToolbar/formatting.ts +22 -25
  170. package/src/components/EditorToolbar/headings.ts +10 -5
  171. package/src/components/EditorToolbar/image.ts +8 -4
  172. package/src/components/EditorToolbar/lists.ts +16 -19
  173. package/src/components/EditorToolbar/search.ts +8 -4
  174. package/src/components/EditorToolbar/util.ts +21 -9
  175. package/src/components/EditorToolbar/view-mode.ts +12 -7
  176. package/src/components/index.ts +2 -1
  177. package/src/defaults.ts +5 -2
  178. package/src/extensions/autocomplete.ts +204 -54
  179. package/src/extensions/automerge/automerge.stories.tsx +26 -17
  180. package/src/extensions/automerge/automerge.ts +4 -3
  181. package/src/extensions/automerge/defs.ts +1 -1
  182. package/src/extensions/automerge/sync.ts +1 -1
  183. package/src/extensions/automerge/update-automerge.ts +1 -1
  184. package/src/extensions/autoscroll.ts +157 -0
  185. package/src/extensions/awareness/awareness.ts +2 -2
  186. package/src/extensions/blast.ts +3 -16
  187. package/src/extensions/command/action.ts +1 -2
  188. package/src/extensions/command/command-menu.ts +7 -6
  189. package/src/extensions/command/command.ts +3 -3
  190. package/src/extensions/command/floating-menu.ts +10 -15
  191. package/src/extensions/command/hint.ts +2 -1
  192. package/src/extensions/command/index.ts +1 -1
  193. package/src/extensions/command/placeholder.ts +1 -1
  194. package/src/extensions/command/state.ts +4 -3
  195. package/src/extensions/command/typeahead.ts +28 -15
  196. package/src/extensions/command/useCommandMenu.ts +6 -9
  197. package/src/extensions/comments.ts +18 -13
  198. package/src/extensions/dnd.ts +1 -1
  199. package/src/extensions/factories.ts +22 -15
  200. package/src/extensions/folding.tsx +2 -2
  201. package/src/extensions/index.ts +2 -0
  202. package/src/extensions/markdown/action.ts +2 -1
  203. package/src/extensions/markdown/bundle.ts +25 -3
  204. package/src/extensions/markdown/changes.ts +1 -1
  205. package/src/extensions/markdown/decorate.ts +23 -14
  206. package/src/extensions/markdown/formatting.test.ts +7 -7
  207. package/src/extensions/markdown/formatting.ts +16 -14
  208. package/src/extensions/markdown/highlight.ts +1 -1
  209. package/src/extensions/markdown/image.ts +3 -4
  210. package/src/extensions/markdown/link.ts +3 -0
  211. package/src/extensions/markdown/table.ts +7 -1
  212. package/src/extensions/mention.ts +1 -1
  213. package/src/extensions/modes.ts +0 -9
  214. package/src/extensions/outliner/outliner.test.ts +3 -2
  215. package/src/extensions/outliner/outliner.ts +6 -5
  216. package/src/extensions/outliner/selection.ts +1 -1
  217. package/src/extensions/outliner/tree.test.ts +2 -1
  218. package/src/extensions/outliner/tree.ts +2 -2
  219. package/src/extensions/preview/preview.ts +59 -62
  220. package/src/extensions/tags/extended-markdown.test.ts +261 -0
  221. package/src/extensions/tags/extended-markdown.ts +78 -0
  222. package/src/extensions/tags/index.ts +7 -0
  223. package/src/extensions/tags/streamer.ts +244 -0
  224. package/src/extensions/tags/xml-tags.ts +335 -0
  225. package/src/extensions/tags/xml-util.ts +94 -0
  226. package/src/hooks/useTextEditor.ts +3 -15
  227. package/src/index.ts +1 -1
  228. package/src/stories/Command.stories.tsx +24 -31
  229. package/src/stories/CommandMenu.stories.tsx +29 -30
  230. package/src/stories/Comments.stories.tsx +10 -6
  231. package/src/stories/EditorToolbar.stories.tsx +10 -11
  232. package/src/stories/Experimental.stories.tsx +12 -8
  233. package/src/stories/Markdown.stories.tsx +21 -17
  234. package/src/stories/Outliner.stories.tsx +42 -30
  235. package/src/stories/Preview.stories.tsx +34 -33
  236. package/src/stories/Tags.stories.tsx +81 -0
  237. package/src/stories/TextEditor.stories.tsx +41 -35
  238. package/src/stories/components/EditorStory.tsx +9 -10
  239. package/src/styles/theme.ts +11 -10
  240. package/src/testing/PreviewPopover.tsx +78 -0
  241. package/src/testing/index.ts +1 -0
  242. package/src/testing/util.ts +2 -0
  243. package/src/translations.ts +5 -3
  244. package/src/types/index.ts +5 -0
  245. package/src/types/types.ts +32 -0
  246. package/src/util/cursor.ts +2 -1
  247. package/src/util/debug.ts +2 -2
  248. package/src/util/decorations.ts +21 -0
  249. package/src/util/dom.ts +5 -27
  250. package/src/util/domino.ts +51 -0
  251. package/src/util/index.ts +2 -0
  252. package/src/util/react.tsx +1 -1
  253. package/dist/lib/node/index.cjs +0 -7754
  254. package/dist/lib/node/index.cjs.map +0 -7
  255. package/dist/lib/node/meta.json +0 -1
  256. package/dist/lib/node/testing/index.cjs +0 -29
  257. package/dist/lib/node/testing/index.cjs.map +0 -7
  258. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  259. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  260. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  261. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  262. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  263. package/dist/types/src/components/Popover/index.d.ts +0 -4
  264. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  265. package/dist/types/src/types.d.ts +0 -14
  266. package/dist/types/src/types.d.ts.map +0 -1
  267. package/src/components/Popover/RefDropdownMenu.tsx +0 -79
  268. package/src/components/Popover/RefPopover.tsx +0 -99
  269. package/src/types.ts +0 -23
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/react-ui-editor",
3
- "version": "0.8.3",
3
+ "version": "0.8.4-main.1f223c7",
4
4
  "description": "Document editing experience within a DXOS shell.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -10,11 +10,19 @@
10
10
  "type": "module",
11
11
  "exports": {
12
12
  ".": {
13
+ "source": "./src/index.ts",
13
14
  "types": "./dist/types/src/index.d.ts",
14
15
  "browser": "./dist/lib/browser/index.mjs",
15
16
  "node": "./dist/lib/node-esm/index.mjs"
16
17
  },
18
+ "./types": {
19
+ "source": "./src/types/index.ts",
20
+ "types": "./dist/types/src/types/index.d.ts",
21
+ "browser": "./dist/lib/browser/types/index.mjs",
22
+ "node": "./dist/lib/node-esm/types/index.mjs"
23
+ },
17
24
  "./testing": {
25
+ "source": "./src/testing/index.ts",
18
26
  "types": "./dist/types/src/testing/index.d.ts",
19
27
  "browser": "./dist/lib/browser/testing/index.mjs",
20
28
  "node": "./dist/lib/node-esm/testing/index.mjs"
@@ -29,19 +37,20 @@
29
37
  "src"
30
38
  ],
31
39
  "dependencies": {
32
- "@automerge/automerge": "3.0.0-beta.4",
33
- "@codemirror/autocomplete": "^6.18.1",
34
- "@codemirror/commands": "^6.6.2",
35
- "@codemirror/lang-javascript": "^6.2.2",
36
- "@codemirror/lang-json": "^6.0.1",
37
- "@codemirror/lang-markdown": "^6.3.0",
38
- "@codemirror/language": "^6.10.3",
40
+ "@automerge/automerge": "3.1.1",
41
+ "@codemirror/autocomplete": "^6.18.7",
42
+ "@codemirror/commands": "^6.8.1",
43
+ "@codemirror/lang-javascript": "^6.2.4",
44
+ "@codemirror/lang-json": "^6.0.2",
45
+ "@codemirror/lang-markdown": "^6.3.4",
46
+ "@codemirror/lang-xml": "^6.1.0",
47
+ "@codemirror/language": "^6.11.3",
39
48
  "@codemirror/language-data": "^6.5.1",
40
- "@codemirror/lint": "^6.8.2",
41
- "@codemirror/search": "^6.5.6",
42
- "@codemirror/state": "^6.4.1",
43
- "@codemirror/theme-one-dark": "^6.1.2",
44
- "@codemirror/view": "^6.34.1",
49
+ "@codemirror/lint": "^6.8.5",
50
+ "@codemirror/search": "^6.5.11",
51
+ "@codemirror/state": "^6.5.2",
52
+ "@codemirror/theme-one-dark": "^6.1.3",
53
+ "@codemirror/view": "^6.38.2",
45
54
  "@fluentui/react-tabster": "^9.24.2",
46
55
  "@lezer/common": "^1.2.2",
47
56
  "@lezer/generator": "^1.7.1",
@@ -50,6 +59,7 @@
50
59
  "@preact-signals/safe-react": "^0.9.0",
51
60
  "@preact/signals-react": "^3.2.0",
52
61
  "@radix-ui/react-context": "1.1.1",
62
+ "@radix-ui/react-use-controllable-state": "1.1.0",
53
63
  "@replit/codemirror-vim": "^6.2.1",
54
64
  "@replit/codemirror-vscode-keymap": "^6.0.2",
55
65
  "ajv": "^8.17.1",
@@ -59,29 +69,28 @@
59
69
  "lodash.merge": "^4.6.2",
60
70
  "lodash.sortby": "^4.7.0",
61
71
  "style-mod": "^4.1.0",
62
- "@dxos/app-graph": "0.8.3",
63
- "@dxos/async": "0.8.3",
64
- "@dxos/context": "0.8.3",
65
- "@dxos/debug": "0.8.3",
66
- "@dxos/display-name": "0.8.3",
67
- "@dxos/invariant": "0.8.3",
68
- "@dxos/lit-ui": "0.8.3",
69
- "@dxos/echo-schema": "0.8.3",
70
- "@dxos/live-object": "0.8.3",
71
- "@dxos/log": "0.8.3",
72
- "@dxos/protocols": "0.8.3",
73
- "@dxos/react-hooks": "0.8.3",
74
- "@dxos/react-ui-menu": "0.8.3",
75
- "@dxos/react-ui-stack": "0.8.3",
76
- "@dxos/util": "0.8.3"
72
+ "@dxos/app-graph": "0.8.4-main.1f223c7",
73
+ "@dxos/async": "0.8.4-main.1f223c7",
74
+ "@dxos/context": "0.8.4-main.1f223c7",
75
+ "@dxos/debug": "0.8.4-main.1f223c7",
76
+ "@dxos/echo-schema": "0.8.4-main.1f223c7",
77
+ "@dxos/display-name": "0.8.4-main.1f223c7",
78
+ "@dxos/invariant": "0.8.4-main.1f223c7",
79
+ "@dxos/live-object": "0.8.4-main.1f223c7",
80
+ "@dxos/log": "0.8.4-main.1f223c7",
81
+ "@dxos/protocols": "0.8.4-main.1f223c7",
82
+ "@dxos/react-hooks": "0.8.4-main.1f223c7",
83
+ "@dxos/react-ui-menu": "0.8.4-main.1f223c7",
84
+ "@dxos/react-ui-stack": "0.8.4-main.1f223c7",
85
+ "@dxos/react-ui-types": "0.8.4-main.1f223c7",
86
+ "@dxos/util": "0.8.4-main.1f223c7"
77
87
  },
78
88
  "devDependencies": {
79
- "@automerge/automerge": "3.0.0-beta.4",
80
- "@automerge/automerge-repo": "2.0.1",
81
- "@automerge/automerge-repo-network-broadcastchannel": "2.0.1",
82
- "@effect-rx/rx-react": "^0.34.1",
83
- "@effect/platform": "0.80.12",
84
- "@phosphor-icons/react": "^2.1.5",
89
+ "@automerge/automerge": "3.1.1",
90
+ "@automerge/automerge-repo": "2.3.0-alpha.0",
91
+ "@automerge/automerge-repo-network-broadcastchannel": "2.3.0-alpha.0",
92
+ "@effect-rx/rx-react": "0.38.0",
93
+ "@effect/platform": "0.90.2",
85
94
  "@types/chai": "^4.2.15",
86
95
  "@types/chai-dom": "^1.11.0",
87
96
  "@types/lodash.defaultsdeep": "^4.6.6",
@@ -92,39 +101,39 @@
92
101
  "@types/react-test-renderer": "^17.0.2",
93
102
  "chai": "^4.4.1",
94
103
  "chai-dom": "^1.11.0",
95
- "effect": "3.14.21",
104
+ "effect": "3.17.7",
96
105
  "happy-dom": "^13.3.1",
97
106
  "jsdom": "^24.0.0",
98
107
  "mocha": "^10.6.0",
99
108
  "react": "~18.2.0",
100
109
  "react-dom": "~18.2.0",
101
110
  "react-test-renderer": "~18.2.0",
102
- "vite": "5.4.7",
103
- "vite-plugin-top-level-await": "^1.4.1",
104
- "vite-plugin-wasm": "^3.3.0",
105
- "@dxos/config": "0.8.3",
106
- "@dxos/echo": "0.8.3",
107
- "@dxos/echo-signals": "0.8.3",
108
- "@dxos/keyboard": "0.8.3",
109
- "@dxos/random": "0.8.3",
110
- "@dxos/react-ui": "0.8.3",
111
- "@dxos/react-ui-syntax-highlighter": "0.8.3",
112
- "@dxos/react-ui-attention": "0.8.3",
113
- "@dxos/react-client": "0.8.3",
114
- "@dxos/react-ui-theme": "0.8.3",
115
- "@dxos/storybook-utils": "0.8.3",
116
- "@dxos/schema": "0.8.3"
111
+ "vite": "7.1.1",
112
+ "vite-plugin-top-level-await": "^1.6.0",
113
+ "vite-plugin-wasm": "^3.5.0",
114
+ "@dxos/config": "0.8.4-main.1f223c7",
115
+ "@dxos/echo": "0.8.4-main.1f223c7",
116
+ "@dxos/echo-signals": "0.8.4-main.1f223c7",
117
+ "@dxos/keyboard": "0.8.4-main.1f223c7",
118
+ "@dxos/random": "0.8.4-main.1f223c7",
119
+ "@dxos/react-client": "0.8.4-main.1f223c7",
120
+ "@dxos/react-ui": "0.8.4-main.1f223c7",
121
+ "@dxos/react-ui-attention": "0.8.4-main.1f223c7",
122
+ "@dxos/react-ui-stack": "0.8.4-main.1f223c7",
123
+ "@dxos/react-ui-syntax-highlighter": "0.8.4-main.1f223c7",
124
+ "@dxos/react-ui-theme": "0.8.4-main.1f223c7",
125
+ "@dxos/schema": "0.8.4-main.1f223c7",
126
+ "@dxos/storybook-utils": "0.8.4-main.1f223c7"
117
127
  },
118
128
  "peerDependencies": {
119
129
  "@effect-rx/rx-react": "^0.34.1",
120
- "@effect/platform": "0.80.12",
121
- "@phosphor-icons/react": "^2.1.5",
130
+ "@effect/platform": "^0.80.12",
122
131
  "effect": "^3.13.3",
123
132
  "react": "~18.2.0",
124
133
  "react-dom": "~18.2.0",
125
- "@dxos/react-client": "0.8.3",
126
- "@dxos/react-ui": "0.8.3",
127
- "@dxos/react-ui-theme": "0.8.3"
134
+ "@dxos/react-client": "0.8.4-main.1f223c7",
135
+ "@dxos/react-ui-theme": "0.8.4-main.1f223c7",
136
+ "@dxos/react-ui": "0.8.4-main.1f223c7"
128
137
  },
129
138
  "publishConfig": {
130
139
  "access": "public"
@@ -3,9 +3,19 @@
3
3
  //
4
4
 
5
5
  import { type EditorView } from '@codemirror/view';
6
- import React, { useCallback, useEffect, useRef } from 'react';
6
+ import { useControllableState } from '@radix-ui/react-use-controllable-state';
7
+ import React, { Fragment, type PropsWithChildren, useCallback, useEffect, useRef, useState } from 'react';
7
8
 
8
- import { Icon, type Label, Popover, toLocalizedString, useThemeContext, useTranslation } from '@dxos/react-ui';
9
+ import { addEventListener } from '@dxos/async';
10
+ import {
11
+ type DxAnchorActivate,
12
+ Icon,
13
+ type Label,
14
+ Popover,
15
+ toLocalizedString,
16
+ useThemeContext,
17
+ useTranslation,
18
+ } from '@dxos/react-ui';
9
19
  import { type MaybePromise } from '@dxos/util';
10
20
 
11
21
  import { commandRangeEffect } from '../../extensions';
@@ -23,37 +33,94 @@ export type CommandMenuItem = {
23
33
  onSelect?: (view: EditorView, head: number) => MaybePromise<void>;
24
34
  };
25
35
 
26
- export type CommandMenuProps = {
36
+ export type CommandMenuProps = PropsWithChildren<{
27
37
  groups: CommandMenuGroup[];
28
- currentItem?: string;
29
38
  onSelect: (item: CommandMenuItem) => void;
30
- };
39
+ onActivate?: (event: DxAnchorActivate) => void;
40
+ currentItem?: string;
41
+ open?: boolean;
42
+ onOpenChange?: (nextOpen: boolean) => void;
43
+ defaultOpen?: boolean;
44
+ }>;
31
45
 
32
46
  // NOTE: Not using DropdownMenu because the command menu needs to manage focus explicitly.
33
- export const CommandMenu = ({ groups, currentItem, onSelect }: CommandMenuProps) => {
47
+ export const CommandMenuProvider = ({
48
+ groups,
49
+ onSelect,
50
+ onActivate,
51
+ currentItem,
52
+ children,
53
+ open: propsOpen,
54
+ onOpenChange,
55
+ defaultOpen,
56
+ }: CommandMenuProps) => {
34
57
  const { tx } = useThemeContext();
35
58
  const groupsWithItems = groups.filter((group) => group.items.length > 0);
59
+ const trigger = useRef<HTMLButtonElement | null>(null);
60
+
61
+ const [open, setOpen] = useControllableState({
62
+ prop: propsOpen,
63
+ onChange: onOpenChange,
64
+ defaultProp: defaultOpen,
65
+ });
66
+
67
+ const handleDxAnchorActivate = useCallback(
68
+ (event: DxAnchorActivate) => {
69
+ const { trigger: dxTrigger, refId } = event;
70
+ // If this has a `refId`, then it’s probably a URL or DXN and out of scope for this component.
71
+ if (!refId) {
72
+ trigger.current = dxTrigger as HTMLButtonElement;
73
+ if (onActivate) {
74
+ onActivate(event);
75
+ } else {
76
+ queueMicrotask(() => setOpen(true));
77
+ }
78
+ }
79
+ },
80
+ [onActivate],
81
+ );
82
+
83
+ const [rootRef, setRootRef] = useState<HTMLDivElement | null>(null);
84
+
85
+ useEffect(() => {
86
+ if (!rootRef || !handleDxAnchorActivate) {
87
+ return;
88
+ }
89
+
90
+ return addEventListener(rootRef, 'dx-anchor-activate' as any, handleDxAnchorActivate, {
91
+ capture: true,
92
+ passive: false,
93
+ });
94
+ }, [rootRef, handleDxAnchorActivate]);
95
+
36
96
  return (
37
- <Popover.Portal>
38
- <Popover.Content
39
- align='start'
40
- onOpenAutoFocus={(event) => event.preventDefault()}
41
- classNames={tx('menu.content', 'menu--exotic-unfocusable', { elevation: 'positioned' }, [
42
- 'max-h-[300px] overflow-y-auto',
43
- ])}
44
- >
45
- <Popover.Viewport classNames={tx('menu.viewport', 'menu__viewport--exotic-unfocusable', {})}>
46
- <ul>
47
- {groupsWithItems.map((group, index) => (
48
- <React.Fragment key={group.id}>
49
- <CommandGroup group={group} currentItem={currentItem} onSelect={onSelect} />
50
- {index < groupsWithItems.length - 1 && <div className={tx('menu.separator', 'menu__item', {})} />}
51
- </React.Fragment>
52
- ))}
53
- </ul>
54
- </Popover.Viewport>
55
- </Popover.Content>
56
- </Popover.Portal>
97
+ <Popover.Root modal={false} open={open} onOpenChange={setOpen}>
98
+ <Popover.Portal>
99
+ <Popover.Content
100
+ align='start'
101
+ onOpenAutoFocus={(event) => event.preventDefault()}
102
+ classNames={tx('menu.content', 'menu--exotic-unfocusable', { elevation: 'positioned' }, [
103
+ 'max-bs-80 overflow-y-auto',
104
+ ])}
105
+ >
106
+ <Popover.Viewport classNames={tx('menu.viewport', 'menu__viewport--exotic-unfocusable', {})}>
107
+ <ul>
108
+ {groupsWithItems.map((group, index) => (
109
+ <Fragment key={group.id}>
110
+ <CommandGroup group={group} currentItem={currentItem} onSelect={onSelect} />
111
+ {index < groupsWithItems.length - 1 && <div className={tx('menu.separator', 'menu__item', {})} />}
112
+ </Fragment>
113
+ ))}
114
+ </ul>
115
+ </Popover.Viewport>
116
+ <Popover.Arrow />
117
+ </Popover.Content>
118
+ </Popover.Portal>
119
+ <Popover.VirtualTrigger virtualRef={trigger} />
120
+ <div role='none' className='contents' ref={setRootRef}>
121
+ {children}
122
+ </div>
123
+ </Popover.Root>
57
124
  );
58
125
  };
59
126
 
@@ -3,5 +3,3 @@
3
3
  //
4
4
 
5
5
  export * from './CommandMenu';
6
- export * from './RefPopover';
7
- export * from './RefDropdownMenu';
@@ -0,0 +1,39 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type EditorView } from '@codemirror/view';
6
+ import React, { forwardRef, useImperativeHandle } from 'react';
7
+
8
+ import { type ThemedClassName, useThemeContext } from '@dxos/react-ui';
9
+ import { mx } from '@dxos/react-ui-theme';
10
+ import { type DataType } from '@dxos/schema';
11
+
12
+ import { type UseTextEditorProps, useTextEditor } from '../../hooks';
13
+
14
+ export type EditorProps = ThemedClassName<
15
+ {
16
+ id: string;
17
+ text: DataType.Text;
18
+ } & Omit<UseTextEditorProps, 'id'>
19
+ >;
20
+
21
+ /**
22
+ * Minimal text editor.
23
+ */
24
+ export const Editor = forwardRef<EditorView | undefined, EditorProps>(
25
+ ({ classNames, id, text, ...props }, forwardedRef) => {
26
+ const { themeMode } = useThemeContext();
27
+ const { parentRef, focusAttributes, view } = useTextEditor(
28
+ () => ({
29
+ id,
30
+ initialValue: text.content,
31
+ ...props,
32
+ }),
33
+ [id, text, themeMode],
34
+ );
35
+
36
+ useImperativeHandle(forwardedRef, () => view, [view]);
37
+ return <div ref={parentRef} className={mx(classNames)} {...focusAttributes} />;
38
+ },
39
+ );
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './Editor';
@@ -5,9 +5,15 @@
5
5
  import { Rx } from '@effect-rx/rx-react';
6
6
  import React, { memo, useMemo } from 'react';
7
7
 
8
- import { rxFromSignal, type NodeArg } from '@dxos/app-graph';
8
+ import { rxFromSignal } from '@dxos/app-graph';
9
9
  import { ElevationProvider } from '@dxos/react-ui';
10
- import { MenuProvider, ToolbarMenu, createGapSeparator, useMenuActions } from '@dxos/react-ui-menu';
10
+ import {
11
+ type ActionGraphProps,
12
+ MenuProvider,
13
+ ToolbarMenu,
14
+ createGapSeparator,
15
+ useMenuActions,
16
+ } from '@dxos/react-ui-menu';
11
17
 
12
18
  import { createBlocks } from './blocks';
13
19
  import { createFormatting } from './formatting';
@@ -18,62 +24,66 @@ import { createSearch } from './search';
18
24
  import { type EditorToolbarActionGraphProps, type EditorToolbarFeatureFlags, type EditorToolbarProps } from './util';
19
25
  import { createViewMode } from './view-mode';
20
26
 
21
- const createToolbar = ({
27
+ const createToolbarActions = ({
22
28
  getView,
23
29
  state,
24
30
  customActions,
25
31
  ...features
26
- }: EditorToolbarFeatureFlags & Pick<EditorToolbarActionGraphProps, 'getView' | 'state' | 'customActions'>): Rx.Rx<{
27
- nodes: NodeArg<any>[];
28
- edges: { source: string; target: string }[];
29
- }> => {
32
+ }: EditorToolbarFeatureFlags &
33
+ Pick<EditorToolbarActionGraphProps, 'getView' | 'state' | 'customActions'>): Rx.Rx<ActionGraphProps> => {
30
34
  return Rx.make((get) => {
31
- const nodes = [];
32
- const edges = [];
35
+ const graph: ActionGraphProps = {
36
+ nodes: [],
37
+ edges: [],
38
+ };
39
+
33
40
  if (features.headings ?? true) {
34
41
  const headings = get(rxFromSignal(() => createHeadings(state, getView)));
35
- nodes.push(...headings.nodes);
36
- edges.push(...headings.edges);
42
+ graph.nodes.push(...headings.nodes);
43
+ graph.edges.push(...headings.edges);
37
44
  }
38
45
  if (features.formatting ?? true) {
39
46
  const formatting = get(rxFromSignal(() => createFormatting(state, getView)));
40
- nodes.push(...formatting.nodes);
41
- edges.push(...formatting.edges);
47
+ graph.nodes.push(...formatting.nodes);
48
+ graph.edges.push(...formatting.edges);
42
49
  }
43
50
  if (features.lists ?? true) {
44
51
  const lists = get(rxFromSignal(() => createLists(state, getView)));
45
- nodes.push(...lists.nodes);
46
- edges.push(...lists.edges);
52
+ graph.nodes.push(...lists.nodes);
53
+ graph.edges.push(...lists.edges);
47
54
  }
48
55
  if (features.blocks ?? true) {
49
56
  const blocks = get(rxFromSignal(() => createBlocks(state, getView)));
50
- nodes.push(...blocks.nodes);
51
- edges.push(...blocks.edges);
57
+ graph.nodes.push(...blocks.nodes);
58
+ graph.edges.push(...blocks.edges);
52
59
  }
53
60
  if (features.image) {
54
61
  const image = get(rxFromSignal(() => createImageUpload(features.image!)));
55
- nodes.push(...image.nodes);
56
- edges.push(...image.edges);
62
+ graph.nodes.push(...image.nodes);
63
+ graph.edges.push(...image.edges);
64
+ }
65
+ {
66
+ const gap = createGapSeparator();
67
+ graph.nodes.push(...gap.nodes);
68
+ graph.edges.push(...gap.edges);
57
69
  }
58
- const editorToolbarGap = createGapSeparator();
59
- nodes.push(...editorToolbarGap.nodes);
60
- edges.push(...editorToolbarGap.edges);
61
70
  if (customActions) {
62
71
  const custom = get(customActions);
63
- nodes.push(...custom.nodes);
64
- edges.push(...custom.edges);
72
+ graph.nodes.push(...custom.nodes);
73
+ graph.edges.push(...custom.edges);
65
74
  }
66
75
  if (features.search ?? true) {
67
76
  const search = get(rxFromSignal(() => createSearch(getView)));
68
- nodes.push(...search.nodes);
69
- edges.push(...search.edges);
77
+ graph.nodes.push(...search.nodes);
78
+ graph.edges.push(...search.edges);
70
79
  }
71
80
  if (features.viewMode) {
72
81
  const viewMode = get(rxFromSignal(() => createViewMode(state, features.viewMode!)));
73
- nodes.push(...viewMode.nodes);
74
- edges.push(...viewMode.edges);
82
+ graph.nodes.push(...viewMode.nodes);
83
+ graph.edges.push(...viewMode.edges);
75
84
  }
76
- return { nodes, edges };
85
+
86
+ return graph;
77
87
  });
78
88
  };
79
89
 
@@ -83,7 +93,7 @@ const createToolbar = ({
83
93
  const useEditorToolbarActionGraph = (props: EditorToolbarProps) => {
84
94
  const menuCreator = useMemo(
85
95
  () =>
86
- createToolbar({
96
+ createToolbarActions({
87
97
  getView: props.getView,
88
98
  state: props.state,
89
99
  customActions: props.customActions,
@@ -7,8 +7,9 @@ import { type EditorView } from '@codemirror/view';
7
7
  import { type NodeArg } from '@dxos/app-graph';
8
8
  import { type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';
9
9
 
10
- import { createEditorAction, createEditorActionGroup, type EditorToolbarState } from './util';
11
- import { removeBlockquote, addBlockquote, removeCodeblock, addCodeblock, insertTable } from '../../extensions';
10
+ import { addBlockquote, addCodeblock, insertTable, removeBlockquote, removeCodeblock } from '../../extensions';
11
+
12
+ import { type EditorToolbarState, createEditorAction, createEditorActionGroup } from './util';
12
13
 
13
14
  const createBlockGroupAction = (value: string) =>
14
15
  createEditorActionGroup('block', {
@@ -24,32 +25,28 @@ const createBlockActions = (value: string, getView: () => EditorView, blankLine?
24
25
  table: 'ph--table--regular',
25
26
  }).map(([type, icon]) => {
26
27
  const checked = type === value;
27
- return createEditorAction(
28
- type,
29
- () => {
30
- const view = getView();
31
- if (!view) {
32
- return;
33
- }
34
-
35
- switch (type) {
36
- case 'blockquote':
37
- checked ? removeBlockquote(view) : addBlockquote(view);
38
- break;
39
- case 'codeblock':
40
- checked ? removeCodeblock(view) : addCodeblock(view);
41
- break;
42
- case 'table':
43
- insertTable(view);
44
- break;
45
- }
46
- },
47
- { checked, ...(type === 'table' && { disabled: !!blankLine }), icon },
48
- );
28
+ return createEditorAction(type, { checked, ...(type === 'table' && { disabled: !!blankLine }), icon }, () => {
29
+ const view = getView();
30
+ if (!view) {
31
+ return;
32
+ }
33
+
34
+ switch (type) {
35
+ case 'blockquote':
36
+ checked ? removeBlockquote(view) : addBlockquote(view);
37
+ break;
38
+ case 'codeblock':
39
+ checked ? removeCodeblock(view) : addCodeblock(view);
40
+ break;
41
+ case 'table':
42
+ insertTable(view);
43
+ break;
44
+ }
45
+ });
49
46
  });
50
47
 
51
48
  export const createBlocks = (state: EditorToolbarState, getView: () => EditorView) => {
52
- const value = state?.blockQuote ? 'blockquote' : state.blockType ?? '';
49
+ const value = state?.blockQuote ? 'blockquote' : (state.blockType ?? '');
53
50
  const blockGroupAction = createBlockGroupAction(value);
54
51
  const blockActions = createBlockActions(value, getView, state.blankLine);
55
52
  return {
@@ -7,8 +7,9 @@ import { type EditorView } from '@codemirror/view';
7
7
  import { type NodeArg } from '@dxos/app-graph';
8
8
  import { type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';
9
9
 
10
- import { createEditorAction, createEditorActionGroup, type EditorToolbarState } from './util';
11
- import { addLink, Inline, removeLink, setStyle, type Formatting } from '../../extensions';
10
+ import { type Formatting, Inline, addLink, removeLink, setStyle } from '../../extensions';
11
+
12
+ import { type EditorToolbarState, createEditorAction, createEditorActionGroup } from './util';
12
13
 
13
14
  const formats = {
14
15
  strong: 'ph--text-b--regular',
@@ -28,31 +29,27 @@ const createFormattingGroup = (formatting: Formatting) =>
28
29
  const createFormattingActions = (formatting: Formatting, getView: () => EditorView) =>
29
30
  Object.entries(formats).map(([type, icon]) => {
30
31
  const checked = !!formatting[type as keyof Formatting];
31
- return createEditorAction(
32
- type,
33
- () => {
34
- const view = getView();
35
- if (!view) {
36
- return;
37
- }
32
+ return createEditorAction(type, { checked, icon }, () => {
33
+ const view = getView();
34
+ if (!view) {
35
+ return;
36
+ }
38
37
 
39
- if (type === 'link') {
40
- checked ? removeLink(view) : addLink()(view);
41
- return;
42
- }
38
+ if (type === 'link') {
39
+ checked ? removeLink(view) : addLink()(view);
40
+ return;
41
+ }
43
42
 
44
- const inlineType =
45
- type === 'strong'
46
- ? Inline.Strong
47
- : type === 'emphasis'
48
- ? Inline.Emphasis
49
- : type === 'strikethrough'
50
- ? Inline.Strikethrough
51
- : Inline.Code;
52
- setStyle(inlineType, !checked)(view);
53
- },
54
- { checked, icon },
55
- );
43
+ const inlineType =
44
+ type === 'strong'
45
+ ? Inline.Strong
46
+ : type === 'emphasis'
47
+ ? Inline.Emphasis
48
+ : type === 'strikethrough'
49
+ ? Inline.Strikethrough
50
+ : Inline.Code;
51
+ setStyle(inlineType, !checked)(view);
52
+ });
56
53
  });
57
54
 
58
55
  export const createFormatting = (state: EditorToolbarState, getView: () => EditorView) => {
@@ -7,10 +7,11 @@ import { type EditorView } from '@codemirror/view';
7
7
  import { type NodeArg } from '@dxos/app-graph';
8
8
  import { type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';
9
9
 
10
- import { createEditorAction, createEditorActionGroup, type EditorToolbarState } from './util';
11
10
  import { setHeading } from '../../extensions';
12
11
  import { translationKey } from '../../translations';
13
12
 
13
+ import { type EditorToolbarState, createEditorAction, createEditorActionGroup } from './util';
14
+
14
15
  const createHeadingGroupAction = (value: string) =>
15
16
  createEditorActionGroup(
16
17
  'heading',
@@ -34,10 +35,14 @@ const createHeadingActions = (getView: () => EditorView) =>
34
35
  '6': 'ph--text-h-six--regular',
35
36
  }).map(([levelStr, icon]) => {
36
37
  const level = parseInt(levelStr);
37
- return createEditorAction(`heading--${levelStr}`, () => setHeading(level)(getView()), {
38
- label: ['heading level label', { count: level, ns: translationKey }],
39
- icon,
40
- });
38
+ return createEditorAction(
39
+ `heading--${levelStr}`,
40
+ {
41
+ label: ['heading level label', { count: level, ns: translationKey }],
42
+ icon,
43
+ },
44
+ () => setHeading(level)(getView()),
45
+ );
41
46
  });
42
47
 
43
48
  const computeHeadingValue = (state: EditorToolbarState) => {