@dxos/react-ui-editor 0.8.1 → 0.8.2-main.10c050d

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 (268) hide show
  1. package/dist/lib/browser/index.mjs +4152 -2852
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/browser/testing/index.mjs +6 -0
  5. package/dist/lib/browser/testing/index.mjs.map +7 -0
  6. package/dist/lib/node/index.cjs +3318 -2009
  7. package/dist/lib/node/index.cjs.map +4 -4
  8. package/dist/lib/node/meta.json +1 -1
  9. package/dist/lib/node/testing/index.cjs +29 -0
  10. package/dist/lib/node/testing/index.cjs.map +7 -0
  11. package/dist/lib/node-esm/index.mjs +4152 -2852
  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 +8 -0
  15. package/dist/lib/node-esm/testing/index.mjs.map +7 -0
  16. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +1 -1
  17. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  18. package/dist/types/src/components/EditorToolbar/blocks.d.ts +4 -3
  19. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  20. package/dist/types/src/components/EditorToolbar/formatting.d.ts +4 -3
  21. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  22. package/dist/types/src/components/EditorToolbar/headings.d.ts +4 -3
  23. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  24. package/dist/types/src/components/EditorToolbar/{comment.d.ts → image.d.ts} +4 -5
  25. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -0
  26. package/dist/types/src/components/EditorToolbar/index.d.ts +1 -1
  27. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  28. package/dist/types/src/components/EditorToolbar/lists.d.ts +4 -3
  29. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -1
  30. package/dist/types/src/components/EditorToolbar/search.d.ts +17 -0
  31. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -0
  32. package/dist/types/src/components/EditorToolbar/util.d.ts +17 -25
  33. package/dist/types/src/components/EditorToolbar/util.d.ts.map +1 -1
  34. package/dist/types/src/components/EditorToolbar/{viewMode.d.ts → view-mode.d.ts} +5 -4
  35. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -0
  36. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +21 -0
  37. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +1 -0
  38. package/dist/types/src/components/Popover/RefPopover.d.ts +21 -0
  39. package/dist/types/src/components/Popover/RefPopover.d.ts.map +1 -0
  40. package/dist/types/src/components/Popover/index.d.ts +3 -0
  41. package/dist/types/src/components/Popover/index.d.ts.map +1 -0
  42. package/dist/types/src/components/index.d.ts +1 -0
  43. package/dist/types/src/components/index.d.ts.map +1 -1
  44. package/dist/types/src/defaults.d.ts +3 -5
  45. package/dist/types/src/defaults.d.ts.map +1 -1
  46. package/dist/types/src/extensions/annotations.d.ts +4 -1
  47. package/dist/types/src/extensions/annotations.d.ts.map +1 -1
  48. package/dist/types/src/extensions/autocomplete.d.ts +1 -2
  49. package/dist/types/src/extensions/autocomplete.d.ts.map +1 -1
  50. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  51. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  52. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  53. package/dist/types/src/extensions/automerge/defs.d.ts +1 -1
  54. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
  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/automerge/update-codemirror.d.ts +1 -1
  59. package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +1 -1
  60. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
  61. package/dist/types/src/extensions/awareness/awareness.d.ts.map +1 -1
  62. package/dist/types/src/extensions/blast.d.ts.map +1 -1
  63. package/dist/types/src/extensions/command/action.d.ts +17 -0
  64. package/dist/types/src/extensions/command/action.d.ts.map +1 -0
  65. package/dist/types/src/extensions/command/command.d.ts +4 -10
  66. package/dist/types/src/extensions/command/command.d.ts.map +1 -1
  67. package/dist/types/src/extensions/command/hint.d.ts +18 -4
  68. package/dist/types/src/extensions/command/hint.d.ts.map +1 -1
  69. package/dist/types/src/extensions/command/index.d.ts +3 -0
  70. package/dist/types/src/extensions/command/index.d.ts.map +1 -1
  71. package/dist/types/src/extensions/command/menu.d.ts +6 -11
  72. package/dist/types/src/extensions/command/menu.d.ts.map +1 -1
  73. package/dist/types/src/extensions/command/state.d.ts +9 -11
  74. package/dist/types/src/extensions/command/state.d.ts.map +1 -1
  75. package/dist/types/src/extensions/command/typeahead.d.ts +17 -0
  76. package/dist/types/src/extensions/command/typeahead.d.ts.map +1 -0
  77. package/dist/types/src/extensions/comments.d.ts +9 -17
  78. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  79. package/dist/types/src/extensions/debug.d.ts.map +1 -1
  80. package/dist/types/src/extensions/dnd.d.ts.map +1 -1
  81. package/dist/types/src/extensions/factories.d.ts +4 -0
  82. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  83. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  84. package/dist/types/src/extensions/index.d.ts +3 -0
  85. package/dist/types/src/extensions/index.d.ts.map +1 -1
  86. package/dist/types/src/extensions/json.d.ts +7 -0
  87. package/dist/types/src/extensions/json.d.ts.map +1 -0
  88. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  89. package/dist/types/src/extensions/markdown/{editorAction.d.ts → action.d.ts} +1 -1
  90. package/dist/types/src/extensions/markdown/action.d.ts.map +1 -0
  91. package/dist/types/src/extensions/markdown/bundle.d.ts +2 -1
  92. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  93. package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
  94. package/dist/types/src/extensions/markdown/debug.d.ts.map +1 -1
  95. package/dist/types/src/extensions/markdown/decorate.d.ts +5 -1
  96. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  97. package/dist/types/src/extensions/markdown/formatting.d.ts +3 -3
  98. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  99. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
  100. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
  101. package/dist/types/src/extensions/markdown/index.d.ts +1 -1
  102. package/dist/types/src/extensions/markdown/index.d.ts.map +1 -1
  103. package/dist/types/src/extensions/markdown/link.d.ts +4 -1
  104. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  105. package/dist/types/src/extensions/markdown/styles.d.ts.map +1 -1
  106. package/dist/types/src/extensions/markdown/table.d.ts.map +1 -1
  107. package/dist/types/src/extensions/mention.d.ts.map +1 -1
  108. package/dist/types/src/extensions/modes.d.ts +5 -5
  109. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  110. package/dist/types/src/extensions/outliner/commands.d.ts +10 -0
  111. package/dist/types/src/extensions/outliner/commands.d.ts.map +1 -0
  112. package/dist/types/src/extensions/outliner/editor.d.ts +5 -0
  113. package/dist/types/src/extensions/outliner/editor.d.ts.map +1 -0
  114. package/dist/types/src/extensions/outliner/editor.test.d.ts +2 -0
  115. package/dist/types/src/extensions/outliner/editor.test.d.ts.map +1 -0
  116. package/dist/types/src/extensions/outliner/index.d.ts +4 -0
  117. package/dist/types/src/extensions/outliner/index.d.ts.map +1 -0
  118. package/dist/types/src/extensions/outliner/outliner.d.ts +13 -0
  119. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -0
  120. package/dist/types/src/extensions/outliner/outliner.test.d.ts +2 -0
  121. package/dist/types/src/extensions/outliner/outliner.test.d.ts.map +1 -0
  122. package/dist/types/src/extensions/outliner/selection.d.ts +12 -0
  123. package/dist/types/src/extensions/outliner/selection.d.ts.map +1 -0
  124. package/dist/types/src/extensions/outliner/tree.d.ts +79 -0
  125. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -0
  126. package/dist/types/src/extensions/outliner/tree.test.d.ts +2 -0
  127. package/dist/types/src/extensions/outliner/tree.test.d.ts.map +1 -0
  128. package/dist/types/src/extensions/preview/index.d.ts +2 -0
  129. package/dist/types/src/extensions/preview/index.d.ts.map +1 -0
  130. package/dist/types/src/extensions/preview/preview.d.ts +39 -0
  131. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -0
  132. package/dist/types/src/extensions/selection.d.ts.map +1 -1
  133. package/dist/types/src/extensions/typewriter.d.ts.map +1 -1
  134. package/dist/types/src/hooks/index.d.ts +0 -1
  135. package/dist/types/src/hooks/index.d.ts.map +1 -1
  136. package/dist/types/src/hooks/useTextEditor.d.ts +2 -1
  137. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  138. package/dist/types/src/stories/Command.stories.d.ts +7 -0
  139. package/dist/types/src/stories/Command.stories.d.ts.map +1 -0
  140. package/dist/types/src/stories/Comments.stories.d.ts +13 -0
  141. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -0
  142. package/dist/types/src/stories/EditorToolbar.stories.d.ts +12 -0
  143. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -0
  144. package/dist/types/src/stories/Experimental.stories.d.ts +16 -0
  145. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -0
  146. package/dist/types/src/stories/Markdown.stories.d.ts +46 -0
  147. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -0
  148. package/dist/types/src/stories/Outliner.stories.d.ts +26 -0
  149. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -0
  150. package/dist/types/src/stories/Preview.stories.d.ts +10 -0
  151. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -0
  152. package/dist/types/src/stories/TextEditor.stories.d.ts +55 -0
  153. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -0
  154. package/dist/types/src/stories/util.d.ts +53 -0
  155. package/dist/types/src/stories/util.d.ts.map +1 -0
  156. package/dist/types/src/styles/theme.d.ts.map +1 -1
  157. package/dist/types/src/styles/tokens.d.ts.map +1 -1
  158. package/dist/types/src/testing/index.d.ts +2 -0
  159. package/dist/types/src/testing/index.d.ts.map +1 -0
  160. package/dist/types/src/testing/util.d.ts +2 -0
  161. package/dist/types/src/testing/util.d.ts.map +1 -0
  162. package/dist/types/src/types.d.ts +5 -0
  163. package/dist/types/src/types.d.ts.map +1 -1
  164. package/dist/types/src/util/cursor.d.ts.map +1 -1
  165. package/dist/types/src/util/debug.d.ts.map +1 -1
  166. package/dist/types/src/util/dom.d.ts.map +1 -1
  167. package/dist/types/src/util/facet.d.ts.map +1 -1
  168. package/dist/types/src/util/react.d.ts +6 -1
  169. package/dist/types/src/util/react.d.ts.map +1 -1
  170. package/dist/types/tsconfig.tsbuildinfo +1 -1
  171. package/package.json +46 -30
  172. package/src/components/EditorToolbar/EditorToolbar.tsx +95 -72
  173. package/src/components/EditorToolbar/blocks.ts +27 -6
  174. package/src/components/EditorToolbar/formatting.ts +34 -7
  175. package/src/components/EditorToolbar/headings.ts +9 -8
  176. package/src/components/EditorToolbar/image.ts +16 -0
  177. package/src/components/EditorToolbar/index.ts +7 -1
  178. package/src/components/EditorToolbar/lists.ts +26 -7
  179. package/src/components/EditorToolbar/search.ts +19 -0
  180. package/src/components/EditorToolbar/util.ts +19 -20
  181. package/src/components/EditorToolbar/{viewMode.ts → view-mode.ts} +9 -8
  182. package/src/components/Popover/RefDropdownMenu.tsx +77 -0
  183. package/src/components/Popover/RefPopover.tsx +75 -0
  184. package/src/components/Popover/index.ts +6 -0
  185. package/src/components/index.ts +1 -0
  186. package/src/defaults.ts +12 -13
  187. package/src/extensions/annotations.ts +41 -64
  188. package/src/extensions/autocomplete.ts +5 -6
  189. package/src/extensions/automerge/automerge.stories.tsx +13 -24
  190. package/src/extensions/automerge/automerge.test.tsx +6 -5
  191. package/src/extensions/automerge/automerge.ts +2 -2
  192. package/src/extensions/automerge/defs.ts +1 -2
  193. package/src/extensions/automerge/sync.ts +7 -7
  194. package/src/extensions/automerge/update-automerge.ts +1 -1
  195. package/src/extensions/automerge/update-codemirror.ts +3 -4
  196. package/src/extensions/awareness/awareness-provider.ts +4 -4
  197. package/src/extensions/awareness/awareness.ts +7 -7
  198. package/src/extensions/blast.ts +9 -9
  199. package/src/extensions/command/action.ts +49 -0
  200. package/src/extensions/command/command.ts +7 -27
  201. package/src/extensions/command/hint.ts +36 -33
  202. package/src/extensions/command/index.ts +3 -0
  203. package/src/extensions/command/menu.ts +79 -51
  204. package/src/extensions/command/state.ts +41 -61
  205. package/src/extensions/command/typeahead.ts +116 -0
  206. package/src/extensions/comments.ts +11 -76
  207. package/src/extensions/factories.ts +13 -0
  208. package/src/extensions/folding.tsx +1 -1
  209. package/src/extensions/index.ts +3 -0
  210. package/src/extensions/json.ts +56 -0
  211. package/src/extensions/markdown/bundle.ts +13 -9
  212. package/src/extensions/markdown/changes.ts +3 -2
  213. package/src/extensions/markdown/decorate.ts +19 -17
  214. package/src/extensions/markdown/formatting.ts +6 -6
  215. package/src/extensions/markdown/image.ts +14 -13
  216. package/src/extensions/markdown/index.ts +1 -1
  217. package/src/extensions/markdown/link.ts +33 -24
  218. package/src/extensions/markdown/styles.ts +4 -3
  219. package/src/extensions/markdown/table.ts +3 -3
  220. package/src/extensions/modes.ts +5 -6
  221. package/src/extensions/outliner/commands.ts +270 -0
  222. package/src/extensions/outliner/editor.test.ts +33 -0
  223. package/src/extensions/outliner/editor.ts +184 -0
  224. package/src/extensions/outliner/index.ts +7 -0
  225. package/src/extensions/outliner/outliner.test.ts +99 -0
  226. package/src/extensions/outliner/outliner.ts +168 -0
  227. package/src/extensions/outliner/selection.ts +50 -0
  228. package/src/extensions/outliner/tree.test.ts +164 -0
  229. package/src/extensions/outliner/tree.ts +315 -0
  230. package/src/extensions/preview/index.ts +5 -0
  231. package/src/extensions/preview/preview.ts +271 -0
  232. package/src/hooks/index.ts +0 -1
  233. package/src/hooks/useTextEditor.ts +4 -3
  234. package/src/stories/Command.stories.tsx +97 -0
  235. package/src/stories/Comments.stories.tsx +98 -0
  236. package/src/stories/EditorToolbar.stories.tsx +96 -0
  237. package/src/stories/Experimental.stories.tsx +86 -0
  238. package/src/stories/Markdown.stories.tsx +121 -0
  239. package/src/stories/Outliner.stories.tsx +108 -0
  240. package/src/stories/Preview.stories.tsx +149 -0
  241. package/src/stories/TextEditor.stories.tsx +256 -0
  242. package/src/stories/util.tsx +326 -0
  243. package/src/styles/theme.ts +15 -5
  244. package/src/styles/tokens.ts +1 -2
  245. package/src/testing/index.ts +5 -0
  246. package/src/testing/util.ts +5 -0
  247. package/src/types.ts +7 -0
  248. package/src/util/react.tsx +20 -2
  249. package/dist/types/src/InputMode.stories.d.ts +0 -57
  250. package/dist/types/src/InputMode.stories.d.ts.map +0 -1
  251. package/dist/types/src/TextEditor.stories.d.ts +0 -115
  252. package/dist/types/src/TextEditor.stories.d.ts.map +0 -1
  253. package/dist/types/src/components/EditorToolbar/comment.d.ts.map +0 -1
  254. package/dist/types/src/components/EditorToolbar/viewMode.d.ts.map +0 -1
  255. package/dist/types/src/extensions/command/preview.d.ts +0 -12
  256. package/dist/types/src/extensions/command/preview.d.ts.map +0 -1
  257. package/dist/types/src/extensions/markdown/editorAction.d.ts.map +0 -1
  258. package/dist/types/src/fragments.d.ts +0 -3
  259. package/dist/types/src/fragments.d.ts.map +0 -1
  260. package/dist/types/src/hooks/useActionHandler.d.ts +0 -4
  261. package/dist/types/src/hooks/useActionHandler.d.ts.map +0 -1
  262. package/src/InputMode.stories.tsx +0 -124
  263. package/src/TextEditor.stories.tsx +0 -856
  264. package/src/components/EditorToolbar/comment.ts +0 -23
  265. package/src/extensions/command/preview.ts +0 -79
  266. package/src/fragments.ts +0 -19
  267. package/src/hooks/useActionHandler.ts +0 -12
  268. /package/src/extensions/markdown/{editorAction.ts → action.ts} +0 -0
@@ -0,0 +1,149 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import '@dxos-theme';
6
+
7
+ import React, { useState, useEffect, type FC } from 'react';
8
+
9
+ import { faker } from '@dxos/random';
10
+ import { IconButton, Popover } from '@dxos/react-ui';
11
+ import { hoverableHidden } from '@dxos/react-ui-theme';
12
+ import { withLayout, withTheme, type Meta } from '@dxos/storybook-utils';
13
+
14
+ import { EditorStory } from './util';
15
+ import { RefPopover, useRefPopover } from '../components';
16
+ import {
17
+ preview,
18
+ image,
19
+ type PreviewOptions,
20
+ type PreviewLinkRef,
21
+ type PreviewLinkTarget,
22
+ type PreviewRenderProps,
23
+ } from '../extensions';
24
+ import { str } from '../testing';
25
+ import { createRenderer } from '../util';
26
+
27
+ const handlePreviewLookup = async ({ label, ref }: PreviewLinkRef): Promise<PreviewLinkTarget> => {
28
+ // Random text.
29
+ faker.seed(ref.split('').reduce((acc: number, char: string) => acc + char.charCodeAt(0), 1));
30
+ const text = Array.from({ length: 2 }, () => faker.lorem.paragraphs()).join('\n\n');
31
+ return {
32
+ label,
33
+ text,
34
+ };
35
+ };
36
+
37
+ // Async lookup.
38
+ // TODO(burdon): Handle errors.
39
+ const useRefTarget = (link: PreviewLinkRef, onLookup: PreviewOptions['onLookup']): PreviewLinkTarget | undefined => {
40
+ const [target, setTarget] = useState<PreviewLinkTarget | undefined>();
41
+ useEffect(() => {
42
+ void onLookup?.(link).then((target) => setTarget(target ?? undefined));
43
+ }, [link, onLookup]);
44
+
45
+ return target;
46
+ };
47
+
48
+ const PreviewCard = () => {
49
+ const { target } = useRefPopover('PreviewCard');
50
+ return (
51
+ <Popover.Portal>
52
+ <Popover.Content classNames='popover-card-width p-2' onOpenAutoFocus={(event) => event.preventDefault()}>
53
+ <Popover.Viewport>
54
+ <h2 className='grow truncate'>{target?.label}</h2>
55
+ {target && <div className='line-clamp-3'>{target.text}</div>}
56
+ </Popover.Viewport>
57
+ <Popover.Arrow />
58
+ </Popover.Content>
59
+ </Popover.Portal>
60
+ );
61
+ };
62
+
63
+ // TODO(burdon): Replace with card.
64
+ const PreviewBlock: FC<PreviewRenderProps> = ({ readonly, link, onAction, onLookup }) => {
65
+ const target = useRefTarget(link, onLookup);
66
+ return (
67
+ <div className='group flex flex-col gap-2'>
68
+ <div className='flex items-center gap-4'>
69
+ <div className='grow truncate'>
70
+ {/* <span className='text-xs text-subdued mie-2'>Prompt</span> */}
71
+ {link.label}
72
+ </div>
73
+ {!readonly && (
74
+ <div className='flex gap-1'>
75
+ {(link.suggest && (
76
+ <>
77
+ {target && (
78
+ <IconButton
79
+ classNames='text-green-500'
80
+ label='Apply'
81
+ icon={'ph--check--regular'}
82
+ onClick={() => onAction({ type: 'insert', link, target })}
83
+ />
84
+ )}
85
+ <IconButton
86
+ classNames='text-red-500'
87
+ label='Cancel'
88
+ icon={'ph--x--regular'}
89
+ onClick={() => onAction({ type: 'delete', link })}
90
+ />
91
+ </>
92
+ )) || (
93
+ <IconButton
94
+ iconOnly
95
+ label='Delete'
96
+ icon={'ph--x--regular'}
97
+ classNames={hoverableHidden}
98
+ onClick={() => onAction({ type: 'delete', link })}
99
+ />
100
+ )}
101
+ </div>
102
+ )}
103
+ </div>
104
+ {target && <div className='line-clamp-3'>{target.text}</div>}
105
+ </div>
106
+ );
107
+ };
108
+
109
+ const meta: Meta<typeof EditorStory> = {
110
+ title: 'ui/react-ui-editor/Preview',
111
+ decorators: [withTheme, withLayout({ fullscreen: true })],
112
+ render: EditorStory,
113
+ parameters: { layout: 'fullscreen' },
114
+ };
115
+
116
+ export default meta;
117
+
118
+ export const Default = {
119
+ render: () => (
120
+ <RefPopover.Provider onLookup={handlePreviewLookup}>
121
+ <EditorStory
122
+ text={str(
123
+ '# Preview',
124
+ '',
125
+ 'This project is part of the [DXOS][dxn:queue:data:123] SDK.',
126
+ '',
127
+ '![DXOS][?dxn:queue:data:123]',
128
+ '',
129
+ 'It consists of [ECHO][dxn:queue:data:echo], [HALO][dxn:queue:data:halo], and [MESH][dxn:queue:data:mesh].',
130
+ '',
131
+ '## Deep dive',
132
+ '',
133
+ '![ECHO][dxn:queue:data:echo]',
134
+ '',
135
+ '',
136
+ '',
137
+ )}
138
+ extensions={[
139
+ image(),
140
+ preview({
141
+ renderBlock: createRenderer(PreviewBlock),
142
+ onLookup: handlePreviewLookup,
143
+ }),
144
+ ]}
145
+ />
146
+ <PreviewCard />
147
+ </RefPopover.Provider>
148
+ ),
149
+ };
@@ -0,0 +1,256 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import '@dxos-theme';
6
+
7
+ import { javascript } from '@codemirror/lang-javascript';
8
+ import { openSearchPanel } from '@codemirror/search';
9
+ import React from 'react';
10
+
11
+ import { log } from '@dxos/log';
12
+ import { withLayout, withTheme, type Meta } from '@dxos/storybook-utils';
13
+
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 './util';
27
+ import { editorMonospace } from '../defaults';
28
+ import {
29
+ InputModeExtensions,
30
+ autocomplete,
31
+ decorateMarkdown,
32
+ folding,
33
+ image,
34
+ listener,
35
+ mention,
36
+ selectionState,
37
+ staticCompletion,
38
+ typeahead,
39
+ } from '../extensions';
40
+ import { str } from '../testing';
41
+
42
+ const meta: Meta<typeof EditorStory> = {
43
+ title: 'ui/react-ui-editor/TextEditor',
44
+ render: EditorStory,
45
+ decorators: [withTheme, withLayout({ fullscreen: true })],
46
+ parameters: { layout: 'fullscreen' },
47
+ };
48
+
49
+ export default meta;
50
+
51
+ //
52
+ // Default
53
+ //
54
+
55
+ export const Default = {
56
+ render: () => <EditorStory text={text} extensions={defaultExtensions} />,
57
+ };
58
+
59
+ //
60
+ // Everything
61
+ //
62
+
63
+ export const Everything = {
64
+ render: () => <EditorStory text={text} extensions={allExtensions} selection={{ anchor: 99, head: 110 }} />,
65
+ };
66
+
67
+ //
68
+ // Empty
69
+ //
70
+
71
+ export const Empty = {
72
+ render: () => <EditorStory extensions={defaultExtensions} />,
73
+ };
74
+
75
+ //
76
+ // Readonly
77
+ //
78
+
79
+ export const Readonly = {
80
+ render: () => <EditorStory text={text} extensions={defaultExtensions} readOnly />,
81
+ };
82
+
83
+ //
84
+ // No Extensions
85
+ //
86
+
87
+ export const NoExtensions = {
88
+ render: () => <EditorStory text={text} />,
89
+ };
90
+
91
+ //
92
+ // Vim
93
+ //
94
+
95
+ export const Vim = {
96
+ render: () => (
97
+ <EditorStory
98
+ text={str('# Vim Mode', '', 'The distant future. The year 2000.', '', content.paragraphs)}
99
+ extensions={[defaultExtensions, InputModeExtensions.vim]}
100
+ />
101
+ ),
102
+ };
103
+
104
+ //
105
+ // Listener
106
+ //
107
+
108
+ export const Listener = {
109
+ render: () => (
110
+ <EditorStory
111
+ text={str('# Listener', '', content.footer)}
112
+ extensions={[
113
+ listener({
114
+ onFocus: (focusing) => {
115
+ log.info('listener', { focusing });
116
+ },
117
+ onChange: (text) => {
118
+ log.info('listener', { text });
119
+ },
120
+ }),
121
+ ]}
122
+ />
123
+ ),
124
+ };
125
+
126
+ //
127
+ // Folding
128
+ //
129
+
130
+ export const Folding = {
131
+ render: () => <EditorStory text={text} extensions={[folding()]} />,
132
+ };
133
+
134
+ //
135
+ // Scrolling
136
+ //
137
+
138
+ export const Scrolling = {
139
+ render: () => (
140
+ <EditorStory
141
+ text={str('# Large Document', '', longText)}
142
+ extensions={selectionState({
143
+ setState: (id, state) => global.set(id, state),
144
+ getState: (id) => global.get(id),
145
+ })}
146
+ />
147
+ ),
148
+ };
149
+
150
+ export const ScrollingWithImages = {
151
+ render: () => (
152
+ <EditorStory text={str('# Large Document', '', largeWithImages)} extensions={[decorateMarkdown(), image()]} />
153
+ ),
154
+ };
155
+
156
+ export const ScrollTo = {
157
+ render: () => {
158
+ // NOTE: Selection won't appear if text is reformatted.
159
+ const word = 'Scroll to here...';
160
+ const text = str('# Scroll To', longText, '', word, '', longText);
161
+ const idx = text.indexOf(word);
162
+ return (
163
+ <EditorStory
164
+ text={text}
165
+ extensions={defaultExtensions}
166
+ scrollTo={idx}
167
+ selection={{ anchor: idx, head: idx + word.length }}
168
+ />
169
+ );
170
+ },
171
+ };
172
+
173
+ //
174
+ // Typescript
175
+ //
176
+
177
+ export const Typescript = {
178
+ render: () => (
179
+ <EditorStory
180
+ text={content.typescript}
181
+ lineNumbers
182
+ extensions={[editorMonospace, javascript({ typescript: true })]}
183
+ />
184
+ ),
185
+ };
186
+
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
+ //
208
+ // Typeahead
209
+ //
210
+
211
+ const completions = ['type', 'AND', 'OR', 'NOT', 'dxos.org'];
212
+
213
+ export const Typeahead = {
214
+ render: () => (
215
+ <EditorStory
216
+ text={str('# Typeahead', '')}
217
+ extensions={[
218
+ decorateMarkdown({ renderLinkButton }),
219
+ typeahead({
220
+ onComplete: staticCompletion(completions, completions[0]),
221
+ }),
222
+ ]}
223
+ />
224
+ ),
225
+ };
226
+
227
+ //
228
+ // Mention
229
+ //
230
+
231
+ export const Mention = {
232
+ render: () => (
233
+ <EditorStory
234
+ text={str('# Mention', '', 'Type @...', content.footer)}
235
+ extensions={[
236
+ mention({
237
+ onSearch: (text) => names.filter((name) => name.toLowerCase().startsWith(text.toLowerCase())),
238
+ }),
239
+ ]}
240
+ />
241
+ ),
242
+ };
243
+
244
+ //
245
+ // Search
246
+ //
247
+
248
+ export const Search = {
249
+ render: () => (
250
+ <EditorStory
251
+ text={str('# Search', text)}
252
+ extensions={defaultExtensions}
253
+ onReady={(view) => openSearchPanel(view)}
254
+ />
255
+ ),
256
+ };