@dxos/react-ui-editor 0.3.11-main.668f0ff → 0.3.11-main.674a7f9

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