@dxos/react-ui-editor 0.3.11-main.c8e9429 → 0.3.11-main.cb5abf5

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 (182) hide show
  1. package/dist/lib/browser/index.mjs +1627 -1073
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts +13 -15
  5. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -1
  6. package/dist/types/src/components/TextEditor/TextEditor.d.ts +13 -5
  7. package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
  8. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts +1 -1
  9. package/dist/types/src/components/TextEditor/automerge.stories.d.ts.map +1 -1
  10. package/dist/types/src/components/TextEditor/{yjs.stories.d.ts → hooks.stories.d.ts} +13 -2
  11. package/dist/types/src/components/TextEditor/hooks.stories.d.ts.map +1 -0
  12. package/dist/types/src/components/Toolbar/Toolbar.d.ts +25 -0
  13. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -0
  14. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +23 -0
  15. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -0
  16. package/dist/types/src/components/Toolbar/index.d.ts +2 -0
  17. package/dist/types/src/components/Toolbar/index.d.ts.map +1 -0
  18. package/dist/types/src/components/index.d.ts +1 -0
  19. package/dist/types/src/components/index.d.ts.map +1 -1
  20. package/dist/types/src/extensions/autocomplete.d.ts.map +1 -1
  21. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  22. package/dist/types/src/extensions/automerge/automerge.spec.d.ts +2 -0
  23. package/dist/types/src/extensions/automerge/automerge.spec.d.ts.map +1 -0
  24. package/dist/types/src/extensions/automerge/automerge.test.d.ts +2 -0
  25. package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +1 -0
  26. package/dist/types/src/extensions/automerge/defs.d.ts +8 -10
  27. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
  28. package/dist/types/src/extensions/automerge/semaphore.d.ts +7 -6
  29. package/dist/types/src/extensions/automerge/semaphore.d.ts.map +1 -1
  30. package/dist/types/src/extensions/automerge/update-automerge.d.ts +2 -2
  31. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  32. package/dist/types/src/extensions/awareness.d.ts +2 -2
  33. package/dist/types/src/extensions/awareness.d.ts.map +1 -1
  34. package/dist/types/src/extensions/basic.d.ts +4 -5
  35. package/dist/types/src/extensions/basic.d.ts.map +1 -1
  36. package/dist/types/src/extensions/comments.d.ts +23 -15
  37. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  38. package/dist/types/src/extensions/cursor.d.ts +3 -3
  39. package/dist/types/src/extensions/cursor.d.ts.map +1 -1
  40. package/dist/types/src/extensions/index.d.ts +1 -7
  41. package/dist/types/src/extensions/index.d.ts.map +1 -1
  42. package/dist/types/src/extensions/markdown/bundle.d.ts +3 -6
  43. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  44. package/dist/types/src/extensions/markdown/code.d.ts.map +1 -0
  45. package/dist/types/src/extensions/markdown/formatting.d.ts +13 -0
  46. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -0
  47. package/dist/types/src/extensions/markdown/heading.d.ts +6 -0
  48. package/dist/types/src/extensions/markdown/heading.d.ts.map +1 -0
  49. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
  50. package/dist/types/src/extensions/markdown/hr.d.ts.map +1 -0
  51. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -0
  52. package/dist/types/src/extensions/markdown/index.d.ts +8 -0
  53. package/dist/types/src/extensions/markdown/index.d.ts.map +1 -1
  54. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -0
  55. package/dist/types/src/extensions/markdown/table.d.ts.map +1 -0
  56. package/dist/types/src/extensions/markdown/tasklist.d.ts +3 -0
  57. package/dist/types/src/extensions/markdown/tasklist.d.ts.map +1 -0
  58. package/dist/types/src/extensions/mention.d.ts.map +1 -1
  59. package/dist/types/src/extensions/outliner.d.ts +4 -0
  60. package/dist/types/src/extensions/outliner.d.ts.map +1 -0
  61. package/dist/types/src/hooks/awareness-provider.d.ts +7 -4
  62. package/dist/types/src/hooks/awareness-provider.d.ts.map +1 -1
  63. package/dist/types/src/hooks/defs.d.ts +25 -0
  64. package/dist/types/src/hooks/defs.d.ts.map +1 -0
  65. package/dist/types/src/hooks/index.d.ts +4 -2
  66. package/dist/types/src/hooks/index.d.ts.map +1 -1
  67. package/dist/types/src/hooks/useActionHandler.d.ts +4 -0
  68. package/dist/types/src/hooks/useActionHandler.d.ts.map +1 -0
  69. package/dist/types/src/hooks/useEditorView.d.ts +17 -0
  70. package/dist/types/src/hooks/useEditorView.d.ts.map +1 -0
  71. package/dist/types/src/hooks/useTextEditor.d.ts +39 -0
  72. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -0
  73. package/dist/types/src/hooks/useTextModel.d.ts +14 -27
  74. package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
  75. package/dist/types/src/index.d.ts +1 -1
  76. package/dist/types/src/index.d.ts.map +1 -1
  77. package/dist/types/src/styles/markdown.d.ts +2 -2
  78. package/dist/types/src/styles/markdown.d.ts.map +1 -1
  79. package/dist/types/src/themes/default.d.ts.map +1 -1
  80. package/dist/types/src/util.d.ts +2 -0
  81. package/dist/types/src/util.d.ts.map +1 -1
  82. package/package.json +46 -36
  83. package/src/components/TextEditor/MarkdownEditor.stories.tsx +73 -82
  84. package/src/components/TextEditor/TextEditor.tsx +107 -71
  85. package/src/components/TextEditor/automerge.stories.tsx +1 -2
  86. package/src/components/TextEditor/hooks.stories.tsx +106 -0
  87. package/src/components/Toolbar/Toolbar.stories.tsx +90 -0
  88. package/src/components/Toolbar/Toolbar.tsx +166 -0
  89. package/src/components/Toolbar/index.ts +5 -0
  90. package/src/components/index.ts +1 -0
  91. package/src/extensions/autocomplete.ts +6 -3
  92. package/src/extensions/automerge/automerge.spec.tsx +76 -0
  93. package/src/extensions/automerge/automerge.test.ts +13 -0
  94. package/src/extensions/automerge/automerge.ts +50 -39
  95. package/src/extensions/automerge/cursor.ts +3 -3
  96. package/src/extensions/automerge/defs.ts +11 -36
  97. package/src/extensions/automerge/semaphore.ts +31 -28
  98. package/src/extensions/automerge/update-automerge.ts +14 -8
  99. package/src/extensions/automerge/update-codemirror.ts +5 -5
  100. package/src/extensions/awareness.ts +21 -18
  101. package/src/extensions/basic.ts +17 -10
  102. package/src/extensions/blast.ts +4 -1
  103. package/src/extensions/comments.ts +247 -179
  104. package/src/extensions/cursor.ts +7 -3
  105. package/src/extensions/index.ts +1 -7
  106. package/src/extensions/markdown/bundle.ts +23 -28
  107. package/src/extensions/markdown/code.ts +150 -0
  108. package/src/extensions/markdown/formatting.ts +188 -0
  109. package/src/extensions/markdown/heading.ts +59 -0
  110. package/src/extensions/markdown/highlight.ts +9 -15
  111. package/src/extensions/markdown/hr.ts +71 -0
  112. package/src/extensions/markdown/index.ts +8 -0
  113. package/src/extensions/{link.ts → markdown/link.ts} +13 -4
  114. package/src/extensions/{tasklist.ts → markdown/tasklist.ts} +48 -34
  115. package/src/extensions/mention.ts +9 -2
  116. package/src/extensions/outliner.ts +12 -0
  117. package/src/hooks/awareness-provider.ts +24 -20
  118. package/src/hooks/defs.ts +42 -0
  119. package/src/hooks/index.ts +4 -2
  120. package/src/hooks/useActionHandler.ts +62 -0
  121. package/src/hooks/useEditorView.ts +29 -0
  122. package/src/hooks/useTextEditor.ts +153 -0
  123. package/src/hooks/useTextModel.ts +66 -56
  124. package/src/index.ts +1 -1
  125. package/src/styles/markdown.ts +9 -10
  126. package/src/themes/default.ts +9 -6
  127. package/src/util.ts +26 -3
  128. package/dist/types/src/components/TextEditor/codemirror.stories.d.ts +0 -12
  129. package/dist/types/src/components/TextEditor/codemirror.stories.d.ts.map +0 -1
  130. package/dist/types/src/components/TextEditor/comments.stories.d.ts +0 -26
  131. package/dist/types/src/components/TextEditor/comments.stories.d.ts.map +0 -1
  132. package/dist/types/src/components/TextEditor/yjs.stories.d.ts.map +0 -1
  133. package/dist/types/src/extensions/code.d.ts.map +0 -1
  134. package/dist/types/src/extensions/hr.d.ts.map +0 -1
  135. package/dist/types/src/extensions/image.d.ts.map +0 -1
  136. package/dist/types/src/extensions/link.d.ts.map +0 -1
  137. package/dist/types/src/extensions/table.d.ts.map +0 -1
  138. package/dist/types/src/extensions/tasklist.d.ts +0 -7
  139. package/dist/types/src/extensions/tasklist.d.ts.map +0 -1
  140. package/dist/types/src/extensions/yjs/cursor.d.ts +0 -4
  141. package/dist/types/src/extensions/yjs/cursor.d.ts.map +0 -1
  142. package/dist/types/src/extensions/yjs/index.d.ts +0 -2
  143. package/dist/types/src/extensions/yjs/index.d.ts.map +0 -1
  144. package/dist/types/src/extensions/yjs/yjs.d.ts +0 -4
  145. package/dist/types/src/extensions/yjs/yjs.d.ts.map +0 -1
  146. package/dist/types/src/extensions/yjs/yjs.test.d.ts +0 -2
  147. package/dist/types/src/extensions/yjs/yjs.test.d.ts.map +0 -1
  148. package/dist/types/src/hooks/automerge.d.ts +0 -3
  149. package/dist/types/src/hooks/automerge.d.ts.map +0 -1
  150. package/dist/types/src/hooks/yjs.d.ts +0 -27
  151. package/dist/types/src/hooks/yjs.d.ts.map +0 -1
  152. package/dist/types/src/testing/index.d.ts +0 -3
  153. package/dist/types/src/testing/index.d.ts.map +0 -1
  154. package/dist/types/src/testing/proto/gen/schema.d.ts +0 -15
  155. package/dist/types/src/testing/proto/gen/schema.d.ts.map +0 -1
  156. package/dist/types/src/testing/proto/index.d.ts +0 -2
  157. package/dist/types/src/testing/proto/index.d.ts.map +0 -1
  158. package/dist/types/src/testing/replicator.d.ts +0 -45
  159. package/dist/types/src/testing/replicator.d.ts.map +0 -1
  160. package/src/components/TextEditor/codemirror.stories.ts +0 -115
  161. package/src/components/TextEditor/comments.stories.tsx +0 -355
  162. package/src/components/TextEditor/yjs.stories.tsx +0 -56
  163. package/src/extensions/code.ts +0 -104
  164. package/src/extensions/hr.ts +0 -72
  165. package/src/extensions/yjs/cursor.ts +0 -22
  166. package/src/extensions/yjs/index.ts +0 -5
  167. package/src/extensions/yjs/yjs.test.ts +0 -35
  168. package/src/extensions/yjs/yjs.ts +0 -16
  169. package/src/hooks/automerge.ts +0 -52
  170. package/src/hooks/yjs.ts +0 -156
  171. package/src/testing/index.ts +0 -6
  172. package/src/testing/proto/gen/schema.ts +0 -49
  173. package/src/testing/proto/index.ts +0 -5
  174. package/src/testing/proto/schema.proto +0 -15
  175. package/src/testing/replicator.ts +0 -184
  176. /package/dist/types/src/extensions/{code.d.ts → markdown/code.d.ts} +0 -0
  177. /package/dist/types/src/extensions/{hr.d.ts → markdown/hr.d.ts} +0 -0
  178. /package/dist/types/src/extensions/{image.d.ts → markdown/image.d.ts} +0 -0
  179. /package/dist/types/src/extensions/{link.d.ts → markdown/link.d.ts} +0 -0
  180. /package/dist/types/src/extensions/{table.d.ts → markdown/table.d.ts} +0 -0
  181. /package/src/extensions/{image.ts → markdown/image.ts} +0 -0
  182. /package/src/extensions/{table.ts → markdown/table.ts} +0 -0
@@ -16,7 +16,7 @@ import {
16
16
  type SpliceTextPatch,
17
17
  } from '@dxos/automerge/automerge';
18
18
 
19
- import { reconcileAnnotationType } from './defs';
19
+ import { reconcileAnnotation } from './defs';
20
20
 
21
21
  export const updateCodeMirror = (view: EditorView, selection: EditorSelection, target: Prop[], patches: Patch[]) => {
22
22
  for (const patch of patches) {
@@ -26,14 +26,14 @@ export const updateCodeMirror = (view: EditorView, selection: EditorSelection, t
26
26
  selection = selection.map(changeSet, 1);
27
27
  view.dispatch({
28
28
  changes: changeSet,
29
- annotations: reconcileAnnotationType.of({}),
29
+ annotations: reconcileAnnotation.of(false),
30
30
  });
31
31
  }
32
32
  }
33
33
 
34
34
  view.dispatch({
35
35
  selection,
36
- annotations: reconcileAnnotationType.of({}),
36
+ annotations: reconcileAnnotation.of(false),
37
37
  });
38
38
  };
39
39
 
@@ -57,7 +57,7 @@ const handleInsert = (target: Prop[], patch: InsertPatch): Array<ChangeSpec> =>
57
57
  return [];
58
58
  }
59
59
 
60
- const text = patch.values.map((v) => (v ? v.toString() : '')).join('');
60
+ const text = patch.values.map((value) => (value ? value.toString() : '')).join('');
61
61
  return [{ from: index, to: index, insert: text }];
62
62
  };
63
63
 
@@ -88,7 +88,7 @@ const handlePut = (target: Prop[], patch: PutPatch, state: EditorState): Array<C
88
88
 
89
89
  const length = state.doc.length;
90
90
  if (typeof patch.value !== 'string') {
91
- return []; // TODO(dmaretskyi): How to handle non string values?
91
+ return []; // TODO(dmaretskyi): How to handle non-string values?
92
92
  }
93
93
 
94
94
  return [{ from: 0, to: length, insert: patch.value as any }];
@@ -24,8 +24,8 @@ export interface AwarenessProvider {
24
24
  open(): void;
25
25
  close(): void;
26
26
 
27
- update(position: AwarenessPosition | undefined): void;
28
27
  getRemoteStates(): AwarenessState[];
28
+ update(position: AwarenessPosition | undefined): void;
29
29
  }
30
30
 
31
31
  const dummyProvider: AwarenessProvider = {
@@ -34,11 +34,11 @@ const dummyProvider: AwarenessProvider = {
34
34
  open: () => {},
35
35
  close: () => {},
36
36
 
37
- update: () => {},
38
37
  getRemoteStates: () => [],
38
+ update: () => {},
39
39
  };
40
40
 
41
- export const AwarenessProvider = Facet.define<AwarenessProvider, AwarenessProvider>({
41
+ export const awarenessProvider = Facet.define<AwarenessProvider, AwarenessProvider>({
42
42
  combine: (providers) => providers[0] ?? dummyProvider,
43
43
  });
44
44
 
@@ -66,10 +66,9 @@ export type AwarenessState = {
66
66
  /**
67
67
  * Extension provides presence information about other peers.
68
68
  */
69
- // TODO(burdon): Why provide default?
70
69
  export const awareness = (provider = dummyProvider): Extension => {
71
70
  return [
72
- AwarenessProvider.of(provider),
71
+ awarenessProvider.of(provider),
73
72
  ViewPlugin.fromClass(RemoteSelectionsDecorator, {
74
73
  decorations: (value) => value.decorations,
75
74
  }),
@@ -92,7 +91,7 @@ export class RemoteSelectionsDecorator implements PluginValue {
92
91
 
93
92
  constructor(view: EditorView) {
94
93
  this._cursorConverter = view.state.facet(Cursor.converter);
95
- this._provider = view.state.facet(AwarenessProvider);
94
+ this._provider = view.state.facet(awarenessProvider);
96
95
  this._provider.open();
97
96
  this._provider.remoteStateChange.on(this._ctx, () => {
98
97
  view.dispatch({ annotations: [RemoteSelectionChangedAnnotation.of([])] });
@@ -208,7 +207,10 @@ export class RemoteSelectionsDecorator implements PluginValue {
208
207
  }
209
208
 
210
209
  class RemoteCaretWidget extends WidgetType {
211
- constructor(private readonly _name: string, private readonly _color: string) {
210
+ constructor(
211
+ private readonly _name: string,
212
+ private readonly _color: string,
213
+ ) {
212
214
  super();
213
215
  }
214
216
 
@@ -251,7 +253,6 @@ class RemoteCaretWidget extends WidgetType {
251
253
  }
252
254
  }
253
255
 
254
- // TODO(burdon): Mixed case?
255
256
  const styles = EditorView.baseTheme({
256
257
  '.cm-collab-selection': {},
257
258
  '.cm-collab-selectionLine': {
@@ -266,38 +267,40 @@ const styles = EditorView.baseTheme({
266
267
  marginRight: '-1px',
267
268
  boxSizing: 'border-box',
268
269
  display: 'inline',
270
+ cursor: 'pointer',
269
271
  },
270
272
  '.cm-collab-selectionCaretDot': {
271
273
  borderRadius: '50%',
272
274
  position: 'absolute',
273
- width: '.4em',
274
- height: '.4em',
275
- top: '-.2em',
276
- left: '-.2em',
275
+ width: '.5em',
276
+ height: '.5em',
277
+ top: '-.25em',
278
+ left: '-.25em',
277
279
  backgroundColor: 'inherit',
278
280
  transition: 'transform .3s ease-in-out',
279
281
  boxSizing: 'border-box',
280
282
  },
281
283
  '.cm-collab-selectionCaret:hover > .cm-collab-selectionCaretDot': {
282
- transformOrigin: 'bottom center',
283
284
  transform: 'scale(0)',
285
+ transformOrigin: 'center',
284
286
  },
285
287
  '.cm-collab-selectionInfo': {
286
288
  position: 'absolute',
287
- top: '-1.05em',
288
- left: '-1px',
289
+ transform: 'translate(-50%, 0)',
290
+ top: '-20px',
291
+ left: 0,
289
292
  fontSize: '.75em',
290
- fontFamily: 'serif',
293
+ fontFamily: 'sans-serif',
291
294
  fontStyle: 'normal',
292
295
  fontWeight: 'normal',
293
296
  lineHeight: 'normal',
294
297
  userSelect: 'none',
295
298
  color: 'white',
296
- paddingLeft: '2px',
297
- paddingRight: '2px',
299
+ padding: '2px',
298
300
  zIndex: 101,
299
301
  transition: 'opacity .3s ease-in-out',
300
302
  backgroundColor: 'inherit',
303
+ borderRadius: '2px',
301
304
  // These should be separate.
302
305
  opacity: 0,
303
306
  transitionDelay: '0s',
@@ -3,30 +3,37 @@
3
3
  //
4
4
 
5
5
  import { closeBrackets } from '@codemirror/autocomplete';
6
+ import { history } from '@codemirror/commands';
6
7
  import { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from '@codemirror/language';
7
8
  import { type Extension } from '@codemirror/state';
8
9
  import { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';
9
- import { drawSelection, EditorView, placeholder } from '@codemirror/view';
10
+ import { drawSelection, EditorView, highlightActiveLine, placeholder } from '@codemirror/view';
10
11
 
11
- import type { ThemeMode } from '@dxos/react-ui';
12
+ import { type ThemeMode } from '@dxos/react-ui';
13
+ import { isNotFalsy } from '@dxos/util';
14
+
15
+ import { type TextEditorProps } from '../components';
12
16
 
13
17
  export type BasicBundleOptions = {
14
- readonly?: boolean;
15
18
  themeMode?: ThemeMode;
16
- placeholder?: string;
17
- };
19
+ } & Pick<TextEditorProps, 'placeholder' | 'lineWrapping'>;
18
20
 
19
- export const basicBundle = ({ readonly, themeMode, placeholder: _placeholder }: BasicBundleOptions): Extension[] =>
21
+ export const createBasicBundle = ({
22
+ themeMode,
23
+ placeholder: _placeholder,
24
+ lineWrapping = true,
25
+ }: BasicBundleOptions = {}): Extension[] =>
20
26
  [
21
- EditorView.lineWrapping,
27
+ lineWrapping && EditorView.lineWrapping,
22
28
 
23
- // TODO(burdon): Compare with minimalSetup.
24
29
  // https://codemirror.net/docs/ref/#codemirror.minimalSetup
25
30
  bracketMatching(),
26
31
  closeBrackets(),
27
32
  drawSelection(),
33
+ highlightActiveLine(),
34
+ history(),
28
35
  _placeholder && placeholder(_placeholder),
29
36
 
30
- // TODO(burdon): Is this required?
37
+ // https://github.com/codemirror/theme-one-dark
31
38
  themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle),
32
- ].filter(Boolean) as Extension[];
39
+ ].filter(isNotFalsy);
@@ -125,7 +125,10 @@ class Blaster {
125
125
 
126
126
  _lastPoint = { x: 0, y: 0 };
127
127
 
128
- constructor(private readonly _node: HTMLElement, private readonly _options: BlastOptions) {
128
+ constructor(
129
+ private readonly _node: HTMLElement,
130
+ private readonly _options: BlastOptions,
131
+ ) {
129
132
  this._effect = this._options.effect === 1 ? new Effect1(_options) : new Effect2(_options);
130
133
  }
131
134