@dxos/react-ui-editor 0.4.6 → 0.4.7-main.06facb4

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 (83) hide show
  1. package/dist/lib/browser/index.mjs +970 -740
  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 +9 -0
  5. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -1
  6. package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
  7. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts +0 -9
  8. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts.map +1 -1
  9. package/dist/types/src/components/TextEditor/index.d.ts +0 -2
  10. package/dist/types/src/components/TextEditor/index.d.ts.map +1 -1
  11. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  12. package/dist/types/src/{components/TextEditor → extensions/automerge}/automerge.stories.d.ts +4 -2
  13. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -0
  14. package/dist/types/src/extensions/command/command.d.ts +10 -0
  15. package/dist/types/src/extensions/command/command.d.ts.map +1 -0
  16. package/dist/types/src/extensions/command/hint.d.ts +7 -0
  17. package/dist/types/src/extensions/command/hint.d.ts.map +1 -0
  18. package/dist/types/src/extensions/command/index.d.ts +2 -0
  19. package/dist/types/src/extensions/command/index.d.ts.map +1 -0
  20. package/dist/types/src/extensions/command/state.d.ts +18 -0
  21. package/dist/types/src/extensions/command/state.d.ts.map +1 -0
  22. package/dist/types/src/extensions/cursor-line-margin.d.ts.map +1 -1
  23. package/dist/types/src/extensions/dnd.d.ts +3 -0
  24. package/dist/types/src/extensions/dnd.d.ts.map +1 -0
  25. package/dist/types/src/extensions/index.d.ts +2 -1
  26. package/dist/types/src/extensions/index.d.ts.map +1 -1
  27. package/dist/types/src/extensions/listener.d.ts +1 -1
  28. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  29. package/dist/types/src/extensions/markdown/bundle.d.ts +2 -2
  30. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  31. package/dist/types/src/extensions/markdown/decorate.d.ts +4 -0
  32. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  33. package/dist/types/src/extensions/util/dom.d.ts +15 -0
  34. package/dist/types/src/extensions/util/dom.d.ts.map +1 -0
  35. package/dist/types/src/hooks/defs.d.ts +5 -11
  36. package/dist/types/src/hooks/defs.d.ts.map +1 -1
  37. package/dist/types/src/hooks/useEditorView.d.ts.map +1 -1
  38. package/dist/types/src/hooks/useTextEditor.d.ts +20 -5
  39. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  40. package/dist/types/src/{components/TextEditor/hooks.stories.d.ts → hooks/useTextEditor.stories.d.ts} +1 -3
  41. package/dist/types/src/hooks/useTextEditor.stories.d.ts.map +1 -0
  42. package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
  43. package/dist/types/src/index.d.ts +1 -0
  44. package/dist/types/src/index.d.ts.map +1 -1
  45. package/dist/types/src/styles/index.d.ts +0 -1
  46. package/dist/types/src/styles/index.d.ts.map +1 -1
  47. package/dist/types/src/themes/default.d.ts.map +1 -1
  48. package/package.json +25 -25
  49. package/src/components/TextEditor/MarkdownEditor.stories.tsx +95 -8
  50. package/src/components/TextEditor/TextEditor.stories.tsx +0 -15
  51. package/src/components/TextEditor/TextEditor.tsx +13 -6
  52. package/src/components/TextEditor/index.ts +0 -3
  53. package/src/components/Toolbar/Toolbar.stories.tsx +2 -1
  54. package/src/{components/TextEditor → extensions/automerge}/automerge.stories.tsx +32 -37
  55. package/src/extensions/awareness.ts +3 -3
  56. package/src/extensions/command/command.ts +35 -0
  57. package/src/extensions/command/hint.ts +76 -0
  58. package/src/extensions/command/index.ts +5 -0
  59. package/src/extensions/command/state.ts +106 -0
  60. package/src/extensions/cursor-line-margin.ts +2 -1
  61. package/src/extensions/dnd.ts +15 -0
  62. package/src/extensions/index.ts +2 -1
  63. package/src/extensions/listener.ts +3 -3
  64. package/src/extensions/markdown/bundle.ts +4 -15
  65. package/src/extensions/markdown/decorate.ts +75 -31
  66. package/src/extensions/util/dom.ts +36 -0
  67. package/src/hooks/defs.ts +6 -20
  68. package/src/hooks/useActionHandler.ts +11 -11
  69. package/src/hooks/useEditorView.ts +0 -1
  70. package/src/{components/TextEditor/hooks.stories.tsx → hooks/useTextEditor.stories.tsx} +8 -8
  71. package/src/hooks/useTextEditor.ts +69 -14
  72. package/src/hooks/useTextModel.ts +18 -18
  73. package/src/index.ts +2 -0
  74. package/src/styles/index.ts +0 -1
  75. package/src/themes/default.ts +1 -0
  76. package/dist/types/src/components/TextEditor/automerge.stories.d.ts.map +0 -1
  77. package/dist/types/src/components/TextEditor/hooks.stories.d.ts.map +0 -1
  78. package/dist/types/src/extensions/basic.d.ts +0 -9
  79. package/dist/types/src/extensions/basic.d.ts.map +0 -1
  80. package/dist/types/src/styles/cursors.d.ts +0 -5
  81. package/dist/types/src/styles/cursors.d.ts.map +0 -1
  82. package/src/extensions/basic.ts +0 -41
  83. package/src/styles/cursors.ts +0 -21
@@ -1,4 +1,4 @@
1
- import { type Extension, StateField } from '@codemirror/state';
1
+ import { type Extension } from '@codemirror/state';
2
2
  import { type DocAccessor } from '@dxos/echo-schema';
3
3
  export type Range = {
4
4
  from: number;
@@ -8,19 +8,13 @@ export type Comment = {
8
8
  id: string;
9
9
  cursor?: string;
10
10
  };
11
+ /**
12
+ * @deprecated
13
+ */
11
14
  export type EditorModel = {
12
15
  id: string;
13
16
  text: () => string;
14
- extension?: Extension;
15
17
  content: string | DocAccessor;
16
- peer?: {
17
- id: string;
18
- name?: string;
19
- };
18
+ extension?: Extension;
20
19
  };
21
- /**
22
- * State field makes the model available to other extensions.
23
- * @deprecated
24
- */
25
- export declare const modelState: StateField<EditorModel | undefined>;
26
20
  //# sourceMappingURL=defs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"defs.d.ts","sourceRoot":"","sources":["../../../../src/hooks/defs.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAGF,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;IAGtB,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC;IAG9B,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH,CAAC;AAEF;;;GAGG;AAEH,eAAO,MAAM,UAAU,qCAGrB,CAAC"}
1
+ {"version":3,"file":"defs.d.ts","sourceRoot":"","sources":["../../../../src/hooks/defs.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAGF,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;GAEG;AAEH,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC;IAC9B,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useEditorView.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useEditorView.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,gBAAgB,EAAoB,MAAM,OAAO,CAAC;AAEhE;;;;;;;;;;;;;;;GAeG;AAEH,eAAO,MAAM,aAAa,OAAQ,MAAM,KAAG,CAAC,iBAAiB,UAAU,GAAG,IAAI,CAAC,EAAE,OAAO,CAQvF,CAAC"}
1
+ {"version":3,"file":"useEditorView.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useEditorView.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,gBAAgB,EAAoB,MAAM,OAAO,CAAC;AAEhE;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,aAAa,OAAQ,MAAM,KAAG,CAAC,iBAAiB,UAAU,GAAG,IAAI,CAAC,EAAE,OAAO,CAQvF,CAAC"}
@@ -16,16 +16,31 @@ export type UseTextEditor = {
16
16
  * Hook for creating editor.
17
17
  */
18
18
  export declare const useTextEditor: ({ autoFocus, scrollTo, debug, doc, selection, extensions }?: UseTextEditorOptions, deps?: DependencyList) => UseTextEditor;
19
- export type DataExtensionsOptions = {
19
+ /**
20
+ * https://codemirror.net/docs/extensions
21
+ * https://github.com/codemirror/basic-setup
22
+ */
23
+ export type BasicExtensionsOptions = {
24
+ allowMultipleSelections?: boolean;
25
+ bracketMatching?: boolean;
26
+ closeBrackets?: boolean;
27
+ crosshairCursor?: boolean;
28
+ dropCursor?: boolean;
29
+ drawSelection?: boolean;
30
+ editable?: boolean;
31
+ highlightActiveLine?: boolean;
32
+ history?: boolean;
33
+ lineNumbers?: boolean;
34
+ lineWrapping?: boolean;
35
+ placeholder?: string;
20
36
  readonly?: boolean;
37
+ scrollPastEnd?: boolean;
38
+ tabSize?: number;
21
39
  };
22
- export declare const createDataExtensions: ({ readonly }?: {
23
- readonly?: boolean | undefined;
24
- }) => Extension;
40
+ export declare const createBasicExtensions: (_props?: BasicExtensionsOptions) => Extension;
25
41
  export type ThemeExtensionsOptions = {
26
42
  theme?: ThemeStyles;
27
43
  themeMode?: ThemeMode;
28
- lineWrap?: boolean;
29
44
  slots?: {
30
45
  editor?: {
31
46
  className?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"useTextEditor.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextEditor.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAA+B,MAAM,OAAO,CAAC;AAGzF,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAI7C,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,iBAAiB,CAAC;AAGtB,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF;;GAEG;AAEH,eAAO,MAAM,aAAa,gEACoC,oBAAoB,SACzE,cAAc,KACpB,aAuEF,CAAC;AAIF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAGF,eAAO,MAAM,oBAAoB;;MAAgC,SAMhE,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE;QACN,MAAM,CAAC,EAAE;YACP,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;QACF,OAAO,CAAC,EAAE;YACR,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;KACH,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,qBAAqB,iCAAiC,sBAAsB,KAAQ,SAShG,CAAC"}
1
+ {"version":3,"file":"useTextEditor.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextEditor.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAIL,UAAU,EAKX,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAA+B,MAAM,OAAO,CAAC;AAGzF,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAI7C,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,iBAAiB,CAAC;AAGtB,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF;;GAEG;AAEH,eAAO,MAAM,aAAa,gEACoC,oBAAoB,4BAE/E,aAuEF,CAAC;AAIF;;;GAGG;AAEH,MAAM,MAAM,sBAAsB,GAAG;IACnC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAWF,eAAO,MAAM,qBAAqB,YAAa,sBAAsB,KAAG,SAuBvE,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,KAAK,CAAC,EAAE;QACN,MAAM,CAAC,EAAE;YACP,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;QACF,OAAO,CAAC,EAAE;YACR,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;KACH,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,qBAAqB,iCAAiC,sBAAsB,KAAQ,SAQhG,CAAC"}
@@ -1,5 +1,4 @@
1
1
  import '@dxosTheme';
2
- import React from 'react';
3
2
  type StoryProps = {
4
3
  autoFocus?: boolean;
5
4
  placeholder?: string;
@@ -8,7 +7,6 @@ type StoryProps = {
8
7
  };
9
8
  declare const _default: {
10
9
  title: string;
11
- component: React.ForwardRefExoticComponent<import("./TextEditor").TextEditorProps & React.RefAttributes<import("@codemirror/view").EditorView | null>>;
12
10
  decorators: import("@storybook/react").Decorator[];
13
11
  render: (args: StoryProps) => JSX.Element;
14
12
  parameters: {
@@ -42,4 +40,4 @@ export declare const Default: {
42
40
  doc: string;
43
41
  };
44
42
  };
45
- //# sourceMappingURL=hooks.stories.d.ts.map
43
+ //# sourceMappingURL=useTextEditor.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTextEditor.stories.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextEditor.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,YAAY,CAAC;AA8BpB,KAAK,UAAU,GAAG;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;;;;mBAiFe,UAAU;;;;;;;;;;;;;;;;;;;;;;;;AAJ3B,wBAUE;AAEF,eAAO,MAAM,OAAO;;;;;;CAMnB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTextModel.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextModel.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAqB,MAAM,OAAO,CAAC;AAK9E,OAAO,EAAqB,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGxD,OAAO,EAAE,KAAK,WAAW,EAAc,MAAM,QAAQ,CAAC;AAEtD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAGhE,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,CAAC;AAGF,eAAO,MAAM,iBAAiB,kCAAmC,sBAAsB,KAAG,SAAS,EAmBlG,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF;;GAEG;AAEH,eAAO,MAAM,YAAY,UAAW,iBAAiB,KAAG,WAAW,GAAG,SACb,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,oBAAoB;QAI3B,MAAM;;;gBAEoB,SAAS,eAAe,MAAM,CAAC,CAAC;CAG/D,CAAC"}
1
+ {"version":3,"file":"useTextModel.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextModel.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAqB,MAAM,OAAO,CAAC;AAK9E,OAAO,EAAqB,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAKxD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE1C,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,CAAC;AAGF,eAAO,MAAM,iBAAiB,kCAAmC,sBAAsB,KAAG,SAAS,EAsBlG,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF;;GAEG;AAEH,eAAO,MAAM,YAAY,UAAW,iBAAiB,KAAG,WAAW,GAAG,SACb,CAAC;AAE1D;;;GAGG;AAEH,eAAO,MAAM,oBAAoB;QAI3B,MAAM;;;gBAEoB,SAAS,eAAe,MAAM,CAAC,CAAC;CAG/D,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import translations from './translations';
2
2
  export { type Extension, type EditorState } from '@codemirror/state';
3
3
  export { type EditorView, keymap } from '@codemirror/view';
4
+ export { tags } from '@lezer/highlight';
4
5
  export { TextKind } from '@dxos/protocols/proto/dxos/echo/model/text';
5
6
  export { Doc, YText, YXmlFragment } from '@dxos/text-model';
6
7
  export * from './components';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,MAAM,4CAA4C,CAAC;AACtE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE5D,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAC3G,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,4CAA4C,CAAC;AACtE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE5D,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAC3G,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -1,4 +1,3 @@
1
- export * from './cursors';
2
1
  export * from './markdown';
3
2
  export * from './tokens';
4
3
  export * from './layout';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/styles/index.ts"],"names":[],"mappings":"AAIA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/styles/index.ts"],"names":[],"mappings":"AAIA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../../../src/themes/default.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,WAAW,EAAU,MAAM,WAAW,CAAC;AAKrD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,EAAE,WA+O1B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,WAOvB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,WAO3B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,WAOvB,CAAC"}
1
+ {"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../../../src/themes/default.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,WAAW,EAAU,MAAM,WAAW,CAAC;AAKrD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,EAAE,WAgP1B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,WAOvB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,WAO3B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,WAOvB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/react-ui-editor",
3
- "version": "0.4.6",
3
+ "version": "0.4.7-main.06facb4",
4
4
  "description": "Document editing experience within a DXOS shell.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -23,7 +23,7 @@
23
23
  "@codemirror/search": "^6.5.5",
24
24
  "@codemirror/state": "^6.4.0",
25
25
  "@codemirror/theme-one-dark": "^6.1.2",
26
- "@codemirror/view": "^6.23.0",
26
+ "@codemirror/view": "^6.25.0",
27
27
  "@fluentui/react-tabster": "^9.19.0",
28
28
  "@lezer/common": "^1.2.1",
29
29
  "@lezer/highlight": "^1.2.0",
@@ -37,20 +37,20 @@
37
37
  "lodash.pick": "^4.4.0",
38
38
  "lodash.sortby": "^4.7.0",
39
39
  "style-mod": "^4.1.0",
40
- "@dxos/automerge": "0.4.6",
41
- "@dxos/async": "0.4.6",
42
- "@dxos/debug": "0.4.6",
43
- "@dxos/context": "0.4.6",
44
- "@dxos/echo-schema": "0.4.6",
45
- "@dxos/invariant": "0.4.6",
46
- "@dxos/log": "0.4.6",
47
- "@dxos/protocols": "0.4.6",
48
- "@dxos/react-async": "0.4.6",
49
- "@dxos/display-name": "0.4.6",
50
- "@dxos/react-ui-theme": "0.4.6",
51
- "@dxos/text-model": "0.4.6",
52
- "@dxos/react-ui": "0.4.6",
53
- "@dxos/util": "0.4.6"
40
+ "@dxos/async": "0.4.7-main.06facb4",
41
+ "@dxos/context": "0.4.7-main.06facb4",
42
+ "@dxos/automerge": "0.4.7-main.06facb4",
43
+ "@dxos/debug": "0.4.7-main.06facb4",
44
+ "@dxos/display-name": "0.4.7-main.06facb4",
45
+ "@dxos/echo-schema": "0.4.7-main.06facb4",
46
+ "@dxos/invariant": "0.4.7-main.06facb4",
47
+ "@dxos/log": "0.4.7-main.06facb4",
48
+ "@dxos/protocols": "0.4.7-main.06facb4",
49
+ "@dxos/react-async": "0.4.7-main.06facb4",
50
+ "@dxos/react-ui-theme": "0.4.7-main.06facb4",
51
+ "@dxos/text-model": "0.4.7-main.06facb4",
52
+ "@dxos/util": "0.4.7-main.06facb4",
53
+ "@dxos/react-ui": "0.4.7-main.06facb4"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@automerge/automerge-repo-network-broadcastchannel": "^1.1.1",
@@ -78,14 +78,14 @@
78
78
  "vite-plugin-top-level-await": "^1.4.1",
79
79
  "vite-plugin-wasm": "^3.3.0",
80
80
  "vitest": "^1.2.2",
81
- "@dxos/config": "0.4.6",
82
- "@dxos/echo-signals": "0.4.6",
83
- "@dxos/keyboard": "0.4.6",
84
- "@dxos/echo-typegen": "0.4.6",
85
- "@dxos/react-client": "0.4.6",
86
- "@dxos/random": "0.4.6",
87
- "@dxos/react-ui": "0.4.6",
88
- "@dxos/storybook-utils": "0.4.6"
81
+ "@dxos/echo-typegen": "0.4.7-main.06facb4",
82
+ "@dxos/keyboard": "0.4.7-main.06facb4",
83
+ "@dxos/react-client": "0.4.7-main.06facb4",
84
+ "@dxos/config": "0.4.7-main.06facb4",
85
+ "@dxos/storybook-utils": "0.4.7-main.06facb4",
86
+ "@dxos/random": "0.4.7-main.06facb4",
87
+ "@dxos/react-ui": "0.4.7-main.06facb4",
88
+ "@dxos/echo-signals": "0.4.7-main.06facb4"
89
89
  },
90
90
  "peerDependencies": {
91
91
  "@phosphor-icons/react": "^2.0.5",
@@ -93,7 +93,7 @@
93
93
  "@vitest/ui": "^1.2.2",
94
94
  "react": "^18.2.0",
95
95
  "react-dom": "^18.2.0",
96
- "@dxos/react-client": "0.4.6"
96
+ "@dxos/react-client": "0.4.7-main.06facb4"
97
97
  },
98
98
  "publishConfig": {
99
99
  "access": "public"
@@ -3,36 +3,43 @@
3
3
  //
4
4
 
5
5
  import '@dxosTheme';
6
+
6
7
  import { type EditorView } from '@codemirror/view';
7
- import { ArrowSquareOut } from '@phosphor-icons/react';
8
+ import { ArrowSquareOut, X } from '@phosphor-icons/react';
8
9
  import defaultsDeep from 'lodash.defaultsdeep';
9
- import React, { type FC, StrictMode, useRef, useState } from 'react';
10
+ import React, { type FC, type KeyboardEvent, StrictMode, useRef, useState } from 'react';
10
11
  import { createRoot } from 'react-dom/client';
11
12
 
12
13
  import { TextObject } from '@dxos/echo-schema';
13
14
  import { keySymbols, parseShortcut } from '@dxos/keyboard';
14
15
  import { PublicKey } from '@dxos/keys';
15
16
  import { faker } from '@dxos/random';
16
- import { getSize, mx, textBlockWidth } from '@dxos/react-ui-theme';
17
+ import { Button, DensityProvider, Input, ThemeProvider } from '@dxos/react-ui';
18
+ import { baseSurface, defaultTx, getSize, mx, textBlockWidth } from '@dxos/react-ui-theme';
17
19
  import { withTheme } from '@dxos/storybook-utils';
18
20
 
19
21
  import { MarkdownEditor, type TextEditorProps } from './TextEditor';
20
22
  import {
21
- type CommentsOptions,
23
+ annotations,
22
24
  autocomplete,
23
25
  blast,
24
- decorateMarkdown,
26
+ command,
25
27
  comments,
28
+ decorateMarkdown,
26
29
  defaultOptions,
30
+ dnd,
31
+ formatting,
27
32
  image,
28
33
  linkTooltip,
29
34
  mention,
30
35
  table,
31
36
  typewriter,
32
37
  useComments,
33
- formatting,
34
- annotations,
35
38
  EditorModes,
39
+ type CommandAction,
40
+ type CommandOptions,
41
+ type CommentsOptions,
42
+ listener,
36
43
  } from '../../extensions';
37
44
  import { type Comment, useTextModel } from '../../hooks';
38
45
  import translations from '../../translations';
@@ -238,7 +245,7 @@ const Story = ({ id = 'test', text, comments, placeholder = 'New document.', ...
238
245
  placeholder={placeholder}
239
246
  slots={{
240
247
  root: { className: mx(textBlockWidth, 'min-bs-dvh') },
241
- editor: { className: 'min-bs-dvh p-2 bg-white dark:bg-black' },
248
+ editor: { className: 'min-bs-dvh px-8 bg-white dark:bg-black' },
242
249
  }}
243
250
  {...props}
244
251
  />
@@ -353,6 +360,64 @@ export const Mention = {
353
360
  ),
354
361
  };
355
362
 
363
+ const CommandDialog: FC<{ onClose: (action?: CommandAction) => void }> = ({ onClose }) => {
364
+ const [text, setText] = useState('');
365
+ const handleInsert = () => {
366
+ onClose(text.length ? { insert: text + '\n' } : undefined);
367
+ };
368
+
369
+ const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
370
+ switch (event.key) {
371
+ case 'Enter': {
372
+ handleInsert();
373
+ break;
374
+ }
375
+ case 'Escape': {
376
+ onClose();
377
+ break;
378
+ }
379
+ }
380
+ };
381
+
382
+ return (
383
+ <DensityProvider density='fine'>
384
+ <div className={mx('flex items-center p-2 gap-2 border rounded-md', baseSurface)}>
385
+ <Input.Root>
386
+ <Input.TextInput
387
+ autoFocus={true}
388
+ placeholder='Enter command.'
389
+ value={text}
390
+ onChange={({ target: { value } }) => setText(value)}
391
+ onKeyDown={handleKeyDown}
392
+ />
393
+ </Input.Root>
394
+ <Button variant='ghost' classNames='pli-0' onClick={() => onClose()}>
395
+ <X className={getSize(5)} />
396
+ </Button>
397
+ </div>
398
+ </DensityProvider>
399
+ );
400
+ };
401
+
402
+ const renderCommandDialog: CommandOptions['onRender'] = (el, onClose) => {
403
+ createRoot(el).render(
404
+ <StrictMode>
405
+ <ThemeProvider tx={defaultTx}>
406
+ <CommandDialog onClose={onClose} />
407
+ </ThemeProvider>
408
+ </StrictMode>,
409
+ );
410
+ };
411
+
412
+ export const Command = {
413
+ render: () => (
414
+ <Story
415
+ text={str('# Command', '')}
416
+ extensions={[command({ onRender: renderCommandDialog, onHint: () => 'Press / for commands.' })]}
417
+ />
418
+ ),
419
+ };
420
+
356
421
  export const Comments = {
357
422
  render: () => {
358
423
  const [_comments, setComments] = useState<Comment[]>([]);
@@ -402,8 +467,30 @@ export const Annotations = {
402
467
  render: () => <Story text={str('# Annotations', '', large)} extensions={[annotations({ match: /volup/gi })]} />,
403
468
  };
404
469
 
470
+ export const DND = {
471
+ render: () => <Story text={str('# DND', '')} extensions={[dnd()]} />,
472
+ };
473
+
405
474
  const typewriterItems = localStorage.getItem('dxos.org/plugin/markdown/typewriter')?.split(',');
406
475
 
476
+ export const Listener = {
477
+ render: () => (
478
+ <Story
479
+ text={str('# Listener', '', text.footer)}
480
+ extensions={[
481
+ listener({
482
+ onFocus: (focusing) => {
483
+ console.log({ focusing });
484
+ },
485
+ onChange: (text) => {
486
+ console.log({ text });
487
+ },
488
+ }),
489
+ ]}
490
+ />
491
+ ),
492
+ };
493
+
407
494
  export const Typewriter = {
408
495
  render: () => (
409
496
  <Story
@@ -11,7 +11,6 @@ import { mx, textBlockWidth } from '@dxos/react-ui-theme';
11
11
  import { withTheme } from '@dxos/storybook-utils';
12
12
 
13
13
  import { TextEditor, type TextEditorProps } from './TextEditor';
14
- import { listener } from '../../extensions';
15
14
  import { useTextModel } from '../../hooks';
16
15
  import translations from '../../translations';
17
16
 
@@ -57,19 +56,5 @@ export default {
57
56
  };
58
57
 
59
58
  export const Default = {
60
- render: () => <Story placeholder='Enter text...' />,
61
- };
62
-
63
- export const Text = {
64
59
  render: () => <Story text={initialText} placeholder='Enter text...' />,
65
60
  };
66
-
67
- export const Automerge = {
68
- render: () => <Story text={initialText} placeholder='Enter text...' automerge />,
69
- };
70
-
71
- export const Listener = {
72
- render: () => (
73
- <Story placeholder='Enter text...' extensions={[listener({ onChange: (text) => console.log(text) })]} />
74
- ),
75
- };
@@ -18,13 +18,14 @@ import React, {
18
18
  useMemo,
19
19
  } from 'react';
20
20
 
21
+ import { DocAccessor } from '@dxos/echo-schema';
21
22
  import { log } from '@dxos/log';
22
23
  import { useThemeContext } from '@dxos/react-ui';
23
24
  import { focusRing } from '@dxos/react-ui-theme';
24
25
  import { isNotFalsy } from '@dxos/util';
25
26
 
26
- import { createBasicBundle, createMarkdownExtensions, editorMode } from '../../extensions';
27
- import { type EditorModel } from '../../hooks';
27
+ import { createMarkdownExtensions, editorMode } from '../../extensions';
28
+ import { createBasicExtensions, createThemeExtensions, type EditorModel } from '../../hooks';
28
29
  import { type ThemeStyles } from '../../styles';
29
30
  import { defaultTheme, markdownTheme, textTheme } from '../../themes';
30
31
  import { logChanges } from '../../util';
@@ -114,7 +115,7 @@ export const BaseTextEditor = forwardRef<EditorView | null, TextEditorProps>(
114
115
  // https://codemirror.net/docs/ref/#state.EditorStateConfig
115
116
  //
116
117
  const state = EditorState.create({
117
- doc: model.text(),
118
+ doc: typeof model.content === 'string' ? model.content : DocAccessor.getValue(model.content),
118
119
  selection,
119
120
  extensions: [
120
121
  // TODO(burdon): Doesn't catch errors in keymap functions.
@@ -210,7 +211,7 @@ export const BaseTextEditor = forwardRef<EditorView | null, TextEditorProps>(
210
211
  <div
211
212
  role='none'
212
213
  ref={rootRef}
213
- key={model.id}
214
+ key={model.id} // TODO(burdon): Remove?
214
215
  tabIndex={0}
215
216
  onKeyUp={handleKeyUp}
216
217
  {...slots.root}
@@ -220,15 +221,20 @@ export const BaseTextEditor = forwardRef<EditorView | null, TextEditorProps>(
220
221
  },
221
222
  );
222
223
 
224
+ // TODO(burdon): Replace with hooks.
223
225
  export const TextEditor = forwardRef<EditorView | null, TextEditorProps>(
224
226
  (
225
- { readonly, placeholder, lineWrapping, theme = textTheme, slots, extensions: _extensions, ...props },
227
+ { readonly, placeholder, lineWrapping = true, theme = textTheme, slots, extensions: _extensions, ...props },
226
228
  forwardedRef,
227
229
  ) => {
228
230
  const { themeMode } = useThemeContext();
229
231
  const updatedSlots = defaultsDeep({}, slots, defaultTextSlots);
230
232
  const extensions = useMemo(
231
- () => [createBasicBundle({ themeMode, placeholder, lineWrapping }), ...(_extensions ?? [])],
233
+ () => [
234
+ createBasicExtensions({ lineWrapping, placeholder }),
235
+ createThemeExtensions({ themeMode }),
236
+ ...(_extensions ?? []),
237
+ ],
232
238
  [themeMode, placeholder, lineWrapping, _extensions],
233
239
  );
234
240
 
@@ -245,6 +251,7 @@ export const TextEditor = forwardRef<EditorView | null, TextEditorProps>(
245
251
  },
246
252
  );
247
253
 
254
+ // TODO(burdon): Replace with hooks.
248
255
  export const MarkdownEditor = forwardRef<EditorView | null, TextEditorProps>(
249
256
  ({ readonly, placeholder, theme = markdownTheme, slots, extensions: _extensions, ...props }, forwardedRef) => {
250
257
  const { themeMode } = useThemeContext();
@@ -2,7 +2,4 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export { tags } from '@lezer/highlight';
6
- export { type Extension } from '@codemirror/state';
7
-
8
5
  export * from './TextEditor';
@@ -61,12 +61,13 @@ const Story: FC<{ id?: string; content: string }> = ({ id = 'test', content }) =
61
61
  }
62
62
 
63
63
  return (
64
- <div role='none' className={mx('fixed inset-0 flex flex-col')}>
64
+ <div role='none' className='fixed inset-0 flex flex-col'>
65
65
  <Toolbar.Root onAction={handleAction} state={formattingState} classNames={textBlockWidth}>
66
66
  <Toolbar.Markdown />
67
67
  <Toolbar.Separator />
68
68
  <Toolbar.Extended />
69
69
  </Toolbar.Root>
70
+
70
71
  <MarkdownEditor
71
72
  ref={editorRef}
72
73
  model={model}
@@ -6,22 +6,19 @@ import '@dxosTheme';
6
6
 
7
7
  import { BroadcastChannelNetworkAdapter } from '@automerge/automerge-repo-network-broadcastchannel';
8
8
  import '@preact/signals-react';
9
- import { EditorView } from '@codemirror/view'; // Register react integration.
10
9
  import React, { useEffect, useMemo, useState } from 'react';
11
10
 
12
11
  import { Repo } from '@dxos/automerge/automerge-repo';
13
- import { Filter } from '@dxos/echo-schema';
12
+ import { createDocAccessor, Filter } from '@dxos/echo-schema';
14
13
  import { type PublicKey } from '@dxos/keys';
15
14
  import { Expando, TextObject, useSpace } from '@dxos/react-client/echo';
16
- import { useIdentity } from '@dxos/react-client/halo';
17
15
  import { ClientRepeater } from '@dxos/react-client/testing';
16
+ import { useThemeContext } from '@dxos/react-ui';
18
17
  import { withTheme } from '@dxos/storybook-utils';
19
18
 
20
- import { MarkdownEditor } from './TextEditor';
21
- import { automerge, awareness, createBasicBundle } from '../../extensions';
22
- import { DocAccessor } from '../../extensions/automerge/defs';
23
- import { useTextEditor, useTextModel } from '../../hooks';
24
- import { defaultTheme } from '../../themes';
19
+ import { automerge } from './automerge';
20
+ import { DocAccessor } from './defs';
21
+ import { createBasicExtensions, createThemeExtensions, useTextEditor } from '../../hooks';
25
22
  import translations from '../../translations';
26
23
 
27
24
  const initialContent = 'Hello world!';
@@ -32,24 +29,24 @@ type TestObject = {
32
29
 
33
30
  type EditorProps = {
34
31
  source: DocAccessor;
32
+ autoFocus?: boolean;
35
33
  };
36
34
 
37
- const Editor = ({ source }: EditorProps) => {
35
+ const Editor = ({ source, autoFocus }: EditorProps) => {
36
+ const { themeMode } = useThemeContext();
38
37
  const extensions = useMemo(
39
38
  () => [
40
- EditorView.baseTheme(defaultTheme),
41
- EditorView.editorAttributes.of({ class: 'p-2 bg-white' }),
42
- createBasicBundle({ placeholder: 'Type here...' }),
39
+ createBasicExtensions({ placeholder: 'Type here...' }),
40
+ createThemeExtensions({ themeMode, slots: { editor: { className: 'p-2 bg-white dark:bg-black' } } }),
43
41
  automerge(source),
44
- awareness(),
45
42
  ],
46
- [source],
43
+ [themeMode, source],
47
44
  );
48
45
 
49
46
  const { parentRef } = useTextEditor({
50
- autoFocus: true,
51
47
  doc: DocAccessor.getValue(source),
52
48
  extensions,
49
+ autoFocus,
53
50
  });
54
51
 
55
52
  return <div ref={parentRef} />;
@@ -61,12 +58,8 @@ const Story = () => {
61
58
 
62
59
  useEffect(() => {
63
60
  queueMicrotask(async () => {
64
- const repo1 = new Repo({
65
- network: [new BroadcastChannelNetworkAdapter()],
66
- });
67
- const repo2 = new Repo({
68
- network: [new BroadcastChannelNetworkAdapter()],
69
- });
61
+ const repo1 = new Repo({ network: [new BroadcastChannelNetworkAdapter()] });
62
+ const repo2 = new Repo({ network: [new BroadcastChannelNetworkAdapter()] });
70
63
 
71
64
  const object1 = repo1.create();
72
65
  object1.change((doc: TestObject) => {
@@ -86,8 +79,8 @@ const Story = () => {
86
79
  }
87
80
 
88
81
  return (
89
- <div role='none' className='grid grid-cols-2 bs-full is-full gap-2'>
90
- <Editor source={object1} />
82
+ <div role='none' className='grid grid-cols-2 bs-full is-full divide-x divide-neutral-500'>
83
+ <Editor source={object1} autoFocus />
91
84
  <Editor source={object2} />
92
85
  </div>
93
86
  );
@@ -96,36 +89,39 @@ const Story = () => {
96
89
  export default {
97
90
  title: 'react-ui-editor/Automerge',
98
91
  component: Editor,
92
+ decorators: [withTheme],
99
93
  render: () => <Story />,
100
94
  parameters: { translations, layout: 'fullscreen' },
101
95
  };
102
96
 
103
- export const Default = {};
104
-
105
97
  const EchoStory = ({ spaceKey }: { spaceKey: PublicKey }) => {
106
- const identity = useIdentity();
98
+ // TODO(burdon): Test identity.
99
+ // const identity = useIdentity();
107
100
  const space = useSpace(spaceKey);
108
- // TODO(dmaretskyi): useQuery doesn't work.
109
- const [obj] = space?.db.query(Filter.from({ type: 'test' })).objects ?? [];
110
- const model = useTextModel({
111
- identity,
112
- space,
113
- text: obj?.content,
114
- });
115
-
116
- if (!model) {
101
+ const source = useMemo<DocAccessor | undefined>(() => {
102
+ const { objects = [] } = space?.db.query(Filter.from({ type: 'test' })) ?? {};
103
+ if (objects.length) {
104
+ return createDocAccessor(objects[0].content);
105
+ }
106
+ }, [space]);
107
+
108
+ if (!source) {
117
109
  return null;
118
110
  }
119
111
 
120
- return <MarkdownEditor model={model} />;
112
+ return <Editor source={source} />;
121
113
  };
122
114
 
115
+ export const Default = {};
116
+
117
+ // TODO(burdon): Feed already added error.
123
118
  export const WithEcho = {
124
119
  decorators: [withTheme],
125
120
  render: () => {
126
121
  return (
127
122
  <ClientRepeater
128
123
  count={2}
124
+ component={EchoStory}
129
125
  createSpace
130
126
  onCreateSpace={async (space) => {
131
127
  space.db.add(
@@ -135,7 +131,6 @@ export const WithEcho = {
135
131
  }),
136
132
  );
137
133
  }}
138
- component={EchoStory}
139
134
  />
140
135
  );
141
136
  },