@dxos/react-ui-editor 0.8.4-main.72ec0f3 → 0.8.4-main.7ace549

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 (38) hide show
  1. package/dist/lib/browser/index.mjs +19 -17
  2. package/dist/lib/browser/index.mjs.map +3 -3
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +19 -17
  5. package/dist/lib/node-esm/index.mjs.map +3 -3
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/extensions/automerge/automerge.d.ts +1 -1
  8. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  9. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  10. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  11. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  12. package/dist/types/src/extensions/automerge/sync.d.ts +1 -1
  13. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  14. package/dist/types/src/extensions/automerge/update-automerge.d.ts +1 -1
  15. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  16. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +4 -4
  17. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
  18. package/dist/types/src/extensions/factories.d.ts +5 -4
  19. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  20. package/dist/types/src/stories/Comments.stories.d.ts +1 -1
  21. package/dist/types/src/stories/Experimental.stories.d.ts +1 -1
  22. package/dist/types/src/stories/Markdown.stories.d.ts +1 -1
  23. package/dist/types/src/stories/Preview.stories.d.ts +1 -1
  24. package/dist/types/src/stories/TextEditor.stories.d.ts +1 -1
  25. package/dist/types/src/stories/components/EditorStory.d.ts +5 -4
  26. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  27. package/dist/types/tsconfig.tsbuildinfo +1 -1
  28. package/package.json +36 -35
  29. package/src/components/EditorContent/EditorContent.stories.tsx +1 -1
  30. package/src/extensions/automerge/automerge.stories.tsx +3 -2
  31. package/src/extensions/automerge/automerge.ts +1 -1
  32. package/src/extensions/automerge/cursor.ts +1 -1
  33. package/src/extensions/automerge/sync.ts +1 -1
  34. package/src/extensions/automerge/update-automerge.ts +1 -1
  35. package/src/extensions/awareness/awareness-provider.ts +12 -12
  36. package/src/extensions/factories.ts +13 -9
  37. package/src/stories/Popover.stories.tsx +4 -4
  38. package/src/stories/components/EditorStory.tsx +5 -7
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dxos/react-ui-editor",
3
- "version": "0.8.4-main.72ec0f3",
4
- "description": "Document editing experience within a DXOS shell.",
3
+ "version": "0.8.4-main.7ace549",
4
+ "description": "Text editor components.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
7
7
  "license": "MIT",
@@ -66,23 +66,24 @@
66
66
  "lodash.merge": "^4.6.2",
67
67
  "lodash.sortby": "^4.7.0",
68
68
  "style-mod": "^4.1.0",
69
- "@dxos/app-graph": "0.8.4-main.72ec0f3",
70
- "@dxos/context": "0.8.4-main.72ec0f3",
71
- "@dxos/debug": "0.8.4-main.72ec0f3",
72
- "@dxos/display-name": "0.8.4-main.72ec0f3",
73
- "@dxos/client": "0.8.4-main.72ec0f3",
74
- "@dxos/echo": "0.8.4-main.72ec0f3",
75
- "@dxos/invariant": "0.8.4-main.72ec0f3",
76
- "@dxos/lit-ui": "0.8.4-main.72ec0f3",
77
- "@dxos/async": "0.8.4-main.72ec0f3",
78
- "@dxos/log": "0.8.4-main.72ec0f3",
79
- "@dxos/protocols": "0.8.4-main.72ec0f3",
80
- "@dxos/react-ui-menu": "0.8.4-main.72ec0f3",
81
- "@dxos/react-hooks": "0.8.4-main.72ec0f3",
82
- "@dxos/react-ui-stack": "0.8.4-main.72ec0f3",
83
- "@dxos/util": "0.8.4-main.72ec0f3",
84
- "@dxos/react-ui-types": "0.8.4-main.72ec0f3",
85
- "@dxos/live-object": "0.8.4-main.72ec0f3"
69
+ "@dxos/async": "0.8.4-main.7ace549",
70
+ "@dxos/context": "0.8.4-main.7ace549",
71
+ "@dxos/app-graph": "0.8.4-main.7ace549",
72
+ "@dxos/debug": "0.8.4-main.7ace549",
73
+ "@dxos/display-name": "0.8.4-main.7ace549",
74
+ "@dxos/echo": "0.8.4-main.7ace549",
75
+ "@dxos/echo-db": "0.8.4-main.7ace549",
76
+ "@dxos/lit-ui": "0.8.4-main.7ace549",
77
+ "@dxos/live-object": "0.8.4-main.7ace549",
78
+ "@dxos/invariant": "0.8.4-main.7ace549",
79
+ "@dxos/log": "0.8.4-main.7ace549",
80
+ "@dxos/protocols": "0.8.4-main.7ace549",
81
+ "@dxos/react-hooks": "0.8.4-main.7ace549",
82
+ "@dxos/react-ui-menu": "0.8.4-main.7ace549",
83
+ "@dxos/react-ui-stack": "0.8.4-main.7ace549",
84
+ "@dxos/util": "0.8.4-main.7ace549",
85
+ "@dxos/react-ui-types": "0.8.4-main.7ace549",
86
+ "@dxos/client": "0.8.4-main.7ace549"
86
87
  },
87
88
  "devDependencies": {
88
89
  "@automerge/automerge": "3.1.2",
@@ -110,19 +111,19 @@
110
111
  "vite": "7.1.9",
111
112
  "vite-plugin-top-level-await": "^1.6.0",
112
113
  "vite-plugin-wasm": "^3.5.0",
113
- "@dxos/config": "0.8.4-main.72ec0f3",
114
- "@dxos/echo-signals": "0.8.4-main.72ec0f3",
115
- "@dxos/keyboard": "0.8.4-main.72ec0f3",
116
- "@dxos/random": "0.8.4-main.72ec0f3",
117
- "@dxos/react-client": "0.8.4-main.72ec0f3",
118
- "@dxos/react-ui": "0.8.4-main.72ec0f3",
119
- "@dxos/echo": "0.8.4-main.72ec0f3",
120
- "@dxos/react-ui-attention": "0.8.4-main.72ec0f3",
121
- "@dxos/react-ui-stack": "0.8.4-main.72ec0f3",
122
- "@dxos/react-ui-theme": "0.8.4-main.72ec0f3",
123
- "@dxos/react-ui-syntax-highlighter": "0.8.4-main.72ec0f3",
124
- "@dxos/storybook-utils": "0.8.4-main.72ec0f3",
125
- "@dxos/schema": "0.8.4-main.72ec0f3"
114
+ "@dxos/config": "0.8.4-main.7ace549",
115
+ "@dxos/echo-signals": "0.8.4-main.7ace549",
116
+ "@dxos/keyboard": "0.8.4-main.7ace549",
117
+ "@dxos/random": "0.8.4-main.7ace549",
118
+ "@dxos/echo": "0.8.4-main.7ace549",
119
+ "@dxos/react-ui-attention": "0.8.4-main.7ace549",
120
+ "@dxos/react-ui": "0.8.4-main.7ace549",
121
+ "@dxos/react-ui-stack": "0.8.4-main.7ace549",
122
+ "@dxos/react-ui-syntax-highlighter": "0.8.4-main.7ace549",
123
+ "@dxos/react-ui-theme": "0.8.4-main.7ace549",
124
+ "@dxos/react-client": "0.8.4-main.7ace549",
125
+ "@dxos/schema": "0.8.4-main.7ace549",
126
+ "@dxos/storybook-utils": "0.8.4-main.7ace549"
126
127
  },
127
128
  "peerDependencies": {
128
129
  "@effect-atom/atom-react": "^0.3.4",
@@ -130,9 +131,9 @@
130
131
  "effect": "^3.13.3",
131
132
  "react": "^19.0.0",
132
133
  "react-dom": "^19.0.0",
133
- "@dxos/react-ui": "0.8.4-main.72ec0f3",
134
- "@dxos/react-client": "0.8.4-main.72ec0f3",
135
- "@dxos/react-ui-theme": "0.8.4-main.72ec0f3"
134
+ "@dxos/react-client": "0.8.4-main.7ace549",
135
+ "@dxos/react-ui": "0.8.4-main.7ace549",
136
+ "@dxos/react-ui-theme": "0.8.4-main.7ace549"
136
137
  },
137
138
  "publishConfig": {
138
139
  "access": "public"
@@ -6,7 +6,7 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React from 'react';
7
7
  import { useMemo } from 'react';
8
8
 
9
- import { createDocAccessor, createObject } from '@dxos/client/echo';
9
+ import { createDocAccessor, createObject } from '@dxos/echo-db';
10
10
  import { useThemeContext } from '@dxos/react-ui';
11
11
  import { withLayout, withTheme } from '@dxos/react-ui/testing';
12
12
  import { Text } from '@dxos/schema';
@@ -10,7 +10,8 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
10
10
  import React, { useEffect, useState } from 'react';
11
11
 
12
12
  import { Obj, Ref, Type } from '@dxos/echo';
13
- import { DocAccessor, Query, type Space, createDocAccessor, useQuery, useSpace } from '@dxos/react-client/echo';
13
+ import { DocAccessor, createDocAccessor } from '@dxos/echo-db';
14
+ import { Query, type Space, useQuery, useSpace } from '@dxos/react-client/echo';
14
15
  import { type Identity, useIdentity } from '@dxos/react-client/halo';
15
16
  import { type ClientRepeatedComponentProps, ClientRepeater } from '@dxos/react-client/testing';
16
17
  import { useThemeContext } from '@dxos/react-ui';
@@ -43,7 +44,7 @@ const Editor = ({ source, autoFocus, space, identity }: EditorProps) => {
43
44
  extensions: [
44
45
  createBasicExtensions({ placeholder: 'Type here...', search: true }),
45
46
  createThemeExtensions({ themeMode, slots: editorSlots }),
46
- createDataExtensions({ id: 'test', text: source, space, identity }),
47
+ createDataExtensions({ id: 'test', text: source, messenger: space, identity }),
47
48
  ],
48
49
  autoFocus,
49
50
  }),
@@ -8,7 +8,7 @@ import { next as A } from '@automerge/automerge';
8
8
  import { type Extension, StateField, Transaction } from '@codemirror/state';
9
9
  import { EditorView, ViewPlugin } from '@codemirror/view';
10
10
 
11
- import { DocAccessor } from '@dxos/client/echo';
11
+ import { DocAccessor } from '@dxos/echo-db';
12
12
 
13
13
  import { Cursor } from '../../util';
14
14
  import { initialSync } from '../state';
@@ -2,7 +2,7 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { type DocAccessor, fromCursor, toCursor } from '@dxos/client/echo';
5
+ import { type DocAccessor, fromCursor, toCursor } from '@dxos/echo-db';
6
6
  import { log } from '@dxos/log';
7
7
 
8
8
  import { type CursorConverter } from '../../util';
@@ -8,7 +8,7 @@ import { next as A } from '@automerge/automerge';
8
8
  import { type StateField } from '@codemirror/state';
9
9
  import { type EditorView } from '@codemirror/view';
10
10
 
11
- import { type IDocHandle } from '@dxos/client/echo';
11
+ import { type IDocHandle } from '@dxos/echo-db';
12
12
  import { log } from '@dxos/log';
13
13
 
14
14
  import { type State, getLastHeads, getPath, isReconcile, reconcileAnnotation, updateHeads } from './defs';
@@ -7,7 +7,7 @@
7
7
  import { next as A, type Heads } from '@automerge/automerge';
8
8
  import { type EditorState, type StateField, type Text, type Transaction } from '@codemirror/state';
9
9
 
10
- import { type IDocHandle } from '@dxos/client/echo';
10
+ import { type IDocHandle } from '@dxos/echo-db';
11
11
 
12
12
  import { type State } from './defs';
13
13
 
@@ -3,11 +3,11 @@
3
3
  //
4
4
 
5
5
  import { DeferredTask, Event, sleep } from '@dxos/async';
6
- import { type Space } from '@dxos/client/echo';
7
- import { type GossipMessage } from '@dxos/client/mesh';
8
6
  import { Context } from '@dxos/context';
9
7
  import { invariant } from '@dxos/invariant';
10
8
  import { log } from '@dxos/log';
9
+ import { type Messenger } from '@dxos/protocols';
10
+ import { type GossipMessage } from '@dxos/protocols/proto/dxos/mesh/teleport/gossip';
11
11
 
12
12
  import { type AwarenessInfo, type AwarenessPosition, type AwarenessProvider, type AwarenessState } from './awareness';
13
13
 
@@ -23,7 +23,7 @@ type ProtocolMessage =
23
23
  const DEBOUNCE_INTERVAL = 100; // ms
24
24
 
25
25
  export type AwarenessProviderParams = {
26
- space: Space;
26
+ messenger: Messenger;
27
27
  channel: string;
28
28
  peerId: string;
29
29
  info: AwarenessInfo;
@@ -35,7 +35,7 @@ export type AwarenessProviderParams = {
35
35
  export class SpaceAwarenessProvider implements AwarenessProvider {
36
36
  private readonly _remoteStates = new Map<string, AwarenessState>();
37
37
 
38
- private readonly _space: Space;
38
+ private readonly _messenger: Messenger;
39
39
  private readonly _channel: string;
40
40
  private readonly _peerId: string;
41
41
  private readonly _info: AwarenessInfo;
@@ -46,18 +46,18 @@ export class SpaceAwarenessProvider implements AwarenessProvider {
46
46
 
47
47
  public readonly remoteStateChange = new Event<void>();
48
48
 
49
- constructor(params: AwarenessProviderParams) {
50
- this._space = params.space;
51
- this._channel = params.channel;
52
- this._peerId = params.peerId;
53
- this._info = params.info;
49
+ constructor({ messenger, channel, peerId, info }: AwarenessProviderParams) {
50
+ this._messenger = messenger;
51
+ this._channel = channel;
52
+ this._peerId = peerId;
53
+ this._info = info;
54
54
  }
55
55
 
56
56
  open(): void {
57
57
  this._ctx = new Context();
58
58
  this._postTask = new DeferredTask(this._ctx, async () => {
59
59
  if (this._localState) {
60
- await this._space.postMessage(this._channel, {
60
+ await this._messenger.postMessage(this._channel, {
61
61
  kind: 'post',
62
62
  state: this._localState,
63
63
  } satisfies ProtocolMessage);
@@ -69,7 +69,7 @@ export class SpaceAwarenessProvider implements AwarenessProvider {
69
69
  });
70
70
 
71
71
  this._ctx.onDispose(
72
- this._space.listen(this._channel, (message: GossipMessage) => {
72
+ this._messenger.listen(this._channel, (message: GossipMessage) => {
73
73
  switch (message.payload.kind) {
74
74
  case 'query': {
75
75
  this._handleQueryMessage();
@@ -83,7 +83,7 @@ export class SpaceAwarenessProvider implements AwarenessProvider {
83
83
  }),
84
84
  );
85
85
 
86
- void this._space
86
+ void this._messenger
87
87
  .postMessage(this._channel, {
88
88
  kind: 'query',
89
89
  } satisfies ProtocolMessage)
@@ -23,10 +23,11 @@ import { vscodeDarkStyle, vscodeLightStyle } from '@uiw/codemirror-theme-vscode'
23
23
  import defaultsDeep from 'lodash.defaultsdeep';
24
24
  import merge from 'lodash.merge';
25
25
 
26
- import { type DocAccessor, type Space } from '@dxos/client/echo';
27
- import { type Identity } from '@dxos/client/halo';
28
26
  import { generateName } from '@dxos/display-name';
27
+ import { type DocAccessor } from '@dxos/echo-db';
29
28
  import { log } from '@dxos/log';
29
+ import { type Messenger } from '@dxos/protocols';
30
+ import { type Identity } from '@dxos/protocols/proto/dxos/client/services';
30
31
  import { type ThemeMode } from '@dxos/react-ui';
31
32
  import { type HuePalette } from '@dxos/react-ui-theme';
32
33
  import { hexToHue, isTruthy } from '@dxos/util';
@@ -44,7 +45,9 @@ import { focus } from './focus';
44
45
 
45
46
  export const filterChars = (chars: RegExp) => {
46
47
  return EditorState.transactionFilter.of((transaction) => {
47
- if (!transaction.docChanged) return transaction;
48
+ if (!transaction.docChanged) {
49
+ return transaction;
50
+ }
48
51
 
49
52
  const changes: ChangeSpec[] = [];
50
53
  transaction.changes.iterChanges((fromA, toA, fromB, toB, text) => {
@@ -62,6 +65,7 @@ export const filterChars = (chars: RegExp) => {
62
65
  if (changes.length) {
63
66
  return [transaction, { changes, sequential: true } as TransactionSpec];
64
67
  }
68
+
65
69
  return transaction;
66
70
  });
67
71
  };
@@ -190,7 +194,7 @@ export type ThemeExtensionsOptions = {
190
194
 
191
195
  export const grow: ThemeExtensionsOptions['slots'] = {
192
196
  editor: {
193
- className: 'is-full bs-full',
197
+ className: 'bs-full is-full',
194
198
  },
195
199
  } as const;
196
200
 
@@ -244,24 +248,24 @@ export const createThemeExtensions = ({
244
248
  export type DataExtensionsProps<T> = {
245
249
  id: string;
246
250
  text?: DocAccessor<T>;
247
- space?: Space;
251
+ messenger?: Messenger;
248
252
  identity?: Identity | null;
249
253
  };
250
254
 
251
- // TODO(burdon): Move out of react-ui-editor (remove echo deps).
252
- export const createDataExtensions = <T>({ id, text, space, identity }: DataExtensionsProps<T>): Extension[] => {
255
+ // TODO(burdon): Move out of react-ui-editor?
256
+ export const createDataExtensions = <T>({ id, text, messenger, identity }: DataExtensionsProps<T>): Extension[] => {
253
257
  const extensions: Extension[] = [];
254
258
  if (text) {
255
259
  extensions.push(automerge(text));
256
260
  }
257
261
 
258
- if (space && identity) {
262
+ if (messenger && identity) {
259
263
  const peerId = identity?.identityKey.toHex();
260
264
  const hue = (identity?.profile?.data?.hue as HuePalette | undefined) ?? hexToHue(peerId ?? '0');
261
265
  extensions.push(
262
266
  awareness(
263
267
  new SpaceAwarenessProvider({
264
- space,
268
+ messenger,
265
269
  channel: `awareness.${id}`,
266
270
  peerId: identity.identityKey.toHex(),
267
271
  info: {
@@ -10,7 +10,7 @@ import { faker } from '@dxos/random';
10
10
  import { useClientProvider, withClientProvider } from '@dxos/react-client/testing';
11
11
  import { Domino } from '@dxos/react-ui';
12
12
  import { withTheme } from '@dxos/react-ui/testing';
13
- import { Testing, type ValueGenerator, createObjectFactory } from '@dxos/schema/testing';
13
+ import { TestSchema, type ValueGenerator, createObjectFactory } from '@dxos/schema/testing';
14
14
 
15
15
  import {
16
16
  type EditorController,
@@ -77,7 +77,7 @@ const LinkStory = (args: StoryProps) => {
77
77
  }
78
78
 
79
79
  const name = text?.startsWith('@') ? text.slice(1).toLowerCase() : (text?.toLowerCase() ?? '');
80
- const result = await space?.db.query(Query.type(Testing.Person)).run();
80
+ const result = await space?.db.query(Query.type(TestSchema.Person)).run();
81
81
  const items = result.objects
82
82
  .filter((object) => object.name.toLowerCase().includes(name))
83
83
  .map(
@@ -143,11 +143,11 @@ export const Link: Story = {
143
143
  withClientProvider({
144
144
  createSpace: true,
145
145
  onInitialized: async (client) => {
146
- client.addTypes([Testing.Person]);
146
+ client.addTypes([TestSchema.Person]);
147
147
  },
148
148
  onCreateSpace: async ({ space }) => {
149
149
  const createObjects = createObjectFactory(space.db, generator);
150
- await createObjects([{ type: Testing.Person, count: 10 }]);
150
+ await createObjects([{ type: TestSchema.Person, count: 10 }]);
151
151
  await space.db.flush({ indexes: true });
152
152
  },
153
153
  }),
@@ -3,11 +3,10 @@
3
3
  //
4
4
 
5
5
  import { type EditorView } from '@codemirror/view';
6
+ import type * as Schema from 'effect/Schema';
6
7
  import React, { type ReactNode, forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
7
8
 
8
- import { createDocAccessor, createObject } from '@dxos/client/echo';
9
- import { Expando } from '@dxos/echo/internal';
10
- import { live } from '@dxos/echo/internal';
9
+ import { Obj, Type } from '@dxos/echo';
11
10
  import { invariant } from '@dxos/invariant';
12
11
  import { PublicKey } from '@dxos/keys';
13
12
  import { log } from '@dxos/log';
@@ -23,7 +22,6 @@ import {
23
22
  type DebugNode,
24
23
  type ThemeExtensionsOptions,
25
24
  createBasicExtensions,
26
- createDataExtensions,
27
25
  createMarkdownExtensions,
28
26
  createThemeExtensions,
29
27
  debugTree,
@@ -41,7 +39,8 @@ export type StoryProps = Pick<UseTextEditorProps, 'id' | 'scrollTo' | 'selection
41
39
  debug?: DebugMode;
42
40
  debugCustom?: (view: EditorView) => ReactNode;
43
41
  text?: string;
44
- object?: Expando;
42
+ // TODO(wittjosiah): Find a simpler way to define this type.
43
+ object?: Obj.Obj<Schema.Schema.Type<typeof Type.Expando>>;
45
44
  readOnly?: boolean;
46
45
  placeholder?: string;
47
46
  lineNumbers?: boolean;
@@ -55,7 +54,7 @@ export const EditorStory = forwardRef<EditorController, StoryProps>(
55
54
 
56
55
  const attentionAttrs = useAttentionAttributes('test-panel');
57
56
  const [tree, setTree] = useState<DebugNode>();
58
- const [object] = useState(createObject(live(Expando, { content: text ?? '' })));
57
+ const [object] = useState(Obj.make(Type.Expando, { content: text ?? '' }));
59
58
 
60
59
  const extensions = useMemo(
61
60
  () => (debug ? [extensionsParam, debugTree(setTree)].filter(isNonNullable) : extensionsParam),
@@ -118,7 +117,6 @@ export const EditorComponent = forwardRef<EditorController, StoryProps>(
118
117
  selection,
119
118
  initialValue: text,
120
119
  extensions: [
121
- createDataExtensions({ id, text: createDocAccessor(object, ['content']) }),
122
120
  createBasicExtensions({ readOnly, placeholder, lineNumbers, scrollPastEnd: true, search: true }),
123
121
  createMarkdownExtensions(),
124
122
  createThemeExtensions({ themeMode, syntaxHighlighting: true, slots }),