@dxos/react-ui-editor 0.4.6 → 0.4.7-main.06facb4
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.
- package/dist/lib/browser/index.mjs +970 -740
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts +9 -0
- package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts +0 -9
- package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/index.d.ts +0 -2
- package/dist/types/src/components/TextEditor/index.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
- package/dist/types/src/{components/TextEditor → extensions/automerge}/automerge.stories.d.ts +4 -2
- package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -0
- package/dist/types/src/extensions/command/command.d.ts +10 -0
- package/dist/types/src/extensions/command/command.d.ts.map +1 -0
- package/dist/types/src/extensions/command/hint.d.ts +7 -0
- package/dist/types/src/extensions/command/hint.d.ts.map +1 -0
- package/dist/types/src/extensions/command/index.d.ts +2 -0
- package/dist/types/src/extensions/command/index.d.ts.map +1 -0
- package/dist/types/src/extensions/command/state.d.ts +18 -0
- package/dist/types/src/extensions/command/state.d.ts.map +1 -0
- package/dist/types/src/extensions/cursor-line-margin.d.ts.map +1 -1
- package/dist/types/src/extensions/dnd.d.ts +3 -0
- package/dist/types/src/extensions/dnd.d.ts.map +1 -0
- package/dist/types/src/extensions/index.d.ts +2 -1
- package/dist/types/src/extensions/index.d.ts.map +1 -1
- package/dist/types/src/extensions/listener.d.ts +1 -1
- package/dist/types/src/extensions/listener.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/bundle.d.ts +2 -2
- package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/decorate.d.ts +4 -0
- package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
- package/dist/types/src/extensions/util/dom.d.ts +15 -0
- package/dist/types/src/extensions/util/dom.d.ts.map +1 -0
- package/dist/types/src/hooks/defs.d.ts +5 -11
- package/dist/types/src/hooks/defs.d.ts.map +1 -1
- package/dist/types/src/hooks/useEditorView.d.ts.map +1 -1
- package/dist/types/src/hooks/useTextEditor.d.ts +20 -5
- package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
- package/dist/types/src/{components/TextEditor/hooks.stories.d.ts → hooks/useTextEditor.stories.d.ts} +1 -3
- package/dist/types/src/hooks/useTextEditor.stories.d.ts.map +1 -0
- package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/styles/index.d.ts +0 -1
- package/dist/types/src/styles/index.d.ts.map +1 -1
- package/dist/types/src/themes/default.d.ts.map +1 -1
- package/package.json +25 -25
- package/src/components/TextEditor/MarkdownEditor.stories.tsx +95 -8
- package/src/components/TextEditor/TextEditor.stories.tsx +0 -15
- package/src/components/TextEditor/TextEditor.tsx +13 -6
- package/src/components/TextEditor/index.ts +0 -3
- package/src/components/Toolbar/Toolbar.stories.tsx +2 -1
- package/src/{components/TextEditor → extensions/automerge}/automerge.stories.tsx +32 -37
- package/src/extensions/awareness.ts +3 -3
- package/src/extensions/command/command.ts +35 -0
- package/src/extensions/command/hint.ts +76 -0
- package/src/extensions/command/index.ts +5 -0
- package/src/extensions/command/state.ts +106 -0
- package/src/extensions/cursor-line-margin.ts +2 -1
- package/src/extensions/dnd.ts +15 -0
- package/src/extensions/index.ts +2 -1
- package/src/extensions/listener.ts +3 -3
- package/src/extensions/markdown/bundle.ts +4 -15
- package/src/extensions/markdown/decorate.ts +75 -31
- package/src/extensions/util/dom.ts +36 -0
- package/src/hooks/defs.ts +6 -20
- package/src/hooks/useActionHandler.ts +11 -11
- package/src/hooks/useEditorView.ts +0 -1
- package/src/{components/TextEditor/hooks.stories.tsx → hooks/useTextEditor.stories.tsx} +8 -8
- package/src/hooks/useTextEditor.ts +69 -14
- package/src/hooks/useTextModel.ts +18 -18
- package/src/index.ts +2 -0
- package/src/styles/index.ts +0 -1
- package/src/themes/default.ts +1 -0
- package/dist/types/src/components/TextEditor/automerge.stories.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/hooks.stories.d.ts.map +0 -1
- package/dist/types/src/extensions/basic.d.ts +0 -9
- package/dist/types/src/extensions/basic.d.ts.map +0 -1
- package/dist/types/src/styles/cursors.d.ts +0 -5
- package/dist/types/src/styles/cursors.d.ts.map +0 -1
- package/src/extensions/basic.ts +0 -41
- package/src/styles/cursors.ts +0 -21
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Extension
|
|
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
|
-
|
|
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,
|
|
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;
|
|
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
|
-
|
|
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
|
|
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":"
|
|
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"}
|
package/dist/types/src/{components/TextEditor/hooks.stories.d.ts → hooks/useTextEditor.stories.d.ts}
RENAMED
|
@@ -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=
|
|
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;
|
|
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,EAsBlG,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":"
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/styles/index.ts"],"names":[],"mappings":"AAIA,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,
|
|
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.
|
|
3
|
+
"version": "0.4.7-main.06facb4",
|
|
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.
|
|
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/
|
|
41
|
-
"@dxos/
|
|
42
|
-
"@dxos/
|
|
43
|
-
"@dxos/
|
|
44
|
-
"@dxos/
|
|
45
|
-
"@dxos/
|
|
46
|
-
"@dxos/
|
|
47
|
-
"@dxos/
|
|
48
|
-
"@dxos/
|
|
49
|
-
"@dxos/
|
|
50
|
-
"@dxos/react-ui-theme": "0.4.
|
|
51
|
-
"@dxos/text-model": "0.4.
|
|
52
|
-
"@dxos/
|
|
53
|
-
"@dxos/
|
|
40
|
+
"@dxos/async": "0.4.7-main.06facb4",
|
|
41
|
+
"@dxos/context": "0.4.7-main.06facb4",
|
|
42
|
+
"@dxos/automerge": "0.4.7-main.06facb4",
|
|
43
|
+
"@dxos/debug": "0.4.7-main.06facb4",
|
|
44
|
+
"@dxos/display-name": "0.4.7-main.06facb4",
|
|
45
|
+
"@dxos/echo-schema": "0.4.7-main.06facb4",
|
|
46
|
+
"@dxos/invariant": "0.4.7-main.06facb4",
|
|
47
|
+
"@dxos/log": "0.4.7-main.06facb4",
|
|
48
|
+
"@dxos/protocols": "0.4.7-main.06facb4",
|
|
49
|
+
"@dxos/react-async": "0.4.7-main.06facb4",
|
|
50
|
+
"@dxos/react-ui-theme": "0.4.7-main.06facb4",
|
|
51
|
+
"@dxos/text-model": "0.4.7-main.06facb4",
|
|
52
|
+
"@dxos/util": "0.4.7-main.06facb4",
|
|
53
|
+
"@dxos/react-ui": "0.4.7-main.06facb4"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@automerge/automerge-repo-network-broadcastchannel": "^1.1.1",
|
|
@@ -78,14 +78,14 @@
|
|
|
78
78
|
"vite-plugin-top-level-await": "^1.4.1",
|
|
79
79
|
"vite-plugin-wasm": "^3.3.0",
|
|
80
80
|
"vitest": "^1.2.2",
|
|
81
|
-
"@dxos/
|
|
82
|
-
"@dxos/
|
|
83
|
-
"@dxos/
|
|
84
|
-
"@dxos/
|
|
85
|
-
"@dxos/
|
|
86
|
-
"@dxos/random": "0.4.
|
|
87
|
-
"@dxos/react-ui": "0.4.
|
|
88
|
-
"@dxos/
|
|
81
|
+
"@dxos/echo-typegen": "0.4.7-main.06facb4",
|
|
82
|
+
"@dxos/keyboard": "0.4.7-main.06facb4",
|
|
83
|
+
"@dxos/react-client": "0.4.7-main.06facb4",
|
|
84
|
+
"@dxos/config": "0.4.7-main.06facb4",
|
|
85
|
+
"@dxos/storybook-utils": "0.4.7-main.06facb4",
|
|
86
|
+
"@dxos/random": "0.4.7-main.06facb4",
|
|
87
|
+
"@dxos/react-ui": "0.4.7-main.06facb4",
|
|
88
|
+
"@dxos/echo-signals": "0.4.7-main.06facb4"
|
|
89
89
|
},
|
|
90
90
|
"peerDependencies": {
|
|
91
91
|
"@phosphor-icons/react": "^2.0.5",
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
"@vitest/ui": "^1.2.2",
|
|
94
94
|
"react": "^18.2.0",
|
|
95
95
|
"react-dom": "^18.2.0",
|
|
96
|
-
"@dxos/react-client": "0.4.
|
|
96
|
+
"@dxos/react-client": "0.4.7-main.06facb4"
|
|
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 {
|
|
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
|
-
|
|
23
|
+
annotations,
|
|
22
24
|
autocomplete,
|
|
23
25
|
blast,
|
|
24
|
-
|
|
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
|
|
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 {
|
|
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.
|
|
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}
|
|
@@ -220,15 +221,20 @@ export const BaseTextEditor = forwardRef<EditorView | null, TextEditorProps>(
|
|
|
220
221
|
},
|
|
221
222
|
);
|
|
222
223
|
|
|
224
|
+
// TODO(burdon): Replace with hooks.
|
|
223
225
|
export const TextEditor = forwardRef<EditorView | null, TextEditorProps>(
|
|
224
226
|
(
|
|
225
|
-
{ readonly, placeholder, lineWrapping, theme = textTheme, slots, extensions: _extensions, ...props },
|
|
227
|
+
{ readonly, placeholder, lineWrapping = true, theme = textTheme, slots, extensions: _extensions, ...props },
|
|
226
228
|
forwardedRef,
|
|
227
229
|
) => {
|
|
228
230
|
const { themeMode } = useThemeContext();
|
|
229
231
|
const updatedSlots = defaultsDeep({}, slots, defaultTextSlots);
|
|
230
232
|
const extensions = useMemo(
|
|
231
|
-
() => [
|
|
233
|
+
() => [
|
|
234
|
+
createBasicExtensions({ lineWrapping, placeholder }),
|
|
235
|
+
createThemeExtensions({ themeMode }),
|
|
236
|
+
...(_extensions ?? []),
|
|
237
|
+
],
|
|
232
238
|
[themeMode, placeholder, lineWrapping, _extensions],
|
|
233
239
|
);
|
|
234
240
|
|
|
@@ -245,6 +251,7 @@ export const TextEditor = forwardRef<EditorView | null, TextEditorProps>(
|
|
|
245
251
|
},
|
|
246
252
|
);
|
|
247
253
|
|
|
254
|
+
// TODO(burdon): Replace with hooks.
|
|
248
255
|
export const MarkdownEditor = forwardRef<EditorView | null, TextEditorProps>(
|
|
249
256
|
({ readonly, placeholder, theme = markdownTheme, slots, extensions: _extensions, ...props }, forwardedRef) => {
|
|
250
257
|
const { themeMode } = useThemeContext();
|
|
@@ -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=
|
|
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}
|
|
@@ -6,22 +6,19 @@ import '@dxosTheme';
|
|
|
6
6
|
|
|
7
7
|
import { BroadcastChannelNetworkAdapter } from '@automerge/automerge-repo-network-broadcastchannel';
|
|
8
8
|
import '@preact/signals-react';
|
|
9
|
-
import { EditorView } from '@codemirror/view'; // Register react integration.
|
|
10
9
|
import React, { useEffect, useMemo, useState } from 'react';
|
|
11
10
|
|
|
12
11
|
import { Repo } from '@dxos/automerge/automerge-repo';
|
|
13
|
-
import { Filter } from '@dxos/echo-schema';
|
|
12
|
+
import { createDocAccessor, Filter } from '@dxos/echo-schema';
|
|
14
13
|
import { type PublicKey } from '@dxos/keys';
|
|
15
14
|
import { Expando, TextObject, useSpace } from '@dxos/react-client/echo';
|
|
16
|
-
import { useIdentity } from '@dxos/react-client/halo';
|
|
17
15
|
import { ClientRepeater } from '@dxos/react-client/testing';
|
|
16
|
+
import { useThemeContext } from '@dxos/react-ui';
|
|
18
17
|
import { withTheme } from '@dxos/storybook-utils';
|
|
19
18
|
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import { useTextEditor, useTextModel } from '../../hooks';
|
|
24
|
-
import { defaultTheme } from '../../themes';
|
|
19
|
+
import { automerge } from './automerge';
|
|
20
|
+
import { DocAccessor } from './defs';
|
|
21
|
+
import { createBasicExtensions, createThemeExtensions, useTextEditor } from '../../hooks';
|
|
25
22
|
import translations from '../../translations';
|
|
26
23
|
|
|
27
24
|
const initialContent = 'Hello world!';
|
|
@@ -32,24 +29,24 @@ type TestObject = {
|
|
|
32
29
|
|
|
33
30
|
type EditorProps = {
|
|
34
31
|
source: DocAccessor;
|
|
32
|
+
autoFocus?: boolean;
|
|
35
33
|
};
|
|
36
34
|
|
|
37
|
-
const Editor = ({ source }: EditorProps) => {
|
|
35
|
+
const Editor = ({ source, autoFocus }: EditorProps) => {
|
|
36
|
+
const { themeMode } = useThemeContext();
|
|
38
37
|
const extensions = useMemo(
|
|
39
38
|
() => [
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
createBasicBundle({ placeholder: 'Type here...' }),
|
|
39
|
+
createBasicExtensions({ placeholder: 'Type here...' }),
|
|
40
|
+
createThemeExtensions({ themeMode, slots: { editor: { className: 'p-2 bg-white dark:bg-black' } } }),
|
|
43
41
|
automerge(source),
|
|
44
|
-
awareness(),
|
|
45
42
|
],
|
|
46
|
-
[source],
|
|
43
|
+
[themeMode, source],
|
|
47
44
|
);
|
|
48
45
|
|
|
49
46
|
const { parentRef } = useTextEditor({
|
|
50
|
-
autoFocus: true,
|
|
51
47
|
doc: DocAccessor.getValue(source),
|
|
52
48
|
extensions,
|
|
49
|
+
autoFocus,
|
|
53
50
|
});
|
|
54
51
|
|
|
55
52
|
return <div ref={parentRef} />;
|
|
@@ -61,12 +58,8 @@ const Story = () => {
|
|
|
61
58
|
|
|
62
59
|
useEffect(() => {
|
|
63
60
|
queueMicrotask(async () => {
|
|
64
|
-
const repo1 = new Repo({
|
|
65
|
-
|
|
66
|
-
});
|
|
67
|
-
const repo2 = new Repo({
|
|
68
|
-
network: [new BroadcastChannelNetworkAdapter()],
|
|
69
|
-
});
|
|
61
|
+
const repo1 = new Repo({ network: [new BroadcastChannelNetworkAdapter()] });
|
|
62
|
+
const repo2 = new Repo({ network: [new BroadcastChannelNetworkAdapter()] });
|
|
70
63
|
|
|
71
64
|
const object1 = repo1.create();
|
|
72
65
|
object1.change((doc: TestObject) => {
|
|
@@ -86,8 +79,8 @@ const Story = () => {
|
|
|
86
79
|
}
|
|
87
80
|
|
|
88
81
|
return (
|
|
89
|
-
<div role='none' className='grid grid-cols-2 bs-full is-full
|
|
90
|
-
<Editor source={object1} />
|
|
82
|
+
<div role='none' className='grid grid-cols-2 bs-full is-full divide-x divide-neutral-500'>
|
|
83
|
+
<Editor source={object1} autoFocus />
|
|
91
84
|
<Editor source={object2} />
|
|
92
85
|
</div>
|
|
93
86
|
);
|
|
@@ -96,36 +89,39 @@ const Story = () => {
|
|
|
96
89
|
export default {
|
|
97
90
|
title: 'react-ui-editor/Automerge',
|
|
98
91
|
component: Editor,
|
|
92
|
+
decorators: [withTheme],
|
|
99
93
|
render: () => <Story />,
|
|
100
94
|
parameters: { translations, layout: 'fullscreen' },
|
|
101
95
|
};
|
|
102
96
|
|
|
103
|
-
export const Default = {};
|
|
104
|
-
|
|
105
97
|
const EchoStory = ({ spaceKey }: { spaceKey: PublicKey }) => {
|
|
106
|
-
|
|
98
|
+
// TODO(burdon): Test identity.
|
|
99
|
+
// const identity = useIdentity();
|
|
107
100
|
const space = useSpace(spaceKey);
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
if (!model) {
|
|
101
|
+
const source = useMemo<DocAccessor | undefined>(() => {
|
|
102
|
+
const { objects = [] } = space?.db.query(Filter.from({ type: 'test' })) ?? {};
|
|
103
|
+
if (objects.length) {
|
|
104
|
+
return createDocAccessor(objects[0].content);
|
|
105
|
+
}
|
|
106
|
+
}, [space]);
|
|
107
|
+
|
|
108
|
+
if (!source) {
|
|
117
109
|
return null;
|
|
118
110
|
}
|
|
119
111
|
|
|
120
|
-
return <
|
|
112
|
+
return <Editor source={source} />;
|
|
121
113
|
};
|
|
122
114
|
|
|
115
|
+
export const Default = {};
|
|
116
|
+
|
|
117
|
+
// TODO(burdon): Feed already added error.
|
|
123
118
|
export const WithEcho = {
|
|
124
119
|
decorators: [withTheme],
|
|
125
120
|
render: () => {
|
|
126
121
|
return (
|
|
127
122
|
<ClientRepeater
|
|
128
123
|
count={2}
|
|
124
|
+
component={EchoStory}
|
|
129
125
|
createSpace
|
|
130
126
|
onCreateSpace={async (space) => {
|
|
131
127
|
space.db.add(
|
|
@@ -135,7 +131,6 @@ export const WithEcho = {
|
|
|
135
131
|
}),
|
|
136
132
|
);
|
|
137
133
|
}}
|
|
138
|
-
component={EchoStory}
|
|
139
134
|
/>
|
|
140
135
|
);
|
|
141
136
|
},
|