@dxos/react-ui-editor 0.8.4-main.5ad4a44 → 0.8.4-main.66e292d

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 (280) hide show
  1. package/dist/lib/browser/index.mjs +2979 -2478
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +2979 -2478
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/components/Editor/Editor.d.ts +37 -21
  8. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  9. package/dist/types/src/components/Editor/Editor.stories.d.ts +20 -0
  10. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -0
  11. package/dist/types/src/components/EditorContent/EditorContent.d.ts +29 -0
  12. package/dist/types/src/components/EditorContent/EditorContent.d.ts.map +1 -0
  13. package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts +26 -0
  14. package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts.map +1 -0
  15. package/dist/types/src/components/EditorContent/controller.d.ts +10 -0
  16. package/dist/types/src/components/EditorContent/controller.d.ts.map +1 -0
  17. package/dist/types/src/components/EditorContent/index.d.ts +3 -0
  18. package/dist/types/src/components/EditorContent/index.d.ts.map +1 -0
  19. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts +36 -0
  20. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorMenuProvider/index.d.ts +7 -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/EditorMenuProvider/util.d.ts +8 -0
  32. package/dist/types/src/components/EditorMenuProvider/util.d.ts.map +1 -0
  33. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +16 -0
  34. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -0
  35. package/dist/types/src/components/EditorPreviewProvider/index.d.ts +2 -0
  36. package/dist/types/src/components/EditorPreviewProvider/index.d.ts.map +1 -0
  37. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +26 -2
  38. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  39. package/dist/types/src/components/EditorToolbar/actions.d.ts +39 -0
  40. package/dist/types/src/components/EditorToolbar/actions.d.ts.map +1 -0
  41. package/dist/types/src/components/EditorToolbar/blocks.d.ts +3 -3
  42. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  43. package/dist/types/src/components/EditorToolbar/formatting.d.ts +3 -3
  44. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  45. package/dist/types/src/components/EditorToolbar/headings.d.ts +3 -3
  46. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  47. package/dist/types/src/components/EditorToolbar/index.d.ts +2 -1
  48. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  49. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts +11 -0
  50. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts.map +1 -0
  51. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +3 -3
  52. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  53. package/dist/types/src/components/index.d.ts +4 -2
  54. package/dist/types/src/components/index.d.ts.map +1 -1
  55. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +17 -0
  56. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +1 -0
  57. package/dist/types/src/extensions/autocomplete/index.d.ts +5 -0
  58. package/dist/types/src/extensions/autocomplete/index.d.ts.map +1 -0
  59. package/dist/types/src/extensions/autocomplete/match.d.ts +13 -0
  60. package/dist/types/src/extensions/autocomplete/match.d.ts.map +1 -0
  61. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +20 -0
  62. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +1 -0
  63. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +10 -0
  64. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +1 -0
  65. package/dist/types/src/extensions/automerge/automerge.d.ts +1 -1
  66. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  67. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  68. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  69. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  70. package/dist/types/src/extensions/automerge/sync.d.ts +3 -3
  71. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  72. package/dist/types/src/extensions/automerge/update-automerge.d.ts +1 -1
  73. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  74. package/dist/types/src/extensions/autoscroll.d.ts +14 -4
  75. package/dist/types/src/extensions/autoscroll.d.ts.map +1 -1
  76. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +4 -4
  77. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
  78. package/dist/types/src/extensions/blocks.d.ts +2 -0
  79. package/dist/types/src/extensions/blocks.d.ts.map +1 -0
  80. package/dist/types/src/extensions/bookmarks.d.ts +12 -0
  81. package/dist/types/src/extensions/bookmarks.d.ts.map +1 -0
  82. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  83. package/dist/types/src/extensions/factories.d.ts +7 -6
  84. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  85. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  86. package/dist/types/src/extensions/index.d.ts +8 -3
  87. package/dist/types/src/extensions/index.d.ts.map +1 -1
  88. package/dist/types/src/extensions/listener.d.ts +8 -6
  89. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  90. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  91. package/dist/types/src/extensions/markdown/formatting.d.ts +1 -3
  92. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  93. package/dist/types/src/extensions/modal.d.ts +7 -0
  94. package/dist/types/src/extensions/modal.d.ts.map +1 -0
  95. package/dist/types/src/extensions/modes.d.ts +1 -1
  96. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  97. package/dist/types/src/extensions/outliner/menu.d.ts +8 -0
  98. package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -0
  99. package/dist/types/src/extensions/preview/preview.d.ts +6 -3
  100. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  101. package/dist/types/src/extensions/replacer.d.ts +21 -0
  102. package/dist/types/src/extensions/replacer.d.ts.map +1 -0
  103. package/dist/types/src/extensions/replacer.test.d.ts +2 -0
  104. package/dist/types/src/extensions/replacer.test.d.ts.map +1 -0
  105. package/dist/types/src/extensions/scrolling.d.ts +78 -0
  106. package/dist/types/src/extensions/scrolling.d.ts.map +1 -0
  107. package/dist/types/src/extensions/state.d.ts +2 -0
  108. package/dist/types/src/extensions/state.d.ts.map +1 -0
  109. package/dist/types/src/extensions/submit.d.ts +10 -0
  110. package/dist/types/src/extensions/submit.d.ts.map +1 -0
  111. package/dist/types/src/extensions/tab.d.ts +4 -0
  112. package/dist/types/src/extensions/tab.d.ts.map +1 -0
  113. package/dist/types/src/extensions/tags/xml-tags.d.ts +41 -16
  114. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -1
  115. package/dist/types/src/hooks/useTextEditor.d.ts +3 -7
  116. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  117. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -1
  118. package/dist/types/src/stories/Comments.stories.d.ts +3 -3
  119. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  120. package/dist/types/src/stories/Experimental.stories.d.ts +3 -3
  121. package/dist/types/src/stories/Markdown.stories.d.ts +3 -3
  122. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  123. package/dist/types/src/stories/{CommandMenu.stories.d.ts → Popover.stories.d.ts} +6 -5
  124. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  125. package/dist/types/src/stories/Preview.stories.d.ts +4 -3
  126. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  127. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -1
  128. package/dist/types/src/stories/TextEditor.stories.d.ts +3 -4
  129. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  130. package/dist/types/src/stories/components/EditorStory.d.ts +11 -8
  131. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  132. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  133. package/dist/types/src/styles/theme.d.ts.map +1 -1
  134. package/dist/types/src/util/debug.d.ts +4 -0
  135. package/dist/types/src/util/debug.d.ts.map +1 -1
  136. package/dist/types/tsconfig.tsbuildinfo +1 -1
  137. package/package.json +44 -46
  138. package/src/components/Editor/Editor.stories.tsx +89 -0
  139. package/src/components/Editor/Editor.tsx +157 -57
  140. package/src/components/EditorContent/EditorContent.stories.tsx +70 -0
  141. package/src/components/EditorContent/EditorContent.tsx +70 -0
  142. package/src/components/EditorContent/controller.ts +50 -0
  143. package/src/components/EditorContent/index.ts +6 -0
  144. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +233 -0
  145. package/src/components/EditorMenuProvider/index.ts +11 -0
  146. package/src/components/EditorMenuProvider/menu-presets.ts +123 -0
  147. package/src/components/EditorMenuProvider/menu.ts +71 -0
  148. package/src/components/EditorMenuProvider/popover.ts +287 -0
  149. package/src/components/EditorMenuProvider/useEditorMenu.ts +175 -0
  150. package/src/components/EditorMenuProvider/util.ts +31 -0
  151. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +82 -0
  152. package/src/components/EditorPreviewProvider/index.ts +5 -0
  153. package/src/components/EditorToolbar/EditorToolbar.tsx +101 -92
  154. package/src/components/EditorToolbar/{lists.ts → actions.ts} +46 -16
  155. package/src/components/EditorToolbar/blocks.ts +2 -1
  156. package/src/components/EditorToolbar/formatting.ts +2 -1
  157. package/src/components/EditorToolbar/headings.ts +8 -5
  158. package/src/components/EditorToolbar/image.ts +1 -1
  159. package/src/components/EditorToolbar/index.ts +3 -7
  160. package/src/components/EditorToolbar/search.ts +1 -1
  161. package/src/components/EditorToolbar/useEditorToolbar.ts +20 -0
  162. package/src/components/EditorToolbar/view-mode.ts +2 -1
  163. package/src/components/index.ts +8 -2
  164. package/src/extensions/{autocomplete.ts → autocomplete/autocomplete.ts} +8 -76
  165. package/src/extensions/autocomplete/index.ts +8 -0
  166. package/src/extensions/autocomplete/match.ts +46 -0
  167. package/src/extensions/{command-menu → autocomplete}/placeholder.ts +21 -17
  168. package/src/extensions/{command-dialog → autocomplete}/typeahead.ts +6 -48
  169. package/src/extensions/automerge/automerge.stories.tsx +4 -3
  170. package/src/extensions/automerge/automerge.ts +28 -9
  171. package/src/extensions/automerge/cursor.ts +1 -1
  172. package/src/extensions/automerge/sync.ts +8 -4
  173. package/src/extensions/automerge/update-automerge.ts +1 -1
  174. package/src/extensions/autoscroll.ts +75 -69
  175. package/src/extensions/awareness/awareness-provider.ts +12 -12
  176. package/src/extensions/blocks.ts +131 -0
  177. package/src/extensions/bookmarks.ts +75 -0
  178. package/src/extensions/comments.ts +2 -1
  179. package/src/extensions/factories.ts +22 -24
  180. package/src/extensions/folding.tsx +1 -2
  181. package/src/extensions/index.ts +8 -3
  182. package/src/extensions/listener.ts +14 -20
  183. package/src/extensions/markdown/bundle.ts +14 -2
  184. package/src/extensions/markdown/decorate.ts +8 -8
  185. package/src/extensions/markdown/formatting.ts +8 -10
  186. package/src/extensions/markdown/highlight.ts +1 -1
  187. package/src/extensions/markdown/image.ts +2 -2
  188. package/src/extensions/markdown/table.ts +6 -6
  189. package/src/extensions/modal.ts +24 -0
  190. package/src/extensions/modes.ts +2 -2
  191. package/src/extensions/{floating-menu.ts → outliner/menu.ts} +7 -5
  192. package/src/extensions/outliner/outliner.test.ts +1 -1
  193. package/src/extensions/outliner/outliner.ts +3 -3
  194. package/src/extensions/outliner/tree.test.ts +1 -1
  195. package/src/extensions/preview/index.ts +1 -1
  196. package/src/extensions/preview/preview.ts +14 -11
  197. package/src/extensions/replacer.test.ts +75 -0
  198. package/src/extensions/replacer.ts +93 -0
  199. package/src/extensions/scrolling.ts +189 -0
  200. package/src/extensions/selection.ts +1 -1
  201. package/src/extensions/state.ts +7 -0
  202. package/src/extensions/submit.ts +62 -0
  203. package/src/extensions/tab.ts +29 -0
  204. package/src/extensions/tags/extended-markdown.test.ts +2 -1
  205. package/src/extensions/tags/xml-tags.ts +310 -203
  206. package/src/extensions/typewriter.ts +1 -1
  207. package/src/hooks/useTextEditor.ts +25 -25
  208. package/src/stories/CommandDialog.stories.tsx +13 -19
  209. package/src/stories/Comments.stories.tsx +3 -4
  210. package/src/stories/EditorToolbar.stories.tsx +8 -8
  211. package/src/stories/Experimental.stories.tsx +1 -1
  212. package/src/stories/Markdown.stories.tsx +1 -1
  213. package/src/stories/Outliner.stories.tsx +15 -15
  214. package/src/stories/Popover.stories.tsx +162 -0
  215. package/src/stories/Preview.stories.tsx +41 -37
  216. package/src/stories/Tags.stories.tsx +19 -5
  217. package/src/stories/TextEditor.stories.tsx +4 -30
  218. package/src/stories/components/EditorStory.tsx +31 -20
  219. package/src/stories/components/util.tsx +40 -8
  220. package/src/styles/markdown.ts +1 -1
  221. package/src/styles/theme.ts +2 -1
  222. package/src/util/debug.ts +5 -0
  223. package/dist/lib/browser/testing/index.mjs +0 -76
  224. package/dist/lib/browser/testing/index.mjs.map +0 -7
  225. package/dist/lib/node-esm/testing/index.mjs +0 -78
  226. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  227. package/dist/types/src/components/CommandMenu/CommandMenu.d.ts +0 -38
  228. package/dist/types/src/components/CommandMenu/CommandMenu.d.ts.map +0 -1
  229. package/dist/types/src/components/CommandMenu/index.d.ts +0 -2
  230. package/dist/types/src/components/CommandMenu/index.d.ts.map +0 -1
  231. package/dist/types/src/components/EditorToolbar/lists.d.ts +0 -19
  232. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +0 -1
  233. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -51
  234. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  235. package/dist/types/src/extensions/autocomplete.d.ts +0 -26
  236. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  237. package/dist/types/src/extensions/command-dialog/action.d.ts +0 -17
  238. package/dist/types/src/extensions/command-dialog/action.d.ts.map +0 -1
  239. package/dist/types/src/extensions/command-dialog/command-dialog.d.ts +0 -6
  240. package/dist/types/src/extensions/command-dialog/command-dialog.d.ts.map +0 -1
  241. package/dist/types/src/extensions/command-dialog/hint.d.ts +0 -19
  242. package/dist/types/src/extensions/command-dialog/hint.d.ts.map +0 -1
  243. package/dist/types/src/extensions/command-dialog/index.d.ts +0 -4
  244. package/dist/types/src/extensions/command-dialog/index.d.ts.map +0 -1
  245. package/dist/types/src/extensions/command-dialog/state.d.ts +0 -16
  246. package/dist/types/src/extensions/command-dialog/state.d.ts.map +0 -1
  247. package/dist/types/src/extensions/command-dialog/typeahead.d.ts +0 -22
  248. package/dist/types/src/extensions/command-dialog/typeahead.d.ts.map +0 -1
  249. package/dist/types/src/extensions/command-menu/command-menu.d.ts +0 -20
  250. package/dist/types/src/extensions/command-menu/command-menu.d.ts.map +0 -1
  251. package/dist/types/src/extensions/command-menu/index.d.ts +0 -3
  252. package/dist/types/src/extensions/command-menu/index.d.ts.map +0 -1
  253. package/dist/types/src/extensions/command-menu/placeholder.d.ts +0 -10
  254. package/dist/types/src/extensions/command-menu/placeholder.d.ts.map +0 -1
  255. package/dist/types/src/extensions/command-menu/useCommandMenu.d.ts +0 -24
  256. package/dist/types/src/extensions/command-menu/useCommandMenu.d.ts.map +0 -1
  257. package/dist/types/src/extensions/floating-menu.d.ts +0 -7
  258. package/dist/types/src/extensions/floating-menu.d.ts.map +0 -1
  259. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  260. package/dist/types/src/testing/PreviewPopover.d.ts +0 -20
  261. package/dist/types/src/testing/PreviewPopover.d.ts.map +0 -1
  262. package/dist/types/src/testing/index.d.ts +0 -3
  263. package/dist/types/src/testing/index.d.ts.map +0 -1
  264. package/dist/types/src/testing/util.d.ts +0 -3
  265. package/dist/types/src/testing/util.d.ts.map +0 -1
  266. package/src/components/CommandMenu/CommandMenu.tsx +0 -348
  267. package/src/components/CommandMenu/index.ts +0 -5
  268. package/src/components/EditorToolbar/util.ts +0 -76
  269. package/src/extensions/command-dialog/action.ts +0 -55
  270. package/src/extensions/command-dialog/command-dialog.ts +0 -34
  271. package/src/extensions/command-dialog/hint.ts +0 -103
  272. package/src/extensions/command-dialog/index.ts +0 -7
  273. package/src/extensions/command-dialog/state.ts +0 -90
  274. package/src/extensions/command-menu/command-menu.ts +0 -210
  275. package/src/extensions/command-menu/index.ts +0 -6
  276. package/src/extensions/command-menu/useCommandMenu.ts +0 -134
  277. package/src/stories/CommandMenu.stories.tsx +0 -158
  278. package/src/testing/PreviewPopover.tsx +0 -78
  279. package/src/testing/index.ts +0 -6
  280. package/src/testing/util.ts +0 -7
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
- import React, { useState } from 'react';
6
+ import React, { useEffect, useState } from 'react';
7
7
  import { createPortal } from 'react-dom';
8
8
 
9
9
  import { useThemeContext } from '@dxos/react-ui';
@@ -22,10 +22,22 @@ import {
22
22
  import { useTextEditor } from '../hooks';
23
23
 
24
24
  const registry = {
25
- // <test/>
25
+ /**
26
+ * Custom tag: <test/>
27
+ */
26
28
  ['test' as const]: {
27
29
  block: true,
28
- Component: () => <div className='p-2 border border-separator rounded'>Test</div>,
30
+ Component: () => {
31
+ const [count, setCount] = useState(0);
32
+ useEffect(() => {
33
+ const interval = setInterval(() => {
34
+ setCount((prev) => prev + 1);
35
+ }, 1_000);
36
+ return () => clearInterval(interval);
37
+ }, []);
38
+
39
+ return <div className='p-2 border border-separator rounded'>Test {count}</div>;
40
+ },
29
41
  },
30
42
  } satisfies XmlWidgetRegistry;
31
43
 
@@ -36,7 +48,7 @@ const DefaultStory = ({ text }: { text?: string }) => {
36
48
  initialValue: text,
37
49
  extensions: [
38
50
  createThemeExtensions({ themeMode }),
39
- createBasicExtensions({ lineWrapping: true, readOnly: true }),
51
+ createBasicExtensions({ lineWrapping: true }),
40
52
  decorateMarkdown(),
41
53
  extendedMarkdown({ registry }),
42
54
  xmlTags({ registry, setWidgets }),
@@ -56,13 +68,15 @@ const DefaultStory = ({ text }: { text?: string }) => {
56
68
  const text = trim`
57
69
  # Tags
58
70
 
71
+ React widget below.
72
+
59
73
  <test id="123" />
60
74
 
61
75
  React widget above.
62
76
  `;
63
77
 
64
78
  const meta = {
65
- title: 'ui/react-ui-editor/Tags',
79
+ title: 'ui/react-ui-editor/XmlTags',
66
80
  render: DefaultStory,
67
81
  decorators: [withTheme],
68
82
  parameters: {
@@ -13,7 +13,6 @@ import { withTheme } from '@dxos/react-ui/testing';
13
13
  import { editorMonospace } from '../defaults';
14
14
  import {
15
15
  InputModeExtensions,
16
- autocomplete,
17
16
  decorateMarkdown,
18
17
  folding,
19
18
  image,
@@ -23,7 +22,7 @@ import {
23
22
  staticCompletion,
24
23
  typeahead,
25
24
  } from '../extensions';
26
- import { str } from '../testing';
25
+ import { str } from '../util';
27
26
 
28
27
  import {
29
28
  EditorStory,
@@ -32,10 +31,8 @@ import {
32
31
  defaultExtensions,
33
32
  global,
34
33
  largeWithImages,
35
- links,
36
34
  longText,
37
35
  names,
38
- renderLinkButton,
39
36
  text,
40
37
  } from './components';
41
38
 
@@ -116,10 +113,10 @@ export const Listener: Story = {
116
113
  text={str('# Listener', '', content.footer)}
117
114
  extensions={[
118
115
  listener({
119
- onFocus: (focusing) => {
116
+ onFocus: ({ focusing }) => {
120
117
  log.info('listener', { focusing });
121
118
  },
122
- onChange: (text) => {
119
+ onChange: ({ text }) => {
123
120
  log.info('listener', { text });
124
121
  },
125
122
  }),
@@ -189,40 +186,17 @@ export const Typescript: Story = {
189
186
  ),
190
187
  };
191
188
 
192
- //
193
- // Autocomplete
194
- //
195
-
196
- export const Autocomplete: Story = {
197
- render: () => (
198
- <EditorStory
199
- text={str('# Autocomplete', '', 'Press Ctrl-Space...', content.footer)}
200
- extensions={[
201
- decorateMarkdown({ renderLinkButton }),
202
- autocomplete({
203
- onSuggest: (text) => {
204
- return links
205
- .filter(({ label }) => label.toLowerCase().includes(text.toLowerCase()))
206
- .map(({ label }) => label);
207
- },
208
- }),
209
- ]}
210
- />
211
- ),
212
- };
213
-
214
189
  //
215
190
  // Typeahead
216
191
  //
217
192
 
218
- const completions = ['type', 'AND', 'OR', 'NOT', 'dxos.org'];
193
+ const completions = ['hello world!', 'dxos.org'];
219
194
 
220
195
  export const Typeahead: Story = {
221
196
  render: () => (
222
197
  <EditorStory
223
198
  text={str('# Typeahead', '')}
224
199
  extensions={[
225
- decorateMarkdown({ renderLinkButton }),
226
200
  typeahead({
227
201
  onComplete: staticCompletion(completions, { minLength: 2 }),
228
202
  }),
@@ -3,28 +3,29 @@
3
3
  //
4
4
 
5
5
  import { type EditorView } from '@codemirror/view';
6
- import React, { type ReactNode, forwardRef, useEffect, useImperativeHandle, useMemo, useState } from 'react';
6
+ import type * as Schema from 'effect/Schema';
7
+ import React, { type ReactNode, forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
7
8
 
8
- import { Expando } from '@dxos/echo/internal';
9
- import { live } from '@dxos/echo/internal';
9
+ import { Obj, Type } from '@dxos/echo';
10
10
  import { invariant } from '@dxos/invariant';
11
11
  import { PublicKey } from '@dxos/keys';
12
- import { createDocAccessor, createObject } from '@dxos/react-client/echo';
13
- import { useForwardedRef, useThemeContext } from '@dxos/react-ui';
12
+ import { log } from '@dxos/log';
13
+ import { useMergeRefs, 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 { type EditorController, createEditorController } from '../../components';
19
20
  import { editorGutter, editorSlots } from '../../defaults';
20
21
  import {
21
22
  type DebugNode,
22
23
  type ThemeExtensionsOptions,
23
24
  createBasicExtensions,
24
- createDataExtensions,
25
25
  createMarkdownExtensions,
26
26
  createThemeExtensions,
27
27
  debugTree,
28
+ decorateMarkdown,
28
29
  } from '../../extensions';
29
30
  import { type UseTextEditorProps, useTextEditor } from '../../hooks';
30
31
 
@@ -38,32 +39,36 @@ export type StoryProps = Pick<UseTextEditorProps, 'id' | 'scrollTo' | 'selection
38
39
  debug?: DebugMode;
39
40
  debugCustom?: (view: EditorView) => ReactNode;
40
41
  text?: string;
41
- object?: Expando;
42
+ // TODO(wittjosiah): Find a simpler way to define this type.
43
+ object?: Obj.Obj<Schema.Schema.Type<typeof Type.Expando>>;
42
44
  readOnly?: boolean;
43
45
  placeholder?: string;
44
46
  lineNumbers?: boolean;
45
47
  onReady?: (view: EditorView) => void;
46
48
  };
47
49
 
48
- export const EditorStory = forwardRef<EditorView | null, StoryProps>(
49
- ({ debug, debugCustom, text, extensions: _extensions, ...props }, forwardedRef) => {
50
+ export const EditorStory = forwardRef<EditorController, StoryProps>(
51
+ ({ debug, debugCustom, text, extensions: extensionsParam, ...props }, forwardedRef) => {
52
+ const controllerRef = useRef<EditorController>(null);
53
+ const mergedRef = useMergeRefs([controllerRef, forwardedRef]);
54
+
50
55
  const attentionAttrs = useAttentionAttributes('test-panel');
51
56
  const [tree, setTree] = useState<DebugNode>();
52
- const [object] = useState(createObject(live(Expando, { content: text ?? '' })));
53
- const viewRef = useForwardedRef(forwardedRef);
57
+ const [object] = useState(Obj.make(Type.Expando, { content: text ?? '' }));
58
+
54
59
  const extensions = useMemo(
55
- () => (debug ? [_extensions, debugTree(setTree)].filter(isNonNullable) : _extensions),
56
- [debug, _extensions],
60
+ () => (debug ? [extensionsParam, debugTree(setTree)].filter(isNonNullable) : extensionsParam),
61
+ [debug, extensionsParam],
57
62
  );
58
63
 
59
- const view = viewRef.current;
64
+ const view = controllerRef.current?.view;
60
65
  return (
61
- <div className={mx('w-full h-full grid overflow-hidden', debug && 'grid-cols-2 lg:grid-cols-[1fr_600px]')}>
62
- <EditorComponent ref={viewRef} object={object} text={text} extensions={extensions} {...props} />
66
+ <div className={mx('is-full bs-full grid overflow-hidden', debug && 'grid-cols-2 lg:grid-cols-[1fr_600px]')}>
67
+ <EditorComponent ref={mergedRef} object={object} text={text} extensions={extensions} {...props} />
63
68
 
64
69
  {debug && (
65
70
  <div
66
- className='grid h-full auto-rows-fr border-l border-separator divide-y divide-separator overflow-hidden'
71
+ className='grid bs-full auto-rows-fr border-l border-separator divide-y divide-separator overflow-hidden'
67
72
  {...attentionAttrs}
68
73
  >
69
74
  {view && debugCustom?.(view)}
@@ -82,8 +87,10 @@ export const EditorStory = forwardRef<EditorView | null, StoryProps>(
82
87
 
83
88
  /**
84
89
  * Default story component.
90
+ * @deprecated
85
91
  */
86
- export const EditorComponent = forwardRef<EditorView | null, StoryProps>(
92
+ // TODO(burdon): Replace with <Editor.Root>
93
+ export const EditorComponent = forwardRef<EditorController, StoryProps>(
87
94
  (
88
95
  {
89
96
  id = defaultId,
@@ -110,10 +117,10 @@ export const EditorComponent = forwardRef<EditorView | null, StoryProps>(
110
117
  selection,
111
118
  initialValue: text,
112
119
  extensions: [
113
- createDataExtensions({ id, text: createDocAccessor(object, ['content']) }),
114
120
  createBasicExtensions({ readOnly, placeholder, lineNumbers, scrollPastEnd: true, search: true }),
115
121
  createMarkdownExtensions(),
116
122
  createThemeExtensions({ themeMode, syntaxHighlighting: true, slots }),
123
+ decorateMarkdown(),
117
124
  editorGutter,
118
125
  extensions || [],
119
126
  ],
@@ -121,7 +128,11 @@ export const EditorComponent = forwardRef<EditorView | null, StoryProps>(
121
128
  [id, object, extensions, themeMode],
122
129
  );
123
130
 
124
- useImperativeHandle<EditorView | null, EditorView | null>(forwardedRef, () => view, [view]);
131
+ // External controller.
132
+ useImperativeHandle(forwardedRef, () => {
133
+ log.info('view updated', { id });
134
+ return createEditorController(view);
135
+ }, [id, view]);
125
136
 
126
137
  useEffect(() => {
127
138
  if (view) {
@@ -19,14 +19,14 @@ import {
19
19
  linkTooltip,
20
20
  table,
21
21
  } from '../../extensions';
22
- import { str } from '../../testing';
23
- import { createRenderer } from '../../util';
22
+ import { createRenderer, str } from '../../util';
24
23
 
25
24
  export const num = () => faker.number.int({ min: 0, max: 9999 }).toLocaleString();
26
25
 
27
26
  export const img = '![dxos](https://dxos.network/dxos-logotype-blue.png)';
28
27
 
29
28
  export const code = str(
29
+ // prettier-ignore
30
30
  '// Code',
31
31
  'const Component = () => {',
32
32
  ' const x = 100;',
@@ -38,7 +38,7 @@ export const code = str(
38
38
  // Content blocks for stories
39
39
  export const content = {
40
40
  tasks: str(
41
- //
41
+ // prettier-ignore
42
42
  '### TaskList',
43
43
  '',
44
44
  `- [x] ${faker.lorem.sentences()}`,
@@ -50,7 +50,7 @@ export const content = {
50
50
  ),
51
51
 
52
52
  bullets: str(
53
- //
53
+ // prettier-ignore
54
54
  '### BulletList',
55
55
  '',
56
56
  `- ${faker.lorem.sentences()}`,
@@ -62,7 +62,7 @@ export const content = {
62
62
  ),
63
63
 
64
64
  numbered: str(
65
- //
65
+ // prettier-ignore
66
66
  '### OrderedList (part 1)',
67
67
  '',
68
68
  `1. ${faker.lorem.sentences()}`,
@@ -81,11 +81,34 @@ export const content = {
81
81
 
82
82
  typescript: code,
83
83
 
84
- codeblocks: str('### Code', '', '```bash', '$ ls -las', '```', '', '```tsx', code, '```', ''),
84
+ codeblocks: str(
85
+ // prettier-ignore
86
+ '### Code',
87
+ '',
88
+ '```bash',
89
+ '$ ls -las',
90
+ '```',
91
+ '',
92
+ '```tsx',
93
+ code,
94
+ '```',
95
+ '',
96
+ ),
85
97
 
86
- comment: str('<!--', 'A comment', '-->', '', 'No comment.', 'Partial comment. <!-- comment. -->'),
98
+ comment: str(
99
+ // prettier-ignore
100
+ '### Comment',
101
+ '',
102
+ '<!--',
103
+ 'A comment',
104
+ '-->',
105
+ '',
106
+ 'Partial comment. <!-- comment. -->',
107
+ '',
108
+ ),
87
109
 
88
110
  links: str(
111
+ // prettier-ignore
89
112
  '### Links',
90
113
  '',
91
114
  'This is a naked link https://dxos.org within a sentence.',
@@ -97,6 +120,7 @@ export const content = {
97
120
  ),
98
121
 
99
122
  table: str(
123
+ // prettier-ignore
100
124
  '### Tables',
101
125
  '',
102
126
  `| ${faker.lorem.word().padStart(12)} | ${faker.lorem.word().padStart(12)} | ${faker.lorem.word().padStart(12)} |`,
@@ -113,9 +137,16 @@ export const content = {
113
137
  ...[1, 2, 3, 4, 5, 6].map((level) => ['#'.repeat(level) + ` Heading ${level}`, faker.lorem.sentences(), '']).flat(),
114
138
  ),
115
139
 
116
- formatting: str('### Formatting', '', 'This this is **bold**, ~~strikethrough~~, _italic_, and `f(INLINE)`.', ''),
140
+ formatting: str(
141
+ // prettier-ignore
142
+ '### Formatting',
143
+ '',
144
+ 'This this is **bold**, ~~strikethrough~~, _italic_, and `f(INLINE)`.',
145
+ '',
146
+ ),
117
147
 
118
148
  blockquotes: str(
149
+ // prettier-ignore
119
150
  '### Blockquotes',
120
151
  '',
121
152
  '> This is a block quote.',
@@ -154,6 +185,7 @@ export const text = str(
154
185
  '---',
155
186
  '## Misc',
156
187
  content.codeblocks,
188
+ content.comment,
157
189
  content.table,
158
190
  content.image,
159
191
  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
  };
@@ -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',
@@ -110,6 +110,7 @@ export const defaultTheme: ThemeStyles = {
110
110
  borderLeft: '2px solid var(--dx-cmCursor)',
111
111
  },
112
112
  '.cm-placeholder': {
113
+ fontFamily: fontBody,
113
114
  color: 'var(--dx-placeholder)',
114
115
  },
115
116
 
package/src/util/debug.ts CHANGED
@@ -7,6 +7,11 @@ import { type EditorView } from '@codemirror/view';
7
7
 
8
8
  import { log } from '@dxos/log';
9
9
 
10
+ /**
11
+ * @deprecated Use `trim` from `@dxos/util`.
12
+ */
13
+ export const str = (...lines: string[]) => lines.join('\n');
14
+
10
15
  export const wrapWithCatch = (fn: (...args: any[]) => any, label?: string) => {
11
16
  return (...args: any[]) => {
12
17
  try {
@@ -1,76 +0,0 @@
1
- // src/testing/util.ts
2
- var str = (...lines) => lines.join("\n");
3
-
4
- // src/testing/PreviewPopover.tsx
5
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
6
- import { createContext } from "@radix-ui/react-context";
7
- import React, { useCallback, useEffect, useRef, useState } from "react";
8
- import { addEventListener } from "@dxos/async";
9
- import { Popover } from "@dxos/react-ui";
10
- var [PreviewPopoverContextProvider, usePreviewPopover] = createContext("PreviewPopover", {});
11
- var PreviewPopoverProvider = ({ children, onLookup }) => {
12
- var _effect = _useSignals();
13
- try {
14
- const trigger = useRef(null);
15
- const [value, setValue] = useState({});
16
- const [open, setOpen] = useState(false);
17
- const handleDxAnchorActivate = useCallback((event) => {
18
- const { refId, label, trigger: dxTrigger } = event;
19
- setValue((value2) => ({
20
- ...value2,
21
- link: {
22
- label,
23
- ref: refId
24
- },
25
- pending: true
26
- }));
27
- trigger.current = dxTrigger;
28
- queueMicrotask(() => setOpen(true));
29
- void onLookup?.({
30
- label,
31
- ref: refId
32
- }).then((target) => setValue((value2) => ({
33
- ...value2,
34
- target: target ?? void 0,
35
- pending: false
36
- })));
37
- }, [
38
- onLookup
39
- ]);
40
- const [rootRef, setRootRef] = useState(null);
41
- useEffect(() => {
42
- if (!rootRef || !handleDxAnchorActivate) {
43
- return;
44
- }
45
- return addEventListener(rootRef, "dx-anchor-activate", handleDxAnchorActivate, {
46
- capture: true,
47
- passive: false
48
- });
49
- }, [
50
- rootRef,
51
- handleDxAnchorActivate
52
- ]);
53
- return /* @__PURE__ */ React.createElement(PreviewPopoverContextProvider, {
54
- pending: value.pending,
55
- link: value.link,
56
- target: value.target
57
- }, /* @__PURE__ */ React.createElement(Popover.Root, {
58
- open,
59
- onOpenChange: setOpen
60
- }, /* @__PURE__ */ React.createElement(Popover.VirtualTrigger, {
61
- virtualRef: trigger
62
- }), /* @__PURE__ */ React.createElement("div", {
63
- role: "none",
64
- className: "contents",
65
- ref: setRootRef
66
- }, children)));
67
- } finally {
68
- _effect.f();
69
- }
70
- };
71
- export {
72
- PreviewPopoverProvider,
73
- str,
74
- usePreviewPopover
75
- };
76
- //# sourceMappingURL=index.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/testing/util.ts", "../../../../src/testing/PreviewPopover.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n/** deprecated Replace with @dxos/util trim */\n// TODO(burdon): Remove\nexport const str = (...lines: string[]) => lines.join('\\n');\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, type RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { addEventListener } from '@dxos/async';\nimport { type DxAnchorActivate, Popover } from '@dxos/react-ui';\n\nimport { type PreviewLinkRef, type PreviewLinkTarget } from '../extensions';\n\ntype PreviewLookup = (link: PreviewLinkRef) => Promise<PreviewLinkTarget | null | undefined>;\n\ntype PreviewPopoverValue = Partial<{\n link: PreviewLinkRef;\n target: PreviewLinkTarget;\n pending: boolean;\n}>;\n\nconst [PreviewPopoverContextProvider, usePreviewPopover] = createContext<PreviewPopoverValue>('PreviewPopover', {});\n\ntype PopoverLookupProviderProps = PropsWithChildren<{\n onLookup?: PreviewLookup;\n}>;\n\nconst PreviewPopoverProvider = ({ children, onLookup }: PopoverLookupProviderProps) => {\n const trigger = useRef<HTMLElement | null>(null);\n const [value, setValue] = useState<PreviewPopoverValue>({});\n const [open, setOpen] = useState(false);\n\n const handleDxAnchorActivate = useCallback(\n (event: DxAnchorActivate) => {\n const { refId, label, trigger: dxTrigger } = event;\n setValue((value) => ({\n ...value,\n link: { label, ref: refId },\n pending: true,\n }));\n trigger.current = dxTrigger;\n queueMicrotask(() => setOpen(true));\n void onLookup?.({ label, ref: refId }).then((target) =>\n setValue((value) => ({\n ...value,\n target: target ?? undefined,\n pending: false,\n })),\n );\n },\n [onLookup],\n );\n\n const [rootRef, setRootRef] = useState<HTMLDivElement | null>(null);\n useEffect(() => {\n if (!rootRef || !handleDxAnchorActivate) {\n return;\n }\n\n return addEventListener(rootRef, 'dx-anchor-activate' as any, handleDxAnchorActivate, {\n capture: true,\n passive: false,\n });\n }, [rootRef, handleDxAnchorActivate]);\n\n return (\n <PreviewPopoverContextProvider pending={value.pending} link={value.link} target={value.target}>\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.VirtualTrigger virtualRef={trigger as unknown as RefObject<HTMLButtonElement>} />\n <div role='none' className='contents' ref={setRootRef}>\n {children}\n </div>\n </Popover.Root>\n </PreviewPopoverContextProvider>\n );\n};\nexport { PreviewPopoverProvider, usePreviewPopover };\n\nexport type { PopoverLookupProviderProps, PreviewPopoverValue };\n"],
5
- "mappings": ";AAMO,IAAMA,MAAM,IAAIC,UAAoBA,MAAMC,KAAK,IAAA;;;;ACFtD,SAASC,qBAAqB;AAC9B,OAAOC,SAAiDC,aAAaC,WAAWC,QAAQC,gBAAgB;AAExG,SAASC,wBAAwB;AACjC,SAAgCC,eAAe;AAY/C,IAAM,CAACC,+BAA+BC,iBAAAA,IAAqBC,cAAmC,kBAAkB,CAAC,CAAA;AAMjH,IAAMC,yBAAyB,CAAC,EAAEC,UAAUC,SAAQ,MAA8B;;;AAChF,UAAMC,UAAUC,OAA2B,IAAA;AAC3C,UAAM,CAACC,OAAOC,QAAAA,IAAYC,SAA8B,CAAC,CAAA;AACzD,UAAM,CAACC,MAAMC,OAAAA,IAAWF,SAAS,KAAA;AAEjC,UAAMG,yBAAyBC,YAC7B,CAACC,UAAAA;AACC,YAAM,EAAEC,OAAOC,OAAOX,SAASY,UAAS,IAAKH;AAC7CN,eAAS,CAACD,YAAW;QACnB,GAAGA;QACHW,MAAM;UAAEF;UAAOG,KAAKJ;QAAM;QAC1BK,SAAS;MACX,EAAA;AACAf,cAAQgB,UAAUJ;AAClBK,qBAAe,MAAMX,QAAQ,IAAA,CAAA;AAC7B,WAAKP,WAAW;QAAEY;QAAOG,KAAKJ;MAAM,CAAA,EAAGQ,KAAK,CAACC,WAC3ChB,SAAS,CAACD,YAAW;QACnB,GAAGA;QACHiB,QAAQA,UAAUC;QAClBL,SAAS;MACX,EAAA,CAAA;IAEJ,GACA;MAAChB;KAAS;AAGZ,UAAM,CAACsB,SAASC,UAAAA,IAAclB,SAAgC,IAAA;AAC9DmB,cAAU,MAAA;AACR,UAAI,CAACF,WAAW,CAACd,wBAAwB;AACvC;MACF;AAEA,aAAOiB,iBAAiBH,SAAS,sBAA6Bd,wBAAwB;QACpFkB,SAAS;QACTC,SAAS;MACX,CAAA;IACF,GAAG;MAACL;MAASd;KAAuB;AAEpC,WACE,sBAAA,cAACb,+BAAAA;MAA8BqB,SAASb,MAAMa;MAASF,MAAMX,MAAMW;MAAMM,QAAQjB,MAAMiB;OACrF,sBAAA,cAACQ,QAAQC,MAAI;MAACvB;MAAYwB,cAAcvB;OACtC,sBAAA,cAACqB,QAAQG,gBAAc;MAACC,YAAY/B;QACpC,sBAAA,cAACgC,OAAAA;MAAIC,MAAK;MAAOC,WAAU;MAAWpB,KAAKQ;OACxCxB,QAAAA,CAAAA,CAAAA;;;;AAKX;",
6
- "names": ["str", "lines", "join", "createContext", "React", "useCallback", "useEffect", "useRef", "useState", "addEventListener", "Popover", "PreviewPopoverContextProvider", "usePreviewPopover", "createContext", "PreviewPopoverProvider", "children", "onLookup", "trigger", "useRef", "value", "setValue", "useState", "open", "setOpen", "handleDxAnchorActivate", "useCallback", "event", "refId", "label", "dxTrigger", "link", "ref", "pending", "current", "queueMicrotask", "then", "target", "undefined", "rootRef", "setRootRef", "useEffect", "addEventListener", "capture", "passive", "Popover", "Root", "onOpenChange", "VirtualTrigger", "virtualRef", "div", "role", "className"]
7
- }
@@ -1,78 +0,0 @@
1
- import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
-
3
- // src/testing/util.ts
4
- var str = (...lines) => lines.join("\n");
5
-
6
- // src/testing/PreviewPopover.tsx
7
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
8
- import { createContext } from "@radix-ui/react-context";
9
- import React, { useCallback, useEffect, useRef, useState } from "react";
10
- import { addEventListener } from "@dxos/async";
11
- import { Popover } from "@dxos/react-ui";
12
- var [PreviewPopoverContextProvider, usePreviewPopover] = createContext("PreviewPopover", {});
13
- var PreviewPopoverProvider = ({ children, onLookup }) => {
14
- var _effect = _useSignals();
15
- try {
16
- const trigger = useRef(null);
17
- const [value, setValue] = useState({});
18
- const [open, setOpen] = useState(false);
19
- const handleDxAnchorActivate = useCallback((event) => {
20
- const { refId, label, trigger: dxTrigger } = event;
21
- setValue((value2) => ({
22
- ...value2,
23
- link: {
24
- label,
25
- ref: refId
26
- },
27
- pending: true
28
- }));
29
- trigger.current = dxTrigger;
30
- queueMicrotask(() => setOpen(true));
31
- void onLookup?.({
32
- label,
33
- ref: refId
34
- }).then((target) => setValue((value2) => ({
35
- ...value2,
36
- target: target ?? void 0,
37
- pending: false
38
- })));
39
- }, [
40
- onLookup
41
- ]);
42
- const [rootRef, setRootRef] = useState(null);
43
- useEffect(() => {
44
- if (!rootRef || !handleDxAnchorActivate) {
45
- return;
46
- }
47
- return addEventListener(rootRef, "dx-anchor-activate", handleDxAnchorActivate, {
48
- capture: true,
49
- passive: false
50
- });
51
- }, [
52
- rootRef,
53
- handleDxAnchorActivate
54
- ]);
55
- return /* @__PURE__ */ React.createElement(PreviewPopoverContextProvider, {
56
- pending: value.pending,
57
- link: value.link,
58
- target: value.target
59
- }, /* @__PURE__ */ React.createElement(Popover.Root, {
60
- open,
61
- onOpenChange: setOpen
62
- }, /* @__PURE__ */ React.createElement(Popover.VirtualTrigger, {
63
- virtualRef: trigger
64
- }), /* @__PURE__ */ React.createElement("div", {
65
- role: "none",
66
- className: "contents",
67
- ref: setRootRef
68
- }, children)));
69
- } finally {
70
- _effect.f();
71
- }
72
- };
73
- export {
74
- PreviewPopoverProvider,
75
- str,
76
- usePreviewPopover
77
- };
78
- //# sourceMappingURL=index.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/testing/util.ts", "../../../../src/testing/PreviewPopover.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n/** deprecated Replace with @dxos/util trim */\n// TODO(burdon): Remove\nexport const str = (...lines: string[]) => lines.join('\\n');\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, type RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { addEventListener } from '@dxos/async';\nimport { type DxAnchorActivate, Popover } from '@dxos/react-ui';\n\nimport { type PreviewLinkRef, type PreviewLinkTarget } from '../extensions';\n\ntype PreviewLookup = (link: PreviewLinkRef) => Promise<PreviewLinkTarget | null | undefined>;\n\ntype PreviewPopoverValue = Partial<{\n link: PreviewLinkRef;\n target: PreviewLinkTarget;\n pending: boolean;\n}>;\n\nconst [PreviewPopoverContextProvider, usePreviewPopover] = createContext<PreviewPopoverValue>('PreviewPopover', {});\n\ntype PopoverLookupProviderProps = PropsWithChildren<{\n onLookup?: PreviewLookup;\n}>;\n\nconst PreviewPopoverProvider = ({ children, onLookup }: PopoverLookupProviderProps) => {\n const trigger = useRef<HTMLElement | null>(null);\n const [value, setValue] = useState<PreviewPopoverValue>({});\n const [open, setOpen] = useState(false);\n\n const handleDxAnchorActivate = useCallback(\n (event: DxAnchorActivate) => {\n const { refId, label, trigger: dxTrigger } = event;\n setValue((value) => ({\n ...value,\n link: { label, ref: refId },\n pending: true,\n }));\n trigger.current = dxTrigger;\n queueMicrotask(() => setOpen(true));\n void onLookup?.({ label, ref: refId }).then((target) =>\n setValue((value) => ({\n ...value,\n target: target ?? undefined,\n pending: false,\n })),\n );\n },\n [onLookup],\n );\n\n const [rootRef, setRootRef] = useState<HTMLDivElement | null>(null);\n useEffect(() => {\n if (!rootRef || !handleDxAnchorActivate) {\n return;\n }\n\n return addEventListener(rootRef, 'dx-anchor-activate' as any, handleDxAnchorActivate, {\n capture: true,\n passive: false,\n });\n }, [rootRef, handleDxAnchorActivate]);\n\n return (\n <PreviewPopoverContextProvider pending={value.pending} link={value.link} target={value.target}>\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.VirtualTrigger virtualRef={trigger as unknown as RefObject<HTMLButtonElement>} />\n <div role='none' className='contents' ref={setRootRef}>\n {children}\n </div>\n </Popover.Root>\n </PreviewPopoverContextProvider>\n );\n};\nexport { PreviewPopoverProvider, usePreviewPopover };\n\nexport type { PopoverLookupProviderProps, PreviewPopoverValue };\n"],
5
- "mappings": ";;;AAMO,IAAMA,MAAM,IAAIC,UAAoBA,MAAMC,KAAK,IAAA;;;;ACFtD,SAASC,qBAAqB;AAC9B,OAAOC,SAAiDC,aAAaC,WAAWC,QAAQC,gBAAgB;AAExG,SAASC,wBAAwB;AACjC,SAAgCC,eAAe;AAY/C,IAAM,CAACC,+BAA+BC,iBAAAA,IAAqBC,cAAmC,kBAAkB,CAAC,CAAA;AAMjH,IAAMC,yBAAyB,CAAC,EAAEC,UAAUC,SAAQ,MAA8B;;;AAChF,UAAMC,UAAUC,OAA2B,IAAA;AAC3C,UAAM,CAACC,OAAOC,QAAAA,IAAYC,SAA8B,CAAC,CAAA;AACzD,UAAM,CAACC,MAAMC,OAAAA,IAAWF,SAAS,KAAA;AAEjC,UAAMG,yBAAyBC,YAC7B,CAACC,UAAAA;AACC,YAAM,EAAEC,OAAOC,OAAOX,SAASY,UAAS,IAAKH;AAC7CN,eAAS,CAACD,YAAW;QACnB,GAAGA;QACHW,MAAM;UAAEF;UAAOG,KAAKJ;QAAM;QAC1BK,SAAS;MACX,EAAA;AACAf,cAAQgB,UAAUJ;AAClBK,qBAAe,MAAMX,QAAQ,IAAA,CAAA;AAC7B,WAAKP,WAAW;QAAEY;QAAOG,KAAKJ;MAAM,CAAA,EAAGQ,KAAK,CAACC,WAC3ChB,SAAS,CAACD,YAAW;QACnB,GAAGA;QACHiB,QAAQA,UAAUC;QAClBL,SAAS;MACX,EAAA,CAAA;IAEJ,GACA;MAAChB;KAAS;AAGZ,UAAM,CAACsB,SAASC,UAAAA,IAAclB,SAAgC,IAAA;AAC9DmB,cAAU,MAAA;AACR,UAAI,CAACF,WAAW,CAACd,wBAAwB;AACvC;MACF;AAEA,aAAOiB,iBAAiBH,SAAS,sBAA6Bd,wBAAwB;QACpFkB,SAAS;QACTC,SAAS;MACX,CAAA;IACF,GAAG;MAACL;MAASd;KAAuB;AAEpC,WACE,sBAAA,cAACb,+BAAAA;MAA8BqB,SAASb,MAAMa;MAASF,MAAMX,MAAMW;MAAMM,QAAQjB,MAAMiB;OACrF,sBAAA,cAACQ,QAAQC,MAAI;MAACvB;MAAYwB,cAAcvB;OACtC,sBAAA,cAACqB,QAAQG,gBAAc;MAACC,YAAY/B;QACpC,sBAAA,cAACgC,OAAAA;MAAIC,MAAK;MAAOC,WAAU;MAAWpB,KAAKQ;OACxCxB,QAAAA,CAAAA,CAAAA;;;;AAKX;",
6
- "names": ["str", "lines", "join", "createContext", "React", "useCallback", "useEffect", "useRef", "useState", "addEventListener", "Popover", "PreviewPopoverContextProvider", "usePreviewPopover", "createContext", "PreviewPopoverProvider", "children", "onLookup", "trigger", "useRef", "value", "setValue", "useState", "open", "setOpen", "handleDxAnchorActivate", "useCallback", "event", "refId", "label", "dxTrigger", "link", "ref", "pending", "current", "queueMicrotask", "then", "target", "undefined", "rootRef", "setRootRef", "useEffect", "addEventListener", "capture", "passive", "Popover", "Root", "onOpenChange", "VirtualTrigger", "virtualRef", "div", "role", "className"]
7
- }
@@ -1,38 +0,0 @@
1
- import { type EditorView } from '@codemirror/view';
2
- import React, { type PropsWithChildren } from 'react';
3
- import { type DxAnchorActivate, type Label } from '@dxos/react-ui';
4
- import { type MaybePromise } from '@dxos/util';
5
- export type CommandMenuGroup = {
6
- id: string;
7
- label?: Label;
8
- items: CommandMenuItem[];
9
- };
10
- export type CommandMenuItem = {
11
- id: string;
12
- label: Label;
13
- icon?: string;
14
- onSelect?: (view: EditorView, head: number) => MaybePromise<void>;
15
- };
16
- export type CommandMenuProps = PropsWithChildren<{
17
- groups: CommandMenuGroup[];
18
- onSelect: (item: CommandMenuItem) => void;
19
- onActivate?: (event: DxAnchorActivate) => void;
20
- currentItem?: string;
21
- open?: boolean;
22
- onOpenChange?: (nextOpen: boolean) => void;
23
- defaultOpen?: boolean;
24
- }>;
25
- export declare const CommandMenuProvider: ({ groups, onSelect, onActivate, currentItem, children, open: propsOpen, onOpenChange, defaultOpen, }: CommandMenuProps) => React.JSX.Element;
26
- export declare const getItem: (groups: CommandMenuGroup[], id?: string) => CommandMenuItem | undefined;
27
- export declare const getNextItem: (groups: CommandMenuGroup[], id?: string) => CommandMenuItem;
28
- export declare const getPreviousItem: (groups: CommandMenuGroup[], id?: string) => CommandMenuItem;
29
- export declare const filterItems: (groups: CommandMenuGroup[], filter: (item: CommandMenuItem) => boolean) => CommandMenuGroup[];
30
- export declare const insertAtCursor: (view: EditorView, head: number, insert: string) => void;
31
- /**
32
- * If the cursor is at the start of a line, insert the text at the cursor.
33
- * Otherwise, insert the text on a new line.
34
- */
35
- export declare const insertAtLineStart: (view: EditorView, head: number, insert: string) => void;
36
- export declare const coreSlashCommands: CommandMenuGroup;
37
- export declare const linkSlashCommands: CommandMenuGroup;
38
- //# sourceMappingURL=CommandMenu.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CommandMenu.d.ts","sourceRoot":"","sources":["../../../../../src/components/CommandMenu/CommandMenu.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,EAAY,KAAK,iBAAiB,EAA4C,MAAM,OAAO,CAAC;AAG1G,OAAO,EACL,KAAK,gBAAgB,EAErB,KAAK,KAAK,EAKX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;CACnE,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;IAC/C,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC,CAAC;AAGH,eAAO,MAAM,mBAAmB,GAAI,sGASjC,gBAAgB,sBAqElB,CAAC;AAiEF,eAAO,MAAM,OAAO,GAAI,QAAQ,gBAAgB,EAAE,EAAE,KAAK,MAAM,KAAG,eAAe,GAAG,SAEnF,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,QAAQ,gBAAgB,EAAE,EAAE,KAAK,MAAM,KAAG,eAIrE,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,QAAQ,gBAAgB,EAAE,EAAE,KAAK,MAAM,KAAG,eAIzE,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,QAAQ,gBAAgB,EAAE,EAC1B,QAAQ,CAAC,IAAI,EAAE,eAAe,KAAK,OAAO,KACzC,gBAAgB,EAKlB,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,MAAM,UAAU,EAAE,MAAM,MAAM,EAAE,QAAQ,MAAM,SAK5E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM,UAAU,EAAE,MAAM,MAAM,EAAE,QAAQ,MAAM,SAW/E,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,gBA6E/B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,gBA2B/B,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from './CommandMenu';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/CommandMenu/index.ts"],"names":[],"mappings":"AAIA,cAAc,eAAe,CAAC"}