@dxos/react-ui-editor 0.3.10 → 0.3.11-main.0e40963

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 (141) hide show
  1. package/dist/lib/browser/index.mjs +1971 -1744
  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 +14 -10
  5. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -1
  6. package/dist/types/src/components/TextEditor/TextEditor.d.ts +3 -2
  7. package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
  8. package/dist/types/src/components/TextEditor/index.d.ts +0 -2
  9. package/dist/types/src/components/TextEditor/index.d.ts.map +1 -1
  10. package/dist/types/src/extensions/autocomplete.d.ts.map +1 -0
  11. package/dist/types/src/extensions/basic.d.ts.map +1 -0
  12. package/dist/types/src/extensions/blast.d.ts.map +1 -0
  13. package/dist/types/src/extensions/code.d.ts.map +1 -0
  14. package/dist/types/src/extensions/comments.d.ts +48 -0
  15. package/dist/types/src/extensions/comments.d.ts.map +1 -0
  16. package/dist/types/src/extensions/hr.d.ts +2 -0
  17. package/dist/types/src/extensions/hr.d.ts.map +1 -0
  18. package/dist/types/src/extensions/image.d.ts.map +1 -0
  19. package/dist/types/src/{components/TextEditor/extensions → extensions}/index.d.ts +3 -3
  20. package/dist/types/src/extensions/index.d.ts.map +1 -0
  21. package/dist/types/src/{components/TextEditor/extensions → extensions}/link.d.ts +1 -0
  22. package/dist/types/src/extensions/link.d.ts.map +1 -0
  23. package/dist/types/src/extensions/listener.d.ts +10 -0
  24. package/dist/types/src/extensions/listener.d.ts.map +1 -0
  25. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -0
  26. package/dist/types/src/{components/TextEditor/extensions → extensions}/markdown/highlight.d.ts +0 -1
  27. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -0
  28. package/dist/types/src/extensions/markdown/index.d.ts.map +1 -0
  29. package/dist/types/src/extensions/mention.d.ts.map +1 -0
  30. package/dist/types/src/extensions/mermaid.d.ts +3 -0
  31. package/dist/types/src/extensions/mermaid.d.ts.map +1 -0
  32. package/dist/types/src/extensions/table.d.ts.map +1 -0
  33. package/dist/types/src/extensions/tasklist.d.ts.map +1 -0
  34. package/dist/types/src/{components/TextEditor/extensions/demo.d.ts → extensions/typewriter.d.ts} +2 -3
  35. package/dist/types/src/extensions/typewriter.d.ts.map +1 -0
  36. package/dist/types/src/extensions/util.d.ts +5 -0
  37. package/dist/types/src/extensions/util.d.ts.map +1 -0
  38. package/dist/types/src/hooks/automerge/automerge.stories.d.ts +2 -3
  39. package/dist/types/src/hooks/automerge/automerge.stories.d.ts.map +1 -1
  40. package/dist/types/src/hooks/automerge/plugin.d.ts.map +1 -1
  41. package/dist/types/src/hooks/automerge/{PatchSemaphore.d.ts → semaphore.d.ts} +1 -1
  42. package/dist/types/src/hooks/automerge/semaphore.d.ts.map +1 -0
  43. package/dist/types/src/hooks/automerge/update-automerge.d.ts +6 -0
  44. package/dist/types/src/hooks/automerge/update-automerge.d.ts.map +1 -0
  45. package/dist/types/src/hooks/automerge/update-codemirror.d.ts +5 -0
  46. package/dist/types/src/hooks/automerge/update-codemirror.d.ts.map +1 -0
  47. package/dist/types/src/hooks/useTextModel.d.ts +14 -6
  48. package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
  49. package/dist/types/src/hooks/yjs/yjs.test.d.ts +2 -0
  50. package/dist/types/src/hooks/yjs/yjs.test.d.ts.map +1 -0
  51. package/dist/types/src/index.d.ts +3 -0
  52. package/dist/types/src/index.d.ts.map +1 -1
  53. package/dist/types/src/testing/replicator.d.ts.map +1 -1
  54. package/dist/types/src/{components/TextEditor/themes → themes}/default.d.ts +5 -13
  55. package/dist/types/src/themes/default.d.ts.map +1 -0
  56. package/dist/types/src/themes/index.d.ts.map +1 -0
  57. package/package.json +24 -20
  58. package/src/components/TextEditor/MarkdownEditor.stories.tsx +130 -71
  59. package/src/components/TextEditor/TextEditor.stories.tsx +2 -2
  60. package/src/components/TextEditor/TextEditor.tsx +29 -25
  61. package/src/components/TextEditor/index.ts +0 -3
  62. package/src/{components/TextEditor/extensions → extensions}/code.ts +13 -13
  63. package/src/extensions/comments.ts +391 -0
  64. package/src/extensions/hr.ts +74 -0
  65. package/src/{components/TextEditor/extensions → extensions}/image.ts +3 -1
  66. package/src/{components/TextEditor/extensions → extensions}/index.ts +3 -3
  67. package/src/{components/TextEditor/extensions → extensions}/link.ts +66 -10
  68. package/src/extensions/listener.ts +35 -0
  69. package/src/{components/TextEditor/extensions → extensions}/markdown/highlight.ts +6 -9
  70. package/src/extensions/mermaid.ts +11 -0
  71. package/src/{components/TextEditor/extensions → extensions}/table.ts +14 -1
  72. package/src/{components/TextEditor/extensions/demo.ts → extensions/typewriter.ts} +2 -3
  73. package/src/extensions/util.ts +18 -0
  74. package/src/hooks/automerge/automerge.stories.tsx +2 -3
  75. package/src/hooks/automerge/plugin.ts +1 -1
  76. package/src/hooks/automerge/{PatchSemaphore.ts → semaphore.ts} +4 -3
  77. package/src/hooks/automerge/{translation/codemirror-to-automerge.ts → update-automerge.ts} +3 -3
  78. package/src/hooks/automerge/{translation/automerge-to-codemirror.ts → update-codemirror.ts} +2 -7
  79. package/src/hooks/useTextModel.ts +60 -22
  80. package/src/hooks/yjs/yjs.test.ts +59 -0
  81. package/src/index.ts +3 -0
  82. package/src/testing/replicator.ts +0 -1
  83. package/src/{components/TextEditor/themes → themes}/default.ts +61 -38
  84. package/dist/types/src/components/TextEditor/extensions/autocomplete.d.ts.map +0 -1
  85. package/dist/types/src/components/TextEditor/extensions/basic.d.ts.map +0 -1
  86. package/dist/types/src/components/TextEditor/extensions/blast.d.ts.map +0 -1
  87. package/dist/types/src/components/TextEditor/extensions/code.d.ts.map +0 -1
  88. package/dist/types/src/components/TextEditor/extensions/comments.d.ts +0 -18
  89. package/dist/types/src/components/TextEditor/extensions/comments.d.ts.map +0 -1
  90. package/dist/types/src/components/TextEditor/extensions/demo.d.ts.map +0 -1
  91. package/dist/types/src/components/TextEditor/extensions/experimental.d.ts +0 -10
  92. package/dist/types/src/components/TextEditor/extensions/experimental.d.ts.map +0 -1
  93. package/dist/types/src/components/TextEditor/extensions/highlight.d.ts +0 -24
  94. package/dist/types/src/components/TextEditor/extensions/highlight.d.ts.map +0 -1
  95. package/dist/types/src/components/TextEditor/extensions/image.d.ts.map +0 -1
  96. package/dist/types/src/components/TextEditor/extensions/index.d.ts.map +0 -1
  97. package/dist/types/src/components/TextEditor/extensions/link.d.ts.map +0 -1
  98. package/dist/types/src/components/TextEditor/extensions/listener.d.ts +0 -9
  99. package/dist/types/src/components/TextEditor/extensions/listener.d.ts.map +0 -1
  100. package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts.map +0 -1
  101. package/dist/types/src/components/TextEditor/extensions/markdown/highlight.d.ts.map +0 -1
  102. package/dist/types/src/components/TextEditor/extensions/markdown/index.d.ts.map +0 -1
  103. package/dist/types/src/components/TextEditor/extensions/mention.d.ts.map +0 -1
  104. package/dist/types/src/components/TextEditor/extensions/table.d.ts.map +0 -1
  105. package/dist/types/src/components/TextEditor/extensions/tasklist.d.ts.map +0 -1
  106. package/dist/types/src/components/TextEditor/extensions/tooltip.d.ts +0 -12
  107. package/dist/types/src/components/TextEditor/extensions/tooltip.d.ts.map +0 -1
  108. package/dist/types/src/components/TextEditor/themes/default.d.ts.map +0 -1
  109. package/dist/types/src/components/TextEditor/themes/index.d.ts.map +0 -1
  110. package/dist/types/src/hooks/automerge/PatchSemaphore.d.ts.map +0 -1
  111. package/dist/types/src/hooks/automerge/translation/automerge-to-codemirror.d.ts +0 -5
  112. package/dist/types/src/hooks/automerge/translation/automerge-to-codemirror.d.ts.map +0 -1
  113. package/dist/types/src/hooks/automerge/translation/codemirror-to-automerge.d.ts +0 -6
  114. package/dist/types/src/hooks/automerge/translation/codemirror-to-automerge.d.ts.map +0 -1
  115. package/dist/types/src/hooks/automerge/translation/index.d.ts +0 -3
  116. package/dist/types/src/hooks/automerge/translation/index.d.ts.map +0 -1
  117. package/src/components/TextEditor/extensions/comments.ts +0 -173
  118. package/src/components/TextEditor/extensions/experimental.tsx +0 -114
  119. package/src/components/TextEditor/extensions/highlight.ts +0 -128
  120. package/src/components/TextEditor/extensions/listener.ts +0 -23
  121. package/src/components/TextEditor/extensions/tooltip.tsx +0 -61
  122. package/src/hooks/automerge/translation/index.ts +0 -6
  123. /package/dist/types/src/{components/TextEditor/extensions → extensions}/autocomplete.d.ts +0 -0
  124. /package/dist/types/src/{components/TextEditor/extensions → extensions}/basic.d.ts +0 -0
  125. /package/dist/types/src/{components/TextEditor/extensions → extensions}/blast.d.ts +0 -0
  126. /package/dist/types/src/{components/TextEditor/extensions → extensions}/code.d.ts +0 -0
  127. /package/dist/types/src/{components/TextEditor/extensions → extensions}/image.d.ts +0 -0
  128. /package/dist/types/src/{components/TextEditor/extensions → extensions}/markdown/bundle.d.ts +0 -0
  129. /package/dist/types/src/{components/TextEditor/extensions → extensions}/markdown/index.d.ts +0 -0
  130. /package/dist/types/src/{components/TextEditor/extensions → extensions}/mention.d.ts +0 -0
  131. /package/dist/types/src/{components/TextEditor/extensions → extensions}/table.d.ts +0 -0
  132. /package/dist/types/src/{components/TextEditor/extensions → extensions}/tasklist.d.ts +0 -0
  133. /package/dist/types/src/{components/TextEditor/themes → themes}/index.d.ts +0 -0
  134. /package/src/{components/TextEditor/extensions → extensions}/autocomplete.ts +0 -0
  135. /package/src/{components/TextEditor/extensions → extensions}/basic.ts +0 -0
  136. /package/src/{components/TextEditor/extensions → extensions}/blast.ts +0 -0
  137. /package/src/{components/TextEditor/extensions → extensions}/markdown/bundle.ts +0 -0
  138. /package/src/{components/TextEditor/extensions → extensions}/markdown/index.ts +0 -0
  139. /package/src/{components/TextEditor/extensions → extensions}/mention.ts +0 -0
  140. /package/src/{components/TextEditor/extensions → extensions}/tasklist.ts +0 -0
  141. /package/src/{components/TextEditor/themes → themes}/index.ts +0 -0
@@ -1,19 +1,27 @@
1
- import { type Extension } from '@codemirror/state';
1
+ import { type Extension, StateField } from '@codemirror/state';
2
2
  import type * as awarenessProtocol from 'y-protocols/awareness';
3
3
  import { type DocAccessor, type Space, type TextObject } from '@dxos/react-client/echo';
4
4
  import { type Identity } from '@dxos/react-client/halo';
5
5
  import type { YText, YXmlFragment } from '@dxos/text-model';
6
6
  type Awareness = awarenessProtocol.Awareness;
7
- export type DocumentRange = {
8
- id: string;
7
+ /**
8
+ * State field makes the model available to other extensions.
9
+ */
10
+ export declare const modelState: StateField<EditorModel | undefined>;
11
+ export type Range = {
9
12
  from: number;
10
13
  to: number;
11
14
  };
15
+ export type CommentRange = {
16
+ id: string;
17
+ cursor: string;
18
+ };
12
19
  export type EditorModel = {
13
20
  id: string;
14
21
  content: string | YText | YXmlFragment | DocAccessor;
15
22
  text: () => string;
16
- ranges: DocumentRange[];
23
+ getCursorFromRange?: (value: Range) => string;
24
+ getRangeFromCursor?: (cursor: string) => Range | undefined;
17
25
  extension?: Extension;
18
26
  awareness?: Awareness;
19
27
  peer?: {
@@ -21,11 +29,11 @@ export type EditorModel = {
21
29
  name?: string;
22
30
  };
23
31
  };
24
- export type UseTextModelOptions = {
32
+ export type UseTextModelProps = {
25
33
  identity?: Identity | null;
26
34
  space?: Space;
27
35
  text?: TextObject;
28
36
  };
29
- export declare const useTextModel: ({ identity, space, text }: UseTextModelOptions) => EditorModel | undefined;
37
+ export declare const useTextModel: (props: UseTextModelProps) => EditorModel | undefined;
30
38
  export {};
31
39
  //# sourceMappingURL=useTextModel.d.ts.map
@@ -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;AAInD,OAAO,KAAK,KAAK,iBAAiB,MAAM,uBAAuB,CAAC;AAGhE,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;AAM5D,KAAK,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC;AAE7C,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAGF,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IAEX,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,YAAY,GAAG,WAAW,CAAC;IACrD,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH,CAAC;AAGF,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;AAIF,eAAO,MAAM,YAAY,8BAA+B,mBAAmB,KAAG,WAAW,GAAG,SAM3F,CAAC"}
1
+ {"version":3,"file":"useTextModel.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextModel.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI/D,OAAO,KAAK,KAAK,iBAAiB,MAAM,uBAAuB,CAAC;AAIhE,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;AAO5D,KAAK,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC;AAE7C;;GAEG;AAEH,eAAO,MAAM,UAAU,qCAGrB,CAAC;AAEH,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IAEX,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IAEX,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,YAAY,GAAG,WAAW,CAAC;IACrD,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC;IAC9C,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,GAAG,SAAS,CAAC;IAC3D,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH,CAAC;AAGF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,CAAC;AAIF,eAAO,MAAM,YAAY,UAAW,iBAAiB,KAAG,WAAW,GAAG,SAKrE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=yjs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yjs.test.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/yjs/yjs.test.ts"],"names":[],"mappings":""}
@@ -1,5 +1,8 @@
1
1
  export { TextKind } from '@dxos/protocols/proto/dxos/echo/model/text';
2
2
  export { Doc, YText, YXmlFragment } from '@dxos/text-model';
3
+ export { type Extension } from '@codemirror/state';
3
4
  export * from './components';
5
+ export * from './extensions';
4
6
  export * from './hooks';
7
+ export * from './themes';
5
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
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
+ {"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;AAC5D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
@@ -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;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,CAqB1D;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,WAEzE,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,CAoB1D;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,WAEzE,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type StyleSpec } from 'style-mod';
1
+ import { type ThemeStyles } from '../styles';
2
2
  /**
3
3
  * Minimal styles.
4
4
  * https://codemirror.net/examples/styling
@@ -10,16 +10,8 @@ import { type StyleSpec } from 'style-mod';
10
10
  * NOTE: Use one of '&', '&light', and '&dark' prefix to scope instance.
11
11
  * NOTE: `light` and `dark` selectors are preprocessed by CodeMirror and can only be in the base theme.
12
12
  */
13
- export declare const defaultTheme: {
14
- [selector: string]: StyleSpec;
15
- };
16
- export declare const textTheme: {
17
- [selector: string]: StyleSpec;
18
- };
19
- export declare const markdownTheme: {
20
- [selector: string]: StyleSpec;
21
- };
22
- export declare const codeTheme: {
23
- [selector: string]: StyleSpec;
24
- };
13
+ export declare const defaultTheme: ThemeStyles;
14
+ export declare const textTheme: ThemeStyles;
15
+ export declare const markdownTheme: ThemeStyles;
16
+ export declare const codeTheme: ThemeStyles;
25
17
  //# sourceMappingURL=default.d.ts.map
@@ -0,0 +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,WA8P1B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,WAOvB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,WAK3B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,WAOvB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/themes/index.ts"],"names":[],"mappings":"AAIA,cAAc,WAAW,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/react-ui-editor",
3
- "version": "0.3.10",
3
+ "version": "0.3.11-main.0e40963",
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",
@@ -32,24 +32,25 @@
32
32
  "lib0": "^0.2.65",
33
33
  "lodash.defaultsdeep": "^4.6.1",
34
34
  "lodash.get": "^4.4.2",
35
+ "lodash.pick": "^4.4.0",
35
36
  "lodash.sortby": "^4.7.0",
36
37
  "style-mod": "^4.1.0",
37
38
  "y-codemirror.next": "^0.3.2",
38
39
  "y-protocols": "^1.0.5",
39
40
  "yjs": "^13.6.10",
40
- "@dxos/automerge": "0.3.10",
41
- "@dxos/async": "0.3.10",
42
- "@dxos/debug": "0.3.10",
43
- "@dxos/display-name": "0.3.10",
44
- "@dxos/invariant": "0.3.10",
45
- "@dxos/echo-schema": "0.3.10",
46
- "@dxos/protocols": "0.3.10",
47
- "@dxos/react-async": "0.3.10",
48
- "@dxos/log": "0.3.10",
49
- "@dxos/react-ui": "0.3.10",
50
- "@dxos/react-ui-theme": "0.3.10",
51
- "@dxos/text-model": "0.3.10",
52
- "@dxos/util": "0.3.10"
41
+ "@dxos/async": "0.3.11-main.0e40963",
42
+ "@dxos/debug": "0.3.11-main.0e40963",
43
+ "@dxos/automerge": "0.3.11-main.0e40963",
44
+ "@dxos/display-name": "0.3.11-main.0e40963",
45
+ "@dxos/invariant": "0.3.11-main.0e40963",
46
+ "@dxos/echo-schema": "0.3.11-main.0e40963",
47
+ "@dxos/protocols": "0.3.11-main.0e40963",
48
+ "@dxos/react-async": "0.3.11-main.0e40963",
49
+ "@dxos/log": "0.3.11-main.0e40963",
50
+ "@dxos/react-ui": "0.3.11-main.0e40963",
51
+ "@dxos/react-ui-theme": "0.3.11-main.0e40963",
52
+ "@dxos/text-model": "0.3.11-main.0e40963",
53
+ "@dxos/util": "0.3.11-main.0e40963"
53
54
  },
54
55
  "devDependencies": {
55
56
  "@automerge/automerge-repo-network-broadcastchannel": "^1.0.19",
@@ -58,22 +59,25 @@
58
59
  "@preact/signals-react": "^1.3.6",
59
60
  "@types/lodash.defaultsdeep": "^4.6.6",
60
61
  "@types/lodash.get": "^4.4.7",
62
+ "@types/lodash.pick": "^4.4.7",
61
63
  "@types/lodash.sortby": "^4.7.7",
62
64
  "@types/react": "^18.0.21",
63
65
  "@types/react-dom": "^18.0.6",
66
+ "deepsignal": "1.4.0-shallow.0",
64
67
  "react": "^18.2.0",
65
68
  "react-dom": "^18.2.0",
66
- "@dxos/config": "0.3.10",
67
- "@dxos/echo-typegen": "0.3.10",
68
- "@dxos/react-ui": "0.3.10",
69
- "@dxos/storybook-utils": "0.3.10",
70
- "@dxos/react-client": "0.3.10"
69
+ "@dxos/config": "0.3.11-main.0e40963",
70
+ "@dxos/echo-signals": "0.3.11-main.0e40963",
71
+ "@dxos/echo-typegen": "0.3.11-main.0e40963",
72
+ "@dxos/react-ui": "0.3.11-main.0e40963",
73
+ "@dxos/react-client": "0.3.11-main.0e40963",
74
+ "@dxos/storybook-utils": "0.3.11-main.0e40963"
71
75
  },
72
76
  "peerDependencies": {
73
77
  "@phosphor-icons/react": "^2.0.5",
74
78
  "react": "^18.2.0",
75
79
  "react-dom": "^18.2.0",
76
- "@dxos/react-client": "0.3.10"
80
+ "@dxos/react-client": "0.3.11-main.0e40963"
77
81
  },
78
82
  "publishConfig": {
79
83
  "access": "public"
@@ -8,7 +8,7 @@ import { EditorView } from '@codemirror/view';
8
8
  import { faker } from '@faker-js/faker';
9
9
  import { ArrowSquareOut } from '@phosphor-icons/react';
10
10
  import defaultsDeep from 'lodash.defaultsdeep';
11
- import React, { StrictMode, useRef, useState } from 'react';
11
+ import React, { type FC, StrictMode, useRef, useState } from 'react';
12
12
  import { createRoot } from 'react-dom/client';
13
13
 
14
14
  import { TextObject } from '@dxos/echo-schema';
@@ -19,28 +19,30 @@ import { withTheme } from '@dxos/storybook-utils';
19
19
  import { MarkdownEditor, type TextEditorProps, type TextEditorRef } from './TextEditor';
20
20
  import {
21
21
  autocomplete,
22
+ blast,
23
+ code,
24
+ comments,
25
+ defaultOptions,
26
+ hr,
27
+ image,
22
28
  listener,
23
29
  link,
30
+ mention,
31
+ table,
24
32
  tasklist,
25
- tooltip,
26
- type TooltipOptions,
33
+ typewriter,
34
+ type CommentsOptions,
27
35
  type LinkOptions,
28
- comments,
29
- table,
30
- image,
31
- mention,
32
- blast,
33
- demo,
34
- defaultOptions,
35
- highlight,
36
- code,
37
- } from './extensions';
38
- import { useTextModel } from '../../hooks';
36
+ mermaid,
37
+ } from '../../extensions';
38
+ import { type CommentRange, useTextModel } from '../../hooks';
39
39
 
40
40
  // Extensions:
41
41
  // TODO(burdon): Table of contents.
42
42
  // TODO(burdon): Front-matter
43
43
 
44
+ faker.seed(101);
45
+
44
46
  const str = (...lines: string[]) => lines.join('\n');
45
47
 
46
48
  const num = () => faker.number.int({ min: 0, max: 9999 }).toLocaleString();
@@ -55,6 +57,7 @@ const text = {
55
57
  ' - [ ] state',
56
58
  ' - [ ] indent',
57
59
  ' - [x] style',
60
+ '',
58
61
  ),
59
62
 
60
63
  list: str(
@@ -63,6 +66,7 @@ const text = {
63
66
  '- new york',
64
67
  '- london',
65
68
  '- tokyo',
69
+ '',
66
70
  ),
67
71
 
68
72
  numbered: str(
@@ -87,8 +91,8 @@ const text = {
87
91
  '',
88
92
  ' return () => <div>Test</div>;',
89
93
  '};',
94
+ '```',
90
95
  '',
91
- '```'
92
96
  ),
93
97
 
94
98
  links: str(
@@ -103,11 +107,11 @@ const text = {
103
107
  table: str(
104
108
  '# Table',
105
109
  '',
106
- `| ${faker.lorem.word().padStart(8)} | ${faker.lorem.word().padStart(8)} | ${faker.lorem.word().padStart(8)} |`,
107
- '|----------|----------|----------|',
108
- `| ${num().padStart(8)} | ${num().padStart(8)} | ${num().padStart(8)} |`,
109
- `| ${num().padStart(8)} | ${num().padStart(8)} | ${num().padStart(8)} |`,
110
- `| ${num().padStart(8)} | ${num().padStart(8)} | ${num().padStart(8)} |`,
110
+ `| ${faker.lorem.word().padStart(12)} | ${faker.lorem.word().padStart(12)} | ${faker.lorem.word().padStart(12)} |`,
111
+ `|-${''.padStart(12, '-')}-|-${''.padStart(12, '-')}-|-${''.padStart(12, '-')}-|`,
112
+ `| ${num().padStart(12)} | ${num().padStart(12)} | ${num().padStart(12)} |`,
113
+ `| ${num().padStart(12)} | ${num().padStart(12)} | ${num().padStart(12)} |`,
114
+ `| ${num().padStart(12)} | ${num().padStart(12)} | ${num().padStart(12)} |`,
111
115
  '', // TODO(burdon): Possible GFM parsing bug if no newline?
112
116
  ),
113
117
 
@@ -119,6 +123,8 @@ const text = {
119
123
 
120
124
  paragraphs: str(...faker.helpers.multiple(() => [faker.lorem.paragraph(), ''], { count: 3 }).flat()),
121
125
 
126
+ mermaid: str('```mermaid', 'graph TD;', 'A-->B;', 'A-->C;', 'B-->D;', 'C-->D;', '```'),
127
+
122
128
  footer: str('', '', '', '', '')
123
129
  };
124
130
 
@@ -147,7 +153,6 @@ const document = str(
147
153
  text.table,
148
154
  '---',
149
155
  text.image,
150
- '',
151
156
  text.footer,
152
157
  );
153
158
 
@@ -162,7 +167,7 @@ const links = [
162
167
  const hover =
163
168
  'rounded-sm text-base text-primary-600 hover:text-primary-500 dark:text-primary-300 hover:dark:text-primary-200';
164
169
 
165
- const onHover: TooltipOptions['onHover'] = (el, url) => {
170
+ const onHoverLinkTooltip: LinkOptions['onHover'] = (el, url) => {
166
171
  const web = new URL(url);
167
172
  createRoot(el).render(
168
173
  <StrictMode>
@@ -174,7 +179,28 @@ const onHover: TooltipOptions['onHover'] = (el, url) => {
174
179
  );
175
180
  };
176
181
 
177
- const onRender: LinkOptions['onRender'] = (el, url) => {
182
+ const Key: FC<{ char: string }> = ({ char }) => (
183
+ <span className='flex justify-center items-center w-[24px] h-[24px] rounded text-xs bg-neutral-200 text-black'>
184
+ {char}
185
+ </span>
186
+ );
187
+
188
+ const onCommentsHover: CommentsOptions['onHover'] = (el) => {
189
+ createRoot(el).render(
190
+ <StrictMode>
191
+ <div className='flex items-center gap-2 px-2 py-2 bg-neutral-700 text-white text-xs rounded'>
192
+ <div>Create comment</div>
193
+ {/* TODO(burdon): Unify shortcuts. */}
194
+ <div className='flex gap-1'>
195
+ <Key char='⌘' />
196
+ <Key char="'" />
197
+ </div>
198
+ </div>
199
+ </StrictMode>,
200
+ );
201
+ };
202
+
203
+ const onRenderLink: LinkOptions['onRender'] = (el, url) => {
178
204
  createRoot(el).render(
179
205
  <StrictMode>
180
206
  <a href={url} target='_blank' rel='noreferrer' className={hover}>
@@ -184,14 +210,14 @@ const onRender: LinkOptions['onRender'] = (el, url) => {
184
210
  );
185
211
  };
186
212
 
187
- // TODO(burdon): Pass in model.
188
- const Story = ({
189
- text,
190
- automerge,
191
- ...props
192
- }: { text?: string; automerge?: boolean } & Pick<TextEditorProps, 'readonly' | 'extensions' | 'slots'>) => {
213
+ type StoryProps = {
214
+ text?: string;
215
+ automerge?: boolean;
216
+ } & Pick<TextEditorProps, 'comments' | 'readonly' | 'extensions' | 'slots'>;
217
+
218
+ const Story = ({ text, automerge, ...props }: StoryProps) => {
193
219
  const ref = useRef<TextEditorRef>(null);
194
- const [item] = useState({ text: new TextObject(text, undefined, undefined, { useAutomergeBackend: automerge }) });
220
+ const [item] = useState({ text: new TextObject(text, undefined, undefined, { automerge }) });
195
221
  const model = useTextModel({ text: item.text });
196
222
  if (!model) {
197
223
  return null;
@@ -221,11 +247,11 @@ const extensions = [
221
247
  onSearch: (text) => links.filter(({ label }) => label.toLowerCase().includes(text.toLowerCase())),
222
248
  }),
223
249
  code(),
250
+ hr(),
224
251
  image(),
225
- link({ onRender }),
252
+ link({ onRender: onRenderLink, onHover: onHoverLinkTooltip }),
226
253
  table(),
227
254
  tasklist(),
228
- tooltip({ onHover }),
229
255
  ];
230
256
 
231
257
  export const Default = {
@@ -236,12 +262,27 @@ export const Readonly = {
236
262
  render: () => <Story text={document} extensions={extensions} readonly />,
237
263
  };
238
264
 
239
- export const Tooltips = {
240
- render: () => <Story text={str(text.links, text.footer)} extensions={[tooltip({ onHover })]} />,
265
+ export const NoExtensions = {
266
+ render: () => <Story text={document} />,
267
+ };
268
+
269
+ // TODO(burdon): Cursor bug if no newline after BR (cursor down just loops back to start of each paragraph).
270
+ export const HorizontalRule = {
271
+ render: () => (
272
+ <Story
273
+ text={str('# Horizontal Rule', '', text.paragraphs, '---', '', text.paragraphs, '---', '', text.paragraphs)}
274
+ extensions={[hr()]}
275
+ />
276
+ ),
241
277
  };
242
278
 
243
279
  export const Links = {
244
- render: () => <Story text={str(text.links, text.footer)} extensions={[link({ onRender })]} />,
280
+ render: () => (
281
+ <Story
282
+ text={str(text.links, text.footer)}
283
+ extensions={[link({ onHover: onHoverLinkTooltip, onRender: onRenderLink })]}
284
+ />
285
+ ),
245
286
  };
246
287
 
247
288
  export const Code = {
@@ -256,7 +297,7 @@ export const Image = {
256
297
  render: () => <Story text={str(text.image, text.footer)} readonly extensions={[image()]} />,
257
298
  };
258
299
 
259
- export const TaskList = {
300
+ export const Tasklist = {
260
301
  render: () => (
261
302
  <Story
262
303
  text={str(text.tasks, '', text.list, text.footer)}
@@ -277,7 +318,7 @@ export const Autocomplete = {
277
318
  <Story
278
319
  text={str('# Autocomplete', '', 'Press CTRL-SPACE', text.footer)}
279
320
  extensions={[
280
- link({ onRender }),
321
+ link({ onRender: onRenderLink }),
281
322
  autocomplete({
282
323
  onSearch: (text) => links.filter(({ label }) => label.toLowerCase().includes(text.toLowerCase())),
283
324
  }),
@@ -301,48 +342,56 @@ export const Mention = {
301
342
  ),
302
343
  };
303
344
 
304
- const mark = () => `[^${PublicKey.random().toHex()}]`;
305
- export const Comments = {
306
- render: () => (
307
- <Story
308
- text={str(text.paragraphs, mark(), '', mark(), text.footer)}
309
- extensions={[
310
- comments({
311
- onCreate: () => PublicKey.random().toHex(),
312
- onUpdate: (info) => {
313
- // console.log('update', info);
314
- },
315
- }),
316
- highlight(),
317
- ]}
318
- />
319
- ),
345
+ export const Mermaid = {
346
+ render: () => <Story text={str('# Mermaid', '', text.mermaid, text.footer)} extensions={[code(), mermaid()]} />,
320
347
  };
321
348
 
322
- export const Diagnostics = {
323
- render: () => (
324
- <Story
325
- text={document}
326
- extensions={[
327
- // Cursor moved.
328
- EditorView.updateListener.of((update) => {
329
- console.log('update', update.view.state.selection.main.head);
330
- }),
331
- ]}
332
- />
333
- ),
349
+ export const Comments = {
350
+ render: () => {
351
+ const [commentsStates, setCommentStates] = useState<CommentRange[]>([]);
352
+
353
+ return (
354
+ <Story
355
+ text={str('# Comments', '', text.paragraphs, text.footer)}
356
+ comments={commentsStates}
357
+ extensions={[
358
+ comments({
359
+ onHover: onCommentsHover,
360
+ onCreate: (relPos) => {
361
+ const id = PublicKey.random().toHex();
362
+ setCommentStates((comments) => [...comments, { id, cursor: relPos }]);
363
+ return id;
364
+ },
365
+ onSelect: (state) => {
366
+ const debug = false;
367
+ if (debug) {
368
+ console.log(
369
+ 'update',
370
+ JSON.stringify({
371
+ active: state.active?.slice(0, 8),
372
+ closest: state.closest?.slice(0, 8),
373
+ ranges: state.ranges.length,
374
+ }),
375
+ );
376
+ }
377
+ },
378
+ }),
379
+ ]}
380
+ />
381
+ );
382
+ },
334
383
  };
335
384
 
336
- export const Demo = {
337
- render: () => <Story text={str(text.paragraphs, text.footer)} extensions={[demo()]} />,
385
+ export const Typewriter = {
386
+ render: () => <Story text={str('# Typewriter', '', text.paragraphs, text.footer)} extensions={[typewriter()]} />,
338
387
  };
339
388
 
340
389
  export const Blast = {
341
390
  render: () => (
342
391
  <Story
343
- text={str(text.paragraphs, text.code, text.paragraphs)}
392
+ text={str('# Blast', '', text.paragraphs, text.code, text.paragraphs)}
344
393
  extensions={[
345
- demo({
394
+ typewriter({
346
395
  items: localStorage.getItem('dxos.composer.extension.demo')?.split(','),
347
396
  }),
348
397
  blast(
@@ -362,6 +411,16 @@ export const Blast = {
362
411
  ),
363
412
  };
364
413
 
365
- export const NoExtensions = {
366
- render: () => <Story text={document} />,
414
+ export const Diagnostics = {
415
+ render: () => (
416
+ <Story
417
+ text={document}
418
+ extensions={[
419
+ // Cursor moved.
420
+ EditorView.updateListener.of((update) => {
421
+ console.log('update', update.view.state.selection.main.head);
422
+ }),
423
+ ]}
424
+ />
425
+ ),
367
426
  };
@@ -12,8 +12,8 @@ import { fixedInsetFlexLayout, groupSurface, mx } from '@dxos/react-ui-theme';
12
12
  import { withTheme } from '@dxos/storybook-utils';
13
13
 
14
14
  import { defaultSlots, TextEditor, type TextEditorProps, type TextEditorRef, type TextEditorSlots } from './TextEditor';
15
- import { textTheme } from './themes';
16
15
  import { useTextModel } from '../../hooks';
16
+ import { textTheme } from '../../themes';
17
17
 
18
18
  const initialText = [
19
19
  '# TextEditor',
@@ -31,7 +31,7 @@ const Story = ({
31
31
  ...props
32
32
  }: { text?: string; automerge?: boolean } & Pick<TextEditorProps, 'extensions' | 'slots'>) => {
33
33
  const ref = useRef<TextEditorRef>(null);
34
- const [item] = useState({ text: new TextObject(text, undefined, undefined, { useAutomergeBackend: automerge }) });
34
+ const [item] = useState({ text: new TextObject(text, undefined, undefined, { automerge }) });
35
35
  const model = useTextModel({ text: item.text });
36
36
  if (!model) {
37
37
  return null;