@dxos/react-ui-editor 0.8.2-main.fbd8ed0 → 0.8.2-staging.7ac8446

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 (193) hide show
  1. package/dist/lib/browser/index.mjs +5088 -5521
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node/index.cjs +4915 -5354
  5. package/dist/lib/node/index.cjs.map +4 -4
  6. package/dist/lib/node/meta.json +1 -1
  7. package/dist/lib/node-esm/index.mjs +5088 -5521
  8. package/dist/lib/node-esm/index.mjs.map +4 -4
  9. package/dist/lib/node-esm/meta.json +1 -1
  10. package/dist/types/src/{components/EditorToolbar/EditorToolbar.stories.d.ts → InputMode.stories.d.ts} +7 -3
  11. package/dist/types/src/InputMode.stories.d.ts.map +1 -0
  12. package/dist/types/src/{stories/TextEditorBasic.stories.d.ts → TextEditor.stories.d.ts} +35 -5
  13. package/dist/types/src/TextEditor.stories.d.ts.map +1 -0
  14. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +1 -1
  15. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  16. package/dist/types/src/components/EditorToolbar/blocks.d.ts +3 -4
  17. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  18. package/dist/types/src/components/EditorToolbar/comment.d.ts +3 -4
  19. package/dist/types/src/components/EditorToolbar/comment.d.ts.map +1 -1
  20. package/dist/types/src/components/EditorToolbar/formatting.d.ts +3 -4
  21. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  22. package/dist/types/src/components/EditorToolbar/headings.d.ts +3 -4
  23. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  24. package/dist/types/src/components/EditorToolbar/lists.d.ts +3 -4
  25. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -1
  26. package/dist/types/src/components/EditorToolbar/util.d.ts +20 -14
  27. package/dist/types/src/components/EditorToolbar/util.d.ts.map +1 -1
  28. package/dist/types/src/components/EditorToolbar/{view-mode.d.ts → viewMode.d.ts} +4 -5
  29. package/dist/types/src/components/EditorToolbar/viewMode.d.ts.map +1 -0
  30. package/dist/types/src/defaults.d.ts +0 -1
  31. package/dist/types/src/defaults.d.ts.map +1 -1
  32. package/dist/types/src/extensions/annotations.d.ts.map +1 -1
  33. package/dist/types/src/extensions/autocomplete.d.ts.map +1 -1
  34. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  35. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  36. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  37. package/dist/types/src/extensions/automerge/defs.d.ts +1 -1
  38. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
  39. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  40. package/dist/types/src/extensions/automerge/update-automerge.d.ts +1 -1
  41. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  42. package/dist/types/src/extensions/automerge/update-codemirror.d.ts +1 -1
  43. package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +1 -1
  44. package/dist/types/src/extensions/awareness/awareness.d.ts.map +1 -1
  45. package/dist/types/src/extensions/blast.d.ts.map +1 -1
  46. package/dist/types/src/extensions/command/command.d.ts +10 -5
  47. package/dist/types/src/extensions/command/command.d.ts.map +1 -1
  48. package/dist/types/src/extensions/command/hint.d.ts +2 -4
  49. package/dist/types/src/extensions/command/hint.d.ts.map +1 -1
  50. package/dist/types/src/extensions/command/index.d.ts +0 -1
  51. package/dist/types/src/extensions/command/index.d.ts.map +1 -1
  52. package/dist/types/src/extensions/command/menu.d.ts +2 -7
  53. package/dist/types/src/extensions/command/menu.d.ts.map +1 -1
  54. package/dist/types/src/extensions/command/preview.d.ts +12 -0
  55. package/dist/types/src/extensions/command/preview.d.ts.map +1 -0
  56. package/dist/types/src/extensions/command/state.d.ts +11 -9
  57. package/dist/types/src/extensions/command/state.d.ts.map +1 -1
  58. package/dist/types/src/extensions/comments.d.ts +7 -9
  59. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  60. package/dist/types/src/extensions/debug.d.ts.map +1 -1
  61. package/dist/types/src/extensions/dnd.d.ts.map +1 -1
  62. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  63. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  64. package/dist/types/src/extensions/index.d.ts +0 -1
  65. package/dist/types/src/extensions/index.d.ts.map +1 -1
  66. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  67. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  68. package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
  69. package/dist/types/src/extensions/markdown/debug.d.ts.map +1 -1
  70. package/dist/types/src/extensions/markdown/decorate.d.ts +1 -5
  71. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  72. package/dist/types/src/extensions/markdown/formatting.d.ts +3 -3
  73. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  74. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
  75. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
  76. package/dist/types/src/extensions/markdown/index.d.ts +0 -1
  77. package/dist/types/src/extensions/markdown/index.d.ts.map +1 -1
  78. package/dist/types/src/extensions/markdown/link.d.ts +1 -4
  79. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  80. package/dist/types/src/extensions/markdown/table.d.ts.map +1 -1
  81. package/dist/types/src/extensions/mention.d.ts.map +1 -1
  82. package/dist/types/src/extensions/modes.d.ts +5 -5
  83. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  84. package/dist/types/src/extensions/selection.d.ts.map +1 -1
  85. package/dist/types/src/extensions/typewriter.d.ts.map +1 -1
  86. package/dist/types/src/fragments.d.ts +3 -0
  87. package/dist/types/src/fragments.d.ts.map +1 -0
  88. package/dist/types/src/hooks/index.d.ts +1 -0
  89. package/dist/types/src/hooks/index.d.ts.map +1 -1
  90. package/dist/types/src/hooks/useActionHandler.d.ts +4 -0
  91. package/dist/types/src/hooks/useActionHandler.d.ts.map +1 -0
  92. package/dist/types/src/hooks/useTextEditor.d.ts +1 -2
  93. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  94. package/dist/types/src/styles/theme.d.ts.map +1 -1
  95. package/dist/types/src/types.d.ts +0 -5
  96. package/dist/types/src/types.d.ts.map +1 -1
  97. package/dist/types/src/util/cursor.d.ts.map +1 -1
  98. package/dist/types/src/util/debug.d.ts.map +1 -1
  99. package/dist/types/src/util/dom.d.ts.map +1 -1
  100. package/dist/types/src/util/facet.d.ts.map +1 -1
  101. package/dist/types/src/util/react.d.ts +1 -6
  102. package/dist/types/src/util/react.d.ts.map +1 -1
  103. package/dist/types/tsconfig.tsbuildinfo +1 -1
  104. package/package.json +27 -37
  105. package/src/InputMode.stories.tsx +124 -0
  106. package/src/TextEditor.stories.tsx +856 -0
  107. package/src/components/EditorToolbar/EditorToolbar.tsx +34 -33
  108. package/src/components/EditorToolbar/blocks.ts +6 -27
  109. package/src/components/EditorToolbar/comment.ts +4 -11
  110. package/src/components/EditorToolbar/formatting.ts +7 -34
  111. package/src/components/EditorToolbar/headings.ts +8 -9
  112. package/src/components/EditorToolbar/lists.ts +7 -26
  113. package/src/components/EditorToolbar/util.ts +17 -17
  114. package/src/components/EditorToolbar/{view-mode.ts → viewMode.ts} +8 -9
  115. package/src/defaults.ts +3 -5
  116. package/src/extensions/automerge/automerge.stories.tsx +17 -11
  117. package/src/extensions/automerge/automerge.test.tsx +4 -4
  118. package/src/extensions/automerge/automerge.ts +2 -2
  119. package/src/extensions/automerge/defs.ts +2 -1
  120. package/src/extensions/automerge/sync.ts +4 -4
  121. package/src/extensions/automerge/update-automerge.ts +1 -1
  122. package/src/extensions/automerge/update-codemirror.ts +4 -3
  123. package/src/extensions/command/command.ts +27 -9
  124. package/src/extensions/command/hint.ts +30 -33
  125. package/src/extensions/command/index.ts +0 -1
  126. package/src/extensions/command/menu.ts +8 -11
  127. package/src/extensions/command/preview.ts +79 -0
  128. package/src/extensions/command/state.ts +61 -41
  129. package/src/extensions/comments.ts +9 -9
  130. package/src/extensions/folding.tsx +1 -1
  131. package/src/extensions/index.ts +0 -1
  132. package/src/extensions/markdown/changes.ts +2 -3
  133. package/src/extensions/markdown/decorate.ts +10 -12
  134. package/src/extensions/markdown/formatting.ts +6 -6
  135. package/src/extensions/markdown/image.ts +11 -12
  136. package/src/extensions/markdown/index.ts +0 -1
  137. package/src/extensions/markdown/link.ts +24 -33
  138. package/src/extensions/markdown/styles.ts +2 -2
  139. package/src/extensions/modes.ts +6 -5
  140. package/src/fragments.ts +19 -0
  141. package/src/hooks/index.ts +1 -0
  142. package/src/hooks/useActionHandler.ts +12 -0
  143. package/src/hooks/useTextEditor.ts +3 -4
  144. package/src/styles/theme.ts +0 -3
  145. package/src/types.ts +0 -7
  146. package/src/util/react.tsx +2 -20
  147. package/dist/lib/browser/testing/index.mjs +0 -67
  148. package/dist/lib/browser/testing/index.mjs.map +0 -7
  149. package/dist/lib/node/testing/index.cjs +0 -101
  150. package/dist/lib/node/testing/index.cjs.map +0 -7
  151. package/dist/lib/node-esm/testing/index.mjs +0 -69
  152. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  153. package/dist/types/src/components/EditorToolbar/EditorToolbar.stories.d.ts.map +0 -1
  154. package/dist/types/src/components/EditorToolbar/image.d.ts +0 -16
  155. package/dist/types/src/components/EditorToolbar/image.d.ts.map +0 -1
  156. package/dist/types/src/components/EditorToolbar/search.d.ts +0 -17
  157. package/dist/types/src/components/EditorToolbar/search.d.ts.map +0 -1
  158. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +0 -1
  159. package/dist/types/src/extensions/command/action.d.ts +0 -17
  160. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  161. package/dist/types/src/extensions/markdown/outliner.d.ts +0 -12
  162. package/dist/types/src/extensions/markdown/outliner.d.ts.map +0 -1
  163. package/dist/types/src/extensions/preview/index.d.ts +0 -2
  164. package/dist/types/src/extensions/preview/index.d.ts.map +0 -1
  165. package/dist/types/src/extensions/preview/preview.d.ts +0 -39
  166. package/dist/types/src/extensions/preview/preview.d.ts.map +0 -1
  167. package/dist/types/src/stories/TextEditorBasic.stories.d.ts.map +0 -1
  168. package/dist/types/src/stories/TextEditorComments.stories.d.ts +0 -13
  169. package/dist/types/src/stories/TextEditorComments.stories.d.ts.map +0 -1
  170. package/dist/types/src/stories/TextEditorPreview.stories.d.ts +0 -13
  171. package/dist/types/src/stories/TextEditorPreview.stories.d.ts.map +0 -1
  172. package/dist/types/src/stories/TextEditorSpecial.stories.d.ts +0 -19
  173. package/dist/types/src/stories/TextEditorSpecial.stories.d.ts.map +0 -1
  174. package/dist/types/src/stories/story-utils.d.ts +0 -53
  175. package/dist/types/src/stories/story-utils.d.ts.map +0 -1
  176. package/dist/types/src/testing/RefPopover.d.ts +0 -21
  177. package/dist/types/src/testing/RefPopover.d.ts.map +0 -1
  178. package/dist/types/src/testing/index.d.ts +0 -2
  179. package/dist/types/src/testing/index.d.ts.map +0 -1
  180. package/src/components/EditorToolbar/EditorToolbar.stories.tsx +0 -90
  181. package/src/components/EditorToolbar/image.ts +0 -16
  182. package/src/components/EditorToolbar/search.ts +0 -19
  183. package/src/extensions/command/action.ts +0 -49
  184. package/src/extensions/markdown/outliner.ts +0 -235
  185. package/src/extensions/preview/index.ts +0 -5
  186. package/src/extensions/preview/preview.ts +0 -271
  187. package/src/stories/TextEditorBasic.stories.tsx +0 -333
  188. package/src/stories/TextEditorComments.stories.tsx +0 -99
  189. package/src/stories/TextEditorPreview.stories.tsx +0 -239
  190. package/src/stories/TextEditorSpecial.stories.tsx +0 -107
  191. package/src/stories/story-utils.tsx +0 -327
  192. package/src/testing/RefPopover.tsx +0 -74
  193. package/src/testing/index.ts +0 -5
@@ -1,333 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import '@dxos-theme';
6
-
7
- import { javascript } from '@codemirror/lang-javascript';
8
- import { markdown } from '@codemirror/lang-markdown';
9
- import { openSearchPanel } from '@codemirror/search';
10
- import React from 'react';
11
-
12
- import { withLayout, withTheme, type Meta } from '@dxos/storybook-utils';
13
-
14
- import {
15
- DefaultStory,
16
- defaultExtensions,
17
- allExtensions,
18
- text,
19
- str,
20
- content,
21
- longText,
22
- largeWithImages,
23
- headings,
24
- global,
25
- renderLinkButton,
26
- renderLinkTooltip,
27
- links,
28
- names,
29
- } from './story-utils';
30
- import { editorMonospace } from '../defaults';
31
- import {
32
- InputModeExtensions,
33
- selectionState,
34
- decorateMarkdown,
35
- folding,
36
- image,
37
- linkTooltip,
38
- table,
39
- autocomplete,
40
- mention,
41
- outliner,
42
- } from '../extensions';
43
-
44
- const meta: Meta<typeof DefaultStory> = {
45
- title: 'ui/react-ui-editor/TextEditor',
46
- decorators: [withTheme, withLayout({ fullscreen: true })],
47
- render: DefaultStory,
48
- parameters: { layout: 'fullscreen' },
49
- };
50
-
51
- export default meta;
52
-
53
- //
54
- // Default
55
- //
56
-
57
- export const Default = {
58
- render: () => <DefaultStory text={text} extensions={defaultExtensions} />,
59
- };
60
-
61
- //
62
- // Everything
63
- //
64
-
65
- export const Everything = {
66
- render: () => <DefaultStory text={text} extensions={allExtensions} selection={{ anchor: 99, head: 110 }} />,
67
- };
68
-
69
- //
70
- // Empty
71
- //
72
-
73
- export const Empty = {
74
- render: () => <DefaultStory extensions={defaultExtensions} />,
75
- };
76
-
77
- //
78
- // Readonly
79
- //
80
-
81
- export const Readonly = {
82
- render: () => <DefaultStory text={text} extensions={defaultExtensions} readOnly />,
83
- };
84
-
85
- //
86
- // No Extensions
87
- //
88
-
89
- export const NoExtensions = {
90
- render: () => <DefaultStory text={text} />,
91
- };
92
-
93
- //
94
- // Vim
95
- //
96
-
97
- export const Vim = {
98
- render: () => (
99
- <DefaultStory
100
- text={str('# Vim Mode', '', 'The distant future. The year 2000.', '', content.paragraphs)}
101
- extensions={[defaultExtensions, InputModeExtensions.vim]}
102
- />
103
- ),
104
- };
105
-
106
- //
107
- // Scrolling
108
- //
109
-
110
- export const Folding = {
111
- render: () => <DefaultStory text={text} extensions={[folding()]} />,
112
- };
113
-
114
- export const Scrolling = {
115
- render: () => (
116
- <DefaultStory
117
- text={str('# Large Document', '', longText)}
118
- extensions={selectionState({
119
- setState: (id, state) => global.set(id, state),
120
- getState: (id) => global.get(id),
121
- })}
122
- />
123
- ),
124
- };
125
-
126
- export const ScrollingWithImages = {
127
- render: () => (
128
- <DefaultStory text={str('# Large Document', '', largeWithImages)} extensions={[decorateMarkdown(), image()]} />
129
- ),
130
- };
131
-
132
- export const ScrollTo = {
133
- render: () => {
134
- // NOTE: Selection won't appear if text is reformatted.
135
- const word = 'Scroll to here...';
136
- const text = str('# Scroll To', longText, '', word, '', longText);
137
- const idx = text.indexOf(word);
138
- return (
139
- <DefaultStory
140
- text={text}
141
- extensions={defaultExtensions}
142
- scrollTo={idx}
143
- selection={{ anchor: idx, head: idx + word.length }}
144
- />
145
- );
146
- },
147
- };
148
-
149
- //
150
- // Markdown
151
- //
152
-
153
- export const Blockquote = {
154
- render: () => (
155
- <DefaultStory
156
- text={str('> Blockquote', 'continuation', content.footer)}
157
- extensions={decorateMarkdown()}
158
- debug='raw'
159
- />
160
- ),
161
- };
162
-
163
- export const Headings = {
164
- render: () => (
165
- <DefaultStory text={headings} extensions={decorateMarkdown({ numberedHeadings: { from: 2, to: 4 } })} />
166
- ),
167
- };
168
-
169
- export const Links = {
170
- render: () => (
171
- <DefaultStory text={str(content.links, content.footer)} extensions={[linkTooltip(renderLinkTooltip)]} />
172
- ),
173
- };
174
-
175
- export const Image = {
176
- render: () => <DefaultStory text={str(content.image, content.footer)} extensions={[image()]} />,
177
- };
178
-
179
- export const Code = {
180
- render: () => <DefaultStory text={str(content.codeblocks, content.footer)} extensions={[decorateMarkdown()]} />,
181
- };
182
-
183
- export const Lists = {
184
- render: () => (
185
- <DefaultStory
186
- text={str(content.tasks, '', content.bullets, '', content.numbered, content.footer)}
187
- extensions={[decorateMarkdown()]}
188
- />
189
- ),
190
- };
191
-
192
- //
193
- // Bullet List
194
- //
195
-
196
- export const BulletList = {
197
- render: () => <DefaultStory text={str(content.bullets, content.footer)} extensions={[decorateMarkdown()]} />,
198
- };
199
-
200
- //
201
- // Ordered List
202
- //
203
-
204
- export const OrderedList = {
205
- render: () => <DefaultStory text={str(content.numbered, content.footer)} extensions={[decorateMarkdown()]} />,
206
- };
207
-
208
- //
209
- // Task List
210
- //
211
-
212
- export const TaskList = {
213
- render: () => (
214
- <DefaultStory text={str(content.tasks, content.footer)} extensions={[decorateMarkdown()]} debug='raw+tree' />
215
- ),
216
- };
217
-
218
- //
219
- // Outliner
220
- //
221
-
222
- export const Outliner = {
223
- render: () => (
224
- <DefaultStory
225
- // text={str(...content.tasks.split('\n').filter((line) => line.trim().startsWith('-')))}
226
- text={str(
227
- //
228
- '- [ ] A',
229
- '- [ ] B',
230
- // Continuation lines.
231
- ' ## Example',
232
- ' Continuation line belonging to B.',
233
- ' ```ts',
234
- ' const x = 100',
235
- ' ```',
236
- ' - [ ] C',
237
- ' - D Items can have links [like this](https://example.com).',
238
- )}
239
- extensions={[decorateMarkdown({ listPaddingLeft: 8 }), outliner()]}
240
- debug='raw+tree'
241
- />
242
- ),
243
- };
244
-
245
- //
246
- // Table
247
- //
248
-
249
- export const Table = {
250
- render: () => <DefaultStory text={str(content.table, content.footer)} extensions={[decorateMarkdown(), table()]} />,
251
- };
252
-
253
- //
254
- // Commented out
255
- //
256
-
257
- export const CommentedOut = {
258
- render: () => (
259
- <DefaultStory
260
- text={str('# Commented out', '', content.comment, content.footer)}
261
- extensions={[
262
- decorateMarkdown(),
263
- markdown(),
264
- // commentBlock()
265
- ]}
266
- />
267
- ),
268
- };
269
-
270
- //
271
- // Typescript
272
- //
273
-
274
- export const Typescript = {
275
- render: () => (
276
- <DefaultStory
277
- text={content.typescript}
278
- lineNumbers
279
- extensions={[editorMonospace, javascript({ typescript: true })]}
280
- />
281
- ),
282
- };
283
-
284
- //
285
- // Custom
286
- //
287
-
288
- export const Autocomplete = {
289
- render: () => (
290
- <DefaultStory
291
- text={str('# Autocomplete', '', 'Press Ctrl-Space...', content.footer)}
292
- extensions={[
293
- decorateMarkdown({ renderLinkButton }),
294
- autocomplete({
295
- onSearch: (text) => {
296
- return links.filter(({ label }) => label.toLowerCase().includes(text.toLowerCase()));
297
- },
298
- }),
299
- ]}
300
- />
301
- ),
302
- };
303
-
304
- //
305
- // Mention
306
- //
307
-
308
- export const Mention = {
309
- render: () => (
310
- <DefaultStory
311
- text={str('# Mention', '', 'Type @...', content.footer)}
312
- extensions={[
313
- mention({
314
- onSearch: (text) => names.filter((name) => name.toLowerCase().startsWith(text.toLowerCase())),
315
- }),
316
- ]}
317
- />
318
- ),
319
- };
320
-
321
- //
322
- // Search
323
- //
324
-
325
- export const Search = {
326
- render: () => (
327
- <DefaultStory
328
- text={str('# Search', text)}
329
- extensions={defaultExtensions}
330
- onReady={(view) => openSearchPanel(view)}
331
- />
332
- ),
333
- };
@@ -1,99 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import '@dxos-theme';
6
-
7
- import { effect, useSignal } from '@preact/signals-react';
8
- import React, { type FC } from 'react';
9
-
10
- import { keySymbols, parseShortcut } from '@dxos/keyboard';
11
- import { PublicKey } from '@dxos/keys';
12
- import { withLayout, withTheme, type Meta } from '@dxos/storybook-utils';
13
-
14
- import { DefaultStory, str, content, longText } from './story-utils';
15
- import { annotations, comments, createExternalCommentSync } from '../extensions';
16
- import { type Comment } from '../types';
17
- import { createRenderer } from '../util';
18
-
19
- const meta: Meta<typeof DefaultStory> = {
20
- title: 'ui/react-ui-editor/TextEditor',
21
- decorators: [withTheme, withLayout({ fullscreen: true })],
22
- render: DefaultStory,
23
- parameters: { layout: 'fullscreen' },
24
- };
25
-
26
- export default meta;
27
-
28
- //
29
- // Comments
30
- //
31
-
32
- export const Comments = {
33
- render: () => {
34
- const _comments = useSignal<Comment[]>([]);
35
- return (
36
- <DefaultStory
37
- text={str('# Comments', '', content.paragraphs, content.footer)}
38
- extensions={[
39
- createExternalCommentSync(
40
- 'test',
41
- (sink) => effect(() => sink()),
42
- () => _comments.value,
43
- ),
44
- comments({
45
- id: 'test',
46
- renderTooltip: createRenderer(CommentTooltip),
47
- onCreate: ({ cursor }) => {
48
- const id = PublicKey.random().toHex();
49
- _comments.value = [..._comments.value, { id, cursor }];
50
- return id;
51
- },
52
- onSelect: (state) => {
53
- const debug = false;
54
- if (debug) {
55
- console.log(
56
- 'update',
57
- JSON.stringify({
58
- comments: state.comments.length,
59
- active: state.selection.current?.slice(0, 8),
60
- closest: state.selection.closest?.slice(0, 8),
61
- }),
62
- );
63
- }
64
- },
65
- }),
66
- ]}
67
- />
68
- );
69
- },
70
- };
71
-
72
- const Key: FC<{ char: string }> = ({ char }) => (
73
- <span className='flex justify-center items-center w-[24px] h-[24px] rounded text-xs bg-neutral-200 text-black'>
74
- {char}
75
- </span>
76
- );
77
-
78
- const CommentTooltip: FC<{ shortcut: string }> = ({ shortcut }) => {
79
- return (
80
- <div className='flex items-center gap-2 px-2 py-2 bg-neutral-700 text-white text-xs rounded'>
81
- <div>Create comment</div>
82
- <div className='flex gap-1'>
83
- {keySymbols(parseShortcut(shortcut)).map((char) => (
84
- <Key key={char} char={char} />
85
- ))}
86
- </div>
87
- </div>
88
- );
89
- };
90
-
91
- //
92
- // Annotations
93
- //
94
-
95
- export const Annotations = {
96
- render: () => (
97
- <DefaultStory text={str('# Annotations', '', longText)} extensions={[annotations({ match: /volup/gi })]} />
98
- ),
99
- };
@@ -1,239 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import '@dxos-theme';
6
-
7
- import React, { useState, useEffect, type FC, type KeyboardEvent } from 'react';
8
-
9
- import { faker } from '@dxos/random';
10
- import { Button, Icon, IconButton, Input, Popover } from '@dxos/react-ui';
11
- import { mx, hoverableHidden } from '@dxos/react-ui-theme';
12
- import { withLayout, withTheme, type Meta } from '@dxos/storybook-utils';
13
-
14
- import { DefaultStory, str } from './story-utils';
15
- import { editorWidth } from '../defaults';
16
- import {
17
- preview,
18
- command,
19
- image,
20
- type PreviewOptions,
21
- type PreviewLinkRef,
22
- type PreviewLinkTarget,
23
- type PreviewRenderProps,
24
- type Action,
25
- } from '../extensions';
26
- import { RefPopover, useRefPopover } from '../testing';
27
- import { createRenderer } from '../util';
28
-
29
- const meta: Meta<typeof DefaultStory> = {
30
- title: 'ui/react-ui-editor/TextEditor',
31
- decorators: [withTheme, withLayout({ fullscreen: true })],
32
- render: DefaultStory,
33
- parameters: { layout: 'fullscreen' },
34
- };
35
-
36
- export default meta;
37
-
38
- //
39
- // Preview
40
- //
41
-
42
- export const Preview = {
43
- render: () => (
44
- <RefPopover.Provider onLookup={handlePreviewLookup}>
45
- <DefaultStory
46
- text={str(
47
- '# Preview',
48
- '',
49
- 'This project is part of the [DXOS][dxn:queue:data:123] SDK.',
50
- '',
51
- '![DXOS][?dxn:queue:data:123]',
52
- '',
53
- 'It consists of [ECHO][dxn:queue:data:echo], [HALO][dxn:queue:data:halo], and [MESH][dxn:queue:data:mesh].',
54
- '',
55
- '## Deep dive',
56
- '',
57
- '![ECHO][dxn:queue:data:echo]',
58
- '',
59
- '',
60
- )}
61
- extensions={[
62
- image(),
63
- preview({
64
- renderBlock: createRenderer(PreviewBlock),
65
- onLookup: handlePreviewLookup,
66
- }),
67
- ]}
68
- />
69
- <PreviewCard />
70
- </RefPopover.Provider>
71
- ),
72
- };
73
-
74
- const handlePreviewLookup = async ({ label, ref }: PreviewLinkRef): Promise<PreviewLinkTarget> => {
75
- // Random text.
76
- faker.seed(ref.split('').reduce((acc: number, char: string) => acc + char.charCodeAt(0), 1));
77
- const text = Array.from({ length: 2 }, () => faker.lorem.paragraphs()).join('\n\n');
78
- return {
79
- label,
80
- text,
81
- };
82
- };
83
-
84
- // Async lookup.
85
- // TODO(burdon): Handle error.s
86
- const useRefTarget = (link: PreviewLinkRef, onLookup: PreviewOptions['onLookup']): PreviewLinkTarget | undefined => {
87
- const [target, setTarget] = useState<PreviewLinkTarget | undefined>();
88
- useEffect(() => {
89
- void onLookup?.(link).then((target) => setTarget(target ?? undefined));
90
- }, [link, onLookup]);
91
-
92
- return target;
93
- };
94
-
95
- const PreviewCard = () => {
96
- const { link, target } = useRefPopover('PreviewCard');
97
- return (
98
- <Popover.Portal>
99
- <Popover.Content onOpenAutoFocus={(e) => e.preventDefault()}>
100
- <Popover.Viewport>
101
- <div className='grow truncate'>{link?.label}</div>
102
- {target && <div className='line-clamp-3'>{target.text}</div>}
103
- </Popover.Viewport>
104
- <Popover.Arrow />
105
- </Popover.Content>
106
- </Popover.Portal>
107
- );
108
- };
109
-
110
- // TODO(burdon): Replace with card.
111
- const PreviewBlock: FC<PreviewRenderProps> = ({ readonly, link, onAction, onLookup }) => {
112
- const target = useRefTarget(link, onLookup);
113
- return (
114
- <div className='group flex flex-col gap-2'>
115
- <div className='flex items-center gap-4'>
116
- <div className='grow truncate'>
117
- {/* <span className='text-xs text-subdued mie-2'>Prompt</span> */}
118
- {link.label}
119
- </div>
120
- {!readonly && (
121
- <div className='flex gap-1'>
122
- {(link.suggest && (
123
- <>
124
- {target && (
125
- <IconButton
126
- classNames='text-green-500'
127
- label='Apply'
128
- icon={'ph--check--regular'}
129
- onClick={() => onAction({ type: 'insert', link, target })}
130
- />
131
- )}
132
- <IconButton
133
- classNames='text-red-500'
134
- label='Cancel'
135
- icon={'ph--x--regular'}
136
- onClick={() => onAction({ type: 'delete', link })}
137
- />
138
- </>
139
- )) || (
140
- <IconButton
141
- iconOnly
142
- label='Delete'
143
- icon={'ph--x--regular'}
144
- classNames={hoverableHidden}
145
- onClick={() => onAction({ type: 'delete', link })}
146
- />
147
- )}
148
- </div>
149
- )}
150
- </div>
151
- {target && <div className='line-clamp-3'>{target.text}</div>}
152
- </div>
153
- );
154
- };
155
-
156
- //
157
- // Command
158
- //
159
-
160
- export const Command = {
161
- render: () => (
162
- <DefaultStory
163
- text={str(
164
- '# Preview',
165
- '',
166
- 'This project is part of the [DXOS][dxn:queue:data:123] SDK.',
167
- '',
168
- '![DXOS][dxn:queue:data:123]',
169
- '',
170
- )}
171
- extensions={[
172
- preview({
173
- renderBlock: createRenderer(PreviewBlock),
174
- onLookup: handlePreviewLookup,
175
- }),
176
- command({
177
- renderMenu: createRenderer(CommandMenu),
178
- renderDialog: createRenderer(CommandDialog),
179
- onHint: () => 'Press / for commands.',
180
- }),
181
- ]}
182
- />
183
- ),
184
- };
185
-
186
- const CommandMenu = ({ onAction }: { onAction: () => void }) => {
187
- return (
188
- <Button classNames='p-1 aspect-square' onClick={onAction}>
189
- <Icon icon='ph--sparkle--regular' size={5} />
190
- </Button>
191
- );
192
- };
193
-
194
- const CommandDialog = ({ onAction }: { onAction: (action?: Action) => void }) => {
195
- const [text, setText] = useState('');
196
-
197
- const handleInsert = () => {
198
- // TODO(burdon): Use queue ref.
199
- const link = `[${text}](dxn:queue:data:123)`;
200
- onAction(text.length ? { type: 'insert', text: link } : undefined);
201
- };
202
-
203
- const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
204
- switch (event.key) {
205
- case 'Enter': {
206
- handleInsert();
207
- break;
208
- }
209
- case 'Escape': {
210
- onAction();
211
- break;
212
- }
213
- }
214
- };
215
-
216
- return (
217
- <div className='flex w-full justify-center'>
218
- <div
219
- className={mx(
220
- 'flex w-full p-2 gap-2 items-center bg-modalSurface border border-separator rounded-md',
221
- editorWidth,
222
- )}
223
- >
224
- <Input.Root>
225
- <Input.TextInput
226
- autoFocus={true}
227
- placeholder='Ask a question...'
228
- value={text}
229
- onChange={(ev) => setText(ev.target.value)}
230
- onKeyDown={handleKeyDown}
231
- />
232
- </Input.Root>
233
- <Button variant='ghost' classNames='pli-0' onClick={() => onAction({ type: 'cancel' })}>
234
- <Icon icon='ph--x--regular' size={5} />
235
- </Button>
236
- </div>
237
- </div>
238
- );
239
- };