@dxos/react-ui-editor 0.8.4-main.3f58842 → 0.8.4-main.548089c

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 (340) 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 +8004 -6623
  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 +71 -1
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/browser/types/index.mjs +1 -1
  9. package/dist/lib/node-esm/{chunk-YXYQPV6R.mjs → chunk-YJZGD3LY.mjs} +2 -2
  10. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs.map +7 -0
  11. package/dist/lib/node-esm/index.mjs +8004 -6623
  12. package/dist/lib/node-esm/index.mjs.map +4 -4
  13. package/dist/lib/node-esm/meta.json +1 -1
  14. package/dist/lib/node-esm/testing/index.mjs +71 -1
  15. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  16. package/dist/lib/node-esm/types/index.mjs +1 -1
  17. package/dist/types/src/components/Editor/Editor.d.ts +24 -9
  18. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  19. package/dist/types/src/components/Editor/Editor.stories.d.ts +27 -0
  20. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +17 -2
  22. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  23. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  24. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  25. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  26. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  27. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -1
  28. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  29. package/dist/types/src/components/EditorToolbar/util.d.ts +8 -22
  30. package/dist/types/src/components/EditorToolbar/util.d.ts.map +1 -1
  31. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +1 -1
  32. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  33. package/dist/types/src/components/index.d.ts +0 -1
  34. package/dist/types/src/components/index.d.ts.map +1 -1
  35. package/dist/types/src/defaults.d.ts.map +1 -1
  36. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +26 -0
  37. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +1 -0
  38. package/dist/types/src/extensions/autocomplete/index.d.ts +5 -0
  39. package/dist/types/src/extensions/autocomplete/index.d.ts.map +1 -0
  40. package/dist/types/src/extensions/autocomplete/match.d.ts +13 -0
  41. package/dist/types/src/extensions/autocomplete/match.d.ts.map +1 -0
  42. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +20 -0
  43. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +1 -0
  44. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +10 -0
  45. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +1 -0
  46. package/dist/types/src/extensions/automerge/automerge.d.ts +1 -1
  47. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  48. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +10 -19
  49. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  50. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  51. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  52. package/dist/types/src/extensions/automerge/defs.d.ts +1 -1
  53. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
  54. package/dist/types/src/extensions/automerge/sync.d.ts +3 -3
  55. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  56. package/dist/types/src/extensions/automerge/update-automerge.d.ts +1 -1
  57. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  58. package/dist/types/src/extensions/autoscroll.d.ts +20 -0
  59. package/dist/types/src/extensions/autoscroll.d.ts.map +1 -0
  60. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +1 -1
  61. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
  62. package/dist/types/src/extensions/blocks.d.ts +2 -0
  63. package/dist/types/src/extensions/blocks.d.ts.map +1 -0
  64. package/dist/types/src/extensions/bookmarks.d.ts +12 -0
  65. package/dist/types/src/extensions/bookmarks.d.ts.map +1 -0
  66. package/dist/types/src/extensions/comments.d.ts +1 -1
  67. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  68. package/dist/types/src/extensions/dnd.d.ts.map +1 -1
  69. package/dist/types/src/extensions/factories.d.ts +11 -11
  70. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  71. package/dist/types/src/extensions/focus.d.ts.map +1 -1
  72. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  73. package/dist/types/src/extensions/index.d.ts +8 -1
  74. package/dist/types/src/extensions/index.d.ts.map +1 -1
  75. package/dist/types/src/extensions/json.d.ts +1 -1
  76. package/dist/types/src/extensions/json.d.ts.map +1 -1
  77. package/dist/types/src/extensions/listener.d.ts +8 -6
  78. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  79. package/dist/types/src/extensions/markdown/action.d.ts.map +1 -1
  80. package/dist/types/src/extensions/markdown/bundle.d.ts +8 -2
  81. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  82. package/dist/types/src/extensions/markdown/changes.d.ts +1 -1
  83. package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
  84. package/dist/types/src/extensions/markdown/decorate.d.ts +9 -1
  85. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  86. package/dist/types/src/extensions/markdown/formatting.d.ts +2 -3
  87. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  88. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +1 -1
  89. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
  90. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
  91. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  92. package/dist/types/src/extensions/modes.d.ts +1 -1
  93. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  94. package/dist/types/src/extensions/outliner/menu.d.ts +8 -0
  95. package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -0
  96. package/dist/types/src/extensions/outliner/outliner.d.ts +1 -1
  97. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
  98. package/dist/types/src/extensions/outliner/selection.d.ts.map +1 -1
  99. package/dist/types/src/extensions/outliner/tree.d.ts +2 -2
  100. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
  101. package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts +36 -0
  102. package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts.map +1 -0
  103. package/dist/types/src/extensions/popover/index.d.ts +8 -0
  104. package/dist/types/src/extensions/popover/index.d.ts.map +1 -0
  105. package/dist/types/src/extensions/popover/menu-presets.d.ts +4 -0
  106. package/dist/types/src/extensions/popover/menu-presets.d.ts.map +1 -0
  107. package/dist/types/src/extensions/popover/menu.d.ts +24 -0
  108. package/dist/types/src/extensions/popover/menu.d.ts.map +1 -0
  109. package/dist/types/src/extensions/popover/modal.d.ts +7 -0
  110. package/dist/types/src/extensions/popover/modal.d.ts.map +1 -0
  111. package/dist/types/src/extensions/popover/popover.d.ts +47 -0
  112. package/dist/types/src/extensions/popover/popover.d.ts.map +1 -0
  113. package/dist/types/src/extensions/popover/usePopoverMenu.d.ts +34 -0
  114. package/dist/types/src/extensions/popover/usePopoverMenu.d.ts.map +1 -0
  115. package/dist/types/src/extensions/popover/util.d.ts +8 -0
  116. package/dist/types/src/extensions/popover/util.d.ts.map +1 -0
  117. package/dist/types/src/extensions/preview/preview.d.ts +8 -8
  118. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  119. package/dist/types/src/extensions/replacer.d.ts +21 -0
  120. package/dist/types/src/extensions/replacer.d.ts.map +1 -0
  121. package/dist/types/src/extensions/replacer.test.d.ts +2 -0
  122. package/dist/types/src/extensions/replacer.test.d.ts.map +1 -0
  123. package/dist/types/src/extensions/scrolling.d.ts +78 -0
  124. package/dist/types/src/extensions/scrolling.d.ts.map +1 -0
  125. package/dist/types/src/extensions/state.d.ts +2 -0
  126. package/dist/types/src/extensions/state.d.ts.map +1 -0
  127. package/dist/types/src/extensions/tags/extended-markdown.d.ts +10 -0
  128. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +1 -0
  129. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +2 -0
  130. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +1 -0
  131. package/dist/types/src/extensions/tags/index.d.ts +4 -0
  132. package/dist/types/src/extensions/tags/index.d.ts.map +1 -0
  133. package/dist/types/src/extensions/tags/streamer.d.ts +12 -0
  134. package/dist/types/src/extensions/tags/streamer.d.ts.map +1 -0
  135. package/dist/types/src/extensions/tags/xml-tags.d.ts +97 -0
  136. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -0
  137. package/dist/types/src/extensions/tags/xml-util.d.ts +10 -0
  138. package/dist/types/src/extensions/tags/xml-util.d.ts.map +1 -0
  139. package/dist/types/src/hooks/useTextEditor.d.ts +4 -8
  140. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  141. package/dist/types/src/stories/CommandDialog.stories.d.ts +14 -0
  142. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
  143. package/dist/types/src/stories/Comments.stories.d.ts +21 -10
  144. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  145. package/dist/types/src/stories/EditorToolbar.stories.d.ts +39 -3
  146. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  147. package/dist/types/src/stories/Experimental.stories.d.ts +22 -13
  148. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  149. package/dist/types/src/stories/Markdown.stories.d.ts +32 -43
  150. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  151. package/dist/types/src/stories/Outliner.stories.d.ts +15 -21
  152. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  153. package/dist/types/src/stories/Popover.stories.d.ts +20 -0
  154. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  155. package/dist/types/src/stories/Preview.stories.d.ts +21 -7
  156. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  157. package/dist/types/src/stories/Tags.stories.d.ts +16 -0
  158. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  159. package/dist/types/src/stories/TextEditor.stories.d.ts +37 -52
  160. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  161. package/dist/types/src/stories/components/EditorStory.d.ts +6 -9
  162. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  163. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  164. package/dist/types/src/styles/theme.d.ts.map +1 -1
  165. package/dist/types/src/testing/PreviewPopover.d.ts +20 -0
  166. package/dist/types/src/testing/PreviewPopover.d.ts.map +1 -0
  167. package/dist/types/src/testing/index.d.ts +1 -0
  168. package/dist/types/src/testing/index.d.ts.map +1 -1
  169. package/dist/types/src/testing/util.d.ts +1 -0
  170. package/dist/types/src/testing/util.d.ts.map +1 -1
  171. package/dist/types/src/translations.d.ts +1 -1
  172. package/dist/types/src/types/types.d.ts +2 -2
  173. package/dist/types/src/types/types.d.ts.map +1 -1
  174. package/dist/types/src/util/cursor.d.ts.map +1 -1
  175. package/dist/types/src/util/debug.d.ts +1 -1
  176. package/dist/types/src/util/debug.d.ts.map +1 -1
  177. package/dist/types/src/util/decorations.d.ts +4 -0
  178. package/dist/types/src/util/decorations.d.ts.map +1 -0
  179. package/dist/types/src/util/dom.d.ts +2 -12
  180. package/dist/types/src/util/dom.d.ts.map +1 -1
  181. package/dist/types/src/util/index.d.ts +1 -0
  182. package/dist/types/src/util/index.d.ts.map +1 -1
  183. package/dist/types/src/util/react.d.ts +1 -1
  184. package/dist/types/src/util/react.d.ts.map +1 -1
  185. package/dist/types/tsconfig.tsbuildinfo +1 -1
  186. package/package.json +73 -62
  187. package/src/components/Editor/Editor.stories.tsx +69 -0
  188. package/src/components/Editor/Editor.tsx +58 -15
  189. package/src/components/EditorToolbar/EditorToolbar.tsx +106 -95
  190. package/src/components/EditorToolbar/blocks.ts +21 -24
  191. package/src/components/EditorToolbar/formatting.ts +22 -25
  192. package/src/components/EditorToolbar/headings.ts +16 -9
  193. package/src/components/EditorToolbar/image.ts +8 -4
  194. package/src/components/EditorToolbar/lists.ts +16 -19
  195. package/src/components/EditorToolbar/search.ts +8 -4
  196. package/src/components/EditorToolbar/util.ts +20 -25
  197. package/src/components/EditorToolbar/view-mode.ts +11 -6
  198. package/src/components/index.ts +0 -1
  199. package/src/defaults.ts +5 -2
  200. package/src/extensions/autocomplete/autocomplete.ts +220 -0
  201. package/src/extensions/autocomplete/index.ts +8 -0
  202. package/src/extensions/autocomplete/match.ts +46 -0
  203. package/src/extensions/{command → autocomplete}/placeholder.ts +22 -18
  204. package/src/extensions/{command → autocomplete}/typeahead.ts +8 -50
  205. package/src/extensions/automerge/automerge.stories.tsx +32 -25
  206. package/src/extensions/automerge/automerge.ts +31 -11
  207. package/src/extensions/automerge/cursor.ts +1 -1
  208. package/src/extensions/automerge/defs.ts +1 -1
  209. package/src/extensions/automerge/sync.ts +9 -5
  210. package/src/extensions/automerge/update-automerge.ts +2 -2
  211. package/src/extensions/autoscroll.ts +163 -0
  212. package/src/extensions/awareness/awareness-provider.ts +2 -2
  213. package/src/extensions/awareness/awareness.ts +2 -2
  214. package/src/extensions/blocks.ts +131 -0
  215. package/src/extensions/bookmarks.ts +75 -0
  216. package/src/extensions/comments.ts +20 -14
  217. package/src/extensions/dnd.ts +1 -1
  218. package/src/extensions/factories.ts +54 -35
  219. package/src/extensions/focus.ts +5 -4
  220. package/src/extensions/folding.tsx +3 -6
  221. package/src/extensions/hashtag.tsx +2 -2
  222. package/src/extensions/index.ts +8 -1
  223. package/src/extensions/json.ts +1 -1
  224. package/src/extensions/listener.ts +14 -20
  225. package/src/extensions/markdown/action.ts +2 -1
  226. package/src/extensions/markdown/bundle.ts +40 -6
  227. package/src/extensions/markdown/changes.ts +1 -1
  228. package/src/extensions/markdown/decorate.ts +32 -22
  229. package/src/extensions/markdown/formatting.test.ts +6 -6
  230. package/src/extensions/markdown/formatting.ts +11 -11
  231. package/src/extensions/markdown/highlight.ts +2 -2
  232. package/src/extensions/markdown/image.ts +5 -6
  233. package/src/extensions/markdown/link.ts +3 -0
  234. package/src/extensions/markdown/table.ts +13 -7
  235. package/src/extensions/mention.ts +1 -1
  236. package/src/extensions/modes.ts +2 -2
  237. package/src/extensions/{command/floating-menu.ts → outliner/menu.ts} +16 -21
  238. package/src/extensions/outliner/outliner.test.ts +3 -2
  239. package/src/extensions/outliner/outliner.ts +7 -6
  240. package/src/extensions/outliner/selection.ts +1 -1
  241. package/src/extensions/outliner/tree.test.ts +2 -1
  242. package/src/extensions/outliner/tree.ts +2 -2
  243. package/src/extensions/popover/PopoverMenuProvider.tsx +220 -0
  244. package/src/extensions/popover/index.ts +12 -0
  245. package/src/extensions/popover/menu-presets.ts +124 -0
  246. package/src/extensions/popover/menu.ts +67 -0
  247. package/src/extensions/popover/modal.ts +24 -0
  248. package/src/extensions/popover/popover.ts +289 -0
  249. package/src/extensions/popover/usePopoverMenu.ts +173 -0
  250. package/src/extensions/popover/util.ts +29 -0
  251. package/src/extensions/preview/index.ts +1 -1
  252. package/src/extensions/preview/preview.ts +69 -69
  253. package/src/extensions/replacer.test.ts +75 -0
  254. package/src/extensions/replacer.ts +93 -0
  255. package/src/extensions/scrolling.ts +189 -0
  256. package/src/extensions/selection.ts +3 -3
  257. package/src/extensions/state.ts +7 -0
  258. package/src/extensions/tags/extended-markdown.test.ts +262 -0
  259. package/src/extensions/tags/extended-markdown.ts +78 -0
  260. package/src/extensions/tags/index.ts +7 -0
  261. package/src/extensions/tags/streamer.ts +243 -0
  262. package/src/extensions/tags/xml-tags.ts +500 -0
  263. package/src/extensions/tags/xml-util.ts +94 -0
  264. package/src/extensions/typewriter.ts +1 -1
  265. package/src/hooks/useTextEditor.ts +27 -39
  266. package/src/stories/CommandDialog.stories.tsx +83 -0
  267. package/src/stories/Comments.stories.tsx +15 -11
  268. package/src/stories/EditorToolbar.stories.tsx +17 -17
  269. package/src/stories/Experimental.stories.tsx +17 -13
  270. package/src/stories/Markdown.stories.tsx +25 -21
  271. package/src/stories/Outliner.stories.tsx +54 -35
  272. package/src/stories/Popover.stories.tsx +161 -0
  273. package/src/stories/Preview.stories.tsx +48 -40
  274. package/src/stories/Tags.stories.tsx +95 -0
  275. package/src/stories/TextEditor.stories.tsx +41 -60
  276. package/src/stories/components/EditorStory.tsx +19 -18
  277. package/src/stories/components/util.tsx +39 -6
  278. package/src/styles/markdown.ts +1 -1
  279. package/src/styles/theme.ts +16 -12
  280. package/src/testing/PreviewPopover.tsx +80 -0
  281. package/src/testing/index.ts +1 -0
  282. package/src/testing/util.ts +2 -0
  283. package/src/translations.ts +1 -1
  284. package/src/types/types.ts +1 -1
  285. package/src/util/cursor.ts +2 -1
  286. package/src/util/debug.ts +2 -2
  287. package/src/util/decorations.ts +21 -0
  288. package/src/util/dom.ts +5 -27
  289. package/src/util/index.ts +1 -0
  290. package/src/util/react.tsx +1 -1
  291. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
  292. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  293. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  294. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  295. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  296. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  297. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  298. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  299. package/dist/types/src/components/Popover/index.d.ts +0 -4
  300. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  301. package/dist/types/src/extensions/autocomplete.d.ts +0 -13
  302. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  303. package/dist/types/src/extensions/command/action.d.ts +0 -17
  304. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  305. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  306. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  307. package/dist/types/src/extensions/command/command.d.ts +0 -6
  308. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  309. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  310. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  311. package/dist/types/src/extensions/command/hint.d.ts +0 -24
  312. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  313. package/dist/types/src/extensions/command/index.d.ts +0 -7
  314. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  315. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  316. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  317. package/dist/types/src/extensions/command/state.d.ts +0 -16
  318. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  319. package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
  320. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  321. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  322. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  323. package/dist/types/src/stories/Command.stories.d.ts +0 -7
  324. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  325. package/dist/types/src/stories/CommandMenu.stories.d.ts +0 -13
  326. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  327. package/src/components/Popover/CommandMenu.tsx +0 -279
  328. package/src/components/Popover/RefDropdownMenu.tsx +0 -85
  329. package/src/components/Popover/RefPopover.tsx +0 -99
  330. package/src/components/Popover/index.ts +0 -7
  331. package/src/extensions/autocomplete.ts +0 -69
  332. package/src/extensions/command/action.ts +0 -56
  333. package/src/extensions/command/command-menu.ts +0 -210
  334. package/src/extensions/command/command.ts +0 -34
  335. package/src/extensions/command/hint.ts +0 -102
  336. package/src/extensions/command/index.ts +0 -10
  337. package/src/extensions/command/state.ts +0 -89
  338. package/src/extensions/command/useCommandMenu.ts +0 -118
  339. package/src/stories/Command.stories.tsx +0 -97
  340. package/src/stories/CommandMenu.stories.tsx +0 -159
@@ -2,32 +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';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
9
8
  import React from 'react';
10
9
 
11
10
  import { log } from '@dxos/log';
12
- import { withLayout, withTheme, type Meta } from '@dxos/storybook-utils';
11
+ import { withTheme } from '@dxos/react-ui/testing';
13
12
 
14
- import {
15
- EditorStory,
16
- allExtensions,
17
- content,
18
- defaultExtensions,
19
- global,
20
- largeWithImages,
21
- links,
22
- longText,
23
- names,
24
- renderLinkButton,
25
- text,
26
- } from './components';
27
13
  import { editorMonospace } from '../defaults';
28
14
  import {
29
15
  InputModeExtensions,
30
- autocomplete,
31
16
  decorateMarkdown,
32
17
  folding,
33
18
  image,
@@ -39,12 +24,27 @@ import {
39
24
  } from '../extensions';
40
25
  import { str } from '../testing';
41
26
 
42
- const meta: Meta<typeof EditorStory> = {
27
+ import {
28
+ EditorStory,
29
+ allExtensions,
30
+ content,
31
+ defaultExtensions,
32
+ global,
33
+ largeWithImages,
34
+ longText,
35
+ names,
36
+ text,
37
+ } from './components';
38
+
39
+ const meta = {
43
40
  title: 'ui/react-ui-editor/TextEditor',
44
41
  component: EditorStory,
45
- decorators: [withTheme, withLayout({ fullscreen: true })],
46
- parameters: { layout: 'fullscreen', controls: { disable: true } },
47
- };
42
+ decorators: [withTheme],
43
+ parameters: {
44
+ layout: 'fullscreen',
45
+ controls: { disable: true },
46
+ },
47
+ } satisfies Meta<typeof EditorStory>;
48
48
 
49
49
  export default meta;
50
50
 
@@ -52,7 +52,9 @@ export default meta;
52
52
  // Default
53
53
  //
54
54
 
55
- export const Default = {
55
+ type Story = StoryObj<typeof meta>;
56
+
57
+ export const Default: Story = {
56
58
  render: () => <EditorStory text={text} extensions={defaultExtensions} />,
57
59
  };
58
60
 
@@ -60,7 +62,7 @@ export const Default = {
60
62
  // Everything
61
63
  //
62
64
 
63
- export const Everything = {
65
+ export const Everything: Story = {
64
66
  render: () => <EditorStory text={text} extensions={allExtensions} selection={{ anchor: 99, head: 110 }} />,
65
67
  };
66
68
 
@@ -68,7 +70,7 @@ export const Everything = {
68
70
  // Empty
69
71
  //
70
72
 
71
- export const Empty = {
73
+ export const Empty: Story = {
72
74
  render: () => <EditorStory extensions={defaultExtensions} />,
73
75
  };
74
76
 
@@ -76,7 +78,7 @@ export const Empty = {
76
78
  // Readonly
77
79
  //
78
80
 
79
- export const Readonly = {
81
+ export const Readonly: Story = {
80
82
  render: () => <EditorStory text={text} extensions={defaultExtensions} readOnly />,
81
83
  };
82
84
 
@@ -84,7 +86,7 @@ export const Readonly = {
84
86
  // No Extensions
85
87
  //
86
88
 
87
- export const NoExtensions = {
89
+ export const NoExtensions: Story = {
88
90
  render: () => <EditorStory text={text} />,
89
91
  };
90
92
 
@@ -92,7 +94,7 @@ export const NoExtensions = {
92
94
  // Vim
93
95
  //
94
96
 
95
- export const Vim = {
97
+ export const Vim: Story = {
96
98
  render: () => (
97
99
  <EditorStory
98
100
  text={str('# Vim Mode', '', 'The distant future. The year 2000.', '', content.paragraphs)}
@@ -105,16 +107,16 @@ export const Vim = {
105
107
  // Listener
106
108
  //
107
109
 
108
- export const Listener = {
110
+ export const Listener: Story = {
109
111
  render: () => (
110
112
  <EditorStory
111
113
  text={str('# Listener', '', content.footer)}
112
114
  extensions={[
113
115
  listener({
114
- onFocus: (focusing) => {
116
+ onFocus: ({ focusing }) => {
115
117
  log.info('listener', { focusing });
116
118
  },
117
- onChange: (text) => {
119
+ onChange: ({ text }) => {
118
120
  log.info('listener', { text });
119
121
  },
120
122
  }),
@@ -127,7 +129,7 @@ export const Listener = {
127
129
  // Folding
128
130
  //
129
131
 
130
- export const Folding = {
132
+ export const Folding: Story = {
131
133
  render: () => <EditorStory text={text} extensions={[folding()]} />,
132
134
  };
133
135
 
@@ -135,7 +137,7 @@ export const Folding = {
135
137
  // Scrolling
136
138
  //
137
139
 
138
- export const Scrolling = {
140
+ export const Scrolling: Story = {
139
141
  render: () => (
140
142
  <EditorStory
141
143
  text={str('# Large Document', '', longText)}
@@ -147,13 +149,13 @@ export const Scrolling = {
147
149
  ),
148
150
  };
149
151
 
150
- export const ScrollingWithImages = {
152
+ export const ScrollingWithImages: Story = {
151
153
  render: () => (
152
154
  <EditorStory text={str('# Large Document', '', largeWithImages)} extensions={[decorateMarkdown(), image()]} />
153
155
  ),
154
156
  };
155
157
 
156
- export const ScrollTo = {
158
+ export const ScrollTo: Story = {
157
159
  render: () => {
158
160
  // NOTE: Selection won't appear if text is reformatted.
159
161
  const word = 'Scroll to here...';
@@ -174,7 +176,7 @@ export const ScrollTo = {
174
176
  // Typescript
175
177
  //
176
178
 
177
- export const Typescript = {
179
+ export const Typescript: Story = {
178
180
  render: () => (
179
181
  <EditorStory
180
182
  text={content.typescript}
@@ -184,38 +186,17 @@ export const Typescript = {
184
186
  ),
185
187
  };
186
188
 
187
- //
188
- // Autocomplete
189
- //
190
-
191
- export const Autocomplete = {
192
- render: () => (
193
- <EditorStory
194
- text={str('# Autocomplete', '', 'Press Ctrl-Space...', content.footer)}
195
- extensions={[
196
- decorateMarkdown({ renderLinkButton }),
197
- autocomplete({
198
- onSearch: (text) => {
199
- return links.filter(({ label }) => label.toLowerCase().includes(text.toLowerCase()));
200
- },
201
- }),
202
- ]}
203
- />
204
- ),
205
- };
206
-
207
189
  //
208
190
  // Typeahead
209
191
  //
210
192
 
211
- const completions = ['type', 'AND', 'OR', 'NOT', 'dxos.org'];
193
+ const completions = ['hello world!', 'dxos.org'];
212
194
 
213
- export const Typeahead = {
195
+ export const Typeahead: Story = {
214
196
  render: () => (
215
197
  <EditorStory
216
198
  text={str('# Typeahead', '')}
217
199
  extensions={[
218
- decorateMarkdown({ renderLinkButton }),
219
200
  typeahead({
220
201
  onComplete: staticCompletion(completions, { minLength: 2 }),
221
202
  }),
@@ -228,7 +209,7 @@ export const Typeahead = {
228
209
  // Mention
229
210
  //
230
211
 
231
- export const Mention = {
212
+ export const Mention: Story = {
232
213
  render: () => (
233
214
  <EditorStory
234
215
  text={str('# Mention', '', 'Type @...', content.footer)}
@@ -245,7 +226,7 @@ export const Mention = {
245
226
  // Search
246
227
  //
247
228
 
248
- export const Search = {
229
+ export const Search: Story = {
249
230
  render: () => (
250
231
  <EditorStory
251
232
  text={str('# Search', text)}
@@ -3,39 +3,39 @@
3
3
  //
4
4
 
5
5
  import { type EditorView } from '@codemirror/view';
6
- import React, { type ReactNode, forwardRef, useEffect, useState, useImperativeHandle, useMemo } from 'react';
6
+ import React, { type ReactNode, forwardRef, useEffect, useImperativeHandle, useMemo, 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
13
  import { useForwardedRef, useThemeContext } from '@dxos/react-ui';
14
14
  import { useAttentionAttributes } from '@dxos/react-ui-attention';
15
15
  import { JsonFilter } from '@dxos/react-ui-syntax-highlighter';
16
16
  import { mx } from '@dxos/react-ui-theme';
17
17
  import { isNonNullable } from '@dxos/util';
18
18
 
19
- import { editorSlots, editorGutter } from '../../defaults';
19
+ import { editorGutter, editorSlots } from '../../defaults';
20
20
  import {
21
21
  type DebugNode,
22
22
  type ThemeExtensionsOptions,
23
- createDataExtensions,
24
23
  createBasicExtensions,
24
+ createDataExtensions,
25
25
  createMarkdownExtensions,
26
26
  createThemeExtensions,
27
27
  debugTree,
28
+ decorateMarkdown,
28
29
  } from '../../extensions';
29
- import { useTextEditor, type UseTextEditorProps } from '../../hooks';
30
+ import { type UseTextEditorProps, useTextEditor } from '../../hooks';
30
31
 
31
32
  // Type definitions.
32
33
  export type DebugMode = 'raw' | 'tree' | 'raw+tree';
33
34
 
34
35
  const defaultId = 'editor-' + PublicKey.random().toHex().slice(0, 8);
35
36
 
36
- export type StoryProps = Pick<UseTextEditorProps, 'scrollTo' | 'selection' | 'extensions'> &
37
+ export type StoryProps = Pick<UseTextEditorProps, 'id' | 'scrollTo' | 'selection' | 'extensions'> &
37
38
  Pick<ThemeExtensionsOptions, 'slots'> & {
38
- id?: string;
39
39
  debug?: DebugMode;
40
40
  debugCustom?: (view: EditorView) => ReactNode;
41
41
  text?: string;
@@ -46,25 +46,25 @@ export type StoryProps = Pick<UseTextEditorProps, 'scrollTo' | 'selection' | 'ex
46
46
  onReady?: (view: EditorView) => void;
47
47
  };
48
48
 
49
- export const EditorStory = forwardRef<EditorView | undefined, StoryProps>(
49
+ export const EditorStory = forwardRef<EditorView | null, StoryProps>(
50
50
  ({ debug, debugCustom, text, extensions: _extensions, ...props }, forwardedRef) => {
51
- const attentionAttrs = useAttentionAttributes('testing');
51
+ const attentionAttrs = useAttentionAttributes('test-panel');
52
52
  const [tree, setTree] = useState<DebugNode>();
53
53
  const [object] = useState(createObject(live(Expando, { content: text ?? '' })));
54
54
  const viewRef = useForwardedRef(forwardedRef);
55
- const view = viewRef.current;
56
55
  const extensions = useMemo(
57
56
  () => (debug ? [_extensions, debugTree(setTree)].filter(isNonNullable) : _extensions),
58
57
  [debug, _extensions],
59
58
  );
60
59
 
60
+ const view = viewRef.current;
61
61
  return (
62
- <div className={mx('w-full h-full grid overflow-hidden', debug && 'grid-cols-2 lg:grid-cols-[1fr_600px]')}>
62
+ <div className={mx('is-full bs-full grid overflow-hidden', debug && 'grid-cols-2 lg:grid-cols-[1fr_600px]')}>
63
63
  <EditorComponent ref={viewRef} object={object} text={text} extensions={extensions} {...props} />
64
64
 
65
65
  {debug && (
66
66
  <div
67
- className='grid h-full auto-rows-fr border-l border-separator divide-y divide-separator overflow-hidden'
67
+ className='grid bs-full auto-rows-fr border-l border-separator divide-y divide-separator overflow-hidden'
68
68
  {...attentionAttrs}
69
69
  >
70
70
  {view && debugCustom?.(view)}
@@ -84,7 +84,7 @@ export const EditorStory = forwardRef<EditorView | undefined, StoryProps>(
84
84
  /**
85
85
  * Default story component.
86
86
  */
87
- export const EditorComponent = forwardRef<EditorView | undefined, StoryProps>(
87
+ export const EditorComponent = forwardRef<EditorView | null, StoryProps>(
88
88
  (
89
89
  {
90
90
  id = defaultId,
@@ -112,9 +112,10 @@ export const EditorComponent = forwardRef<EditorView | undefined, StoryProps>(
112
112
  initialValue: text,
113
113
  extensions: [
114
114
  createDataExtensions({ id, text: createDocAccessor(object, ['content']) }),
115
- createBasicExtensions({ readOnly, placeholder, lineNumbers, scrollPastEnd: true }),
116
- createMarkdownExtensions({ themeMode }),
115
+ createBasicExtensions({ readOnly, placeholder, lineNumbers, scrollPastEnd: true, search: true }),
116
+ createMarkdownExtensions(),
117
117
  createThemeExtensions({ themeMode, syntaxHighlighting: true, slots }),
118
+ decorateMarkdown(),
118
119
  editorGutter,
119
120
  extensions || [],
120
121
  ],
@@ -122,7 +123,7 @@ export const EditorComponent = forwardRef<EditorView | undefined, StoryProps>(
122
123
  [id, object, extensions, themeMode],
123
124
  );
124
125
 
125
- useImperativeHandle(forwardedRef, () => view, [view]);
126
+ useImperativeHandle<EditorView | null, EditorView | null>(forwardedRef, () => view, [view]);
126
127
 
127
128
  useEffect(() => {
128
129
  if (view) {
@@ -27,6 +27,7 @@ export const num = () => faker.number.int({ min: 0, max: 9999 }).toLocaleString(
27
27
  export const img = '![dxos](https://dxos.network/dxos-logotype-blue.png)';
28
28
 
29
29
  export const code = str(
30
+ // prettier-ignore
30
31
  '// Code',
31
32
  'const Component = () => {',
32
33
  ' const x = 100;',
@@ -38,7 +39,7 @@ export const code = str(
38
39
  // Content blocks for stories
39
40
  export const content = {
40
41
  tasks: str(
41
- //
42
+ // prettier-ignore
42
43
  '### TaskList',
43
44
  '',
44
45
  `- [x] ${faker.lorem.sentences()}`,
@@ -50,7 +51,7 @@ export const content = {
50
51
  ),
51
52
 
52
53
  bullets: str(
53
- //
54
+ // prettier-ignore
54
55
  '### BulletList',
55
56
  '',
56
57
  `- ${faker.lorem.sentences()}`,
@@ -62,7 +63,7 @@ export const content = {
62
63
  ),
63
64
 
64
65
  numbered: str(
65
- //
66
+ // prettier-ignore
66
67
  '### OrderedList (part 1)',
67
68
  '',
68
69
  `1. ${faker.lorem.sentences()}`,
@@ -81,11 +82,34 @@ export const content = {
81
82
 
82
83
  typescript: code,
83
84
 
84
- codeblocks: str('### Code', '', '```bash', '$ ls -las', '```', '', '```tsx', code, '```', ''),
85
+ codeblocks: str(
86
+ // prettier-ignore
87
+ '### Code',
88
+ '',
89
+ '```bash',
90
+ '$ ls -las',
91
+ '```',
92
+ '',
93
+ '```tsx',
94
+ code,
95
+ '```',
96
+ '',
97
+ ),
85
98
 
86
- comment: str('<!--', 'A comment', '-->', '', 'No comment.', 'Partial comment. <!-- comment. -->'),
99
+ comment: str(
100
+ // prettier-ignore
101
+ '### Comment',
102
+ '',
103
+ '<!--',
104
+ 'A comment',
105
+ '-->',
106
+ '',
107
+ 'Partial comment. <!-- comment. -->',
108
+ '',
109
+ ),
87
110
 
88
111
  links: str(
112
+ // prettier-ignore
89
113
  '### Links',
90
114
  '',
91
115
  'This is a naked link https://dxos.org within a sentence.',
@@ -97,6 +121,7 @@ export const content = {
97
121
  ),
98
122
 
99
123
  table: str(
124
+ // prettier-ignore
100
125
  '### Tables',
101
126
  '',
102
127
  `| ${faker.lorem.word().padStart(12)} | ${faker.lorem.word().padStart(12)} | ${faker.lorem.word().padStart(12)} |`,
@@ -113,9 +138,16 @@ export const content = {
113
138
  ...[1, 2, 3, 4, 5, 6].map((level) => ['#'.repeat(level) + ` Heading ${level}`, faker.lorem.sentences(), '']).flat(),
114
139
  ),
115
140
 
116
- formatting: str('### Formatting', '', 'This this is **bold**, ~~strikethrough~~, _italic_, and `f(INLINE)`.', ''),
141
+ formatting: str(
142
+ // prettier-ignore
143
+ '### Formatting',
144
+ '',
145
+ 'This this is **bold**, ~~strikethrough~~, _italic_, and `f(INLINE)`.',
146
+ '',
147
+ ),
117
148
 
118
149
  blockquotes: str(
150
+ // prettier-ignore
119
151
  '### Blockquotes',
120
152
  '',
121
153
  '> This is a block quote.',
@@ -154,6 +186,7 @@ export const text = str(
154
186
  '---',
155
187
  '## Misc',
156
188
  content.codeblocks,
189
+ content.comment,
157
190
  content.table,
158
191
  content.image,
159
192
  content.footer,
@@ -21,6 +21,6 @@ export const theme = {
21
21
  codeMark: 'font-mono text-primary-500',
22
22
  mark: 'opacity-50',
23
23
  heading: (level: HeadingLevel) => {
24
- return mx(headings[level], 'dark:text-primary-400');
24
+ return mx(headings[level], 'dark:text-neutral-400');
25
25
  },
26
26
  };
@@ -64,7 +64,7 @@ export const defaultTheme: ThemeStyles = {
64
64
  fontFamily: fontBody,
65
65
  // NOTE: Base font size (otherwise defined by HTML tag, which might be different for storybook).
66
66
  fontSize: '16px',
67
- lineHeight: 1.5,
67
+ lineHeight: '24px',
68
68
  color: 'unset',
69
69
  },
70
70
 
@@ -74,12 +74,12 @@ export const defaultTheme: ThemeStyles = {
74
74
  */
75
75
  '.cm-gutters': {
76
76
  borderRight: 'none',
77
- background: 'transparent',
78
77
  },
79
78
  '.cm-gutter': {},
80
79
  '.cm-gutter.cm-lineNumbers': {
81
80
  paddingRight: '4px',
82
81
  borderRight: '1px solid var(--dx-subduedSeparator)',
82
+ color: 'var(--dx-subduedText)',
83
83
  },
84
84
  '.cm-gutter.cm-lineNumbers .cm-gutterElement': {
85
85
  minWidth: '40px',
@@ -88,14 +88,15 @@ export const defaultTheme: ThemeStyles = {
88
88
  * Height is set to match the corresponding line (which may have wrapped).
89
89
  */
90
90
  '.cm-gutterElement': {
91
- fontSize: '12px',
92
91
  lineHeight: '24px',
92
+ fontSize: '12px',
93
93
  },
94
94
 
95
95
  /**
96
96
  * Line.
97
97
  */
98
98
  '.cm-line': {
99
+ lineHeight: '24px',
99
100
  paddingInline: 0,
100
101
  },
101
102
  '.cm-activeLine': {
@@ -109,6 +110,7 @@ export const defaultTheme: ThemeStyles = {
109
110
  borderLeft: '2px solid var(--dx-cmCursor)',
110
111
  },
111
112
  '.cm-placeholder': {
113
+ fontFamily: fontBody,
112
114
  color: 'var(--dx-placeholder)',
113
115
  },
114
116
 
@@ -164,10 +166,10 @@ export const defaultTheme: ThemeStyles = {
164
166
  * https://github.com/codemirror/autocomplete/blob/main/src/completion.ts
165
167
  */
166
168
  '.cm-tooltip.cm-tooltip-autocomplete': {
167
- marginTop: '4px',
168
- marginLeft: '-3px',
169
- borderColor: 'var(--dx-separator)',
170
- borderTop: 'none',
169
+ marginTop: '6px',
170
+ marginLeft: '-10px',
171
+ border: '2px solid var(--dx-separator)',
172
+ borderRadius: '4px',
171
173
  },
172
174
  '.cm-tooltip.cm-tooltip-autocomplete > ul': {
173
175
  maxHeight: '20em',
@@ -176,12 +178,12 @@ export const defaultTheme: ThemeStyles = {
176
178
  padding: '4px',
177
179
  },
178
180
  '.cm-tooltip.cm-tooltip-autocomplete > ul > li[aria-selected]': {
179
- background: 'var(--dx-hoverSurface)',
181
+ background: 'var(--dx-activeSurface)',
182
+ color: 'var(--dx-activeSurfaceText)',
180
183
  },
181
184
  '.cm-tooltip.cm-tooltip-autocomplete > ul > completion-section': {
182
185
  paddingLeft: '4px !important',
183
- borderBottom: 'none !important',
184
- color: 'var(--dx-accentText)',
186
+ color: 'var(--dx-hoverSurfaceText)',
185
187
  },
186
188
 
187
189
  '.cm-completionInfo': {
@@ -195,10 +197,12 @@ export const defaultTheme: ThemeStyles = {
195
197
  },
196
198
  '.cm-completionLabel': {
197
199
  fontFamily: fontBody,
200
+ color: 'var(--dx-description)',
201
+ padding: '0 4px',
198
202
  },
199
203
  '.cm-completionMatchedText': {
200
204
  textDecoration: 'none !important',
201
- opacity: 0.5,
205
+ color: 'var(--dx-baseText)',
202
206
  },
203
207
 
204
208
  /**
@@ -232,7 +236,7 @@ export const defaultTheme: ThemeStyles = {
232
236
  outline: '1px solid transparent',
233
237
  },
234
238
  '.cm-panel input, .cm-panel button': {
235
- backgroundColor: 'var(--dx-input)',
239
+ backgroundColor: 'var(--dx-inputSurface)',
236
240
  },
237
241
  '.cm-panel input:focus, .cm-panel button:focus': {
238
242
  outline: '1px solid var(--dx-neutralFocusIndicator)',
@@ -0,0 +1,80 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { createContext } from '@radix-ui/react-context';
6
+ import React, { type PropsWithChildren, type RefObject, useCallback, useEffect, useRef, useState } from 'react';
7
+
8
+ import { addEventListener } from '@dxos/async';
9
+ import { type DxAnchorActivate, Popover } from '@dxos/react-ui';
10
+
11
+ import { type PreviewLinkRef, type PreviewLinkTarget } from '../extensions';
12
+
13
+ type PreviewLookup = (link: PreviewLinkRef) => Promise<PreviewLinkTarget | null | undefined>;
14
+
15
+ type PreviewPopoverValue = Partial<{
16
+ link: PreviewLinkRef;
17
+ target: PreviewLinkTarget;
18
+ pending: boolean;
19
+ }>;
20
+
21
+ const [PreviewPopoverContextProvider, usePreviewPopover] = createContext<PreviewPopoverValue>('PreviewPopover', {});
22
+
23
+ type PopoverLookupProviderProps = PropsWithChildren<{
24
+ onLookup?: PreviewLookup;
25
+ }>;
26
+
27
+ // TOOD(burdon): Reconcile with PreviewPlugin?
28
+ const PreviewPopoverProvider = ({ children, onLookup }: PopoverLookupProviderProps) => {
29
+ const trigger = useRef<HTMLElement | null>(null);
30
+ const [value, setValue] = useState<PreviewPopoverValue>({});
31
+ const [open, setOpen] = useState(false);
32
+
33
+ const handleDxAnchorActivate = useCallback(
34
+ (event: DxAnchorActivate) => {
35
+ const { refId, label, trigger: dxTrigger } = event;
36
+ setValue((value) => ({
37
+ ...value,
38
+ link: { label, ref: refId },
39
+ pending: true,
40
+ }));
41
+ trigger.current = dxTrigger;
42
+ queueMicrotask(() => setOpen(true));
43
+ void onLookup?.({ label, ref: refId }).then((target) =>
44
+ setValue((value) => ({
45
+ ...value,
46
+ target: target ?? undefined,
47
+ pending: false,
48
+ })),
49
+ );
50
+ },
51
+ [onLookup],
52
+ );
53
+
54
+ const [rootRef, setRootRef] = useState<HTMLDivElement | null>(null);
55
+ useEffect(() => {
56
+ if (!rootRef || !handleDxAnchorActivate) {
57
+ return;
58
+ }
59
+
60
+ return addEventListener(rootRef, 'dx-anchor-activate' as any, handleDxAnchorActivate, {
61
+ capture: true,
62
+ passive: false,
63
+ });
64
+ }, [rootRef, handleDxAnchorActivate]);
65
+
66
+ return (
67
+ <PreviewPopoverContextProvider pending={value.pending} link={value.link} target={value.target}>
68
+ <Popover.Root open={open} onOpenChange={setOpen}>
69
+ <Popover.VirtualTrigger virtualRef={trigger as unknown as RefObject<HTMLButtonElement>} />
70
+ <div role='none' className='contents' ref={setRootRef}>
71
+ {children}
72
+ </div>
73
+ </Popover.Root>
74
+ </PreviewPopoverContextProvider>
75
+ );
76
+ };
77
+
78
+ export { PreviewPopoverProvider, usePreviewPopover };
79
+
80
+ export type { PopoverLookupProviderProps, PreviewPopoverValue };
@@ -3,3 +3,4 @@
3
3
  //
4
4
 
5
5
  export * from './util';
6
+ export * from './PreviewPopover';
@@ -2,4 +2,6 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ /** deprecated Replace with @dxos/util trim */
6
+ // TODO(burdon): Remove
5
7
  export const str = (...lines: string[]) => lines.join('\n');
@@ -24,8 +24,8 @@ export const translations = [
24
24
  'selection overlaps existing comment label': 'Selection overlaps existing comment',
25
25
  'select text to comment label': 'Select text to comment',
26
26
  'image label': 'Insert image',
27
- 'heading label': 'Heading level',
28
27
  'table label': 'Create table',
28
+ 'heading label': 'Heading level',
29
29
  'heading level label_zero': 'Paragraph',
30
30
  'heading level label_one': 'Heading level {{count}}',
31
31
  'heading level label_other': 'Heading level {{count}}',
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { type EditorView } from '@codemirror/view';
6
- import { Schema } from 'effect';
6
+ import * as Schema from 'effect/Schema';
7
7
 
8
8
  // Runtime data structure.
9
9
  export type Range = {
@@ -4,9 +4,10 @@
4
4
 
5
5
  import { type EditorState } from '@codemirror/state';
6
6
 
7
- import { singleValueFacet } from './facet';
8
7
  import { type Range } from '../types';
9
8
 
9
+ import { singleValueFacet } from './facet';
10
+
10
11
  /**
11
12
  * Determines if two ranges overlap.
12
13
  * A range is considered to overlap if there is any intersection