@dxos/react-ui-editor 0.3.11-main.ec7a2b3 → 0.3.11-main.ee2b64c

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 (185) hide show
  1. package/dist/lib/browser/index.mjs +1702 -1100
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts +13 -15
  5. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -1
  6. package/dist/types/src/components/TextEditor/TextEditor.d.ts +14 -6
  7. package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
  8. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts +1 -1
  9. package/dist/types/src/components/TextEditor/automerge.stories.d.ts.map +1 -1
  10. package/dist/types/src/components/TextEditor/{yjs.stories.d.ts → hooks.stories.d.ts} +13 -2
  11. package/dist/types/src/components/TextEditor/hooks.stories.d.ts.map +1 -0
  12. package/dist/types/src/components/Toolbar/Toolbar.d.ts +25 -0
  13. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -0
  14. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +23 -0
  15. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -0
  16. package/dist/types/src/components/Toolbar/index.d.ts +2 -0
  17. package/dist/types/src/components/Toolbar/index.d.ts.map +1 -0
  18. package/dist/types/src/components/index.d.ts +1 -0
  19. package/dist/types/src/components/index.d.ts.map +1 -1
  20. package/dist/types/src/extensions/autocomplete.d.ts.map +1 -1
  21. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  22. package/dist/types/src/extensions/automerge/automerge.spec.d.ts +2 -0
  23. package/dist/types/src/extensions/automerge/automerge.spec.d.ts.map +1 -0
  24. package/dist/types/src/extensions/automerge/automerge.test.d.ts +2 -0
  25. package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +1 -0
  26. package/dist/types/src/extensions/automerge/defs.d.ts +9 -11
  27. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
  28. package/dist/types/src/extensions/automerge/index.d.ts +0 -1
  29. package/dist/types/src/extensions/automerge/index.d.ts.map +1 -1
  30. package/dist/types/src/extensions/automerge/semaphore.d.ts +8 -12
  31. package/dist/types/src/extensions/automerge/semaphore.d.ts.map +1 -1
  32. package/dist/types/src/extensions/automerge/update-automerge.d.ts +2 -2
  33. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  34. package/dist/types/src/extensions/awareness.d.ts +2 -2
  35. package/dist/types/src/extensions/awareness.d.ts.map +1 -1
  36. package/dist/types/src/extensions/basic.d.ts +4 -5
  37. package/dist/types/src/extensions/basic.d.ts.map +1 -1
  38. package/dist/types/src/extensions/comments.d.ts +35 -18
  39. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  40. package/dist/types/src/extensions/cursor.d.ts +3 -3
  41. package/dist/types/src/extensions/cursor.d.ts.map +1 -1
  42. package/dist/types/src/extensions/index.d.ts +1 -7
  43. package/dist/types/src/extensions/index.d.ts.map +1 -1
  44. package/dist/types/src/extensions/markdown/bundle.d.ts +3 -6
  45. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  46. package/dist/types/src/extensions/markdown/code.d.ts.map +1 -0
  47. package/dist/types/src/extensions/markdown/formatting.d.ts +13 -0
  48. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -0
  49. package/dist/types/src/extensions/markdown/heading.d.ts +6 -0
  50. package/dist/types/src/extensions/markdown/heading.d.ts.map +1 -0
  51. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
  52. package/dist/types/src/extensions/markdown/hr.d.ts.map +1 -0
  53. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -0
  54. package/dist/types/src/extensions/markdown/index.d.ts +8 -0
  55. package/dist/types/src/extensions/markdown/index.d.ts.map +1 -1
  56. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -0
  57. package/dist/types/src/extensions/markdown/table.d.ts.map +1 -0
  58. package/dist/types/src/extensions/markdown/tasklist.d.ts.map +1 -0
  59. package/dist/types/src/extensions/mention.d.ts.map +1 -1
  60. package/dist/types/src/extensions/outliner.d.ts +4 -0
  61. package/dist/types/src/extensions/outliner.d.ts.map +1 -0
  62. package/dist/types/src/hooks/awareness-provider.d.ts +7 -4
  63. package/dist/types/src/hooks/awareness-provider.d.ts.map +1 -1
  64. package/dist/types/src/hooks/defs.d.ts +25 -0
  65. package/dist/types/src/hooks/defs.d.ts.map +1 -0
  66. package/dist/types/src/hooks/index.d.ts +4 -2
  67. package/dist/types/src/hooks/index.d.ts.map +1 -1
  68. package/dist/types/src/hooks/useActionHandler.d.ts +4 -0
  69. package/dist/types/src/hooks/useActionHandler.d.ts.map +1 -0
  70. package/dist/types/src/hooks/useEditorView.d.ts +17 -0
  71. package/dist/types/src/hooks/useEditorView.d.ts.map +1 -0
  72. package/dist/types/src/hooks/useTextEditor.d.ts +39 -0
  73. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -0
  74. package/dist/types/src/hooks/useTextModel.d.ts +14 -27
  75. package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
  76. package/dist/types/src/index.d.ts +1 -1
  77. package/dist/types/src/index.d.ts.map +1 -1
  78. package/dist/types/src/styles/markdown.d.ts +2 -2
  79. package/dist/types/src/styles/markdown.d.ts.map +1 -1
  80. package/dist/types/src/themes/default.d.ts.map +1 -1
  81. package/dist/types/src/util.d.ts +2 -0
  82. package/dist/types/src/util.d.ts.map +1 -1
  83. package/package.json +48 -38
  84. package/src/components/TextEditor/MarkdownEditor.stories.tsx +73 -82
  85. package/src/components/TextEditor/TextEditor.tsx +111 -75
  86. package/src/components/TextEditor/automerge.stories.tsx +1 -2
  87. package/src/components/TextEditor/hooks.stories.tsx +106 -0
  88. package/src/components/Toolbar/Toolbar.stories.tsx +90 -0
  89. package/src/components/Toolbar/Toolbar.tsx +166 -0
  90. package/src/components/Toolbar/index.ts +5 -0
  91. package/src/components/index.ts +1 -0
  92. package/src/extensions/autocomplete.ts +6 -3
  93. package/src/extensions/automerge/automerge.spec.tsx +76 -0
  94. package/src/extensions/automerge/automerge.test.ts +13 -0
  95. package/src/extensions/automerge/automerge.ts +54 -45
  96. package/src/extensions/automerge/cursor.ts +3 -3
  97. package/src/extensions/automerge/defs.ts +13 -34
  98. package/src/extensions/automerge/index.ts +0 -1
  99. package/src/extensions/automerge/semaphore.ts +33 -32
  100. package/src/extensions/automerge/update-automerge.ts +14 -8
  101. package/src/extensions/automerge/update-codemirror.ts +5 -5
  102. package/src/extensions/awareness.ts +22 -18
  103. package/src/extensions/basic.ts +17 -10
  104. package/src/extensions/blast.ts +4 -1
  105. package/src/extensions/comments.ts +327 -166
  106. package/src/extensions/cursor.ts +7 -3
  107. package/src/extensions/index.ts +1 -7
  108. package/src/extensions/markdown/bundle.ts +23 -28
  109. package/src/extensions/markdown/code.ts +150 -0
  110. package/src/extensions/markdown/formatting.ts +188 -0
  111. package/src/extensions/markdown/heading.ts +59 -0
  112. package/src/extensions/markdown/highlight.ts +9 -15
  113. package/src/extensions/markdown/hr.ts +71 -0
  114. package/src/extensions/markdown/index.ts +8 -0
  115. package/src/extensions/{link.ts → markdown/link.ts} +16 -7
  116. package/src/extensions/markdown/tasklist.ts +110 -0
  117. package/src/extensions/mention.ts +9 -2
  118. package/src/extensions/outliner.ts +12 -0
  119. package/src/hooks/awareness-provider.ts +24 -20
  120. package/src/hooks/defs.ts +42 -0
  121. package/src/hooks/index.ts +5 -2
  122. package/src/hooks/useActionHandler.ts +62 -0
  123. package/src/hooks/useEditorView.ts +29 -0
  124. package/src/hooks/useTextEditor.ts +153 -0
  125. package/src/hooks/useTextModel.ts +66 -56
  126. package/src/index.ts +1 -1
  127. package/src/styles/markdown.ts +9 -10
  128. package/src/themes/default.ts +11 -8
  129. package/src/util.ts +26 -3
  130. package/dist/types/src/components/TextEditor/codemirror.stories.d.ts +0 -12
  131. package/dist/types/src/components/TextEditor/codemirror.stories.d.ts.map +0 -1
  132. package/dist/types/src/components/TextEditor/comments.stories.d.ts +0 -26
  133. package/dist/types/src/components/TextEditor/comments.stories.d.ts.map +0 -1
  134. package/dist/types/src/components/TextEditor/yjs.stories.d.ts.map +0 -1
  135. package/dist/types/src/extensions/code.d.ts.map +0 -1
  136. package/dist/types/src/extensions/hr.d.ts.map +0 -1
  137. package/dist/types/src/extensions/image.d.ts.map +0 -1
  138. package/dist/types/src/extensions/link.d.ts.map +0 -1
  139. package/dist/types/src/extensions/table.d.ts.map +0 -1
  140. package/dist/types/src/extensions/tasklist.d.ts.map +0 -1
  141. package/dist/types/src/extensions/yjs/cursor.d.ts +0 -4
  142. package/dist/types/src/extensions/yjs/cursor.d.ts.map +0 -1
  143. package/dist/types/src/extensions/yjs/index.d.ts +0 -2
  144. package/dist/types/src/extensions/yjs/index.d.ts.map +0 -1
  145. package/dist/types/src/extensions/yjs/yjs.d.ts +0 -4
  146. package/dist/types/src/extensions/yjs/yjs.d.ts.map +0 -1
  147. package/dist/types/src/extensions/yjs/yjs.test.d.ts +0 -2
  148. package/dist/types/src/extensions/yjs/yjs.test.d.ts.map +0 -1
  149. package/dist/types/src/hooks/automerge.d.ts +0 -3
  150. package/dist/types/src/hooks/automerge.d.ts.map +0 -1
  151. package/dist/types/src/hooks/yjs.d.ts +0 -27
  152. package/dist/types/src/hooks/yjs.d.ts.map +0 -1
  153. package/dist/types/src/testing/index.d.ts +0 -3
  154. package/dist/types/src/testing/index.d.ts.map +0 -1
  155. package/dist/types/src/testing/proto/gen/schema.d.ts +0 -15
  156. package/dist/types/src/testing/proto/gen/schema.d.ts.map +0 -1
  157. package/dist/types/src/testing/proto/index.d.ts +0 -2
  158. package/dist/types/src/testing/proto/index.d.ts.map +0 -1
  159. package/dist/types/src/testing/replicator.d.ts +0 -45
  160. package/dist/types/src/testing/replicator.d.ts.map +0 -1
  161. package/src/components/TextEditor/codemirror.stories.ts +0 -115
  162. package/src/components/TextEditor/comments.stories.tsx +0 -315
  163. package/src/components/TextEditor/yjs.stories.tsx +0 -56
  164. package/src/extensions/code.ts +0 -106
  165. package/src/extensions/hr.ts +0 -73
  166. package/src/extensions/tasklist.ts +0 -119
  167. package/src/extensions/yjs/cursor.ts +0 -22
  168. package/src/extensions/yjs/index.ts +0 -5
  169. package/src/extensions/yjs/yjs.test.ts +0 -35
  170. package/src/extensions/yjs/yjs.ts +0 -16
  171. package/src/hooks/automerge.ts +0 -52
  172. package/src/hooks/yjs.ts +0 -156
  173. package/src/testing/index.ts +0 -6
  174. package/src/testing/proto/gen/schema.ts +0 -49
  175. package/src/testing/proto/index.ts +0 -5
  176. package/src/testing/proto/schema.proto +0 -15
  177. package/src/testing/replicator.ts +0 -184
  178. /package/dist/types/src/extensions/{code.d.ts → markdown/code.d.ts} +0 -0
  179. /package/dist/types/src/extensions/{hr.d.ts → markdown/hr.d.ts} +0 -0
  180. /package/dist/types/src/extensions/{image.d.ts → markdown/image.d.ts} +0 -0
  181. /package/dist/types/src/extensions/{link.d.ts → markdown/link.d.ts} +0 -0
  182. /package/dist/types/src/extensions/{table.d.ts → markdown/table.d.ts} +0 -0
  183. /package/dist/types/src/extensions/{tasklist.d.ts → markdown/tasklist.d.ts} +0 -0
  184. /package/src/extensions/{image.ts → markdown/image.ts} +0 -0
  185. /package/src/extensions/{table.ts → markdown/table.ts} +0 -0
@@ -1,7 +1,7 @@
1
1
  export { TextKind } from '@dxos/protocols/proto/dxos/echo/model/text';
2
2
  export { Doc, YText, YXmlFragment } from '@dxos/text-model';
3
3
  export { type Extension } from '@codemirror/state';
4
- export { type EditorView } from '@codemirror/view';
4
+ export { type EditorView, keymap } from '@codemirror/view';
5
5
  export * from './components';
6
6
  export * from './extensions';
7
7
  export * from './hooks';
@@ -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;AAC5D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,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;AACnD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE3D,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC"}
@@ -1,6 +1,6 @@
1
1
  export type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
2
- export declare const headings: Record<HeadingLevel, string[]>;
3
- export declare const heading: (level: HeadingLevel, readonly?: boolean) => string;
2
+ export declare const headings: Record<HeadingLevel, string>;
3
+ export declare const heading: (level: HeadingLevel) => string;
4
4
  export declare const text = "text-neutral-800 dark:text-neutral-200";
5
5
  export declare const light = "text-neutral-200 dark:text-neutral-800";
6
6
  export declare const mark: string;
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../../src/styles/markdown.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAIjD,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,CAOnD,CAAC;AAEF,eAAO,MAAM,OAAO,UAAW,YAAY,aAAa,OAAO,WAG9D,CAAC;AAEF,eAAO,MAAM,IAAI,2CAA2C,CAAC;AAC7D,eAAO,MAAM,KAAK,2CAA2C,CAAC;AAE9D,eAAO,MAAM,IAAI,QAAmE,CAAC;AAErF,eAAO,MAAM,SAAS,UAAU,CAAC;AAEjC,eAAO,MAAM,IAAI,cAAc,CAAC;AAChC,eAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,eAAO,MAAM,aAAa,iBAAiB,CAAC;AAE5C,eAAO,MAAM,IAAI,mEAAmE,CAAC;AACrF,eAAO,MAAM,QAAQ,+BAA+B,CAAC;AACrD,eAAO,MAAM,SAAS,kDAAkD,CAAC;AAEzE,eAAO,MAAM,SAAS,QAAmB,CAAC;AAE1C,eAAO,MAAM,UAAU,QAAsF,CAAC;AAE9G,eAAO,MAAM,cAAc,0GAC8E,CAAC;AAG1G,eAAO,MAAM,aAAa,wHAC6F,CAAC;AACxH,eAAO,MAAM,WAAW,+IACkH,CAAC;AAE3I,eAAO,MAAM,QAAQ,gDAAgD,CAAC"}
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../../src/styles/markdown.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAIjD,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAOjD,CAAC;AAEF,eAAO,MAAM,OAAO,UAAW,YAAY,WAE1C,CAAC;AAEF,eAAO,MAAM,IAAI,2CAA2C,CAAC;AAC7D,eAAO,MAAM,KAAK,2CAA2C,CAAC;AAE9D,eAAO,MAAM,IAAI,QAAmE,CAAC;AAErF,eAAO,MAAM,SAAS,UAAU,CAAC;AAEjC,eAAO,MAAM,IAAI,cAAc,CAAC;AAChC,eAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,eAAO,MAAM,aAAa,iBAAiB,CAAC;AAE5C,eAAO,MAAM,IAAI,mEAAmE,CAAC;AACrF,eAAO,MAAM,QAAQ,+BAA+B,CAAC;AACrD,eAAO,MAAM,SAAS,kDAAkD,CAAC;AAEzE,eAAO,MAAM,SAAS,QAAmB,CAAC;AAE1C,eAAO,MAAM,UAAU,QAAsF,CAAC;AAE9G,eAAO,MAAM,cAAc,0GAC8E,CAAC;AAG1G,eAAO,MAAM,aAAa,wHAC6F,CAAC;AACxH,eAAO,MAAM,WAAW,+IACkH,CAAC;AAE3I,eAAO,MAAM,QAAQ,gDAAgD,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,WAiO1B,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,WAoO1B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,WAOvB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,WAO3B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,WAOvB,CAAC"}
@@ -1,5 +1,7 @@
1
+ import type { Transaction } from '@codemirror/state';
1
2
  /**
2
3
  * CodeMirror callbacks swallow errors so wrap handlers.
3
4
  */
4
5
  export declare const callbackWrapper: <T extends Function>(fn: T) => T;
6
+ export declare const logChanges: (trs: readonly Transaction[]) => void;
5
7
  //# sourceMappingURL=util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/util.ts"],"names":[],"mappings":"AAMA;;GAEG;AAEH,eAAO,MAAM,eAAe,kCAOR,CAAC"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/util.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;GAEG;AAEH,eAAO,MAAM,eAAe,kCAOR,CAAC;AAErB,eAAO,MAAM,UAAU,QAAS,SAAS,WAAW,EAAE,SAmBrD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/react-ui-editor",
3
- "version": "0.3.11-main.ec7a2b3",
3
+ "version": "0.3.11-main.ee2b64c",
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,20 +13,21 @@
13
13
  "src"
14
14
  ],
15
15
  "dependencies": {
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",
16
+ "@codemirror/autocomplete": "^6.12.0",
17
+ "@codemirror/commands": "^6.3.3",
18
+ "@codemirror/lang-markdown": "^6.2.4",
19
+ "@codemirror/language": "^6.10.0",
20
20
  "@codemirror/language-data": "^6.3.1",
21
21
  "@codemirror/lint": "^6.4.2",
22
22
  "@codemirror/search": "^6.5.5",
23
- "@codemirror/state": "^6.3.3",
23
+ "@codemirror/state": "^6.4.0",
24
24
  "@codemirror/theme-one-dark": "^6.1.2",
25
- "@codemirror/view": "^6.22.2",
26
- "@fluentui/react-tabster": "^9.16.1",
27
- "@lezer/common": "^1.1.1",
25
+ "@codemirror/view": "^6.23.0",
26
+ "@fluentui/react-tabster": "^9.18.0",
27
+ "@lezer/common": "^1.2.1",
28
28
  "@lezer/highlight": "^1.2.0",
29
- "@lezer/markdown": "^1.1.1",
29
+ "@lezer/markdown": "^1.2.0",
30
+ "@radix-ui/react-context": "^1.0.0",
30
31
  "@replit/codemirror-vim": "^6.0.14",
31
32
  "codemirror": "6.0.1",
32
33
  "lib0": "^0.2.65",
@@ -35,56 +36,65 @@
35
36
  "lodash.pick": "^4.4.0",
36
37
  "lodash.sortby": "^4.7.0",
37
38
  "style-mod": "^4.1.0",
38
- "y-codemirror.next": "^0.3.2",
39
- "y-protocols": "^1.0.5",
40
- "yjs": "^13.6.10",
41
- "@dxos/async": "0.3.11-main.ec7a2b3",
42
- "@dxos/automerge": "0.3.11-main.ec7a2b3",
43
- "@dxos/context": "0.3.11-main.ec7a2b3",
44
- "@dxos/debug": "0.3.11-main.ec7a2b3",
45
- "@dxos/display-name": "0.3.11-main.ec7a2b3",
46
- "@dxos/invariant": "0.3.11-main.ec7a2b3",
47
- "@dxos/echo-schema": "0.3.11-main.ec7a2b3",
48
- "@dxos/log": "0.3.11-main.ec7a2b3",
49
- "@dxos/protocols": "0.3.11-main.ec7a2b3",
50
- "@dxos/react-async": "0.3.11-main.ec7a2b3",
51
- "@dxos/react-ui": "0.3.11-main.ec7a2b3",
52
- "@dxos/react-ui-theme": "0.3.11-main.ec7a2b3",
53
- "@dxos/util": "0.3.11-main.ec7a2b3",
54
- "@dxos/text-model": "0.3.11-main.ec7a2b3"
39
+ "@dxos/automerge": "0.3.11-main.ee2b64c",
40
+ "@dxos/async": "0.3.11-main.ee2b64c",
41
+ "@dxos/context": "0.3.11-main.ee2b64c",
42
+ "@dxos/debug": "0.3.11-main.ee2b64c",
43
+ "@dxos/echo-schema": "0.3.11-main.ee2b64c",
44
+ "@dxos/display-name": "0.3.11-main.ee2b64c",
45
+ "@dxos/invariant": "0.3.11-main.ee2b64c",
46
+ "@dxos/log": "0.3.11-main.ee2b64c",
47
+ "@dxos/protocols": "0.3.11-main.ee2b64c",
48
+ "@dxos/react-async": "0.3.11-main.ee2b64c",
49
+ "@dxos/react-ui-theme": "0.3.11-main.ee2b64c",
50
+ "@dxos/react-ui": "0.3.11-main.ee2b64c",
51
+ "@dxos/util": "0.3.11-main.ee2b64c",
52
+ "@dxos/text-model": "0.3.11-main.ee2b64c"
55
53
  },
56
54
  "devDependencies": {
57
- "@automerge/automerge-repo-network-broadcastchannel": "^1.0.19",
58
- "@faker-js/faker": "^8.0.2",
55
+ "@automerge/automerge-repo-network-broadcastchannel": "^1.1.0",
56
+ "@faker-js/faker": "^8.3.1",
59
57
  "@phosphor-icons/react": "^2.0.5",
60
58
  "@preact/signals-react": "^1.3.6",
59
+ "@testing-library/dom": "^8.17.1",
60
+ "@testing-library/react": "^13.4.0",
61
+ "@testing-library/user-event": "^14.4.3",
61
62
  "@types/lodash.defaultsdeep": "^4.6.6",
62
63
  "@types/lodash.get": "^4.4.7",
63
64
  "@types/lodash.pick": "^4.4.7",
64
65
  "@types/lodash.sortby": "^4.7.7",
65
66
  "@types/react": "^18.0.21",
66
67
  "@types/react-dom": "^18.0.6",
68
+ "@types/react-test-renderer": "^17.0.2",
69
+ "@vitest/ui": "^1.2.1",
67
70
  "deepsignal": "1.4.0-shallow.0",
71
+ "happy-dom": "^13.3.1",
72
+ "jsdom": "^20.0.1",
68
73
  "react": "^18.2.0",
69
74
  "react-dom": "^18.2.0",
70
- "@dxos/config": "0.3.11-main.ec7a2b3",
71
- "@dxos/echo-signals": "0.3.11-main.ec7a2b3",
72
- "@dxos/keyboard": "0.3.11-main.ec7a2b3",
73
- "@dxos/react-client": "0.3.11-main.ec7a2b3",
74
- "@dxos/storybook-utils": "0.3.11-main.ec7a2b3",
75
- "@dxos/react-ui": "0.3.11-main.ec7a2b3",
76
- "@dxos/echo-typegen": "0.3.11-main.ec7a2b3"
75
+ "react-test-renderer": "^18.2.0",
76
+ "vite": "^5.0.12",
77
+ "vite-plugin-top-level-await": "^1.4.1",
78
+ "vite-plugin-wasm": "^3.3.0",
79
+ "vitest": "^1.2.1",
80
+ "@dxos/config": "0.3.11-main.ee2b64c",
81
+ "@dxos/echo-signals": "0.3.11-main.ee2b64c",
82
+ "@dxos/echo-typegen": "0.3.11-main.ee2b64c",
83
+ "@dxos/keyboard": "0.3.11-main.ee2b64c",
84
+ "@dxos/react-client": "0.3.11-main.ee2b64c",
85
+ "@dxos/react-ui": "0.3.11-main.ee2b64c",
86
+ "@dxos/storybook-utils": "0.3.11-main.ee2b64c"
77
87
  },
78
88
  "peerDependencies": {
79
89
  "@phosphor-icons/react": "^2.0.5",
80
90
  "react": "^18.2.0",
81
91
  "react-dom": "^18.2.0",
82
- "@dxos/react-client": "0.3.11-main.ec7a2b3"
92
+ "@dxos/react-client": "0.3.11-main.ee2b64c"
83
93
  },
84
94
  "publishConfig": {
85
95
  "access": "public"
86
96
  },
87
97
  "scripts": {
88
- "prebuild": "dxtype src/testing/proto/schema.proto src/testing/proto/gen/schema.ts"
98
+ "vitest": "vitest --ui"
89
99
  }
90
100
  }
@@ -4,11 +4,11 @@
4
4
 
5
5
  import '@dxosTheme';
6
6
 
7
- import { EditorView } from '@codemirror/view';
7
+ import { type 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, { type FC, StrictMode, 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,27 +19,25 @@ import { withTheme } from '@dxos/storybook-utils';
19
19
 
20
20
  import { MarkdownEditor, type TextEditorProps } from './TextEditor';
21
21
  import {
22
+ type CommentsOptions,
23
+ type LinkOptions,
22
24
  autocomplete,
23
25
  blast,
24
26
  code,
25
27
  comments,
26
28
  defaultOptions,
29
+ heading,
27
30
  hr,
28
31
  image,
29
- listener,
30
32
  link,
31
33
  mention,
32
34
  table,
33
35
  tasklist,
34
36
  typewriter,
35
- type CommentsOptions,
36
- type LinkOptions,
37
+ useComments,
38
+ formatting,
37
39
  } from '../../extensions';
38
- import { type CommentRange, useTextModel } from '../../hooks';
39
-
40
- // Extensions:
41
- // TODO(burdon): Table of contents.
42
- // TODO(burdon): Front-matter
40
+ import { type Comment, useTextModel } from '../../hooks';
43
41
 
44
42
  faker.seed(101);
45
43
 
@@ -55,8 +53,8 @@ const text = {
55
53
  '- [x] decorator',
56
54
  '- [ ] checkbox',
57
55
  ' - [ ] state',
58
- ' - [ ] indent',
59
- ' - [x] style',
56
+ ' - [ ] indent',
57
+ ' - [x] style',
60
58
  '',
61
59
  ),
62
60
 
@@ -82,7 +80,7 @@ const text = {
82
80
  '## Code',
83
81
  '',
84
82
  '```',
85
- 'const x = 100;',
83
+ '$ ls -las',
86
84
  '```',
87
85
  '',
88
86
  '```tsx',
@@ -162,6 +160,8 @@ const links = [
162
160
  { label: 'StackEdit', apply: '[StackEdit](https://stackedit.io/app)' },
163
161
  ];
164
162
 
163
+ const names = ['adam', 'alice', 'alison', 'bob', 'carol', 'charlie', 'sayuri', 'shoko'];
164
+
165
165
  const hover =
166
166
  'rounded-sm text-base text-primary-600 hover:text-primary-500 dark:text-primary-300 hover:dark:text-primary-200';
167
167
 
@@ -210,12 +210,14 @@ const onRenderLink: LinkOptions['onRender'] = (el, url) => {
210
210
 
211
211
  type StoryProps = {
212
212
  text?: string;
213
- automerge?: boolean;
214
- } & Pick<TextEditorProps, 'comments' | 'readonly' | 'extensions' | 'slots'>;
213
+ comments?: Comment[];
214
+ } & Pick<TextEditorProps, 'readonly' | 'placeholder' | 'slots' | 'extensions'>;
215
215
 
216
- const Story = ({ text, automerge, ...props }: StoryProps) => {
217
- const [item] = useState({ text: new TextObject(text, undefined, undefined, { automerge }) });
216
+ const Story = ({ text, comments, placeholder = 'New document.', ...props }: StoryProps) => {
217
+ const [item] = useState({ text: new TextObject(text) });
218
+ const view = useRef<EditorView>(null);
218
219
  const model = useTextModel({ text: item.text });
220
+ useComments(view.current, comments);
219
221
  if (!model) {
220
222
  return null;
221
223
  }
@@ -224,7 +226,7 @@ const Story = ({ text, automerge, ...props }: StoryProps) => {
224
226
  <div className={mx(fixedInsetFlexLayout, groupSurface)}>
225
227
  <div className='flex h-full justify-center'>
226
228
  <div className='flex flex-col h-full w-[800px]'>
227
- <MarkdownEditor model={model} {...props} />
229
+ <MarkdownEditor ref={view} model={model} placeholder={placeholder} {...props} />
228
230
  </div>
229
231
  </div>
230
232
  </div>
@@ -238,11 +240,13 @@ export default {
238
240
  render: Story,
239
241
  };
240
242
 
241
- const extensions = [
243
+ const defaults = [
242
244
  autocomplete({
243
245
  onSearch: (text) => links.filter(({ label }) => label.toLowerCase().includes(text.toLowerCase())),
244
246
  }),
245
247
  code(),
248
+ formatting(),
249
+ heading(),
246
250
  hr(),
247
251
  image(),
248
252
  link({ onRender: onRenderLink, onHover: onHoverLinkTooltip }),
@@ -251,35 +255,25 @@ const extensions = [
251
255
  ];
252
256
 
253
257
  export const Default = {
254
- render: () => <Story text={document} extensions={extensions} />,
258
+ render: () => <Story text={document} extensions={defaults} />,
255
259
  };
256
260
 
257
261
  export const Readonly = {
258
- render: () => <Story text={document} extensions={extensions} readonly />,
262
+ render: () => <Story text={document} extensions={defaults} readonly />,
259
263
  };
260
264
 
261
- const large = faker.helpers.multiple(() => faker.lorem.paragraph({ min: 8, max: 16 }), { count: 20 }).join('\n\n');
262
-
263
- export const Large = {
264
- render: () => <Story text={str('# Large Document', '', large)} extensions={[]} />,
265
+ export const NoExtensions = {
266
+ render: () => <Story text={document} />,
265
267
  };
266
268
 
269
+ const large = faker.helpers.multiple(() => faker.lorem.paragraph({ min: 8, max: 16 }), { count: 20 }).join('\n\n');
270
+
267
271
  export const Empty = {
268
272
  render: () => <Story />,
269
273
  };
270
274
 
271
- export const NoExtensions = {
272
- render: () => <Story text={document} />,
273
- };
274
-
275
- // TODO(burdon): Cursor bug if no newline after BR (cursor down just loops back to start of each paragraph).
276
- export const HorizontalRule = {
277
- render: () => (
278
- <Story
279
- text={str('# Horizontal Rule', '', text.paragraphs, '---', '', text.paragraphs, '---', '', text.paragraphs)}
280
- extensions={[hr()]}
281
- />
282
- ),
275
+ export const Scrolling = {
276
+ render: () => <Story text={str('# Large Document', '', large)} extensions={[]} />,
283
277
  };
284
278
 
285
279
  export const Links = {
@@ -292,37 +286,36 @@ export const Links = {
292
286
  };
293
287
 
294
288
  export const Code = {
295
- render: () => <Story text={str(text.code, text.footer)} extensions={[code()]} readonly />,
296
- };
297
-
298
- export const Table = {
299
- render: () => <Story text={str(text.table, text.footer)} extensions={[table()]} />,
289
+ render: () => <Story text={str(text.code, text.footer)} extensions={[code()]} />,
300
290
  };
301
291
 
302
292
  export const Image = {
303
- render: () => <Story text={str(text.image, text.footer)} readonly extensions={[image()]} />,
293
+ render: () => <Story text={str(text.image, text.footer)} extensions={[image()]} />,
304
294
  };
305
295
 
306
- export const Tasklist = {
296
+ export const Lists = {
307
297
  render: () => (
308
- <Story
309
- text={str(text.tasks, '', text.list, text.footer)}
310
- extensions={[
311
- tasklist(),
312
- listener({
313
- onChange: (text) => {
314
- console.log(text);
315
- },
316
- }),
317
- ]}
318
- />
298
+ <Story text={str(text.tasks, '', text.list, '', text.numbered, text.footer)} extensions={[tasklist()]} />
319
299
  ),
320
300
  };
321
301
 
302
+ export const Table = {
303
+ render: () => <Story text={str(text.table, text.footer)} extensions={[table()]} />,
304
+ };
305
+
306
+ // export const Outliner = {
307
+ // render: () => (
308
+ // <Story
309
+ // text={str('# Outliner', '', 'Block', ': this is a block', ': with multiple lines', text.footer)}
310
+ // extensions={[outliner()]}
311
+ // />
312
+ // ),
313
+ // };
314
+
322
315
  export const Autocomplete = {
323
316
  render: () => (
324
317
  <Story
325
- text={str('# Autocomplete', '', 'Press CTRL-SPACE', text.footer)}
318
+ text={str('# Autocomplete', '', 'Press Ctrl-Space...', text.footer)}
326
319
  extensions={[
327
320
  link({ onRender: onRenderLink }),
328
321
  autocomplete({
@@ -333,8 +326,6 @@ export const Autocomplete = {
333
326
  ),
334
327
  };
335
328
 
336
- const names = ['adam', 'alice', 'alison', 'bob', 'carol', 'charlie', 'sayuri', 'shoko'];
337
-
338
329
  export const Mention = {
339
330
  render: () => (
340
331
  <Story
@@ -350,18 +341,18 @@ export const Mention = {
350
341
 
351
342
  export const Comments = {
352
343
  render: () => {
353
- const [commentRanges, setCommentRanges] = useState<CommentRange[]>([]);
344
+ const [_comments, setComments] = useState<Comment[]>([]);
354
345
 
355
346
  return (
356
347
  <Story
357
348
  text={str('# Comments', '', text.paragraphs, text.footer)}
358
- comments={commentRanges}
349
+ comments={_comments}
359
350
  extensions={[
360
351
  comments({
361
352
  onHover: onCommentsHover,
362
353
  onCreate: (range) => {
363
354
  const id = PublicKey.random().toHex();
364
- setCommentRanges((commentRanges) => [...commentRanges, { id, cursor: range }]);
355
+ setComments((commentRanges) => [...commentRanges, { id, cursor: range }]);
365
356
  return id;
366
357
  },
367
358
  onSelect: (state) => {
@@ -370,9 +361,9 @@ export const Comments = {
370
361
  console.log(
371
362
  'update',
372
363
  JSON.stringify({
373
- active: state.active?.slice(0, 8),
374
- closest: state.closest?.slice(0, 8),
375
- ranges: state.ranges.length,
364
+ comments: state.comments.length,
365
+ active: state.selection.current?.slice(0, 8),
366
+ closest: state.selection.closest?.slice(0, 8),
376
367
  }),
377
368
  );
378
369
  }
@@ -384,8 +375,24 @@ export const Comments = {
384
375
  },
385
376
  };
386
377
 
378
+ export const HorizontalRule = {
379
+ render: () => (
380
+ <Story
381
+ text={str('# Horizontal Rule', '', text.paragraphs, '---', text.paragraphs, '---', text.paragraphs)}
382
+ extensions={[hr()]}
383
+ />
384
+ ),
385
+ };
386
+
387
+ const typewriterItems = localStorage.getItem('dxos.org/plugin/markdown/typewriter')?.split(',');
388
+
387
389
  export const Typewriter = {
388
- render: () => <Story text={str('# Typewriter', '', text.paragraphs, text.footer)} extensions={[typewriter()]} />,
390
+ render: () => (
391
+ <Story
392
+ text={str('# Typewriter', '', text.paragraphs, text.footer)}
393
+ extensions={[typewriter({ items: typewriterItems })]}
394
+ />
395
+ ),
389
396
  };
390
397
 
391
398
  export const Blast = {
@@ -393,9 +400,7 @@ export const Blast = {
393
400
  <Story
394
401
  text={str('# Blast', '', text.paragraphs, text.code, text.paragraphs)}
395
402
  extensions={[
396
- typewriter({
397
- items: localStorage.getItem('dxos.composer.extension.demo')?.split(','),
398
- }),
403
+ typewriter({ items: typewriterItems }),
399
404
  blast(
400
405
  defaultsDeep(
401
406
  {
@@ -412,17 +417,3 @@ export const Blast = {
412
417
  />
413
418
  ),
414
419
  };
415
-
416
- export const Diagnostics = {
417
- render: () => (
418
- <Story
419
- text={document}
420
- extensions={[
421
- // Cursor moved.
422
- EditorView.updateListener.of((update) => {
423
- console.log('update', update.view.state.selection.main.head);
424
- }),
425
- ]}
426
- />
427
- ),
428
- };