@dxos/react-ui-editor 0.3.11-main.e0dc42b → 0.3.11-main.e19f39d

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 (191) hide show
  1. package/dist/lib/browser/index.mjs +1718 -1284
  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 -10
  7. package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
  8. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts +4 -4
  9. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts.map +1 -1
  10. package/dist/types/src/components/TextEditor/comments.stories.d.ts +26 -0
  11. package/dist/types/src/components/TextEditor/comments.stories.d.ts.map +1 -0
  12. package/dist/types/src/components/TextEditor/{yjs.stories.d.ts → hooks.stories.d.ts} +13 -2
  13. package/dist/types/src/components/TextEditor/hooks.stories.d.ts.map +1 -0
  14. package/dist/types/src/components/Toolbar/Toolbar.d.ts +25 -0
  15. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -0
  16. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +23 -0
  17. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -0
  18. package/dist/types/src/components/Toolbar/index.d.ts +2 -0
  19. package/dist/types/src/components/Toolbar/index.d.ts.map +1 -0
  20. package/dist/types/src/components/index.d.ts +1 -0
  21. package/dist/types/src/components/index.d.ts.map +1 -1
  22. package/dist/types/src/extensions/autocomplete.d.ts.map +1 -1
  23. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  24. package/dist/types/src/extensions/automerge/automerge.spec.d.ts +2 -0
  25. package/dist/types/src/extensions/automerge/automerge.spec.d.ts.map +1 -0
  26. package/dist/types/src/extensions/automerge/automerge.test.d.ts +2 -0
  27. package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +1 -0
  28. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  29. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  30. package/dist/types/src/extensions/automerge/defs.d.ts +9 -11
  31. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
  32. package/dist/types/src/extensions/automerge/index.d.ts +0 -1
  33. package/dist/types/src/extensions/automerge/index.d.ts.map +1 -1
  34. package/dist/types/src/extensions/automerge/semaphore.d.ts +8 -12
  35. package/dist/types/src/extensions/automerge/semaphore.d.ts.map +1 -1
  36. package/dist/types/src/extensions/automerge/update-automerge.d.ts +2 -2
  37. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  38. package/dist/types/src/extensions/awareness.d.ts +2 -2
  39. package/dist/types/src/extensions/awareness.d.ts.map +1 -1
  40. package/dist/types/src/extensions/basic.d.ts +4 -5
  41. package/dist/types/src/extensions/basic.d.ts.map +1 -1
  42. package/dist/types/src/extensions/comments.d.ts +36 -19
  43. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  44. package/dist/types/src/{util → extensions}/cursor.d.ts +10 -2
  45. package/dist/types/src/extensions/cursor.d.ts.map +1 -0
  46. package/dist/types/src/extensions/index.d.ts +2 -7
  47. package/dist/types/src/extensions/index.d.ts.map +1 -1
  48. package/dist/types/src/extensions/markdown/bundle.d.ts +3 -6
  49. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  50. package/dist/types/src/extensions/markdown/code.d.ts.map +1 -0
  51. package/dist/types/src/extensions/markdown/formatting.d.ts +13 -0
  52. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -0
  53. package/dist/types/src/extensions/markdown/heading.d.ts +6 -0
  54. package/dist/types/src/extensions/markdown/heading.d.ts.map +1 -0
  55. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
  56. package/dist/types/src/extensions/markdown/hr.d.ts.map +1 -0
  57. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -0
  58. package/dist/types/src/extensions/markdown/index.d.ts +8 -0
  59. package/dist/types/src/extensions/markdown/index.d.ts.map +1 -1
  60. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -0
  61. package/dist/types/src/extensions/markdown/table.d.ts.map +1 -0
  62. package/dist/types/src/extensions/markdown/tasklist.d.ts.map +1 -0
  63. package/dist/types/src/extensions/mention.d.ts.map +1 -1
  64. package/dist/types/src/extensions/outliner.d.ts +4 -0
  65. package/dist/types/src/extensions/outliner.d.ts.map +1 -0
  66. package/dist/types/src/hooks/awareness-provider.d.ts +7 -4
  67. package/dist/types/src/hooks/awareness-provider.d.ts.map +1 -1
  68. package/dist/types/src/hooks/defs.d.ts +25 -0
  69. package/dist/types/src/hooks/defs.d.ts.map +1 -0
  70. package/dist/types/src/hooks/index.d.ts +4 -2
  71. package/dist/types/src/hooks/index.d.ts.map +1 -1
  72. package/dist/types/src/hooks/useActionHandler.d.ts +4 -0
  73. package/dist/types/src/hooks/useActionHandler.d.ts.map +1 -0
  74. package/dist/types/src/hooks/useEditorView.d.ts +17 -0
  75. package/dist/types/src/hooks/useEditorView.d.ts.map +1 -0
  76. package/dist/types/src/hooks/useTextEditor.d.ts +39 -0
  77. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -0
  78. package/dist/types/src/hooks/useTextModel.d.ts +2 -32
  79. package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
  80. package/dist/types/src/styles/markdown.d.ts +2 -2
  81. package/dist/types/src/styles/markdown.d.ts.map +1 -1
  82. package/dist/types/src/themes/default.d.ts.map +1 -1
  83. package/dist/types/src/util.d.ts +7 -0
  84. package/dist/types/src/util.d.ts.map +1 -0
  85. package/package.json +48 -38
  86. package/src/components/TextEditor/MarkdownEditor.stories.tsx +77 -87
  87. package/src/components/TextEditor/TextEditor.stories.tsx +10 -43
  88. package/src/components/TextEditor/TextEditor.tsx +116 -89
  89. package/src/components/TextEditor/comments.stories.tsx +357 -0
  90. package/src/components/TextEditor/hooks.stories.tsx +106 -0
  91. package/src/components/Toolbar/Toolbar.stories.tsx +90 -0
  92. package/src/components/Toolbar/Toolbar.tsx +166 -0
  93. package/src/components/Toolbar/index.ts +5 -0
  94. package/src/components/index.ts +1 -0
  95. package/src/extensions/autocomplete.ts +6 -3
  96. package/src/extensions/automerge/automerge.spec.tsx +76 -0
  97. package/src/extensions/automerge/automerge.test.ts +13 -0
  98. package/src/extensions/automerge/automerge.ts +55 -46
  99. package/src/extensions/automerge/cursor.ts +5 -4
  100. package/src/extensions/automerge/defs.ts +13 -34
  101. package/src/extensions/automerge/index.ts +0 -1
  102. package/src/extensions/automerge/semaphore.ts +33 -32
  103. package/src/extensions/automerge/update-automerge.ts +14 -8
  104. package/src/extensions/automerge/update-codemirror.ts +5 -5
  105. package/src/extensions/awareness.ts +34 -39
  106. package/src/extensions/basic.ts +17 -10
  107. package/src/extensions/comments.ts +318 -261
  108. package/src/extensions/cursor.ts +50 -0
  109. package/src/extensions/index.ts +2 -7
  110. package/src/extensions/markdown/bundle.ts +23 -28
  111. package/src/extensions/markdown/code.ts +150 -0
  112. package/src/extensions/markdown/formatting.ts +188 -0
  113. package/src/extensions/markdown/heading.ts +59 -0
  114. package/src/extensions/markdown/highlight.ts +9 -23
  115. package/src/extensions/markdown/hr.ts +71 -0
  116. package/src/extensions/markdown/index.ts +8 -0
  117. package/src/extensions/{link.ts → markdown/link.ts} +8 -5
  118. package/src/extensions/markdown/tasklist.ts +110 -0
  119. package/src/extensions/mention.ts +9 -2
  120. package/src/extensions/outliner.ts +12 -0
  121. package/src/hooks/awareness-provider.ts +24 -20
  122. package/src/hooks/defs.ts +42 -0
  123. package/src/hooks/index.ts +5 -2
  124. package/src/hooks/useActionHandler.ts +62 -0
  125. package/src/hooks/useEditorView.ts +29 -0
  126. package/src/hooks/useTextEditor.ts +153 -0
  127. package/src/hooks/useTextModel.ts +49 -58
  128. package/src/styles/markdown.ts +9 -12
  129. package/src/themes/default.ts +19 -52
  130. package/src/util.ts +41 -0
  131. package/dist/types/src/components/TextEditor/codemirror.stories.d.ts +0 -12
  132. package/dist/types/src/components/TextEditor/codemirror.stories.d.ts.map +0 -1
  133. package/dist/types/src/components/TextEditor/yjs.stories.d.ts.map +0 -1
  134. package/dist/types/src/extensions/code.d.ts.map +0 -1
  135. package/dist/types/src/extensions/hr.d.ts.map +0 -1
  136. package/dist/types/src/extensions/image.d.ts.map +0 -1
  137. package/dist/types/src/extensions/link.d.ts.map +0 -1
  138. package/dist/types/src/extensions/table.d.ts.map +0 -1
  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/dist/types/src/util/cursor.d.ts.map +0 -1
  161. package/dist/types/src/util/index.d.ts +0 -3
  162. package/dist/types/src/util/index.d.ts.map +0 -1
  163. package/dist/types/src/util/util.d.ts +0 -5
  164. package/dist/types/src/util/util.d.ts.map +0 -1
  165. package/src/components/TextEditor/codemirror.stories.ts +0 -115
  166. package/src/components/TextEditor/yjs.stories.tsx +0 -56
  167. package/src/extensions/code.ts +0 -106
  168. package/src/extensions/hr.ts +0 -73
  169. package/src/extensions/tasklist.ts +0 -119
  170. package/src/extensions/yjs/cursor.ts +0 -21
  171. package/src/extensions/yjs/index.ts +0 -5
  172. package/src/extensions/yjs/yjs.test.ts +0 -35
  173. package/src/extensions/yjs/yjs.ts +0 -16
  174. package/src/hooks/automerge.ts +0 -52
  175. package/src/hooks/yjs.ts +0 -178
  176. package/src/testing/index.ts +0 -6
  177. package/src/testing/proto/gen/schema.ts +0 -49
  178. package/src/testing/proto/index.ts +0 -5
  179. package/src/testing/proto/schema.proto +0 -15
  180. package/src/testing/replicator.ts +0 -184
  181. package/src/util/cursor.ts +0 -29
  182. package/src/util/index.ts +0 -6
  183. package/src/util/util.ts +0 -18
  184. /package/dist/types/src/extensions/{code.d.ts → markdown/code.d.ts} +0 -0
  185. /package/dist/types/src/extensions/{hr.d.ts → markdown/hr.d.ts} +0 -0
  186. /package/dist/types/src/extensions/{image.d.ts → markdown/image.d.ts} +0 -0
  187. /package/dist/types/src/extensions/{link.d.ts → markdown/link.d.ts} +0 -0
  188. /package/dist/types/src/extensions/{table.d.ts → markdown/table.d.ts} +0 -0
  189. /package/dist/types/src/extensions/{tasklist.d.ts → markdown/tasklist.d.ts} +0 -0
  190. /package/src/extensions/{image.ts → markdown/image.ts} +0 -0
  191. /package/src/extensions/{table.ts → markdown/table.ts} +0 -0
@@ -4,17 +4,17 @@
4
4
  // Ref: https://github.com/automerge/automerge-codemirror
5
5
  //
6
6
 
7
- import { type EditorState, type StateField, type Text, type Transaction } from '@codemirror/state';
7
+ import { type EditorState, type StateField, type Transaction, type Text } from '@codemirror/state';
8
8
 
9
- import { next as am, type Heads } from '@dxos/automerge/automerge';
9
+ import { next as A, type Heads } from '@dxos/automerge/automerge';
10
10
 
11
- import { type IDocHandle, type Value } from './defs';
11
+ import { type IDocHandle, type State } from './defs';
12
12
 
13
13
  export const updateAutomerge = (
14
- field: StateField<Value>,
14
+ field: StateField<State>,
15
15
  handle: IDocHandle,
16
16
  transactions: Transaction[],
17
- state: EditorState,
17
+ state: EditorState, // TODO(burdon): Just pass in the state field value?
18
18
  ): Heads | undefined => {
19
19
  const { lastHeads, path } = state.field(field);
20
20
 
@@ -31,12 +31,18 @@ export const updateAutomerge = (
31
31
  return undefined;
32
32
  }
33
33
 
34
- const newHeads = handle.changeAt(lastHeads, (doc: am.Doc<unknown>) => {
34
+ const newHeads = handle.changeAt(lastHeads, (doc: A.Doc<unknown>) => {
35
+ const invertedTransactions: { from: number; del: number; insert: Text }[] = [];
35
36
  for (const tr of transactions) {
36
- tr.changes.iterChanges((fromA: number, toA: number, _fromB: number, _toB: number, inserted: Text) => {
37
- am.splice(doc, path, fromA, toA - fromA, inserted.toString());
37
+ tr.changes.iterChanges((fromA, toA, _fromB, _toB, insert) => {
38
+ invertedTransactions.push({ from: fromA, del: toA - fromA, insert });
38
39
  });
39
40
  }
41
+
42
+ // TODO(burdon): Hack to apply in reverse order to properly apply range.
43
+ invertedTransactions.reverse().forEach(({ from, del, insert }) => {
44
+ A.splice(doc, path.slice(), from, del, insert.toString());
45
+ });
40
46
  });
41
47
 
42
48
  return newHeads ?? undefined;
@@ -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 }];
@@ -16,7 +16,7 @@ import {
16
16
  import { Event } from '@dxos/async';
17
17
  import { Context } from '@dxos/context';
18
18
 
19
- import { CursorConverter } from '../util';
19
+ import { Cursor, type CursorConverter } from './cursor';
20
20
 
21
21
  export interface AwarenessProvider {
22
22
  remoteStateChange: Event<void>;
@@ -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
  }),
@@ -91,8 +90,8 @@ export class RemoteSelectionsDecorator implements PluginValue {
91
90
  private _lastHead?: number = undefined;
92
91
 
93
92
  constructor(view: EditorView) {
94
- this._cursorConverter = view.state.facet(CursorConverter);
95
- this._provider = view.state.facet(AwarenessProvider);
93
+ this._cursorConverter = view.state.facet(Cursor.converter);
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([])] });
@@ -156,7 +155,7 @@ export class RemoteSelectionsDecorator implements PluginValue {
156
155
  to: end,
157
156
  value: Decoration.mark({
158
157
  attributes: { style: `background-color: ${lightColor}` },
159
- class: 'cm-ySelection',
158
+ class: 'cm-collab-selection',
160
159
  }),
161
160
  });
162
161
  } else {
@@ -166,7 +165,7 @@ export class RemoteSelectionsDecorator implements PluginValue {
166
165
  to: startLine.from + startLine.length,
167
166
  value: Decoration.mark({
168
167
  attributes: { style: `background-color: ${color}` },
169
- class: 'cm-ySelection',
168
+ class: 'cm-collab-selection',
170
169
  }),
171
170
  });
172
171
 
@@ -176,7 +175,7 @@ export class RemoteSelectionsDecorator implements PluginValue {
176
175
  to: end,
177
176
  value: Decoration.mark({
178
177
  attributes: { style: `background-color: ${color}` },
179
- class: 'cm-ySelection',
178
+ class: 'cm-collab-selection',
180
179
  }),
181
180
  });
182
181
 
@@ -186,7 +185,7 @@ export class RemoteSelectionsDecorator implements PluginValue {
186
185
  from: linePos,
187
186
  to: linePos,
188
187
  value: Decoration.line({
189
- attributes: { style: `background-color: ${color}`, class: 'cm-yLineSelection' },
188
+ attributes: { style: `background-color: ${color}`, class: 'cm-collab-selectionLine' },
190
189
  }),
191
190
  });
192
191
  }
@@ -214,15 +213,15 @@ class RemoteCaretWidget extends WidgetType {
214
213
 
215
214
  override toDOM(): HTMLElement {
216
215
  const span = document.createElement('span');
217
- span.className = 'cm-ySelectionCaret';
216
+ span.className = 'cm-collab-selectionCaret';
218
217
  span.style.backgroundColor = this._color;
219
218
  span.style.borderColor = this._color;
220
219
 
221
220
  const dot = document.createElement('div');
222
- dot.className = 'cm-ySelectionCaretDot';
221
+ dot.className = 'cm-collab-selectionCaretDot';
223
222
 
224
223
  const info = document.createElement('div');
225
- info.className = 'cm-ySelectionInfo';
224
+ info.className = 'cm-collab-selectionInfo';
226
225
  info.innerText = this._name;
227
226
 
228
227
  span.appendChild(document.createTextNode('\u2060'));
@@ -249,21 +248,15 @@ class RemoteCaretWidget extends WidgetType {
249
248
  override ignoreEvent() {
250
249
  return true;
251
250
  }
252
-
253
- // TODO(burdon): Not used?
254
- compare(widget: this) {
255
- return widget._color === this._color;
256
- }
257
251
  }
258
252
 
259
- // TODO(burdon): Rename prefix (y for yjs?)
260
253
  const styles = EditorView.baseTheme({
261
- '.cm-ySelection': {},
262
- '.cm-yLineSelection': {
254
+ '.cm-collab-selection': {},
255
+ '.cm-collab-selectionLine': {
263
256
  padding: 0,
264
257
  margin: '0px 2px 0px 4px',
265
258
  },
266
- '.cm-ySelectionCaret': {
259
+ '.cm-collab-selectionCaret': {
267
260
  position: 'relative',
268
261
  borderLeft: '1px solid black',
269
262
  borderRight: '1px solid black',
@@ -271,44 +264,46 @@ const styles = EditorView.baseTheme({
271
264
  marginRight: '-1px',
272
265
  boxSizing: 'border-box',
273
266
  display: 'inline',
267
+ cursor: 'pointer',
274
268
  },
275
- '.cm-ySelectionCaretDot': {
269
+ '.cm-collab-selectionCaretDot': {
276
270
  borderRadius: '50%',
277
271
  position: 'absolute',
278
- width: '.4em',
279
- height: '.4em',
280
- top: '-.2em',
281
- left: '-.2em',
272
+ width: '.5em',
273
+ height: '.5em',
274
+ top: '-.25em',
275
+ left: '-.25em',
282
276
  backgroundColor: 'inherit',
283
277
  transition: 'transform .3s ease-in-out',
284
278
  boxSizing: 'border-box',
285
279
  },
286
- '.cm-ySelectionCaret:hover > .cm-ySelectionCaretDot': {
287
- transformOrigin: 'bottom center',
280
+ '.cm-collab-selectionCaret:hover > .cm-collab-selectionCaretDot': {
288
281
  transform: 'scale(0)',
282
+ transformOrigin: 'center',
289
283
  },
290
- '.cm-ySelectionInfo': {
284
+ '.cm-collab-selectionInfo': {
291
285
  position: 'absolute',
292
- top: '-1.05em',
293
- left: '-1px',
286
+ transform: 'translate(-50%, 0)',
287
+ top: '-20px',
288
+ left: 0,
294
289
  fontSize: '.75em',
295
- fontFamily: 'serif',
290
+ fontFamily: 'sans-serif',
296
291
  fontStyle: 'normal',
297
292
  fontWeight: 'normal',
298
293
  lineHeight: 'normal',
299
294
  userSelect: 'none',
300
295
  color: 'white',
301
- paddingLeft: '2px',
302
- paddingRight: '2px',
296
+ padding: '2px',
303
297
  zIndex: 101,
304
298
  transition: 'opacity .3s ease-in-out',
305
299
  backgroundColor: 'inherit',
306
- // these should be separate
300
+ borderRadius: '2px',
301
+ // These should be separate.
307
302
  opacity: 0,
308
303
  transitionDelay: '0s',
309
304
  whiteSpace: 'nowrap',
310
305
  },
311
- '.cm-ySelectionCaret:hover > .cm-ySelectionInfo': {
306
+ '.cm-collab-selectionCaret:hover > .cm-collab-selectionInfo': {
312
307
  opacity: 1,
313
308
  transitionDelay: '0s',
314
309
  },
@@ -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);