@dxos/react-ui-editor 0.3.9-next.7522f7a → 0.3.9

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 (148) hide show
  1. package/dist/lib/browser/index.mjs +930 -811
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/types/src/automerge/automerge-plugin/PatchSemaphore.d.ts +2 -2
  5. package/dist/types/src/automerge/automerge-plugin/PatchSemaphore.d.ts.map +1 -1
  6. package/dist/types/src/automerge/automerge-plugin/codeMirrorToAm.d.ts +2 -2
  7. package/dist/types/src/automerge/automerge-plugin/codeMirrorToAm.d.ts.map +1 -1
  8. package/dist/types/src/automerge/automerge-plugin/handle.d.ts +9 -0
  9. package/dist/types/src/automerge/automerge-plugin/handle.d.ts.map +1 -0
  10. package/dist/types/src/automerge/automerge-plugin/index.d.ts +2 -2
  11. package/dist/types/src/automerge/automerge-plugin/index.d.ts.map +1 -1
  12. package/dist/types/src/automerge/automerge-plugin/plugin.d.ts +6 -5
  13. package/dist/types/src/automerge/automerge-plugin/plugin.d.ts.map +1 -1
  14. package/dist/types/src/automerge/automerge.stories.d.ts +2 -1
  15. package/dist/types/src/automerge/automerge.stories.d.ts.map +1 -1
  16. package/dist/types/src/components/TextEditor/TextEditor.d.ts +24 -20
  17. package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
  18. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts +7 -10
  19. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts.map +1 -1
  20. package/dist/types/{stories/html/code-mirror.stories.d.ts → src/components/TextEditor/codemirror.stories.d.ts} +2 -2
  21. package/dist/types/src/components/TextEditor/codemirror.stories.d.ts.map +1 -0
  22. package/dist/types/src/components/TextEditor/extensions/basic/bundle.d.ts +8 -0
  23. package/dist/types/src/components/TextEditor/extensions/basic/bundle.d.ts.map +1 -0
  24. package/dist/types/src/components/TextEditor/extensions/basic/index.d.ts +3 -0
  25. package/dist/types/src/components/TextEditor/extensions/basic/index.d.ts.map +1 -0
  26. package/dist/types/src/components/TextEditor/{theme.d.ts → extensions/basic/theme.d.ts} +2 -1
  27. package/dist/types/src/components/TextEditor/extensions/basic/theme.d.ts.map +1 -0
  28. package/dist/types/src/components/TextEditor/extensions/change.d.ts +7 -0
  29. package/dist/types/src/components/TextEditor/extensions/change.d.ts.map +1 -0
  30. package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkDecoration.d.ts.map +1 -0
  31. package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkTooltip.d.ts.map +1 -0
  32. package/dist/types/src/components/TextEditor/extensions/hyperlink/hyperlinkWidget.d.ts.map +1 -0
  33. package/dist/types/src/components/TextEditor/extensions/hyperlink/index.d.ts +4 -0
  34. package/dist/types/src/components/TextEditor/extensions/hyperlink/index.d.ts.map +1 -0
  35. package/dist/types/src/components/TextEditor/extensions/index.d.ts +4 -3
  36. package/dist/types/src/components/TextEditor/extensions/index.d.ts.map +1 -1
  37. package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts +8 -0
  38. package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts.map +1 -0
  39. package/dist/types/src/components/TextEditor/extensions/markdown/index.d.ts +3 -0
  40. package/dist/types/src/components/TextEditor/extensions/markdown/index.d.ts.map +1 -0
  41. package/dist/types/src/components/{Markdown/markdownTags.d.ts → TextEditor/extensions/markdown/tags.d.ts} +1 -1
  42. package/dist/types/src/components/TextEditor/extensions/markdown/tags.d.ts.map +1 -0
  43. package/dist/types/src/components/TextEditor/extensions/markdown/theme.d.ts +21 -0
  44. package/dist/types/src/components/TextEditor/extensions/markdown/theme.d.ts.map +1 -0
  45. package/dist/types/src/components/TextEditor/index.d.ts +1 -3
  46. package/dist/types/src/components/TextEditor/index.d.ts.map +1 -1
  47. package/dist/types/src/components/TextEditor/yjs.stories.d.ts +11 -0
  48. package/dist/types/src/components/TextEditor/yjs.stories.d.ts.map +1 -0
  49. package/dist/types/src/components/index.d.ts +0 -3
  50. package/dist/types/src/components/index.d.ts.map +1 -1
  51. package/dist/types/src/hooks/index.d.ts +4 -0
  52. package/dist/types/src/hooks/index.d.ts.map +1 -0
  53. package/dist/types/src/hooks/useCollaboration.d.ts +9 -0
  54. package/dist/types/src/hooks/useCollaboration.d.ts.map +1 -0
  55. package/dist/types/src/{model.d.ts → hooks/useTextModel.d.ts} +3 -15
  56. package/dist/types/src/hooks/useTextModel.d.ts.map +1 -0
  57. package/dist/types/src/hooks/yjs/cursors.d.ts.map +1 -0
  58. package/dist/types/src/hooks/yjs/index.d.ts.map +1 -0
  59. package/dist/types/src/hooks/yjs/space-provider.d.ts.map +1 -0
  60. package/dist/types/src/index.d.ts +2 -2
  61. package/dist/types/src/index.d.ts.map +1 -1
  62. package/dist/types/src/styles/tokens.d.ts +4 -0
  63. package/dist/types/src/styles/tokens.d.ts.map +1 -1
  64. package/dist/types/src/testing/replicator.d.ts +1 -1
  65. package/dist/types/src/testing/replicator.d.ts.map +1 -1
  66. package/package.json +30 -27
  67. package/src/automerge/automerge-plugin/PatchSemaphore.ts +5 -5
  68. package/src/automerge/automerge-plugin/codeMirrorToAm.ts +10 -7
  69. package/src/automerge/automerge-plugin/handle.ts +14 -0
  70. package/src/automerge/automerge-plugin/index.ts +2 -2
  71. package/src/automerge/automerge-plugin/plugin.ts +39 -10
  72. package/src/automerge/automerge.stories.tsx +32 -47
  73. package/src/components/TextEditor/TextEditor.stories.tsx +10 -3
  74. package/src/components/TextEditor/TextEditor.tsx +113 -56
  75. package/src/components/TextEditor/codemirror.stories.ts +114 -0
  76. package/src/components/TextEditor/extensions/basic/bundle.ts +28 -0
  77. package/src/components/TextEditor/extensions/basic/index.ts +6 -0
  78. package/src/components/TextEditor/{theme.ts → extensions/basic/theme.ts} +22 -8
  79. package/src/components/TextEditor/extensions/change.ts +22 -0
  80. package/src/components/TextEditor/extensions/hyperlink/index.ts +7 -0
  81. package/src/components/TextEditor/extensions/index.ts +4 -3
  82. package/src/components/TextEditor/extensions/markdown/bundle.ts +99 -0
  83. package/src/components/TextEditor/extensions/markdown/index.ts +6 -0
  84. package/src/components/{Markdown/markdownTheme.ts → TextEditor/extensions/markdown/theme.ts} +16 -16
  85. package/src/components/TextEditor/index.ts +1 -4
  86. package/src/components/TextEditor/yjs.stories.tsx +55 -0
  87. package/src/components/index.ts +0 -3
  88. package/src/hooks/index.ts +7 -0
  89. package/src/hooks/useCollaboration.ts +45 -0
  90. package/src/{model.ts → hooks/useTextModel.ts} +42 -17
  91. package/src/index.ts +3 -3
  92. package/src/styles/tokens.ts +6 -0
  93. package/src/testing/replicator.ts +1 -2
  94. package/dist/types/src/automerge/demo.d.ts +0 -25
  95. package/dist/types/src/automerge/demo.d.ts.map +0 -1
  96. package/dist/types/src/components/Editor/Editor.d.ts +0 -14
  97. package/dist/types/src/components/Editor/Editor.d.ts.map +0 -1
  98. package/dist/types/src/components/Editor/Editor.stories.d.ts +0 -29
  99. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +0 -1
  100. package/dist/types/src/components/Editor/index.d.ts +0 -2
  101. package/dist/types/src/components/Editor/index.d.ts.map +0 -1
  102. package/dist/types/src/components/Markdown/Markdown.d.ts +0 -21
  103. package/dist/types/src/components/Markdown/Markdown.d.ts.map +0 -1
  104. package/dist/types/src/components/Markdown/Markdown.stories.d.ts +0 -20
  105. package/dist/types/src/components/Markdown/Markdown.stories.d.ts.map +0 -1
  106. package/dist/types/src/components/Markdown/index.d.ts +0 -2
  107. package/dist/types/src/components/Markdown/index.d.ts.map +0 -1
  108. package/dist/types/src/components/Markdown/markdownTags.d.ts.map +0 -1
  109. package/dist/types/src/components/Markdown/markdownTheme.d.ts +0 -100
  110. package/dist/types/src/components/Markdown/markdownTheme.d.ts.map +0 -1
  111. package/dist/types/src/components/RichText/RichText.d.ts +0 -20
  112. package/dist/types/src/components/RichText/RichText.d.ts.map +0 -1
  113. package/dist/types/src/components/RichText/RichText.stories.d.ts +0 -27
  114. package/dist/types/src/components/RichText/RichText.stories.d.ts.map +0 -1
  115. package/dist/types/src/components/RichText/index.d.ts +0 -2
  116. package/dist/types/src/components/RichText/index.d.ts.map +0 -1
  117. package/dist/types/src/components/TextEditor/extensions/hyperlinkDecoration.d.ts.map +0 -1
  118. package/dist/types/src/components/TextEditor/extensions/hyperlinkTooltip.d.ts.map +0 -1
  119. package/dist/types/src/components/TextEditor/extensions/hyperlinkWidget.d.ts.map +0 -1
  120. package/dist/types/src/components/TextEditor/theme.d.ts.map +0 -1
  121. package/dist/types/src/model.d.ts.map +0 -1
  122. package/dist/types/src/yjs/cursors.d.ts.map +0 -1
  123. package/dist/types/src/yjs/index.d.ts.map +0 -1
  124. package/dist/types/src/yjs/space-provider.d.ts.map +0 -1
  125. package/dist/types/stories/html/code-mirror.stories.d.ts.map +0 -1
  126. package/src/automerge/demo.ts +0 -106
  127. package/src/components/Editor/Editor.stories.tsx +0 -82
  128. package/src/components/Editor/Editor.tsx +0 -36
  129. package/src/components/Editor/index.ts +0 -5
  130. package/src/components/Markdown/Markdown.stories.tsx +0 -70
  131. package/src/components/Markdown/Markdown.tsx +0 -239
  132. package/src/components/Markdown/index.ts +0 -5
  133. package/src/components/RichText/RichText.stories.tsx +0 -70
  134. package/src/components/RichText/RichText.tsx +0 -181
  135. package/src/components/RichText/index.ts +0 -5
  136. /package/dist/types/src/components/TextEditor/extensions/{hyperlinkDecoration.d.ts → hyperlink/hyperlinkDecoration.d.ts} +0 -0
  137. /package/dist/types/src/components/TextEditor/extensions/{hyperlinkTooltip.d.ts → hyperlink/hyperlinkTooltip.d.ts} +0 -0
  138. /package/dist/types/src/components/TextEditor/extensions/{hyperlinkWidget.d.ts → hyperlink/hyperlinkWidget.d.ts} +0 -0
  139. /package/dist/types/src/{yjs → hooks/yjs}/cursors.d.ts +0 -0
  140. /package/dist/types/src/{yjs → hooks/yjs}/index.d.ts +0 -0
  141. /package/dist/types/src/{yjs → hooks/yjs}/space-provider.d.ts +0 -0
  142. /package/src/components/TextEditor/extensions/{hyperlinkDecoration.ts → hyperlink/hyperlinkDecoration.ts} +0 -0
  143. /package/src/components/TextEditor/extensions/{hyperlinkTooltip.tsx → hyperlink/hyperlinkTooltip.tsx} +0 -0
  144. /package/src/components/TextEditor/extensions/{hyperlinkWidget.tsx → hyperlink/hyperlinkWidget.tsx} +0 -0
  145. /package/src/components/{Markdown/markdownTags.ts → TextEditor/extensions/markdown/tags.ts} +0 -0
  146. /package/src/{yjs → hooks/yjs}/cursors.ts +0 -0
  147. /package/src/{yjs → hooks/yjs}/index.ts +0 -0
  148. /package/src/{yjs → hooks/yjs}/space-provider.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/index.ts"],"names":[],"mappings":"AAIA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/index.ts"],"names":[],"mappings":"AAIA,cAAc,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './useCollaboration';
2
+ export * from './useTextModel';
3
+ export * from './yjs';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/index.ts"],"names":[],"mappings":"AAIA,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,OAAO,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Extension } from '@codemirror/state';
2
+ import type { ThemeMode } from '@dxos/react-ui';
3
+ import type { EditorModel } from './useTextModel';
4
+ /**
5
+ * Replication and awareness (incl. remote selection).
6
+ * https://codemirror.net/docs/ref/#collab
7
+ */
8
+ export declare const useCollaboration: (model: EditorModel, themeMode: ThemeMode) => Extension | undefined;
9
+ //# sourceMappingURL=useCollaboration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCollaboration.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useCollaboration.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAMnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,UAAW,WAAW,aAAa,SAAS,KAAG,SAAS,GAAG,SAuBvF,CAAC"}
@@ -1,26 +1,14 @@
1
- import { type EditorView } from '@codemirror/view';
2
- import { type ComponentProps } from 'react';
3
1
  import type * as awarenessProtocol from 'y-protocols/awareness';
4
- import { type Space, type TextObject } from '@dxos/react-client/echo';
2
+ import { type DocAccessor, type Space, type TextObject } from '@dxos/react-client/echo';
5
3
  import { type Identity } from '@dxos/react-client/halo';
6
4
  import type { YText, YXmlFragment } from '@dxos/text-model';
7
- export type EditorSlots = {
8
- root?: Omit<ComponentProps<'div'>, 'ref'>;
9
- editor?: {
10
- className?: string;
11
- placeholder?: string;
12
- spellCheck?: boolean;
13
- tabIndex?: number;
14
- markdownTheme?: Parameters<typeof EditorView.theme>[0];
15
- };
16
- };
17
5
  type Awareness = awarenessProtocol.Awareness;
18
6
  type Provider = {
19
7
  awareness: Awareness;
20
8
  };
21
9
  export type EditorModel = {
22
10
  id: string;
23
- content: string | YText | YXmlFragment;
11
+ content: string | YText | YXmlFragment | DocAccessor;
24
12
  provider?: Provider;
25
13
  peer?: {
26
14
  id: string;
@@ -34,4 +22,4 @@ export type UseTextModelOptions = {
34
22
  };
35
23
  export declare const useTextModel: ({ identity, space, text }: UseTextModelOptions) => EditorModel | undefined;
36
24
  export {};
37
- //# sourceMappingURL=model.d.ts.map
25
+ //# sourceMappingURL=useTextModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTextModel.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextModel.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,iBAAiB,MAAM,uBAAuB,CAAC;AAEhE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,KAAK,EACV,KAAK,UAAU,EAIhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAK5D,KAAK,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC;AAC7C,KAAK,QAAQ,GAAG;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,CAAC;AAGzC,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,YAAY,GAAG,WAAW,CAAC;IACrD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,CAAC;AAKF,eAAO,MAAM,YAAY,8BAA+B,mBAAmB,KAAG,WAAW,GAAG,SAoD3F,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursors.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/yjs/cursors.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,WAAW;;;CAAsD,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/yjs/index.ts"],"names":[],"mappings":"AAIA,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"space-provider.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/yjs/space-provider.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,iBAAiB,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAG/B,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAGrD,KAAK,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC;AAO7C;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,UAAU,CAAC,GAAG,CAAC;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,GAAG,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE;IA+BlH,IAAI,SAAS,IAAI,SAAS,CAEzB;IAED,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,YAAY;IAoCpB,OAAO,CAAC,mBAAmB;CAG5B"}
@@ -1,5 +1,5 @@
1
- export * from './components';
2
- export * from './model';
3
1
  export { TextKind } from '@dxos/protocols/proto/dxos/echo/model/text';
4
2
  export { Doc, YText, YXmlFragment } from '@dxos/text-model';
3
+ export * from './components';
4
+ export * from './hooks';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,4CAA4C,CAAC;AACtE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,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,SAAS,CAAC"}
@@ -1,3 +1,7 @@
1
+ import type { StyleSpec } from 'style-mod';
1
2
  import { type TailwindConfig } from '@dxos/react-ui-theme';
3
+ export type ThemeStyles = {
4
+ [selector: string]: StyleSpec;
5
+ };
2
6
  export declare const tokens: TailwindConfig['theme'];
3
7
  //# sourceMappingURL=tokens.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../../src/styles/tokens.ts"],"names":[],"mappings":"AAIA,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3E,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,OAAO,CAA4B,CAAC"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../../src/styles/tokens.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,OAAO,CAA4B,CAAC"}
@@ -3,7 +3,7 @@ import * as awarenessProtocol from 'y-protocols/awareness';
3
3
  import { Doc } from 'yjs';
4
4
  import { Event } from '@dxos/async';
5
5
  import { TextKind } from '@dxos/protocols/proto/dxos/echo/model/text';
6
- import { type EditorModel } from '../model';
6
+ import { type EditorModel } from '../hooks';
7
7
  type Awareness = awarenessProtocol.Awareness;
8
8
  /**
9
9
  * Yjs awareness provider in-memory.
@@ -1 +1 @@
1
- {"version":3,"file":"replicator.d.ts","sourceRoot":"","sources":["../../../../src/testing/replicator.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,KAAK,iBAAiB,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,4CAA4C,CAAC;AAEtE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAG5C,KAAK,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC;AAM7C;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,UAAU,CAAC,GAAG,CAAC;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAM;gBAEf,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAAC,GAAG,EAAE,GAAG,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE;IA+BtG,IAAI,SAAS,IAAI,SAAS,CAEzB;IAED,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,YAAY;IA0CpB,OAAO,CAAC,mBAAmB;CAG5B;AAED;;GAEG;AACH,qBAAa,UAAU;IAIT,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHlC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,MAAM,CAAqB;gBAEN,KAAK,EAAE,QAAQ;IAE5C,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE;IAI7B,UAAU,OAAQ,MAAM,QAAO,GAAG,KAAe,WAAW,CAmB1D;CACH;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,GAAG,CAAC;CACX,CAAC;AAEF,eAAO,MAAM,WAAW,4BAA6B,kBAAkB,KAAG,WAGzE,CAAC"}
1
+ {"version":3,"file":"replicator.d.ts","sourceRoot":"","sources":["../../../../src/testing/replicator.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,KAAK,iBAAiB,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,4CAA4C,CAAC;AAEtE,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAEzD,KAAK,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC;AAM7C;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,UAAU,CAAC,GAAG,CAAC;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAM;gBAEf,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAAC,GAAG,EAAE,GAAG,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,CAAA;KAAE;IA+BtG,IAAI,SAAS,IAAI,SAAS,CAEzB;IAED,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,YAAY;IA0CpB,OAAO,CAAC,mBAAmB;CAG5B;AAED;;GAEG;AACH,qBAAa,UAAU;IAIT,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHlC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,MAAM,CAAqB;gBAEN,KAAK,EAAE,QAAQ;IAE5C,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE;IAI7B,UAAU,OAAQ,MAAM,QAAO,GAAG,KAAe,WAAW,CAmB1D;CACH;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,GAAG,CAAC;CACX,CAAC;AAEF,eAAO,MAAM,WAAW,4BAA6B,kBAAkB,KAAG,WAGzE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/react-ui-editor",
3
- "version": "0.3.9-next.7522f7a",
3
+ "version": "0.3.9",
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",
@@ -13,16 +13,16 @@
13
13
  "src"
14
14
  ],
15
15
  "dependencies": {
16
- "@codemirror/autocomplete": "^6.11.0",
17
- "@codemirror/commands": "^6.3.0",
18
- "@codemirror/lang-markdown": "^6.2.2",
19
- "@codemirror/language": "^6.9.2",
16
+ "@codemirror/autocomplete": "^6.11.1",
17
+ "@codemirror/commands": "^6.3.2",
18
+ "@codemirror/lang-markdown": "^6.2.3",
19
+ "@codemirror/language": "^6.9.3",
20
20
  "@codemirror/language-data": "^6.3.1",
21
21
  "@codemirror/lint": "^6.4.2",
22
- "@codemirror/search": "^6.5.4",
23
- "@codemirror/state": "^6.3.1",
22
+ "@codemirror/search": "^6.5.5",
23
+ "@codemirror/state": "^6.3.3",
24
24
  "@codemirror/theme-one-dark": "^6.1.2",
25
- "@codemirror/view": "^6.22.0",
25
+ "@codemirror/view": "^6.22.2",
26
26
  "@fluentui/react-tabster": "^9.12.0",
27
27
  "@lezer/common": "^1.1.1",
28
28
  "@lezer/highlight": "^1.2.0",
@@ -37,8 +37,9 @@
37
37
  "@tiptap/pm": "2.0.0-beta.220",
38
38
  "@tiptap/react": "2.0.0-beta.220",
39
39
  "@tiptap/starter-kit": "2.0.0-beta.220",
40
- "codemirror": "^6.65.7",
40
+ "codemirror": "6.0.1",
41
41
  "lib0": "^0.2.65",
42
+ "lodash.defaultsdeep": "^4.6.1",
42
43
  "lodash.get": "^4.4.2",
43
44
  "prosemirror-model": "^1.19.0",
44
45
  "prosemirror-state": "^1.4.2",
@@ -48,37 +49,39 @@
48
49
  "y-prosemirror": "~1.0.20",
49
50
  "y-protocols": "^1.0.5",
50
51
  "yjs": "^13.6.10",
51
- "@dxos/display-name": "0.3.9-next.7522f7a",
52
- "@dxos/debug": "0.3.9-next.7522f7a",
53
- "@dxos/log": "0.3.9-next.7522f7a",
54
- "@dxos/protocols": "0.3.9-next.7522f7a",
55
- "@dxos/react-async": "0.3.9-next.7522f7a",
56
- "@dxos/react-ui": "0.3.9-next.7522f7a",
57
- "@dxos/react-ui-theme": "0.3.9-next.7522f7a",
58
- "@dxos/util": "0.3.9-next.7522f7a",
59
- "@dxos/text-model": "0.3.9-next.7522f7a"
52
+ "@dxos/debug": "0.3.9",
53
+ "@dxos/echo-schema": "0.3.9",
54
+ "@dxos/automerge": "0.3.9",
55
+ "@dxos/display-name": "0.3.9",
56
+ "@dxos/invariant": "0.3.9",
57
+ "@dxos/log": "0.3.9",
58
+ "@dxos/protocols": "0.3.9",
59
+ "@dxos/react-ui": "0.3.9",
60
+ "@dxos/react-async": "0.3.9",
61
+ "@dxos/react-ui-theme": "0.3.9",
62
+ "@dxos/text-model": "0.3.9",
63
+ "@dxos/util": "0.3.9"
60
64
  },
61
65
  "devDependencies": {
62
- "@codemirror/basic-setup": "^0.20.0",
66
+ "@automerge/automerge-repo-network-broadcastchannel": "^1.0.19",
63
67
  "@phosphor-icons/react": "^2.0.5",
64
- "@types/codemirror": "^5.60.14",
68
+ "@types/lodash.defaultsdeep": "^4.6.6",
65
69
  "@types/lodash.get": "^4.4.7",
66
70
  "@types/react": "^18.0.21",
67
71
  "@types/react-dom": "^18.0.6",
68
72
  "react": "^18.2.0",
69
73
  "react-dom": "^18.2.0",
70
- "@dxos/automerge": "0.3.9-next.7522f7a",
71
- "@dxos/config": "0.3.9-next.7522f7a",
72
- "@dxos/echo-typegen": "0.3.9-next.7522f7a",
73
- "@dxos/react-client": "0.3.9-next.7522f7a",
74
- "@dxos/echo-schema": "0.3.9-next.7522f7a",
75
- "@dxos/storybook-utils": "0.3.9-next.7522f7a"
74
+ "@dxos/react-ui": "0.3.9",
75
+ "@dxos/storybook-utils": "0.3.9",
76
+ "@dxos/config": "0.3.9",
77
+ "@dxos/echo-typegen": "0.3.9",
78
+ "@dxos/react-client": "0.3.9"
76
79
  },
77
80
  "peerDependencies": {
78
81
  "@phosphor-icons/react": "^2.0.5",
79
82
  "react": "^18.2.0",
80
83
  "react-dom": "^18.2.0",
81
- "@dxos/react-client": "0.3.9-next.7522f7a"
84
+ "@dxos/react-client": "0.3.9"
82
85
  },
83
86
  "publishConfig": {
84
87
  "access": "public"
@@ -8,8 +8,8 @@ import { next as automerge } from '@dxos/automerge/automerge';
8
8
 
9
9
  import amToCodemirror from './amToCodemirror';
10
10
  import codeMirrorToAm from './codeMirrorToAm';
11
+ import { type IDocHandle } from './handle';
11
12
  import { type Field, isReconcileTx, getPath, reconcileAnnotationType, updateHeads, getLastHeads } from './plugin';
12
- import { type Peer } from '../demo';
13
13
 
14
14
  type Doc<T> = automerge.Doc<T>;
15
15
  type Heads = automerge.Heads;
@@ -27,8 +27,8 @@ export class PatchSemaphore {
27
27
  }
28
28
  }
29
29
 
30
- reconcile = (handle: Peer, view: EditorView) => {
31
- if (!this._inReconcile) {
30
+ reconcile = (handle: IDocHandle, view: EditorView) => {
31
+ if (this._inReconcile) {
32
32
  return;
33
33
  }
34
34
  this._inReconcile = true;
@@ -56,12 +56,12 @@ export class PatchSemaphore {
56
56
  // NOTE: null and undefined each come from automerge and repo respectively
57
57
  if (newHeads === null || newHeads === undefined) {
58
58
  // TODO: @alexjg this is the call that's resetting the editor state on click
59
- newHeads = automerge.getHeads(handle.doc);
59
+ newHeads = automerge.getHeads(handle.docSync()!);
60
60
  }
61
61
 
62
62
  // now get the diff between the updated state of the document and the heads
63
63
  // and apply that to the codemirror doc
64
- const diff = automerge.equals(oldHeads, newHeads) ? [] : automerge.diff(handle.doc, oldHeads, newHeads);
64
+ const diff = automerge.equals(oldHeads, newHeads) ? [] : automerge.diff(handle.docSync()!, oldHeads, newHeads);
65
65
  amToCodemirror(view, selection, path, diff);
66
66
 
67
67
  view.dispatch({
@@ -6,21 +6,24 @@ import { type EditorState, type Text, type Transaction } from '@codemirror/state
6
6
 
7
7
  import { next as am, type Heads } from '@dxos/automerge/automerge';
8
8
 
9
+ import { type IDocHandle } from './handle';
9
10
  import { type Field } from './plugin';
10
- import { type Peer } from '../demo';
11
11
 
12
- export default (field: Field, handle: Peer, transactions: Transaction[], state: EditorState): Heads | undefined => {
12
+ export default (
13
+ field: Field,
14
+ handle: IDocHandle,
15
+ transactions: Transaction[],
16
+ state: EditorState,
17
+ ): Heads | undefined => {
13
18
  const { lastHeads, path } = state.field(field);
14
19
 
15
20
  // We don't want to call `automerge.updateAt` if there are no changes.
16
21
  // Otherwise later on `automerge.diff` will return empty patches that result in a no-op but still mess up the selection.
17
22
  let hasChanges = false;
18
23
  for (const tr of transactions) {
19
- if (tr.changes.length) {
20
- tr.changes.iterChanges(() => {
21
- hasChanges = true;
22
- });
23
- }
24
+ tr.changes.iterChanges(() => {
25
+ hasChanges = true;
26
+ });
24
27
  }
25
28
 
26
29
  if (!hasChanges) {
@@ -0,0 +1,14 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import type * as A from '@dxos/automerge/automerge';
6
+
7
+ export type IDocHandle<T = any> = {
8
+ docSync(): A.Doc<T> | undefined;
9
+ change(callback: A.ChangeFn<T>, options?: A.ChangeOptions<T>): void;
10
+ changeAt(heads: A.Heads, callback: A.ChangeFn<T>, options?: A.ChangeOptions<T>): string[] | undefined;
11
+
12
+ addListener(event: 'change', listener: () => void): void;
13
+ removeListener(event: 'change', listener: () => void): void;
14
+ };
@@ -2,5 +2,5 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export { plugin, reconcile } from './plugin';
6
- export { PatchSemaphore } from './PatchSemaphore';
5
+ export { automergePlugin, type AutomergePlugin } from './plugin';
6
+ export { type IDocHandle } from './handle';
@@ -12,13 +12,13 @@ import {
12
12
  type Transaction,
13
13
  type TransactionSpec,
14
14
  } from '@codemirror/state';
15
- import { type EditorView } from '@codemirror/view';
15
+ import { ViewPlugin, type EditorView, type PluginValue, type ViewUpdate } from '@codemirror/view';
16
16
 
17
17
  import * as automerge from '@dxos/automerge/automerge';
18
- import { type Doc, type Heads, type Prop } from '@dxos/automerge/automerge';
18
+ import { type Heads, type Prop } from '@dxos/automerge/automerge';
19
19
 
20
20
  import { PatchSemaphore } from './PatchSemaphore';
21
- import { type Peer } from '../demo';
21
+ import { type IDocHandle } from './handle';
22
22
 
23
23
  export type Value = {
24
24
  lastHeads: Heads;
@@ -44,10 +44,14 @@ const semaphoreFacet = Facet.define<PatchSemaphore, PatchSemaphore>({
44
44
  combine: (values) => values.at(-1)!, // Take last.
45
45
  });
46
46
 
47
- export const plugin = <T>(doc: Doc<T>, path: Prop[]): Extension => {
47
+ export type AutomergePlugin = {
48
+ extension: Extension;
49
+ };
50
+
51
+ export const automergePlugin = (handle: IDocHandle, path: Prop[]): AutomergePlugin => {
48
52
  const stateField: StateField<Value> = StateField.define({
49
53
  create: () => ({
50
- lastHeads: automerge.getHeads(doc),
54
+ lastHeads: automerge.getHeads(handle.docSync()!),
51
55
  unreconciledTransactions: [],
52
56
  path: path.slice(),
53
57
  }),
@@ -76,7 +80,36 @@ export const plugin = <T>(doc: Doc<T>, path: Prop[]): Extension => {
76
80
  });
77
81
  const semaphore = new PatchSemaphore(stateField);
78
82
 
79
- return [stateField, semaphoreFacet.of(semaphore)];
83
+ const viewPlugin = ViewPlugin.fromClass(
84
+ class AutomergeCodemirrorViewPlugin implements PluginValue {
85
+ private _view: EditorView;
86
+
87
+ constructor(view: EditorView) {
88
+ this._view = view;
89
+ handle.addListener('change', this._handleChange);
90
+ }
91
+
92
+ update(update: ViewUpdate) {
93
+ if (update.transactions.length > 0 && update.transactions.some((t) => !isReconcileTx(t))) {
94
+ queueMicrotask(() => {
95
+ this._view.state.facet(semaphoreFacet).reconcile(handle, this._view);
96
+ });
97
+ }
98
+ }
99
+
100
+ destroy() {
101
+ handle.addListener('change', this._handleChange);
102
+ }
103
+
104
+ private _handleChange = () => {
105
+ this._view.state.facet(semaphoreFacet).reconcile(handle, this._view);
106
+ };
107
+ },
108
+ );
109
+
110
+ return {
111
+ extension: [stateField, semaphoreFacet.of(semaphore), viewPlugin],
112
+ };
80
113
  };
81
114
 
82
115
  export const reconcileAnnotationType = Annotation.define<unknown>();
@@ -98,7 +131,3 @@ export const makeReconcile = (tr: TransactionSpec) => {
98
131
  // annotations: reconcileAnnotationType.of({})
99
132
  // }
100
133
  };
101
-
102
- export const reconcile = (handle: Peer, view: EditorView) => {
103
- view.state.facet(semaphoreFacet).reconcile(handle, view);
104
- };
@@ -2,17 +2,20 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { basicSetup } from '@codemirror/basic-setup';
5
+ import '@preact/signals-react'; // Register react integration
6
+ import { BroadcastChannelNetworkAdapter } from '@automerge/automerge-repo-network-broadcastchannel';
6
7
  import { EditorView } from '@codemirror/view';
8
+ import { basicSetup } from 'codemirror';
9
+ import get from 'lodash.get';
7
10
  import React, { useEffect, useRef, useState } from 'react';
8
11
 
9
- import { type Prop, next as automerge } from '@dxos/automerge/automerge';
12
+ import { type Prop } from '@dxos/automerge/automerge';
13
+ import { type DocHandle, Repo } from '@dxos/automerge/automerge-repo';
10
14
 
11
- import { plugin as amgPlugin, reconcile } from './automerge-plugin';
12
- import { Peer } from './demo';
15
+ import { type IDocHandle, automergePlugin } from './automerge-plugin';
13
16
 
14
17
  type EditorProps = {
15
- handle: Peer;
18
+ handle: IDocHandle;
16
19
  path: Prop[];
17
20
  };
18
21
 
@@ -21,27 +24,13 @@ const Editor = ({ handle, path }: EditorProps) => {
21
24
  const editorRoot = useRef<EditorView>();
22
25
 
23
26
  useEffect(() => {
24
- const doc = handle.doc;
25
- const source = doc.text; // this should use path
26
- const plugin = amgPlugin(doc, path);
27
27
  const view = (editorRoot.current = new EditorView({
28
- doc: source,
29
- extensions: [basicSetup, plugin],
30
- dispatch: (transaction) => {
31
- view.update([transaction]);
32
- reconcile(handle, view);
33
- },
28
+ doc: get(handle.docSync()!, path),
29
+ extensions: [basicSetup, automergePlugin(handle, path)],
34
30
  parent: containerRef.current as any,
35
31
  }));
36
32
 
37
- const handleChange = () => {
38
- reconcile(handle, view);
39
- };
40
-
41
- handle.changeEvent.on(handleChange);
42
-
43
33
  return () => {
44
- handle.changeEvent.off(handleChange);
45
34
  view.destroy();
46
35
  };
47
36
  }, []);
@@ -50,31 +39,29 @@ const Editor = ({ handle, path }: EditorProps) => {
50
39
  };
51
40
 
52
41
  const Story = () => {
53
- const [object1, setObject1] = useState<Peer | null>(null);
54
- const [object2, setObject2] = useState<Peer | null>(null);
55
- const [stats1, setStats1] = useState<any>({});
56
- const [stats2, setStats2] = useState<any>({});
42
+ const [object1, setObject1] = useState<DocHandle<any> | null>(null);
43
+ const [object2, setObject2] = useState<DocHandle<any> | null>(null);
57
44
 
58
45
  useEffect(() => {
59
- const object1 = new Peer();
60
- object1.doc = automerge.from({ text: 'Hello world!' });
61
-
62
- const object2 = new Peer();
63
- object2.doc = automerge.init();
64
-
65
- const r1 = object1.replicate();
66
- const r2 = object2.replicate();
67
-
68
- void r1.readable.pipeTo(r2.writable);
69
- void r2.readable.pipeTo(r1.writable);
70
-
71
- setObject1(object1);
72
- setObject2(object2);
73
-
74
- setInterval(() => {
75
- setStats1({ ...object1.stats });
76
- setStats2({ ...object2.stats });
77
- }, 500);
46
+ queueMicrotask(async () => {
47
+ const repo1 = new Repo({
48
+ network: [new BroadcastChannelNetworkAdapter()],
49
+ });
50
+ const repo2 = new Repo({
51
+ network: [new BroadcastChannelNetworkAdapter()],
52
+ });
53
+
54
+ const object1 = repo1.create();
55
+ object1.change((doc: any) => {
56
+ doc.text = 'Hello world!';
57
+ });
58
+
59
+ const object2 = repo2.find(object1.url);
60
+ await object2.whenReady();
61
+
62
+ setObject1(object1);
63
+ setObject2(object2);
64
+ });
78
65
  }, []);
79
66
 
80
67
  if (!object1 || !object2) {
@@ -85,11 +72,9 @@ const Story = () => {
85
72
  <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', width: '100vw' }}>
86
73
  <div>
87
74
  <Editor handle={object1} path={['text']} />
88
- <div style={{ whiteSpace: 'pre' }}>{JSON.stringify(stats1, null, 2)}</div>
89
75
  </div>
90
76
  <div>
91
77
  <Editor handle={object2} path={['text']} />
92
- <div style={{ whiteSpace: 'pre' }}>{JSON.stringify(stats2, null, 2)}</div>
93
78
  </div>
94
79
  </div>
95
80
  );
@@ -99,6 +84,6 @@ export default {
99
84
  title: 'Automerge',
100
85
  };
101
86
 
102
- export const EditorStory = {
87
+ export const AutomergeRepo = {
103
88
  render: () => <Story />,
104
89
  };
@@ -14,7 +14,7 @@ import { withTheme } from '@dxos/storybook-utils';
14
14
 
15
15
  import { TextEditor } from './TextEditor';
16
16
  import { createHyperlinkTooltip, hyperlinkDecoration } from './extensions';
17
- import { useTextModel } from '../../model';
17
+ import { useTextModel } from '../../hooks';
18
18
 
19
19
  const text = [
20
20
  '',
@@ -37,9 +37,12 @@ const hyperLinkTooltip = () =>
37
37
  );
38
38
  });
39
39
 
40
- const Story = () => {
41
- const [item] = useState({ text: new TextObject(text) });
40
+ const Story = ({ automerge }: { automerge?: boolean }) => {
41
+ const [item] = useState({ text: new TextObject(text, undefined, undefined, { useAutomergeBackend: !!automerge }) });
42
42
  const model = useTextModel({ text: item.text });
43
+ if (!model) {
44
+ return <></>;
45
+ }
43
46
 
44
47
  return (
45
48
  <div className={mx(fixedInsetFlexLayout, groupSurface)}>
@@ -70,3 +73,7 @@ export default {
70
73
  };
71
74
 
72
75
  export const Default = {};
76
+
77
+ export const Automerge = {
78
+ render: () => <Story automerge />,
79
+ };