@dxos/react-ui-editor 0.3.11-next.0fb359e → 0.3.11-next.e28df4f

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 (201) hide show
  1. package/dist/lib/browser/index.mjs +1854 -1391
  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 +16 -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 -6
  9. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts.map +1 -1
  10. package/dist/types/src/components/TextEditor/automerge.stories.d.ts.map +1 -1
  11. package/dist/types/src/components/TextEditor/comments.stories.d.ts +26 -0
  12. package/dist/types/src/components/TextEditor/comments.stories.d.ts.map +1 -0
  13. package/dist/types/src/components/TextEditor/hooks.stories.d.ts +23 -0
  14. package/dist/types/src/components/TextEditor/hooks.stories.d.ts.map +1 -0
  15. package/dist/types/src/components/Toolbar/Toolbar.d.ts +25 -0
  16. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -0
  17. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +23 -0
  18. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -0
  19. package/dist/types/src/components/Toolbar/index.d.ts +2 -0
  20. package/dist/types/src/components/Toolbar/index.d.ts.map +1 -0
  21. package/dist/types/src/components/index.d.ts +1 -0
  22. package/dist/types/src/components/index.d.ts.map +1 -1
  23. package/dist/types/src/extensions/autocomplete.d.ts.map +1 -1
  24. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  25. package/dist/types/src/extensions/automerge/automerge.spec.d.ts +2 -0
  26. package/dist/types/src/extensions/automerge/automerge.spec.d.ts.map +1 -0
  27. package/dist/types/src/extensions/automerge/automerge.test.d.ts +2 -0
  28. package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +1 -0
  29. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  30. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  31. package/dist/types/src/extensions/automerge/defs.d.ts +9 -11
  32. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
  33. package/dist/types/src/extensions/automerge/semaphore.d.ts +8 -12
  34. package/dist/types/src/extensions/automerge/semaphore.d.ts.map +1 -1
  35. package/dist/types/src/extensions/automerge/update-automerge.d.ts +2 -2
  36. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  37. package/dist/types/src/extensions/awareness.d.ts +2 -2
  38. package/dist/types/src/extensions/awareness.d.ts.map +1 -1
  39. package/dist/types/src/extensions/basic.d.ts +4 -5
  40. package/dist/types/src/extensions/basic.d.ts.map +1 -1
  41. package/dist/types/src/extensions/comments.d.ts +37 -20
  42. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  43. package/dist/types/src/{util → extensions}/cursor.d.ts +10 -2
  44. package/dist/types/src/extensions/cursor.d.ts.map +1 -0
  45. package/dist/types/src/extensions/index.d.ts +2 -8
  46. package/dist/types/src/extensions/index.d.ts.map +1 -1
  47. package/dist/types/src/extensions/markdown/bundle.d.ts +3 -6
  48. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  49. package/dist/types/src/extensions/markdown/code.d.ts.map +1 -0
  50. package/dist/types/src/extensions/markdown/formatting.d.ts +13 -0
  51. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -0
  52. package/dist/types/src/extensions/markdown/heading.d.ts +6 -0
  53. package/dist/types/src/extensions/markdown/heading.d.ts.map +1 -0
  54. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
  55. package/dist/types/src/extensions/markdown/hr.d.ts.map +1 -0
  56. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -0
  57. package/dist/types/src/extensions/markdown/index.d.ts +8 -0
  58. package/dist/types/src/extensions/markdown/index.d.ts.map +1 -1
  59. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -0
  60. package/dist/types/src/extensions/markdown/table.d.ts.map +1 -0
  61. package/dist/types/src/extensions/markdown/tasklist.d.ts.map +1 -0
  62. package/dist/types/src/extensions/mention.d.ts.map +1 -1
  63. package/dist/types/src/extensions/outliner.d.ts +4 -0
  64. package/dist/types/src/extensions/outliner.d.ts.map +1 -0
  65. package/dist/types/src/hooks/awareness-provider.d.ts +7 -4
  66. package/dist/types/src/hooks/awareness-provider.d.ts.map +1 -1
  67. package/dist/types/src/hooks/defs.d.ts +25 -0
  68. package/dist/types/src/hooks/defs.d.ts.map +1 -0
  69. package/dist/types/src/hooks/index.d.ts +4 -2
  70. package/dist/types/src/hooks/index.d.ts.map +1 -1
  71. package/dist/types/src/hooks/useActionHandler.d.ts +4 -0
  72. package/dist/types/src/hooks/useActionHandler.d.ts.map +1 -0
  73. package/dist/types/src/hooks/useEditorView.d.ts +17 -0
  74. package/dist/types/src/hooks/useEditorView.d.ts.map +1 -0
  75. package/dist/types/src/hooks/useTextEditor.d.ts +39 -0
  76. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -0
  77. package/dist/types/src/hooks/useTextModel.d.ts +2 -32
  78. package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
  79. package/dist/types/src/index.d.ts +3 -0
  80. package/dist/types/src/index.d.ts.map +1 -1
  81. package/dist/types/src/styles/markdown.d.ts +2 -2
  82. package/dist/types/src/styles/markdown.d.ts.map +1 -1
  83. package/dist/types/src/styles/tokens.d.ts +1 -0
  84. package/dist/types/src/styles/tokens.d.ts.map +1 -1
  85. package/dist/types/src/themes/default.d.ts.map +1 -1
  86. package/dist/types/src/util.d.ts +7 -0
  87. package/dist/types/src/util.d.ts.map +1 -0
  88. package/package.json +48 -37
  89. package/src/components/TextEditor/MarkdownEditor.stories.tsx +84 -91
  90. package/src/components/TextEditor/TextEditor.stories.tsx +12 -46
  91. package/src/components/TextEditor/TextEditor.tsx +136 -95
  92. package/src/components/TextEditor/automerge.stories.tsx +1 -2
  93. package/src/components/TextEditor/comments.stories.tsx +357 -0
  94. package/src/components/TextEditor/hooks.stories.tsx +106 -0
  95. package/src/components/Toolbar/Toolbar.stories.tsx +90 -0
  96. package/src/components/Toolbar/Toolbar.tsx +166 -0
  97. package/src/components/Toolbar/index.ts +5 -0
  98. package/src/components/index.ts +1 -0
  99. package/src/extensions/autocomplete.ts +23 -19
  100. package/src/extensions/automerge/automerge.spec.tsx +76 -0
  101. package/src/extensions/automerge/automerge.test.ts +13 -0
  102. package/src/extensions/automerge/automerge.ts +55 -46
  103. package/src/extensions/automerge/cursor.ts +5 -4
  104. package/src/extensions/automerge/defs.ts +13 -34
  105. package/src/extensions/automerge/semaphore.ts +33 -32
  106. package/src/extensions/automerge/update-automerge.ts +14 -8
  107. package/src/extensions/automerge/update-codemirror.ts +5 -5
  108. package/src/extensions/awareness.ts +43 -49
  109. package/src/extensions/basic.ts +17 -10
  110. package/src/extensions/comments.ts +323 -268
  111. package/src/extensions/cursor.ts +50 -0
  112. package/src/extensions/index.ts +2 -8
  113. package/src/extensions/markdown/bundle.ts +23 -28
  114. package/src/extensions/markdown/code.ts +150 -0
  115. package/src/extensions/markdown/formatting.ts +188 -0
  116. package/src/extensions/markdown/heading.ts +59 -0
  117. package/src/extensions/markdown/highlight.ts +11 -26
  118. package/src/extensions/markdown/hr.ts +71 -0
  119. package/src/extensions/markdown/image.ts +87 -0
  120. package/src/extensions/markdown/index.ts +8 -0
  121. package/src/extensions/{link.ts → markdown/link.ts} +87 -86
  122. package/src/extensions/{table.ts → markdown/table.ts} +10 -4
  123. package/src/extensions/markdown/tasklist.ts +110 -0
  124. package/src/extensions/mention.ts +9 -2
  125. package/src/extensions/outliner.ts +12 -0
  126. package/src/hooks/awareness-provider.ts +24 -20
  127. package/src/hooks/defs.ts +42 -0
  128. package/src/hooks/index.ts +5 -2
  129. package/src/hooks/useActionHandler.ts +62 -0
  130. package/src/hooks/useEditorView.ts +29 -0
  131. package/src/hooks/useTextEditor.ts +153 -0
  132. package/src/hooks/useTextModel.ts +50 -59
  133. package/src/index.ts +3 -0
  134. package/src/styles/markdown.ts +9 -12
  135. package/src/styles/tokens.ts +3 -0
  136. package/src/themes/default.ts +53 -80
  137. package/src/util.ts +41 -0
  138. package/dist/types/src/components/TextEditor/codemirror.stories.d.ts +0 -12
  139. package/dist/types/src/components/TextEditor/codemirror.stories.d.ts.map +0 -1
  140. package/dist/types/src/components/TextEditor/yjs.stories.d.ts +0 -12
  141. package/dist/types/src/components/TextEditor/yjs.stories.d.ts.map +0 -1
  142. package/dist/types/src/extensions/code.d.ts.map +0 -1
  143. package/dist/types/src/extensions/hr.d.ts.map +0 -1
  144. package/dist/types/src/extensions/image.d.ts.map +0 -1
  145. package/dist/types/src/extensions/link.d.ts.map +0 -1
  146. package/dist/types/src/extensions/mermaid.d.ts +0 -3
  147. package/dist/types/src/extensions/mermaid.d.ts.map +0 -1
  148. package/dist/types/src/extensions/table.d.ts.map +0 -1
  149. package/dist/types/src/extensions/tasklist.d.ts.map +0 -1
  150. package/dist/types/src/extensions/yjs/cursor.d.ts +0 -4
  151. package/dist/types/src/extensions/yjs/cursor.d.ts.map +0 -1
  152. package/dist/types/src/extensions/yjs/index.d.ts +0 -2
  153. package/dist/types/src/extensions/yjs/index.d.ts.map +0 -1
  154. package/dist/types/src/extensions/yjs/yjs.d.ts +0 -4
  155. package/dist/types/src/extensions/yjs/yjs.d.ts.map +0 -1
  156. package/dist/types/src/extensions/yjs/yjs.test.d.ts +0 -2
  157. package/dist/types/src/extensions/yjs/yjs.test.d.ts.map +0 -1
  158. package/dist/types/src/hooks/automerge.d.ts +0 -3
  159. package/dist/types/src/hooks/automerge.d.ts.map +0 -1
  160. package/dist/types/src/hooks/yjs.d.ts +0 -27
  161. package/dist/types/src/hooks/yjs.d.ts.map +0 -1
  162. package/dist/types/src/testing/index.d.ts +0 -3
  163. package/dist/types/src/testing/index.d.ts.map +0 -1
  164. package/dist/types/src/testing/proto/gen/schema.d.ts +0 -15
  165. package/dist/types/src/testing/proto/gen/schema.d.ts.map +0 -1
  166. package/dist/types/src/testing/proto/index.d.ts +0 -2
  167. package/dist/types/src/testing/proto/index.d.ts.map +0 -1
  168. package/dist/types/src/testing/replicator.d.ts +0 -45
  169. package/dist/types/src/testing/replicator.d.ts.map +0 -1
  170. package/dist/types/src/util/cursor.d.ts.map +0 -1
  171. package/dist/types/src/util/index.d.ts +0 -3
  172. package/dist/types/src/util/index.d.ts.map +0 -1
  173. package/dist/types/src/util/util.d.ts +0 -5
  174. package/dist/types/src/util/util.d.ts.map +0 -1
  175. package/src/components/TextEditor/codemirror.stories.ts +0 -115
  176. package/src/components/TextEditor/yjs.stories.tsx +0 -56
  177. package/src/extensions/code.ts +0 -99
  178. package/src/extensions/hr.ts +0 -74
  179. package/src/extensions/image.ts +0 -69
  180. package/src/extensions/mermaid.ts +0 -11
  181. package/src/extensions/tasklist.ts +0 -121
  182. package/src/extensions/yjs/cursor.ts +0 -21
  183. package/src/extensions/yjs/index.ts +0 -5
  184. package/src/extensions/yjs/yjs.test.ts +0 -35
  185. package/src/extensions/yjs/yjs.ts +0 -16
  186. package/src/hooks/automerge.ts +0 -52
  187. package/src/hooks/yjs.ts +0 -178
  188. package/src/testing/index.ts +0 -6
  189. package/src/testing/proto/gen/schema.ts +0 -49
  190. package/src/testing/proto/index.ts +0 -5
  191. package/src/testing/proto/schema.proto +0 -15
  192. package/src/testing/replicator.ts +0 -184
  193. package/src/util/cursor.ts +0 -29
  194. package/src/util/index.ts +0 -6
  195. package/src/util/util.ts +0 -18
  196. /package/dist/types/src/extensions/{code.d.ts → markdown/code.d.ts} +0 -0
  197. /package/dist/types/src/extensions/{hr.d.ts → markdown/hr.d.ts} +0 -0
  198. /package/dist/types/src/extensions/{image.d.ts → markdown/image.d.ts} +0 -0
  199. /package/dist/types/src/extensions/{link.d.ts → markdown/link.d.ts} +0 -0
  200. /package/dist/types/src/extensions/{table.d.ts → markdown/table.d.ts} +0 -0
  201. /package/dist/types/src/extensions/{tasklist.d.ts → markdown/tasklist.d.ts} +0 -0
@@ -0,0 +1,39 @@
1
+ import { type EditorStateConfig, type Extension, type StateEffect } from '@codemirror/state';
2
+ import { EditorView } from '@codemirror/view';
3
+ import { type RefObject } from 'react';
4
+ import { type ThemeMode } from '@dxos/react-ui';
5
+ import { type ThemeStyles } from '..//styles';
6
+ export type UseTextEditorOptions = {
7
+ autoFocus?: boolean;
8
+ scrollTo?: StateEffect<any>;
9
+ debug?: boolean;
10
+ } & EditorStateConfig;
11
+ export type UseTextEditor = {
12
+ parentRef: RefObject<HTMLDivElement>;
13
+ view?: EditorView;
14
+ };
15
+ /**
16
+ * Hook for creating editor.
17
+ */
18
+ export declare const useTextEditor: ({ autoFocus, scrollTo, debug, doc, selection, extensions, }?: UseTextEditorOptions) => UseTextEditor;
19
+ export type DataExtensionsOptions = {
20
+ readonly?: boolean;
21
+ };
22
+ export declare const createDataExtensions: ({ readonly }?: {
23
+ readonly?: boolean | undefined;
24
+ }) => Extension;
25
+ export type ThemeExtensionsOptions = {
26
+ theme?: ThemeStyles;
27
+ themeMode?: ThemeMode;
28
+ lineWrap?: boolean;
29
+ slots?: {
30
+ editor?: {
31
+ className?: string;
32
+ };
33
+ content?: {
34
+ className?: string;
35
+ };
36
+ };
37
+ };
38
+ export declare const createThemeExtensions: ({ theme, themeMode, slots }?: ThemeExtensionsOptions) => Extension;
39
+ //# sourceMappingURL=useTextEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTextEditor.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextEditor.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,KAAK,SAAS,EAA+B,MAAM,OAAO,CAAC;AAGpE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,iBAAiB,CAAC;AAEtB,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,iEAOvB,oBAAoB,KAAQ,aAqE9B,CAAC;AAIF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAGF,eAAO,MAAM,oBAAoB;;MAAgC,SAMhE,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE;QACN,MAAM,CAAC,EAAE;YACP,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;QACF,OAAO,CAAC,EAAE;YACR,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;KACH,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,qBAAqB,iCAAiC,sBAAsB,KAAQ,SAShG,CAAC"}
@@ -1,36 +1,6 @@
1
- import { StateField, type Extension } from '@codemirror/state';
2
- import type * as YP from 'y-protocols/awareness';
3
- import { type DocAccessor, type Space, type TextObject } from '@dxos/react-client/echo';
1
+ import { type Space, type TextObject } from '@dxos/react-client/echo';
4
2
  import { type Identity } from '@dxos/react-client/halo';
5
- import type { YText, YXmlFragment } from '@dxos/text-model';
6
- /**
7
- * State field makes the model available to other extensions.
8
- */
9
- export declare const modelState: StateField<EditorModel | undefined>;
10
- export type Range = {
11
- from: number;
12
- to: number;
13
- };
14
- export type CommentRange = {
15
- id: string;
16
- cursor: string;
17
- };
18
- export type EditorModel = {
19
- id: string;
20
- text: () => string;
21
- extension?: Extension;
22
- content: string | YText | YXmlFragment | DocAccessor;
23
- /**
24
- * @deprecated Use CursorConverter.
25
- */
26
- getCursorFromRange?: (value: Range) => string;
27
- getRangeFromCursor?: (cursor: string) => Range | undefined;
28
- awareness?: YP.Awareness;
29
- peer?: {
30
- id: string;
31
- name?: string;
32
- };
33
- };
3
+ import { type EditorModel } from './defs';
34
4
  export type UseTextModelProps = {
35
5
  identity?: Identity | null;
36
6
  space?: Space;
@@ -1 +1 @@
1
- {"version":3,"file":"useTextModel.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextModel.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAqB,KAAK,WAAW,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC3G,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAO5D;;GAEG;AACH,eAAO,MAAM,UAAU,qCAGrB,CAAC;AAEH,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;IAGtB,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,YAAY,GAAG,WAAW,CAAC;IACrD;;OAEG;IACH,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC;IAC9C,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,GAAG,SAAS,CAAC;IAE3D,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC;IAEzB,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH,CAAC;AAGF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,CAAC;AAIF,eAAO,MAAM,YAAY,UAAW,iBAAiB,KAAG,WAAW,GAAG,SAKrE,CAAC"}
1
+ {"version":3,"file":"useTextModel.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextModel.ts"],"names":[],"mappings":"AAUA,OAAO,EAAqB,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGxD,OAAO,EAAE,KAAK,WAAW,EAAc,MAAM,QAAQ,CAAC;AAKtD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,YAAY,UAAW,iBAAiB,KAAG,WAAW,GAAG,SAKrE,CAAC"}
@@ -1,8 +1,11 @@
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
5
  export * from './components';
5
6
  export * from './extensions';
6
7
  export * from './hooks';
8
+ export { getToken } from './styles';
7
9
  export * from './themes';
10
+ export * from './util';
8
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,4CAA4C,CAAC;AACtE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
1
+ {"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,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;AAG1C,eAAO,MAAM,UAAU,QAAsF,CAAC;AAG9G,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"}
@@ -4,4 +4,5 @@ export type ThemeStyles = {
4
4
  [selector: string]: StyleSpec;
5
5
  };
6
6
  export declare const tokens: TailwindConfig['theme'];
7
+ export declare const getToken: (path: string, defaultValue?: any) => any;
7
8
  //# sourceMappingURL=tokens.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../../src/styles/tokens.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,OAAO,CAA4B,CAAC"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../../src/styles/tokens.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B,CAAC;AAGF,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,OAAO,CAA4B,CAAC;AAExE,eAAO,MAAM,QAAQ,SAAU,MAAM,iBAAgB,GAAG,QAAgD,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,WA8P1B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,WAOvB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,WAK3B,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,WAiO1B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,WAOvB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,WAO3B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,WAOvB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Transaction } from '@codemirror/state';
2
+ /**
3
+ * CodeMirror callbacks swallow errors so wrap handlers.
4
+ */
5
+ export declare const callbackWrapper: <T extends Function>(fn: T) => T;
6
+ export declare const logChanges: (trs: readonly Transaction[]) => void;
7
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
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-next.0fb359e",
3
+ "version": "0.3.11-next.e28df4f",
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.17.4",
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,55 +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-next.0fb359e",
42
- "@dxos/automerge": "0.3.11-next.0fb359e",
43
- "@dxos/context": "0.3.11-next.0fb359e",
44
- "@dxos/debug": "0.3.11-next.0fb359e",
45
- "@dxos/display-name": "0.3.11-next.0fb359e",
46
- "@dxos/echo-schema": "0.3.11-next.0fb359e",
47
- "@dxos/protocols": "0.3.11-next.0fb359e",
48
- "@dxos/invariant": "0.3.11-next.0fb359e",
49
- "@dxos/react-async": "0.3.11-next.0fb359e",
50
- "@dxos/log": "0.3.11-next.0fb359e",
51
- "@dxos/react-ui": "0.3.11-next.0fb359e",
52
- "@dxos/react-ui-theme": "0.3.11-next.0fb359e",
53
- "@dxos/text-model": "0.3.11-next.0fb359e",
54
- "@dxos/util": "0.3.11-next.0fb359e"
39
+ "@dxos/async": "0.3.11-next.e28df4f",
40
+ "@dxos/automerge": "0.3.11-next.e28df4f",
41
+ "@dxos/context": "0.3.11-next.e28df4f",
42
+ "@dxos/display-name": "0.3.11-next.e28df4f",
43
+ "@dxos/echo-schema": "0.3.11-next.e28df4f",
44
+ "@dxos/invariant": "0.3.11-next.e28df4f",
45
+ "@dxos/debug": "0.3.11-next.e28df4f",
46
+ "@dxos/log": "0.3.11-next.e28df4f",
47
+ "@dxos/protocols": "0.3.11-next.e28df4f",
48
+ "@dxos/react-async": "0.3.11-next.e28df4f",
49
+ "@dxos/react-ui-theme": "0.3.11-next.e28df4f",
50
+ "@dxos/react-ui": "0.3.11-next.e28df4f",
51
+ "@dxos/text-model": "0.3.11-next.e28df4f",
52
+ "@dxos/util": "0.3.11-next.e28df4f"
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/echo-signals": "0.3.11-next.0fb359e",
71
- "@dxos/echo-typegen": "0.3.11-next.0fb359e",
72
- "@dxos/config": "0.3.11-next.0fb359e",
73
- "@dxos/react-client": "0.3.11-next.0fb359e",
74
- "@dxos/storybook-utils": "0.3.11-next.0fb359e",
75
- "@dxos/react-ui": "0.3.11-next.0fb359e"
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-next.e28df4f",
81
+ "@dxos/echo-typegen": "0.3.11-next.e28df4f",
82
+ "@dxos/echo-signals": "0.3.11-next.e28df4f",
83
+ "@dxos/keyboard": "0.3.11-next.e28df4f",
84
+ "@dxos/react-ui": "0.3.11-next.e28df4f",
85
+ "@dxos/react-client": "0.3.11-next.e28df4f",
86
+ "@dxos/storybook-utils": "0.3.11-next.e28df4f"
76
87
  },
77
88
  "peerDependencies": {
78
89
  "@phosphor-icons/react": "^2.0.5",
79
90
  "react": "^18.2.0",
80
91
  "react-dom": "^18.2.0",
81
- "@dxos/react-client": "0.3.11-next.0fb359e"
92
+ "@dxos/react-client": "0.3.11-next.e28df4f"
82
93
  },
83
94
  "publishConfig": {
84
95
  "access": "public"
85
96
  },
86
97
  "scripts": {
87
- "prebuild": "dxtype src/testing/proto/schema.proto src/testing/proto/gen/schema.ts"
98
+ "vitest": "vitest --ui"
88
99
  }
89
100
  }
@@ -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,34 +12,32 @@ 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 {
22
+ type CommentsOptions,
23
+ type LinkOptions,
21
24
  autocomplete,
22
25
  blast,
23
26
  code,
24
27
  comments,
25
28
  defaultOptions,
29
+ heading,
26
30
  hr,
27
31
  image,
28
- listener,
29
32
  link,
30
33
  mention,
31
34
  table,
32
35
  tasklist,
33
36
  typewriter,
34
- type CommentsOptions,
35
- type LinkOptions,
36
- mermaid,
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',
@@ -123,8 +121,6 @@ const text = {
123
121
 
124
122
  paragraphs: str(...faker.helpers.multiple(() => [faker.lorem.paragraph(), ''], { count: 3 }).flat()),
125
123
 
126
- mermaid: str('```mermaid', 'graph TD;', 'A-->B;', 'A-->C;', 'B-->D;', 'C-->D;', '```'),
127
-
128
124
  footer: str('', '', '', '', '')
129
125
  };
130
126
 
@@ -164,6 +160,8 @@ const links = [
164
160
  { label: 'StackEdit', apply: '[StackEdit](https://stackedit.io/app)' },
165
161
  ];
166
162
 
163
+ const names = ['adam', 'alice', 'alison', 'bob', 'carol', 'charlie', 'sayuri', 'shoko'];
164
+
167
165
  const hover =
168
166
  'rounded-sm text-base text-primary-600 hover:text-primary-500 dark:text-primary-300 hover:dark:text-primary-200';
169
167
 
@@ -185,15 +183,15 @@ const Key: FC<{ char: string }> = ({ char }) => (
185
183
  </span>
186
184
  );
187
185
 
188
- const onCommentsHover: CommentsOptions['onHover'] = (el) => {
186
+ const onCommentsHover: CommentsOptions['onHover'] = (el, shortcut) => {
189
187
  createRoot(el).render(
190
188
  <StrictMode>
191
189
  <div className='flex items-center gap-2 px-2 py-2 bg-neutral-700 text-white text-xs rounded'>
192
190
  <div>Create comment</div>
193
- {/* TODO(burdon): Unify shortcuts. */}
194
191
  <div className='flex gap-1'>
195
- <Key char='⌘' />
196
- <Key char="'" />
192
+ {keySymbols(parseShortcut(shortcut)).map((char) => (
193
+ <Key key={char} char={char} />
194
+ ))}
197
195
  </div>
198
196
  </div>
199
197
  </StrictMode>,
@@ -204,7 +202,7 @@ const onRenderLink: LinkOptions['onRender'] = (el, url) => {
204
202
  createRoot(el).render(
205
203
  <StrictMode>
206
204
  <a href={url} target='_blank' rel='noreferrer' className={hover}>
207
- <ArrowSquareOut weight='bold' className={mx(getSize(4), 'inline-block leading-none mis-1 mb-1')} />
205
+ <ArrowSquareOut weight='bold' className={mx(getSize(4), 'inline-block leading-none mis-1 mb-[2px]')} />
208
206
  </a>
209
207
  </StrictMode>,
210
208
  );
@@ -212,23 +210,23 @@ const onRenderLink: LinkOptions['onRender'] = (el, url) => {
212
210
 
213
211
  type StoryProps = {
214
212
  text?: string;
215
- automerge?: boolean;
216
- } & Pick<TextEditorProps, 'comments' | 'readonly' | 'extensions' | 'slots'>;
213
+ comments?: Comment[];
214
+ } & Pick<TextEditorProps, 'readonly' | 'placeholder' | 'slots' | 'extensions'>;
217
215
 
218
- const Story = ({ text, automerge, ...props }: StoryProps) => {
219
- const ref = useRef<TextEditorRef>(null);
220
- 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);
221
219
  const model = useTextModel({ text: item.text });
220
+ useComments(view.current, comments);
222
221
  if (!model) {
223
222
  return null;
224
223
  }
225
224
 
226
225
  return (
227
226
  <div className={mx(fixedInsetFlexLayout, groupSurface)}>
228
- <div className='flex justify-center overflow-y-scroll'>
229
- <div className='flex flex-col w-[800px] py-16'>
230
- <MarkdownEditor ref={ref} model={model} {...props} />
231
- <div className='flex shrink-0 h-[300px]'></div>
227
+ <div className='flex h-full justify-center'>
228
+ <div className='flex flex-col h-full w-[800px]'>
229
+ <MarkdownEditor ref={view} model={model} placeholder={placeholder} {...props} />
232
230
  </div>
233
231
  </div>
234
232
  </div>
@@ -242,11 +240,13 @@ export default {
242
240
  render: Story,
243
241
  };
244
242
 
245
- const extensions = [
243
+ const defaults = [
246
244
  autocomplete({
247
245
  onSearch: (text) => links.filter(({ label }) => label.toLowerCase().includes(text.toLowerCase())),
248
246
  }),
249
247
  code(),
248
+ formatting(),
249
+ heading(),
250
250
  hr(),
251
251
  image(),
252
252
  link({ onRender: onRenderLink, onHover: onHoverLinkTooltip }),
@@ -255,25 +255,25 @@ const extensions = [
255
255
  ];
256
256
 
257
257
  export const Default = {
258
- render: () => <Story text={document} extensions={extensions} />,
258
+ render: () => <Story text={document} extensions={defaults} />,
259
259
  };
260
260
 
261
261
  export const Readonly = {
262
- render: () => <Story text={document} extensions={extensions} readonly />,
262
+ render: () => <Story text={document} extensions={defaults} readonly />,
263
263
  };
264
264
 
265
265
  export const NoExtensions = {
266
266
  render: () => <Story text={document} />,
267
267
  };
268
268
 
269
- // TODO(burdon): Cursor bug if no newline after BR (cursor down just loops back to start of each paragraph).
270
- export const HorizontalRule = {
271
- render: () => (
272
- <Story
273
- text={str('# Horizontal Rule', '', text.paragraphs, '---', '', text.paragraphs, '---', '', text.paragraphs)}
274
- extensions={[hr()]}
275
- />
276
- ),
269
+ const large = faker.helpers.multiple(() => faker.lorem.paragraph({ min: 8, max: 16 }), { count: 20 }).join('\n\n');
270
+
271
+ export const Empty = {
272
+ render: () => <Story />,
273
+ };
274
+
275
+ export const Scrolling = {
276
+ render: () => <Story text={str('# Large Document', '', large)} extensions={[]} />,
277
277
  };
278
278
 
279
279
  export const Links = {
@@ -286,37 +286,36 @@ export const Links = {
286
286
  };
287
287
 
288
288
  export const Code = {
289
- render: () => <Story text={str(text.code, text.footer)} extensions={[code()]} readonly />,
290
- };
291
-
292
- export const Table = {
293
- render: () => <Story text={str(text.table, text.footer)} extensions={[table()]} />,
289
+ render: () => <Story text={str(text.code, text.footer)} extensions={[code()]} />,
294
290
  };
295
291
 
296
292
  export const Image = {
297
- render: () => <Story text={str(text.image, text.footer)} readonly extensions={[image()]} />,
293
+ render: () => <Story text={str(text.image, text.footer)} extensions={[image()]} />,
298
294
  };
299
295
 
300
- export const Tasklist = {
296
+ export const Lists = {
301
297
  render: () => (
302
- <Story
303
- text={str(text.tasks, '', text.list, text.footer)}
304
- extensions={[
305
- tasklist(),
306
- listener({
307
- onChange: (text) => {
308
- console.log(text);
309
- },
310
- }),
311
- ]}
312
- />
298
+ <Story text={str(text.tasks, '', text.list, '', text.numbered, text.footer)} extensions={[tasklist()]} />
313
299
  ),
314
300
  };
315
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
+
316
315
  export const Autocomplete = {
317
316
  render: () => (
318
317
  <Story
319
- text={str('# Autocomplete', '', 'Press CTRL-SPACE', text.footer)}
318
+ text={str('# Autocomplete', '', 'Press Ctrl-Space...', text.footer)}
320
319
  extensions={[
321
320
  link({ onRender: onRenderLink }),
322
321
  autocomplete({
@@ -327,8 +326,6 @@ export const Autocomplete = {
327
326
  ),
328
327
  };
329
328
 
330
- const names = ['adam', 'alice', 'alison', 'bob', 'carol', 'charlie', 'sayuri', 'shoko'];
331
-
332
329
  export const Mention = {
333
330
  render: () => (
334
331
  <Story
@@ -342,24 +339,20 @@ export const Mention = {
342
339
  ),
343
340
  };
344
341
 
345
- export const Mermaid = {
346
- render: () => <Story text={str('# Mermaid', '', text.mermaid, text.footer)} extensions={[code(), mermaid()]} />,
347
- };
348
-
349
342
  export const Comments = {
350
343
  render: () => {
351
- const [commentsStates, setCommentStates] = useState<CommentRange[]>([]);
344
+ const [_comments, setComments] = useState<Comment[]>([]);
352
345
 
353
346
  return (
354
347
  <Story
355
348
  text={str('# Comments', '', text.paragraphs, text.footer)}
356
- comments={commentsStates}
349
+ comments={_comments}
357
350
  extensions={[
358
351
  comments({
359
352
  onHover: onCommentsHover,
360
- onCreate: (relPos) => {
353
+ onCreate: (range) => {
361
354
  const id = PublicKey.random().toHex();
362
- setCommentStates((comments) => [...comments, { id, cursor: relPos }]);
355
+ setComments((commentRanges) => [...commentRanges, { id, cursor: range }]);
363
356
  return id;
364
357
  },
365
358
  onSelect: (state) => {
@@ -368,9 +361,9 @@ export const Comments = {
368
361
  console.log(
369
362
  'update',
370
363
  JSON.stringify({
371
- active: state.active?.slice(0, 8),
372
- closest: state.closest?.slice(0, 8),
373
- 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),
374
367
  }),
375
368
  );
376
369
  }
@@ -382,8 +375,24 @@ export const Comments = {
382
375
  },
383
376
  };
384
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
+
385
389
  export const Typewriter = {
386
- 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
+ ),
387
396
  };
388
397
 
389
398
  export const Blast = {
@@ -391,9 +400,7 @@ export const Blast = {
391
400
  <Story
392
401
  text={str('# Blast', '', text.paragraphs, text.code, text.paragraphs)}
393
402
  extensions={[
394
- typewriter({
395
- items: localStorage.getItem('dxos.composer.extension.demo')?.split(','),
396
- }),
403
+ typewriter({ items: typewriterItems }),
397
404
  blast(
398
405
  defaultsDeep(
399
406
  {
@@ -410,17 +417,3 @@ export const Blast = {
410
417
  />
411
418
  ),
412
419
  };
413
-
414
- export const Diagnostics = {
415
- render: () => (
416
- <Story
417
- text={document}
418
- extensions={[
419
- // Cursor moved.
420
- EditorView.updateListener.of((update) => {
421
- console.log('update', update.view.state.selection.main.head);
422
- }),
423
- ]}
424
- />
425
- ),
426
- };