@dxos/react-ui-editor 0.3.11-main.baa8c4d → 0.3.11-main.bc6b68b

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 (221) hide show
  1. package/dist/lib/browser/index.mjs +1882 -1531
  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 -14
  5. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -1
  6. package/dist/types/src/components/TextEditor/TextEditor.d.ts +20 -17
  7. package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
  8. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts +6 -3
  9. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts.map +1 -1
  10. package/dist/types/src/{hooks/automerge → components/TextEditor}/automerge.stories.d.ts +6 -1
  11. package/dist/types/src/components/TextEditor/automerge.stories.d.ts.map +1 -0
  12. package/dist/types/src/components/TextEditor/comments.stories.d.ts +26 -0
  13. package/dist/types/src/components/TextEditor/comments.stories.d.ts.map +1 -0
  14. package/dist/types/src/components/TextEditor/index.d.ts +0 -2
  15. package/dist/types/src/components/TextEditor/index.d.ts.map +1 -1
  16. package/dist/types/src/extensions/autocomplete.d.ts.map +1 -0
  17. package/dist/types/src/extensions/automerge/automerge.d.ts +9 -0
  18. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -0
  19. package/dist/types/src/extensions/automerge/cursor.d.ts +5 -0
  20. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -0
  21. package/dist/types/src/extensions/automerge/defs.d.ts +24 -0
  22. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -0
  23. package/dist/types/src/extensions/automerge/index.d.ts +3 -0
  24. package/dist/types/src/extensions/automerge/index.d.ts.map +1 -0
  25. package/dist/types/src/extensions/automerge/semaphore.d.ts +14 -0
  26. package/dist/types/src/extensions/automerge/semaphore.d.ts.map +1 -0
  27. package/dist/types/src/extensions/automerge/update-automerge.d.ts +5 -0
  28. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -0
  29. package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +1 -0
  30. package/dist/types/src/extensions/awareness.d.ts +46 -0
  31. package/dist/types/src/extensions/awareness.d.ts.map +1 -0
  32. package/dist/types/src/extensions/basic.d.ts +8 -0
  33. package/dist/types/src/extensions/basic.d.ts.map +1 -0
  34. package/dist/types/src/extensions/blast.d.ts.map +1 -0
  35. package/dist/types/src/extensions/code.d.ts.map +1 -0
  36. package/dist/types/src/{components/TextEditor/extensions → extensions}/comments.d.ts +33 -18
  37. package/dist/types/src/extensions/comments.d.ts.map +1 -0
  38. package/dist/types/src/extensions/cursor.d.ts +25 -0
  39. package/dist/types/src/extensions/cursor.d.ts.map +1 -0
  40. package/dist/types/src/extensions/hr.d.ts.map +1 -0
  41. package/dist/types/src/extensions/image.d.ts.map +1 -0
  42. package/dist/types/src/{components/TextEditor/extensions → extensions}/index.d.ts +4 -2
  43. package/dist/types/src/extensions/index.d.ts.map +1 -0
  44. package/dist/types/src/{components/TextEditor/extensions → extensions}/link.d.ts +1 -0
  45. package/dist/types/src/extensions/link.d.ts.map +1 -0
  46. package/dist/types/src/extensions/listener.d.ts +10 -0
  47. package/dist/types/src/extensions/listener.d.ts.map +1 -0
  48. package/dist/types/src/{components/TextEditor/extensions → extensions}/markdown/bundle.d.ts +2 -5
  49. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -0
  50. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -0
  51. package/dist/types/src/extensions/markdown/index.d.ts.map +1 -0
  52. package/dist/types/src/extensions/mention.d.ts.map +1 -0
  53. package/dist/types/src/extensions/outliner.d.ts +4 -0
  54. package/dist/types/src/extensions/outliner.d.ts.map +1 -0
  55. package/dist/types/src/extensions/table.d.ts.map +1 -0
  56. package/dist/types/src/extensions/tasklist.d.ts.map +1 -0
  57. package/dist/types/src/extensions/typewriter.d.ts.map +1 -0
  58. package/dist/types/src/hooks/awareness-provider.d.ts +31 -0
  59. package/dist/types/src/hooks/awareness-provider.d.ts.map +1 -0
  60. package/dist/types/src/hooks/defs.d.ts +25 -0
  61. package/dist/types/src/hooks/defs.d.ts.map +1 -0
  62. package/dist/types/src/hooks/index.d.ts +3 -1
  63. package/dist/types/src/hooks/index.d.ts.map +1 -1
  64. package/dist/types/src/hooks/useTextEditor.d.ts +17 -0
  65. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -0
  66. package/dist/types/src/hooks/useTextModel.d.ts +2 -31
  67. package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
  68. package/dist/types/src/index.d.ts +5 -0
  69. package/dist/types/src/index.d.ts.map +1 -1
  70. package/dist/types/src/styles/cursors.d.ts.map +1 -0
  71. package/dist/types/src/styles/index.d.ts +1 -0
  72. package/dist/types/src/styles/index.d.ts.map +1 -1
  73. package/dist/types/src/styles/markdown.d.ts.map +1 -1
  74. package/dist/types/src/styles/tokens.d.ts +1 -0
  75. package/dist/types/src/styles/tokens.d.ts.map +1 -1
  76. package/dist/types/src/{components/TextEditor/themes → themes}/default.d.ts +1 -1
  77. package/dist/types/src/themes/default.d.ts.map +1 -0
  78. package/dist/types/src/themes/index.d.ts.map +1 -0
  79. package/dist/types/src/util.d.ts +7 -0
  80. package/dist/types/src/util.d.ts.map +1 -0
  81. package/package.json +33 -34
  82. package/src/components/TextEditor/MarkdownEditor.stories.tsx +86 -91
  83. package/src/components/TextEditor/TextEditor.stories.tsx +13 -34
  84. package/src/components/TextEditor/TextEditor.tsx +124 -95
  85. package/src/{hooks/automerge → components/TextEditor}/automerge.stories.tsx +66 -6
  86. package/src/components/TextEditor/comments.stories.tsx +357 -0
  87. package/src/components/TextEditor/index.ts +0 -3
  88. package/src/{components/TextEditor/extensions → extensions}/autocomplete.ts +23 -19
  89. package/src/extensions/automerge/automerge.ts +88 -0
  90. package/src/extensions/automerge/cursor.ts +52 -0
  91. package/src/extensions/automerge/defs.ts +41 -0
  92. package/src/extensions/automerge/index.ts +6 -0
  93. package/src/{hooks → extensions}/automerge/semaphore.ts +34 -29
  94. package/src/{hooks → extensions}/automerge/update-automerge.ts +5 -6
  95. package/src/{hooks → extensions}/automerge/update-codemirror.ts +13 -5
  96. package/src/extensions/awareness.ts +310 -0
  97. package/src/extensions/basic.ts +37 -0
  98. package/src/{components/TextEditor/extensions → extensions}/code.ts +28 -23
  99. package/src/extensions/comments.ts +428 -0
  100. package/src/extensions/cursor.ts +50 -0
  101. package/src/extensions/hr.ts +72 -0
  102. package/src/extensions/image.ts +87 -0
  103. package/src/{components/TextEditor/extensions → extensions}/index.ts +4 -2
  104. package/src/{components/TextEditor/extensions → extensions}/link.ts +116 -62
  105. package/src/extensions/listener.ts +35 -0
  106. package/src/{components/TextEditor/extensions → extensions}/markdown/bundle.ts +18 -24
  107. package/src/{components/TextEditor/extensions → extensions}/markdown/highlight.ts +4 -13
  108. package/src/{components/TextEditor/extensions → extensions}/mention.ts +9 -2
  109. package/src/extensions/outliner.ts +12 -0
  110. package/src/{components/TextEditor/extensions → extensions}/table.ts +10 -4
  111. package/src/extensions/tasklist.ts +111 -0
  112. package/src/{components/TextEditor/extensions → extensions}/typewriter.ts +1 -1
  113. package/src/hooks/awareness-provider.ts +124 -0
  114. package/src/hooks/defs.ts +42 -0
  115. package/src/hooks/index.ts +4 -1
  116. package/src/hooks/useTextEditor.ts +29 -0
  117. package/src/hooks/useTextModel.ts +30 -115
  118. package/src/index.ts +5 -0
  119. package/src/styles/index.ts +1 -0
  120. package/src/styles/markdown.ts +0 -2
  121. package/src/styles/tokens.ts +3 -0
  122. package/src/{components/TextEditor/themes → themes}/default.ts +52 -79
  123. package/src/util.ts +41 -0
  124. package/dist/types/src/components/TextEditor/codemirror.stories.d.ts +0 -12
  125. package/dist/types/src/components/TextEditor/codemirror.stories.d.ts.map +0 -1
  126. package/dist/types/src/components/TextEditor/extensions/autocomplete.d.ts.map +0 -1
  127. package/dist/types/src/components/TextEditor/extensions/basic.d.ts +0 -9
  128. package/dist/types/src/components/TextEditor/extensions/basic.d.ts.map +0 -1
  129. package/dist/types/src/components/TextEditor/extensions/blast.d.ts.map +0 -1
  130. package/dist/types/src/components/TextEditor/extensions/code.d.ts.map +0 -1
  131. package/dist/types/src/components/TextEditor/extensions/comments.d.ts.map +0 -1
  132. package/dist/types/src/components/TextEditor/extensions/hr.d.ts.map +0 -1
  133. package/dist/types/src/components/TextEditor/extensions/image.d.ts.map +0 -1
  134. package/dist/types/src/components/TextEditor/extensions/index.d.ts.map +0 -1
  135. package/dist/types/src/components/TextEditor/extensions/link.d.ts.map +0 -1
  136. package/dist/types/src/components/TextEditor/extensions/listener.d.ts +0 -9
  137. package/dist/types/src/components/TextEditor/extensions/listener.d.ts.map +0 -1
  138. package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts.map +0 -1
  139. package/dist/types/src/components/TextEditor/extensions/markdown/highlight.d.ts.map +0 -1
  140. package/dist/types/src/components/TextEditor/extensions/markdown/index.d.ts.map +0 -1
  141. package/dist/types/src/components/TextEditor/extensions/mention.d.ts.map +0 -1
  142. package/dist/types/src/components/TextEditor/extensions/mermaid.d.ts +0 -3
  143. package/dist/types/src/components/TextEditor/extensions/mermaid.d.ts.map +0 -1
  144. package/dist/types/src/components/TextEditor/extensions/table.d.ts.map +0 -1
  145. package/dist/types/src/components/TextEditor/extensions/tasklist.d.ts.map +0 -1
  146. package/dist/types/src/components/TextEditor/extensions/tooltip.d.ts +0 -12
  147. package/dist/types/src/components/TextEditor/extensions/tooltip.d.ts.map +0 -1
  148. package/dist/types/src/components/TextEditor/extensions/typewriter.d.ts.map +0 -1
  149. package/dist/types/src/components/TextEditor/extensions/util.d.ts +0 -5
  150. package/dist/types/src/components/TextEditor/extensions/util.d.ts.map +0 -1
  151. package/dist/types/src/components/TextEditor/themes/default.d.ts.map +0 -1
  152. package/dist/types/src/components/TextEditor/themes/index.d.ts.map +0 -1
  153. package/dist/types/src/hooks/automerge/automerge.stories.d.ts.map +0 -1
  154. package/dist/types/src/hooks/automerge/handle.d.ts +0 -9
  155. package/dist/types/src/hooks/automerge/handle.d.ts.map +0 -1
  156. package/dist/types/src/hooks/automerge/index.d.ts +0 -3
  157. package/dist/types/src/hooks/automerge/index.d.ts.map +0 -1
  158. package/dist/types/src/hooks/automerge/plugin.d.ts +0 -26
  159. package/dist/types/src/hooks/automerge/plugin.d.ts.map +0 -1
  160. package/dist/types/src/hooks/automerge/semaphore.d.ts +0 -19
  161. package/dist/types/src/hooks/automerge/semaphore.d.ts.map +0 -1
  162. package/dist/types/src/hooks/automerge/update-automerge.d.ts +0 -6
  163. package/dist/types/src/hooks/automerge/update-automerge.d.ts.map +0 -1
  164. package/dist/types/src/hooks/automerge/update-codemirror.d.ts.map +0 -1
  165. package/dist/types/src/hooks/yjs/cursors.d.ts.map +0 -1
  166. package/dist/types/src/hooks/yjs/index.d.ts +0 -3
  167. package/dist/types/src/hooks/yjs/index.d.ts.map +0 -1
  168. package/dist/types/src/hooks/yjs/space-provider.d.ts +0 -27
  169. package/dist/types/src/hooks/yjs/space-provider.d.ts.map +0 -1
  170. package/dist/types/src/hooks/yjs/yjs.stories.d.ts +0 -12
  171. package/dist/types/src/hooks/yjs/yjs.stories.d.ts.map +0 -1
  172. package/dist/types/src/hooks/yjs/yjs.test.d.ts +0 -2
  173. package/dist/types/src/hooks/yjs/yjs.test.d.ts.map +0 -1
  174. package/dist/types/src/testing/index.d.ts +0 -3
  175. package/dist/types/src/testing/index.d.ts.map +0 -1
  176. package/dist/types/src/testing/proto/gen/schema.d.ts +0 -15
  177. package/dist/types/src/testing/proto/gen/schema.d.ts.map +0 -1
  178. package/dist/types/src/testing/proto/index.d.ts +0 -2
  179. package/dist/types/src/testing/proto/index.d.ts.map +0 -1
  180. package/dist/types/src/testing/replicator.d.ts +0 -45
  181. package/dist/types/src/testing/replicator.d.ts.map +0 -1
  182. package/src/components/TextEditor/codemirror.stories.ts +0 -114
  183. package/src/components/TextEditor/extensions/basic.ts +0 -32
  184. package/src/components/TextEditor/extensions/comments.ts +0 -388
  185. package/src/components/TextEditor/extensions/hr.ts +0 -74
  186. package/src/components/TextEditor/extensions/image.ts +0 -69
  187. package/src/components/TextEditor/extensions/listener.ts +0 -23
  188. package/src/components/TextEditor/extensions/mermaid.ts +0 -11
  189. package/src/components/TextEditor/extensions/tasklist.ts +0 -121
  190. package/src/components/TextEditor/extensions/tooltip.ts +0 -61
  191. package/src/components/TextEditor/extensions/util.ts +0 -18
  192. package/src/hooks/automerge/handle.ts +0 -14
  193. package/src/hooks/automerge/index.ts +0 -6
  194. package/src/hooks/automerge/plugin.ts +0 -134
  195. package/src/hooks/yjs/index.ts +0 -6
  196. package/src/hooks/yjs/space-provider.ts +0 -126
  197. package/src/hooks/yjs/yjs.stories.tsx +0 -56
  198. package/src/hooks/yjs/yjs.test.ts +0 -59
  199. package/src/testing/index.ts +0 -6
  200. package/src/testing/proto/gen/schema.ts +0 -49
  201. package/src/testing/proto/index.ts +0 -5
  202. package/src/testing/proto/schema.proto +0 -15
  203. package/src/testing/replicator.ts +0 -189
  204. /package/dist/types/src/{components/TextEditor/extensions → extensions}/autocomplete.d.ts +0 -0
  205. /package/dist/types/src/{hooks → extensions}/automerge/update-codemirror.d.ts +0 -0
  206. /package/dist/types/src/{components/TextEditor/extensions → extensions}/blast.d.ts +0 -0
  207. /package/dist/types/src/{components/TextEditor/extensions → extensions}/code.d.ts +0 -0
  208. /package/dist/types/src/{components/TextEditor/extensions → extensions}/hr.d.ts +0 -0
  209. /package/dist/types/src/{components/TextEditor/extensions → extensions}/image.d.ts +0 -0
  210. /package/dist/types/src/{components/TextEditor/extensions → extensions}/markdown/highlight.d.ts +0 -0
  211. /package/dist/types/src/{components/TextEditor/extensions → extensions}/markdown/index.d.ts +0 -0
  212. /package/dist/types/src/{components/TextEditor/extensions → extensions}/mention.d.ts +0 -0
  213. /package/dist/types/src/{components/TextEditor/extensions → extensions}/table.d.ts +0 -0
  214. /package/dist/types/src/{components/TextEditor/extensions → extensions}/tasklist.d.ts +0 -0
  215. /package/dist/types/src/{components/TextEditor/extensions → extensions}/typewriter.d.ts +0 -0
  216. /package/dist/types/src/{hooks/yjs → styles}/cursors.d.ts +0 -0
  217. /package/dist/types/src/{components/TextEditor/themes → themes}/index.d.ts +0 -0
  218. /package/src/{components/TextEditor/extensions → extensions}/blast.ts +0 -0
  219. /package/src/{components/TextEditor/extensions → extensions}/markdown/index.ts +0 -0
  220. /package/src/{hooks/yjs → styles}/cursors.ts +0 -0
  221. /package/src/{components/TextEditor/themes → themes}/index.ts +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/react-ui-editor",
3
- "version": "0.3.11-main.baa8c4d",
3
+ "version": "0.3.11-main.bc6b68b",
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,20 @@
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",
25
+ "@codemirror/view": "^6.23.0",
26
26
  "@fluentui/react-tabster": "^9.16.1",
27
- "@lezer/common": "^1.1.1",
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
30
  "@replit/codemirror-vim": "^6.0.14",
31
31
  "codemirror": "6.0.1",
32
32
  "lib0": "^0.2.65",
@@ -35,26 +35,24 @@
35
35
  "lodash.pick": "^4.4.0",
36
36
  "lodash.sortby": "^4.7.0",
37
37
  "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/automerge": "0.3.11-main.baa8c4d",
42
- "@dxos/async": "0.3.11-main.baa8c4d",
43
- "@dxos/debug": "0.3.11-main.baa8c4d",
44
- "@dxos/display-name": "0.3.11-main.baa8c4d",
45
- "@dxos/invariant": "0.3.11-main.baa8c4d",
46
- "@dxos/echo-schema": "0.3.11-main.baa8c4d",
47
- "@dxos/log": "0.3.11-main.baa8c4d",
48
- "@dxos/react-async": "0.3.11-main.baa8c4d",
49
- "@dxos/react-ui": "0.3.11-main.baa8c4d",
50
- "@dxos/react-ui-theme": "0.3.11-main.baa8c4d",
51
- "@dxos/protocols": "0.3.11-main.baa8c4d",
52
- "@dxos/text-model": "0.3.11-main.baa8c4d",
53
- "@dxos/util": "0.3.11-main.baa8c4d"
38
+ "@dxos/async": "0.3.11-main.bc6b68b",
39
+ "@dxos/automerge": "0.3.11-main.bc6b68b",
40
+ "@dxos/context": "0.3.11-main.bc6b68b",
41
+ "@dxos/debug": "0.3.11-main.bc6b68b",
42
+ "@dxos/echo-schema": "0.3.11-main.bc6b68b",
43
+ "@dxos/display-name": "0.3.11-main.bc6b68b",
44
+ "@dxos/invariant": "0.3.11-main.bc6b68b",
45
+ "@dxos/protocols": "0.3.11-main.bc6b68b",
46
+ "@dxos/react-async": "0.3.11-main.bc6b68b",
47
+ "@dxos/react-ui": "0.3.11-main.bc6b68b",
48
+ "@dxos/react-ui-theme": "0.3.11-main.bc6b68b",
49
+ "@dxos/log": "0.3.11-main.bc6b68b",
50
+ "@dxos/text-model": "0.3.11-main.bc6b68b",
51
+ "@dxos/util": "0.3.11-main.bc6b68b"
54
52
  },
55
53
  "devDependencies": {
56
54
  "@automerge/automerge-repo-network-broadcastchannel": "^1.0.19",
57
- "@faker-js/faker": "^8.0.2",
55
+ "@faker-js/faker": "^8.3.1",
58
56
  "@phosphor-icons/react": "^2.0.5",
59
57
  "@preact/signals-react": "^1.3.6",
60
58
  "@types/lodash.defaultsdeep": "^4.6.6",
@@ -66,23 +64,24 @@
66
64
  "deepsignal": "1.4.0-shallow.0",
67
65
  "react": "^18.2.0",
68
66
  "react-dom": "^18.2.0",
69
- "@dxos/config": "0.3.11-main.baa8c4d",
70
- "@dxos/echo-signals": "0.3.11-main.baa8c4d",
71
- "@dxos/echo-typegen": "0.3.11-main.baa8c4d",
72
- "@dxos/react-client": "0.3.11-main.baa8c4d",
73
- "@dxos/react-ui": "0.3.11-main.baa8c4d",
74
- "@dxos/storybook-utils": "0.3.11-main.baa8c4d"
67
+ "@dxos/config": "0.3.11-main.bc6b68b",
68
+ "@dxos/echo-signals": "0.3.11-main.bc6b68b",
69
+ "@dxos/keyboard": "0.3.11-main.bc6b68b",
70
+ "@dxos/react-client": "0.3.11-main.bc6b68b",
71
+ "@dxos/storybook-utils": "0.3.11-main.bc6b68b",
72
+ "@dxos/echo-typegen": "0.3.11-main.bc6b68b",
73
+ "@dxos/react-ui": "0.3.11-main.bc6b68b"
75
74
  },
76
75
  "peerDependencies": {
77
76
  "@phosphor-icons/react": "^2.0.5",
78
77
  "react": "^18.2.0",
79
78
  "react-dom": "^18.2.0",
80
- "@dxos/react-client": "0.3.11-main.baa8c4d"
79
+ "@dxos/react-client": "0.3.11-main.bc6b68b"
81
80
  },
82
81
  "publishConfig": {
83
82
  "access": "public"
84
83
  },
85
84
  "scripts": {
86
- "prebuild": "dxtype src/testing/proto/schema.proto src/testing/proto/gen/schema.ts"
85
+ "test": "true"
87
86
  }
88
87
  }
@@ -4,7 +4,7 @@
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';
@@ -12,11 +12,12 @@ 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';
15
+ import { keySymbols, parseShortcut } from '@dxos/keyboard';
15
16
  import { PublicKey } from '@dxos/keys';
16
17
  import { fixedInsetFlexLayout, getSize, groupSurface, mx } from '@dxos/react-ui-theme';
17
18
  import { withTheme } from '@dxos/storybook-utils';
18
19
 
19
- import { MarkdownEditor, type TextEditorProps, type TextEditorRef } from './TextEditor';
20
+ import { MarkdownEditor, type TextEditorProps } from './TextEditor';
20
21
  import {
21
22
  autocomplete,
22
23
  blast,
@@ -25,19 +26,16 @@ import {
25
26
  defaultOptions,
26
27
  hr,
27
28
  image,
28
- listener,
29
29
  link,
30
30
  mention,
31
31
  table,
32
32
  tasklist,
33
- tooltip,
34
33
  typewriter,
35
34
  type CommentsOptions,
36
- type TooltipOptions,
37
35
  type LinkOptions,
38
- mermaid,
39
- } from './extensions';
40
- import { type CommentRange, useTextModel } from '../../hooks';
36
+ useComments,
37
+ } from '../../extensions';
38
+ import { type Comment, useTextModel } from '../../hooks';
41
39
 
42
40
  // Extensions:
43
41
  // TODO(burdon): Table of contents.
@@ -57,8 +55,8 @@ const text = {
57
55
  '- [x] decorator',
58
56
  '- [ ] checkbox',
59
57
  ' - [ ] state',
60
- ' - [ ] indent',
61
- ' - [x] style',
58
+ ' - [ ] indent',
59
+ ' - [x] style',
62
60
  '',
63
61
  ),
64
62
 
@@ -125,8 +123,6 @@ const text = {
125
123
 
126
124
  paragraphs: str(...faker.helpers.multiple(() => [faker.lorem.paragraph(), ''], { count: 3 }).flat()),
127
125
 
128
- mermaid: str('```mermaid', 'graph TD;', 'A-->B;', 'A-->C;', 'B-->D;', 'C-->D;', '```'),
129
-
130
126
  footer: str('', '', '', '', '')
131
127
  };
132
128
 
@@ -166,10 +162,12 @@ const links = [
166
162
  { label: 'StackEdit', apply: '[StackEdit](https://stackedit.io/app)' },
167
163
  ];
168
164
 
165
+ const names = ['adam', 'alice', 'alison', 'bob', 'carol', 'charlie', 'sayuri', 'shoko'];
166
+
169
167
  const hover =
170
168
  'rounded-sm text-base text-primary-600 hover:text-primary-500 dark:text-primary-300 hover:dark:text-primary-200';
171
169
 
172
- const onTooltipHover: TooltipOptions['onHover'] = (el, url) => {
170
+ const onHoverLinkTooltip: LinkOptions['onHover'] = (el, url) => {
173
171
  const web = new URL(url);
174
172
  createRoot(el).render(
175
173
  <StrictMode>
@@ -187,26 +185,26 @@ const Key: FC<{ char: string }> = ({ char }) => (
187
185
  </span>
188
186
  );
189
187
 
190
- const onCommentsHover: CommentsOptions['onHover'] = (el) => {
188
+ const onCommentsHover: CommentsOptions['onHover'] = (el, shortcut) => {
191
189
  createRoot(el).render(
192
190
  <StrictMode>
193
191
  <div className='flex items-center gap-2 px-2 py-2 bg-neutral-700 text-white text-xs rounded'>
194
192
  <div>Create comment</div>
195
- {/* TODO(burdon): Unify shortcuts. */}
196
193
  <div className='flex gap-1'>
197
- <Key char='⌘' />
198
- <Key char="'" />
194
+ {keySymbols(parseShortcut(shortcut)).map((char) => (
195
+ <Key key={char} char={char} />
196
+ ))}
199
197
  </div>
200
198
  </div>
201
199
  </StrictMode>,
202
200
  );
203
201
  };
204
202
 
205
- const onLinkRender: LinkOptions['onRender'] = (el, url) => {
203
+ const onRenderLink: LinkOptions['onRender'] = (el, url) => {
206
204
  createRoot(el).render(
207
205
  <StrictMode>
208
206
  <a href={url} target='_blank' rel='noreferrer' className={hover}>
209
- <ArrowSquareOut weight='bold' className={mx(getSize(4), 'inline-block leading-none mis-1 mb-1')} />
207
+ <ArrowSquareOut weight='bold' className={mx(getSize(4), 'inline-block leading-none mis-1 mb-[2px]')} />
210
208
  </a>
211
209
  </StrictMode>,
212
210
  );
@@ -214,23 +212,24 @@ const onLinkRender: LinkOptions['onRender'] = (el, url) => {
214
212
 
215
213
  type StoryProps = {
216
214
  text?: string;
215
+ comments?: Comment[];
217
216
  automerge?: boolean;
218
- } & Pick<TextEditorProps, 'comments' | 'readonly' | 'extensions' | 'slots'>;
217
+ } & Pick<TextEditorProps, 'readonly' | 'placeholder' | 'slots' | 'extensions'>;
219
218
 
220
- const Story = ({ text, automerge, ...props }: StoryProps) => {
221
- const ref = useRef<TextEditorRef>(null);
219
+ const Story = ({ text, comments, automerge, placeholder = 'New document.', ...props }: StoryProps) => {
222
220
  const [item] = useState({ text: new TextObject(text, undefined, undefined, { automerge }) });
221
+ const view = useRef<EditorView>(null);
223
222
  const model = useTextModel({ text: item.text });
223
+ useComments(view.current, comments);
224
224
  if (!model) {
225
225
  return null;
226
226
  }
227
227
 
228
228
  return (
229
229
  <div className={mx(fixedInsetFlexLayout, groupSurface)}>
230
- <div className='flex justify-center overflow-y-scroll'>
231
- <div className='flex flex-col w-[800px] py-16'>
232
- <MarkdownEditor ref={ref} model={model} {...props} />
233
- <div className='flex shrink-0 h-[300px]'></div>
230
+ <div className='flex h-full justify-center'>
231
+ <div className='flex flex-col h-full w-[800px]'>
232
+ <MarkdownEditor ref={view} model={model} placeholder={placeholder} {...props} />
234
233
  </div>
235
234
  </div>
236
235
  </div>
@@ -244,83 +243,85 @@ export default {
244
243
  render: Story,
245
244
  };
246
245
 
247
- const extensions = [
246
+ const defaults = [
248
247
  autocomplete({
249
248
  onSearch: (text) => links.filter(({ label }) => label.toLowerCase().includes(text.toLowerCase())),
250
249
  }),
251
250
  code(),
252
251
  hr(),
253
252
  image(),
254
- link({ onRender: onLinkRender }),
253
+ link({ onRender: onRenderLink, onHover: onHoverLinkTooltip }),
254
+ // mention({
255
+ // onSearch: (text) => names.filter((name) => name.toLowerCase().startsWith(text.toLowerCase())),
256
+ // }),
255
257
  table(),
256
258
  tasklist(),
257
- tooltip({ onHover: onTooltipHover }),
258
259
  ];
259
260
 
260
261
  export const Default = {
261
- render: () => <Story text={document} extensions={extensions} />,
262
+ render: () => <Story text={document} extensions={defaults} />,
262
263
  };
263
264
 
264
265
  export const Readonly = {
265
- render: () => <Story text={document} extensions={extensions} readonly />,
266
+ render: () => <Story text={document} extensions={defaults} readonly />,
266
267
  };
267
268
 
268
269
  export const NoExtensions = {
269
270
  render: () => <Story text={document} />,
270
271
  };
271
272
 
272
- // TODO(burdon): Cursor bug if no newline after BR (cursor down just loops back to start of each paragraph).
273
- export const HorizontalRule = {
274
- render: () => (
275
- <Story
276
- text={str('# Horizontal Rule', '', text.paragraphs, '---', '', text.paragraphs, '---', '', text.paragraphs)}
277
- extensions={[hr()]}
278
- />
279
- ),
273
+ const large = faker.helpers.multiple(() => faker.lorem.paragraph({ min: 8, max: 16 }), { count: 20 }).join('\n\n');
274
+
275
+ export const Empty = {
276
+ render: () => <Story />,
280
277
  };
281
278
 
282
- export const Tooltips = {
283
- render: () => <Story text={str(text.links, text.footer)} extensions={[tooltip({ onHover: onTooltipHover })]} />,
279
+ export const Scrolling = {
280
+ render: () => <Story text={str('# Large Document', '', large)} extensions={[]} />,
284
281
  };
285
282
 
286
283
  export const Links = {
287
- render: () => <Story text={str(text.links, text.footer)} extensions={[link({ onRender: onLinkRender })]} />,
284
+ render: () => (
285
+ <Story
286
+ text={str(text.links, text.footer)}
287
+ extensions={[link({ onHover: onHoverLinkTooltip, onRender: onRenderLink })]}
288
+ />
289
+ ),
288
290
  };
289
291
 
290
292
  export const Code = {
291
293
  render: () => <Story text={str(text.code, text.footer)} extensions={[code()]} readonly />,
292
294
  };
293
295
 
294
- export const Table = {
295
- render: () => <Story text={str(text.table, text.footer)} extensions={[table()]} />,
296
- };
297
-
298
296
  export const Image = {
299
297
  render: () => <Story text={str(text.image, text.footer)} readonly extensions={[image()]} />,
300
298
  };
301
299
 
302
- export const Tasklist = {
300
+ export const Lists = {
303
301
  render: () => (
304
- <Story
305
- text={str(text.tasks, '', text.list, text.footer)}
306
- extensions={[
307
- tasklist(),
308
- listener({
309
- onChange: (text) => {
310
- console.log(text);
311
- },
312
- }),
313
- ]}
314
- />
302
+ <Story text={str(text.tasks, '', text.list, '', text.numbered, text.footer)} extensions={[tasklist()]} />
315
303
  ),
316
304
  };
317
305
 
306
+ export const Table = {
307
+ render: () => <Story text={str(text.table, text.footer)} extensions={[table()]} />,
308
+ };
309
+
310
+ // export const Outliner = {
311
+ // render: () => (
312
+ // <Story
313
+ // text={str('# Outliner', '', 'Block', ': this is a block', ': with multiple lines', text.footer)}
314
+ // extensions={[outliner()]}
315
+ // />
316
+ // ),
317
+ // };
318
+
318
319
  export const Autocomplete = {
319
320
  render: () => (
320
321
  <Story
321
- text={str('# Autocomplete', '', 'Press CTRL-SPACE', text.footer)}
322
+ text={str('# Autocomplete', '', 'Press Ctrl-Space...', text.footer)}
322
323
  extensions={[
323
- link({ onRender: onLinkRender }),
324
+ link({ onRender: onRenderLink }),
324
325
  autocomplete({
325
326
  onSearch: (text) => links.filter(({ label }) => label.toLowerCase().includes(text.toLowerCase())),
326
327
  }),
@@ -329,8 +330,6 @@ export const Autocomplete = {
329
330
  ),
330
331
  };
331
332
 
332
- const names = ['adam', 'alice', 'alison', 'bob', 'carol', 'charlie', 'sayuri', 'shoko'];
333
-
334
333
  export const Mention = {
335
334
  render: () => (
336
335
  <Story
@@ -344,24 +343,20 @@ export const Mention = {
344
343
  ),
345
344
  };
346
345
 
347
- export const Mermaid = {
348
- render: () => <Story text={str('# Mermaid', '', text.mermaid, text.footer)} extensions={[code(), mermaid()]} />,
349
- };
350
-
351
346
  export const Comments = {
352
347
  render: () => {
353
- const [commentsStates, setCommentStates] = useState<CommentRange[]>([]);
348
+ const [commentRanges, setCommentRanges] = useState<Comment[]>([]);
354
349
 
355
350
  return (
356
351
  <Story
357
352
  text={str('# Comments', '', text.paragraphs, text.footer)}
358
- comments={commentsStates}
353
+ comments={commentRanges}
359
354
  extensions={[
360
355
  comments({
361
356
  onHover: onCommentsHover,
362
- onCreate: (relPos) => {
357
+ onCreate: (range) => {
363
358
  const id = PublicKey.random().toHex();
364
- setCommentStates((comments) => [...comments, { id, cursor: relPos }]);
359
+ setCommentRanges((commentRanges) => [...commentRanges, { id, cursor: range }]);
365
360
  return id;
366
361
  },
367
362
  onSelect: (state) => {
@@ -370,9 +365,9 @@ export const Comments = {
370
365
  console.log(
371
366
  'update',
372
367
  JSON.stringify({
373
- active: state.active?.slice(0, 8),
374
- closest: state.closest?.slice(0, 8),
375
- ranges: state.ranges.length,
368
+ comments: state.comments.length,
369
+ active: state.selection.current?.slice(0, 8),
370
+ closest: state.selection.closest?.slice(0, 8),
376
371
  }),
377
372
  );
378
373
  }
@@ -384,8 +379,24 @@ export const Comments = {
384
379
  },
385
380
  };
386
381
 
382
+ export const HorizontalRule = {
383
+ render: () => (
384
+ <Story
385
+ text={str('# Horizontal Rule', '', text.paragraphs, '---', text.paragraphs, '---', text.paragraphs)}
386
+ extensions={[hr()]}
387
+ />
388
+ ),
389
+ };
390
+
391
+ const typewriterItems = localStorage.getItem('dxos.org/plugin/markdown/typewriter')?.split(',');
392
+
387
393
  export const Typewriter = {
388
- render: () => <Story text={str('# Typewriter', '', text.paragraphs, text.footer)} extensions={[typewriter()]} />,
394
+ render: () => (
395
+ <Story
396
+ text={str('# Typewriter', '', text.paragraphs, text.footer)}
397
+ extensions={[typewriter({ items: typewriterItems })]}
398
+ />
399
+ ),
389
400
  };
390
401
 
391
402
  export const Blast = {
@@ -393,9 +404,7 @@ export const Blast = {
393
404
  <Story
394
405
  text={str('# Blast', '', text.paragraphs, text.code, text.paragraphs)}
395
406
  extensions={[
396
- typewriter({
397
- items: localStorage.getItem('dxos.composer.extension.demo')?.split(','),
398
- }),
407
+ typewriter({ items: typewriterItems }),
399
408
  blast(
400
409
  defaultsDeep(
401
410
  {
@@ -412,17 +421,3 @@ export const Blast = {
412
421
  />
413
422
  ),
414
423
  };
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
- };
@@ -4,15 +4,14 @@
4
4
 
5
5
  import '@dxosTheme';
6
6
 
7
- import defaultsDeep from 'lodash.defaultsdeep';
8
- import React, { useRef, useState } from 'react';
7
+ import React, { useState } from 'react';
9
8
 
10
9
  import { TextObject } from '@dxos/echo-schema';
11
10
  import { fixedInsetFlexLayout, groupSurface, mx } from '@dxos/react-ui-theme';
12
11
  import { withTheme } from '@dxos/storybook-utils';
13
12
 
14
- import { defaultSlots, TextEditor, type TextEditorProps, type TextEditorRef, type TextEditorSlots } from './TextEditor';
15
- import { textTheme } from './themes';
13
+ import { TextEditor, type TextEditorProps } from './TextEditor';
14
+ import { listener } from '../../extensions';
16
15
  import { useTextModel } from '../../hooks';
17
16
 
18
17
  const initialText = [
@@ -29,8 +28,7 @@ const Story = ({
29
28
  text,
30
29
  automerge,
31
30
  ...props
32
- }: { text?: string; automerge?: boolean } & Pick<TextEditorProps, 'extensions' | 'slots'>) => {
33
- const ref = useRef<TextEditorRef>(null);
31
+ }: { text?: string; automerge?: boolean } & Pick<TextEditorProps, 'extensions' | 'placeholder' | 'slots'>) => {
34
32
  const [item] = useState({ text: new TextObject(text, undefined, undefined, { automerge }) });
35
33
  const model = useTextModel({ text: item.text });
36
34
  if (!model) {
@@ -39,10 +37,9 @@ const Story = ({
39
37
 
40
38
  return (
41
39
  <div className={mx(fixedInsetFlexLayout, groupSurface)}>
42
- <div className='flex justify-center overflow-y-scroll'>
40
+ <div className='flex justify-center'>
43
41
  <div className='flex flex-col w-[800px] py-16'>
44
- <TextEditor ref={ref} model={model} {...props} />
45
- <div className='flex shrink-0 h-[300px]'></div>
42
+ <TextEditor model={model} {...props} />
46
43
  </div>
47
44
  </div>
48
45
  </div>
@@ -57,37 +54,19 @@ export default {
57
54
  };
58
55
 
59
56
  export const Default = {
60
- render: () => (
61
- <Story
62
- slots={defaultsDeep(
63
- { editor: { theme: textTheme, placeholder: 'Enter text...' } } satisfies TextEditorSlots,
64
- defaultSlots,
65
- )}
66
- />
67
- ),
57
+ render: () => <Story placeholder='Enter text...' />,
68
58
  };
69
59
 
70
60
  export const Text = {
71
- render: () => (
72
- <Story
73
- text={initialText}
74
- slots={defaultsDeep(
75
- { editor: { theme: textTheme, placeholder: 'Enter text...' } } satisfies TextEditorSlots,
76
- defaultSlots,
77
- )}
78
- />
79
- ),
61
+ render: () => <Story text={initialText} placeholder='Enter text...' />,
80
62
  };
81
63
 
82
64
  export const Automerge = {
65
+ render: () => <Story text={initialText} placeholder='Enter text...' automerge />,
66
+ };
67
+
68
+ export const Listener = {
83
69
  render: () => (
84
- <Story
85
- automerge
86
- text={initialText}
87
- slots={defaultsDeep(
88
- { editor: { theme: textTheme, placeholder: 'Enter text...' } } satisfies TextEditorSlots,
89
- defaultSlots,
90
- )}
91
- />
70
+ <Story placeholder='Enter text...' extensions={[listener({ onChange: (text) => console.log(text) })]} />
92
71
  ),
93
72
  };