@dxos/react-ui-editor 0.4.7-main.33db07e → 0.4.7-main.340e96b

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 (83) hide show
  1. package/dist/lib/browser/index.mjs +942 -742
  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 +9 -0
  5. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -1
  6. package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
  7. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts +0 -9
  8. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts.map +1 -1
  9. package/dist/types/src/components/TextEditor/index.d.ts +0 -2
  10. package/dist/types/src/components/TextEditor/index.d.ts.map +1 -1
  11. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  12. package/dist/types/src/{components/TextEditor → extensions/automerge}/automerge.stories.d.ts +4 -2
  13. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -0
  14. package/dist/types/src/extensions/command/command.d.ts +10 -0
  15. package/dist/types/src/extensions/command/command.d.ts.map +1 -0
  16. package/dist/types/src/extensions/command/hint.d.ts +7 -0
  17. package/dist/types/src/extensions/command/hint.d.ts.map +1 -0
  18. package/dist/types/src/extensions/command/index.d.ts +2 -0
  19. package/dist/types/src/extensions/command/index.d.ts.map +1 -0
  20. package/dist/types/src/extensions/command/state.d.ts +18 -0
  21. package/dist/types/src/extensions/command/state.d.ts.map +1 -0
  22. package/dist/types/src/extensions/cursor-line-margin.d.ts.map +1 -1
  23. package/dist/types/src/extensions/dnd.d.ts +3 -0
  24. package/dist/types/src/extensions/dnd.d.ts.map +1 -0
  25. package/dist/types/src/extensions/index.d.ts +2 -1
  26. package/dist/types/src/extensions/index.d.ts.map +1 -1
  27. package/dist/types/src/extensions/listener.d.ts +1 -1
  28. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  29. package/dist/types/src/extensions/markdown/bundle.d.ts +2 -2
  30. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  31. package/dist/types/src/extensions/markdown/decorate.d.ts +3 -0
  32. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  33. package/dist/types/src/extensions/util/dom.d.ts +15 -0
  34. package/dist/types/src/extensions/util/dom.d.ts.map +1 -0
  35. package/dist/types/src/hooks/defs.d.ts +5 -11
  36. package/dist/types/src/hooks/defs.d.ts.map +1 -1
  37. package/dist/types/src/hooks/useEditorView.d.ts.map +1 -1
  38. package/dist/types/src/hooks/useTextEditor.d.ts +20 -5
  39. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  40. package/dist/types/src/{components/TextEditor/hooks.stories.d.ts → hooks/useTextEditor.stories.d.ts} +1 -3
  41. package/dist/types/src/hooks/useTextEditor.stories.d.ts.map +1 -0
  42. package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
  43. package/dist/types/src/index.d.ts +1 -0
  44. package/dist/types/src/index.d.ts.map +1 -1
  45. package/dist/types/src/styles/index.d.ts +0 -1
  46. package/dist/types/src/styles/index.d.ts.map +1 -1
  47. package/dist/types/src/themes/default.d.ts.map +1 -1
  48. package/package.json +31 -31
  49. package/src/components/TextEditor/MarkdownEditor.stories.tsx +95 -8
  50. package/src/components/TextEditor/TextEditor.stories.tsx +0 -15
  51. package/src/components/TextEditor/TextEditor.tsx +11 -6
  52. package/src/components/TextEditor/index.ts +0 -3
  53. package/src/components/Toolbar/Toolbar.stories.tsx +2 -1
  54. package/src/{components/TextEditor → extensions/automerge}/automerge.stories.tsx +32 -37
  55. package/src/extensions/awareness.ts +3 -3
  56. package/src/extensions/command/command.ts +35 -0
  57. package/src/extensions/command/hint.ts +76 -0
  58. package/src/extensions/command/index.ts +5 -0
  59. package/src/extensions/command/state.ts +106 -0
  60. package/src/extensions/cursor-line-margin.ts +2 -1
  61. package/src/extensions/dnd.ts +15 -0
  62. package/src/extensions/index.ts +2 -1
  63. package/src/extensions/listener.ts +3 -3
  64. package/src/extensions/markdown/bundle.ts +4 -14
  65. package/src/extensions/markdown/decorate.ts +21 -14
  66. package/src/extensions/util/dom.ts +36 -0
  67. package/src/hooks/defs.ts +6 -20
  68. package/src/hooks/useActionHandler.ts +11 -11
  69. package/src/hooks/useEditorView.ts +0 -1
  70. package/src/{components/TextEditor/hooks.stories.tsx → hooks/useTextEditor.stories.tsx} +8 -8
  71. package/src/hooks/useTextEditor.ts +69 -14
  72. package/src/hooks/useTextModel.ts +20 -18
  73. package/src/index.ts +2 -0
  74. package/src/styles/index.ts +0 -1
  75. package/src/themes/default.ts +1 -0
  76. package/dist/types/src/components/TextEditor/automerge.stories.d.ts.map +0 -1
  77. package/dist/types/src/components/TextEditor/hooks.stories.d.ts.map +0 -1
  78. package/dist/types/src/extensions/basic.d.ts +0 -9
  79. package/dist/types/src/extensions/basic.d.ts.map +0 -1
  80. package/dist/types/src/styles/cursors.d.ts +0 -5
  81. package/dist/types/src/styles/cursors.d.ts.map +0 -1
  82. package/src/extensions/basic.ts +0 -41
  83. package/src/styles/cursors.ts +0 -21
@@ -1,4 +1,4 @@
1
- import { type Extension, StateField } from '@codemirror/state';
1
+ import { type Extension } from '@codemirror/state';
2
2
  import { type DocAccessor } from '@dxos/echo-schema';
3
3
  export type Range = {
4
4
  from: number;
@@ -8,19 +8,13 @@ export type Comment = {
8
8
  id: string;
9
9
  cursor?: string;
10
10
  };
11
+ /**
12
+ * @deprecated
13
+ */
11
14
  export type EditorModel = {
12
15
  id: string;
13
16
  text: () => string;
14
- extension?: Extension;
15
17
  content: string | DocAccessor;
16
- peer?: {
17
- id: string;
18
- name?: string;
19
- };
18
+ extension?: Extension;
20
19
  };
21
- /**
22
- * State field makes the model available to other extensions.
23
- * @deprecated
24
- */
25
- export declare const modelState: StateField<EditorModel | undefined>;
26
20
  //# sourceMappingURL=defs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"defs.d.ts","sourceRoot":"","sources":["../../../../src/hooks/defs.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAGF,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,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,WAAW,CAAC;IAG9B,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH,CAAC;AAEF;;;GAGG;AAEH,eAAO,MAAM,UAAU,qCAGrB,CAAC"}
1
+ {"version":3,"file":"defs.d.ts","sourceRoot":"","sources":["../../../../src/hooks/defs.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAGF,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;GAEG;AAEH,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC;IAC9B,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useEditorView.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useEditorView.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,gBAAgB,EAAoB,MAAM,OAAO,CAAC;AAEhE;;;;;;;;;;;;;;;GAeG;AAEH,eAAO,MAAM,aAAa,OAAQ,MAAM,KAAG,CAAC,iBAAiB,UAAU,GAAG,IAAI,CAAC,EAAE,OAAO,CAQvF,CAAC"}
1
+ {"version":3,"file":"useEditorView.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useEditorView.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,gBAAgB,EAAoB,MAAM,OAAO,CAAC;AAEhE;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,aAAa,OAAQ,MAAM,KAAG,CAAC,iBAAiB,UAAU,GAAG,IAAI,CAAC,EAAE,OAAO,CAQvF,CAAC"}
@@ -16,16 +16,31 @@ export type UseTextEditor = {
16
16
  * Hook for creating editor.
17
17
  */
18
18
  export declare const useTextEditor: ({ autoFocus, scrollTo, debug, doc, selection, extensions }?: UseTextEditorOptions, deps?: DependencyList) => UseTextEditor;
19
- export type DataExtensionsOptions = {
19
+ /**
20
+ * https://codemirror.net/docs/extensions
21
+ * https://github.com/codemirror/basic-setup
22
+ */
23
+ export type BasicExtensionsOptions = {
24
+ allowMultipleSelections?: boolean;
25
+ bracketMatching?: boolean;
26
+ closeBrackets?: boolean;
27
+ crosshairCursor?: boolean;
28
+ dropCursor?: boolean;
29
+ drawSelection?: boolean;
30
+ editable?: boolean;
31
+ highlightActiveLine?: boolean;
32
+ history?: boolean;
33
+ lineNumbers?: boolean;
34
+ lineWrapping?: boolean;
35
+ placeholder?: string;
20
36
  readonly?: boolean;
37
+ scrollPastEnd?: boolean;
38
+ tabSize?: number;
21
39
  };
22
- export declare const createDataExtensions: ({ readonly }?: {
23
- readonly?: boolean | undefined;
24
- }) => Extension;
40
+ export declare const createBasicExtensions: (_props?: BasicExtensionsOptions) => Extension;
25
41
  export type ThemeExtensionsOptions = {
26
42
  theme?: ThemeStyles;
27
43
  themeMode?: ThemeMode;
28
- lineWrap?: boolean;
29
44
  slots?: {
30
45
  editor?: {
31
46
  className?: string;
@@ -1 +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,cAAc,EAAE,KAAK,SAAS,EAA+B,MAAM,OAAO,CAAC;AAGzF,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAI7C,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;AAGtB,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF;;GAEG;AAEH,eAAO,MAAM,aAAa,gEACoC,oBAAoB,SACzE,cAAc,KACpB,aAuEF,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
+ {"version":3,"file":"useTextEditor.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextEditor.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAIL,UAAU,EAKX,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAA+B,MAAM,OAAO,CAAC;AAGzF,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAI7C,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;AAGtB,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF;;GAEG;AAEH,eAAO,MAAM,aAAa,gEACoC,oBAAoB,4BAE/E,aAuEF,CAAC;AAIF;;;GAGG;AAEH,MAAM,MAAM,sBAAsB,GAAG;IACnC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAWF,eAAO,MAAM,qBAAqB,YAAa,sBAAsB,KAAG,SAuBvE,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,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,SAQhG,CAAC"}
@@ -1,5 +1,4 @@
1
1
  import '@dxosTheme';
2
- import React from 'react';
3
2
  type StoryProps = {
4
3
  autoFocus?: boolean;
5
4
  placeholder?: string;
@@ -8,7 +7,6 @@ type StoryProps = {
8
7
  };
9
8
  declare const _default: {
10
9
  title: string;
11
- component: React.ForwardRefExoticComponent<import("./TextEditor").TextEditorProps & React.RefAttributes<import("@codemirror/view").EditorView | null>>;
12
10
  decorators: import("@storybook/react").Decorator[];
13
11
  render: (args: StoryProps) => JSX.Element;
14
12
  parameters: {
@@ -42,4 +40,4 @@ export declare const Default: {
42
40
  doc: string;
43
41
  };
44
42
  };
45
- //# sourceMappingURL=hooks.stories.d.ts.map
43
+ //# sourceMappingURL=useTextEditor.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTextEditor.stories.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextEditor.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,YAAY,CAAC;AA8BpB,KAAK,UAAU,GAAG;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;;;;mBAiFe,UAAU;;;;;;;;;;;;;;;;;;;;;;;;AAJ3B,wBAUE;AAEF,eAAO,MAAM,OAAO;;;;;;CAMnB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTextModel.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextModel.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAqB,MAAM,OAAO,CAAC;AAK9E,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;AAEtD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAGhE,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,CAAC;AAGF,eAAO,MAAM,iBAAiB,kCAAmC,sBAAsB,KAAG,SAAS,EAmBlG,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF;;GAEG;AAEH,eAAO,MAAM,YAAY,UAAW,iBAAiB,KAAG,WAAW,GAAG,SACb,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,oBAAoB;QAI3B,MAAM;;;gBAEoB,SAAS,eAAe,MAAM,CAAC,CAAC;CAG/D,CAAC"}
1
+ {"version":3,"file":"useTextModel.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTextModel.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAqB,MAAM,OAAO,CAAC;AAK9E,OAAO,EAAqB,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAKxD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE1C,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,CAAC;AAGF,eAAO,MAAM,iBAAiB,kCAAmC,sBAAsB,KAAG,SAAS,EAuBlG,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF;;GAEG;AAEH,eAAO,MAAM,YAAY,UAAW,iBAAiB,KAAG,WAAW,GAAG,SACb,CAAC;AAE1D;;;GAGG;AAEH,eAAO,MAAM,oBAAoB;QAI3B,MAAM;;;gBAEoB,SAAS,eAAe,MAAM,CAAC,CAAC;CAG/D,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import translations from './translations';
2
2
  export { type Extension, type EditorState } from '@codemirror/state';
3
3
  export { type EditorView, keymap } from '@codemirror/view';
4
+ export { tags } from '@lezer/highlight';
4
5
  export { TextKind } from '@dxos/protocols/proto/dxos/echo/model/text';
5
6
  export { Doc, YText, YXmlFragment } from '@dxos/text-model';
6
7
  export * from './components';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,MAAM,4CAA4C,CAAC;AACtE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE5D,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAC3G,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,4CAA4C,CAAC;AACtE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE5D,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAC3G,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -1,4 +1,3 @@
1
- export * from './cursors';
2
1
  export * from './markdown';
3
2
  export * from './tokens';
4
3
  export * from './layout';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/styles/index.ts"],"names":[],"mappings":"AAIA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/styles/index.ts"],"names":[],"mappings":"AAIA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,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,WA+O1B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,WAOvB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,WAO3B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,WAOvB,CAAC"}
1
+ {"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../../../src/themes/default.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,WAAW,EAAU,MAAM,WAAW,CAAC;AAKrD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,EAAE,WAgP1B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,WAOvB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,WAO3B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,WAOvB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/react-ui-editor",
3
- "version": "0.4.7-main.33db07e",
3
+ "version": "0.4.7-main.340e96b",
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",
@@ -23,7 +23,7 @@
23
23
  "@codemirror/search": "^6.5.5",
24
24
  "@codemirror/state": "^6.4.0",
25
25
  "@codemirror/theme-one-dark": "^6.1.2",
26
- "@codemirror/view": "^6.23.0",
26
+ "@codemirror/view": "^6.25.0",
27
27
  "@fluentui/react-tabster": "^9.19.0",
28
28
  "@lezer/common": "^1.2.1",
29
29
  "@lezer/highlight": "^1.2.0",
@@ -37,20 +37,20 @@
37
37
  "lodash.pick": "^4.4.0",
38
38
  "lodash.sortby": "^4.7.0",
39
39
  "style-mod": "^4.1.0",
40
- "@dxos/async": "0.4.7-main.33db07e",
41
- "@dxos/automerge": "0.4.7-main.33db07e",
42
- "@dxos/context": "0.4.7-main.33db07e",
43
- "@dxos/display-name": "0.4.7-main.33db07e",
44
- "@dxos/echo-schema": "0.4.7-main.33db07e",
45
- "@dxos/debug": "0.4.7-main.33db07e",
46
- "@dxos/invariant": "0.4.7-main.33db07e",
47
- "@dxos/protocols": "0.4.7-main.33db07e",
48
- "@dxos/log": "0.4.7-main.33db07e",
49
- "@dxos/react-async": "0.4.7-main.33db07e",
50
- "@dxos/react-ui-theme": "0.4.7-main.33db07e",
51
- "@dxos/text-model": "0.4.7-main.33db07e",
52
- "@dxos/react-ui": "0.4.7-main.33db07e",
53
- "@dxos/util": "0.4.7-main.33db07e"
40
+ "@dxos/async": "0.4.7-main.340e96b",
41
+ "@dxos/automerge": "0.4.7-main.340e96b",
42
+ "@dxos/context": "0.4.7-main.340e96b",
43
+ "@dxos/display-name": "0.4.7-main.340e96b",
44
+ "@dxos/debug": "0.4.7-main.340e96b",
45
+ "@dxos/invariant": "0.4.7-main.340e96b",
46
+ "@dxos/log": "0.4.7-main.340e96b",
47
+ "@dxos/echo-schema": "0.4.7-main.340e96b",
48
+ "@dxos/protocols": "0.4.7-main.340e96b",
49
+ "@dxos/react-async": "0.4.7-main.340e96b",
50
+ "@dxos/react-ui-theme": "0.4.7-main.340e96b",
51
+ "@dxos/react-ui": "0.4.7-main.340e96b",
52
+ "@dxos/text-model": "0.4.7-main.340e96b",
53
+ "@dxos/util": "0.4.7-main.340e96b"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@automerge/automerge-repo-network-broadcastchannel": "^1.1.1",
@@ -66,34 +66,34 @@
66
66
  "@types/react": "^18.0.21",
67
67
  "@types/react-dom": "^18.0.6",
68
68
  "@types/react-test-renderer": "^17.0.2",
69
- "@vitest/browser": "^1.2.2",
70
- "@vitest/ui": "^1.2.2",
69
+ "@vitest/browser": "^1.3.1",
70
+ "@vitest/ui": "^1.3.1",
71
71
  "deepsignal": "^1.5.0",
72
72
  "happy-dom": "^13.3.1",
73
73
  "jsdom": "^20.0.1",
74
74
  "react": "^18.2.0",
75
75
  "react-dom": "^18.2.0",
76
76
  "react-test-renderer": "^18.2.0",
77
- "vite": "^5.1.3",
77
+ "vite": "^5.1.5",
78
78
  "vite-plugin-top-level-await": "^1.4.1",
79
79
  "vite-plugin-wasm": "^3.3.0",
80
- "vitest": "^1.2.2",
81
- "@dxos/config": "0.4.7-main.33db07e",
82
- "@dxos/echo-typegen": "0.4.7-main.33db07e",
83
- "@dxos/echo-signals": "0.4.7-main.33db07e",
84
- "@dxos/random": "0.4.7-main.33db07e",
85
- "@dxos/keyboard": "0.4.7-main.33db07e",
86
- "@dxos/react-client": "0.4.7-main.33db07e",
87
- "@dxos/react-ui": "0.4.7-main.33db07e",
88
- "@dxos/storybook-utils": "0.4.7-main.33db07e"
80
+ "vitest": "^1.3.1",
81
+ "@dxos/config": "0.4.7-main.340e96b",
82
+ "@dxos/echo-signals": "0.4.7-main.340e96b",
83
+ "@dxos/echo-typegen": "0.4.7-main.340e96b",
84
+ "@dxos/keyboard": "0.4.7-main.340e96b",
85
+ "@dxos/random": "0.4.7-main.340e96b",
86
+ "@dxos/react-client": "0.4.7-main.340e96b",
87
+ "@dxos/storybook-utils": "0.4.7-main.340e96b",
88
+ "@dxos/react-ui": "0.4.7-main.340e96b"
89
89
  },
90
90
  "peerDependencies": {
91
91
  "@phosphor-icons/react": "^2.0.5",
92
- "@vitest/browser": "^1.2.2",
93
- "@vitest/ui": "^1.2.2",
92
+ "@vitest/browser": "^1.3.1",
93
+ "@vitest/ui": "^1.3.1",
94
94
  "react": "^18.2.0",
95
95
  "react-dom": "^18.2.0",
96
- "@dxos/react-client": "0.4.7-main.33db07e"
96
+ "@dxos/react-client": "0.4.7-main.340e96b"
97
97
  },
98
98
  "publishConfig": {
99
99
  "access": "public"
@@ -3,36 +3,43 @@
3
3
  //
4
4
 
5
5
  import '@dxosTheme';
6
+
6
7
  import { type EditorView } from '@codemirror/view';
7
- import { ArrowSquareOut } from '@phosphor-icons/react';
8
+ import { ArrowSquareOut, X } from '@phosphor-icons/react';
8
9
  import defaultsDeep from 'lodash.defaultsdeep';
9
- import React, { type FC, StrictMode, useRef, useState } from 'react';
10
+ import React, { type FC, type KeyboardEvent, StrictMode, useRef, useState } from 'react';
10
11
  import { createRoot } from 'react-dom/client';
11
12
 
12
13
  import { TextObject } from '@dxos/echo-schema';
13
14
  import { keySymbols, parseShortcut } from '@dxos/keyboard';
14
15
  import { PublicKey } from '@dxos/keys';
15
16
  import { faker } from '@dxos/random';
16
- import { getSize, mx, textBlockWidth } from '@dxos/react-ui-theme';
17
+ import { Button, DensityProvider, Input, ThemeProvider } from '@dxos/react-ui';
18
+ import { baseSurface, defaultTx, getSize, mx, textBlockWidth } from '@dxos/react-ui-theme';
17
19
  import { withTheme } from '@dxos/storybook-utils';
18
20
 
19
21
  import { MarkdownEditor, type TextEditorProps } from './TextEditor';
20
22
  import {
21
- type CommentsOptions,
23
+ annotations,
22
24
  autocomplete,
23
25
  blast,
24
- decorateMarkdown,
26
+ command,
25
27
  comments,
28
+ decorateMarkdown,
26
29
  defaultOptions,
30
+ dnd,
31
+ formatting,
27
32
  image,
28
33
  linkTooltip,
29
34
  mention,
30
35
  table,
31
36
  typewriter,
32
37
  useComments,
33
- formatting,
34
- annotations,
35
38
  EditorModes,
39
+ type CommandAction,
40
+ type CommandOptions,
41
+ type CommentsOptions,
42
+ listener,
36
43
  } from '../../extensions';
37
44
  import { type Comment, useTextModel } from '../../hooks';
38
45
  import translations from '../../translations';
@@ -238,7 +245,7 @@ const Story = ({ id = 'test', text, comments, placeholder = 'New document.', ...
238
245
  placeholder={placeholder}
239
246
  slots={{
240
247
  root: { className: mx(textBlockWidth, 'min-bs-dvh') },
241
- editor: { className: 'min-bs-dvh p-2 bg-white dark:bg-black' },
248
+ editor: { className: 'min-bs-dvh px-8 bg-white dark:bg-black' },
242
249
  }}
243
250
  {...props}
244
251
  />
@@ -353,6 +360,64 @@ export const Mention = {
353
360
  ),
354
361
  };
355
362
 
363
+ const CommandDialog: FC<{ onClose: (action?: CommandAction) => void }> = ({ onClose }) => {
364
+ const [text, setText] = useState('');
365
+ const handleInsert = () => {
366
+ onClose(text.length ? { insert: text + '\n' } : undefined);
367
+ };
368
+
369
+ const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
370
+ switch (event.key) {
371
+ case 'Enter': {
372
+ handleInsert();
373
+ break;
374
+ }
375
+ case 'Escape': {
376
+ onClose();
377
+ break;
378
+ }
379
+ }
380
+ };
381
+
382
+ return (
383
+ <DensityProvider density='fine'>
384
+ <div className={mx('flex items-center p-2 gap-2 border rounded-md', baseSurface)}>
385
+ <Input.Root>
386
+ <Input.TextInput
387
+ autoFocus={true}
388
+ placeholder='Enter command.'
389
+ value={text}
390
+ onChange={({ target: { value } }) => setText(value)}
391
+ onKeyDown={handleKeyDown}
392
+ />
393
+ </Input.Root>
394
+ <Button variant='ghost' classNames='pli-0' onClick={() => onClose()}>
395
+ <X className={getSize(5)} />
396
+ </Button>
397
+ </div>
398
+ </DensityProvider>
399
+ );
400
+ };
401
+
402
+ const renderCommandDialog: CommandOptions['onRender'] = (el, onClose) => {
403
+ createRoot(el).render(
404
+ <StrictMode>
405
+ <ThemeProvider tx={defaultTx}>
406
+ <CommandDialog onClose={onClose} />
407
+ </ThemeProvider>
408
+ </StrictMode>,
409
+ );
410
+ };
411
+
412
+ export const Command = {
413
+ render: () => (
414
+ <Story
415
+ text={str('# Command', '')}
416
+ extensions={[command({ onRender: renderCommandDialog, onHint: () => 'Press / for commands.' })]}
417
+ />
418
+ ),
419
+ };
420
+
356
421
  export const Comments = {
357
422
  render: () => {
358
423
  const [_comments, setComments] = useState<Comment[]>([]);
@@ -402,8 +467,30 @@ export const Annotations = {
402
467
  render: () => <Story text={str('# Annotations', '', large)} extensions={[annotations({ match: /volup/gi })]} />,
403
468
  };
404
469
 
470
+ export const DND = {
471
+ render: () => <Story text={str('# DND', '')} extensions={[dnd()]} />,
472
+ };
473
+
405
474
  const typewriterItems = localStorage.getItem('dxos.org/plugin/markdown/typewriter')?.split(',');
406
475
 
476
+ export const Listener = {
477
+ render: () => (
478
+ <Story
479
+ text={str('# Listener', '', text.footer)}
480
+ extensions={[
481
+ listener({
482
+ onFocus: (focusing) => {
483
+ console.log({ focusing });
484
+ },
485
+ onChange: (text) => {
486
+ console.log({ text });
487
+ },
488
+ }),
489
+ ]}
490
+ />
491
+ ),
492
+ };
493
+
407
494
  export const Typewriter = {
408
495
  render: () => (
409
496
  <Story
@@ -11,7 +11,6 @@ import { mx, textBlockWidth } from '@dxos/react-ui-theme';
11
11
  import { withTheme } from '@dxos/storybook-utils';
12
12
 
13
13
  import { TextEditor, type TextEditorProps } from './TextEditor';
14
- import { listener } from '../../extensions';
15
14
  import { useTextModel } from '../../hooks';
16
15
  import translations from '../../translations';
17
16
 
@@ -57,19 +56,5 @@ export default {
57
56
  };
58
57
 
59
58
  export const Default = {
60
- render: () => <Story placeholder='Enter text...' />,
61
- };
62
-
63
- export const Text = {
64
59
  render: () => <Story text={initialText} placeholder='Enter text...' />,
65
60
  };
66
-
67
- export const Automerge = {
68
- render: () => <Story text={initialText} placeholder='Enter text...' automerge />,
69
- };
70
-
71
- export const Listener = {
72
- render: () => (
73
- <Story placeholder='Enter text...' extensions={[listener({ onChange: (text) => console.log(text) })]} />
74
- ),
75
- };
@@ -18,13 +18,14 @@ import React, {
18
18
  useMemo,
19
19
  } from 'react';
20
20
 
21
+ import { DocAccessor } from '@dxos/echo-schema';
21
22
  import { log } from '@dxos/log';
22
23
  import { useThemeContext } from '@dxos/react-ui';
23
24
  import { focusRing } from '@dxos/react-ui-theme';
24
25
  import { isNotFalsy } from '@dxos/util';
25
26
 
26
- import { createBasicBundle, createMarkdownExtensions, editorMode } from '../../extensions';
27
- import { type EditorModel } from '../../hooks';
27
+ import { createMarkdownExtensions, editorMode } from '../../extensions';
28
+ import { createBasicExtensions, createThemeExtensions, type EditorModel } from '../../hooks';
28
29
  import { type ThemeStyles } from '../../styles';
29
30
  import { defaultTheme, markdownTheme, textTheme } from '../../themes';
30
31
  import { logChanges } from '../../util';
@@ -114,7 +115,7 @@ export const BaseTextEditor = forwardRef<EditorView | null, TextEditorProps>(
114
115
  // https://codemirror.net/docs/ref/#state.EditorStateConfig
115
116
  //
116
117
  const state = EditorState.create({
117
- doc: model.text(),
118
+ doc: typeof model.content === 'string' ? model.content : DocAccessor.getValue(model.content),
118
119
  selection,
119
120
  extensions: [
120
121
  // TODO(burdon): Doesn't catch errors in keymap functions.
@@ -210,7 +211,7 @@ export const BaseTextEditor = forwardRef<EditorView | null, TextEditorProps>(
210
211
  <div
211
212
  role='none'
212
213
  ref={rootRef}
213
- key={model.id}
214
+ key={model.id} // TODO(burdon): Remove?
214
215
  tabIndex={0}
215
216
  onKeyUp={handleKeyUp}
216
217
  {...slots.root}
@@ -223,13 +224,17 @@ export const BaseTextEditor = forwardRef<EditorView | null, TextEditorProps>(
223
224
  // TODO(burdon): Replace with hooks.
224
225
  export const TextEditor = forwardRef<EditorView | null, TextEditorProps>(
225
226
  (
226
- { readonly, placeholder, lineWrapping, theme = textTheme, slots, extensions: _extensions, ...props },
227
+ { readonly, placeholder, lineWrapping = true, theme = textTheme, slots, extensions: _extensions, ...props },
227
228
  forwardedRef,
228
229
  ) => {
229
230
  const { themeMode } = useThemeContext();
230
231
  const updatedSlots = defaultsDeep({}, slots, defaultTextSlots);
231
232
  const extensions = useMemo(
232
- () => [createBasicBundle({ themeMode, placeholder, lineWrapping }), ...(_extensions ?? [])],
233
+ () => [
234
+ createBasicExtensions({ lineWrapping, placeholder }),
235
+ createThemeExtensions({ themeMode }),
236
+ ...(_extensions ?? []),
237
+ ],
233
238
  [themeMode, placeholder, lineWrapping, _extensions],
234
239
  );
235
240
 
@@ -2,7 +2,4 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export { tags } from '@lezer/highlight';
6
- export { type Extension } from '@codemirror/state';
7
-
8
5
  export * from './TextEditor';
@@ -61,12 +61,13 @@ const Story: FC<{ id?: string; content: string }> = ({ id = 'test', content }) =
61
61
  }
62
62
 
63
63
  return (
64
- <div role='none' className={mx('fixed inset-0 flex flex-col')}>
64
+ <div role='none' className='fixed inset-0 flex flex-col'>
65
65
  <Toolbar.Root onAction={handleAction} state={formattingState} classNames={textBlockWidth}>
66
66
  <Toolbar.Markdown />
67
67
  <Toolbar.Separator />
68
68
  <Toolbar.Extended />
69
69
  </Toolbar.Root>
70
+
70
71
  <MarkdownEditor
71
72
  ref={editorRef}
72
73
  model={model}