@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.
- package/dist/lib/browser/index.mjs +942 -742
- 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 +3 -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 +31 -31
- package/src/components/TextEditor/MarkdownEditor.stories.tsx +95 -8
- package/src/components/TextEditor/TextEditor.stories.tsx +0 -15
- package/src/components/TextEditor/TextEditor.tsx +11 -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 -14
- package/src/extensions/markdown/decorate.ts +21 -14
- 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 +20 -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,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":"
|
|
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.7-main.
|
|
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.
|
|
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.
|
|
41
|
-
"@dxos/automerge": "0.4.7-main.
|
|
42
|
-
"@dxos/context": "0.4.7-main.
|
|
43
|
-
"@dxos/display-name": "0.4.7-main.
|
|
44
|
-
"@dxos/
|
|
45
|
-
"@dxos/
|
|
46
|
-
"@dxos/
|
|
47
|
-
"@dxos/
|
|
48
|
-
"@dxos/
|
|
49
|
-
"@dxos/react-async": "0.4.7-main.
|
|
50
|
-
"@dxos/react-ui-theme": "0.4.7-main.
|
|
51
|
-
"@dxos/
|
|
52
|
-
"@dxos/
|
|
53
|
-
"@dxos/util": "0.4.7-main.
|
|
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.
|
|
70
|
-
"@vitest/ui": "^1.
|
|
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.
|
|
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.
|
|
81
|
-
"@dxos/config": "0.4.7-main.
|
|
82
|
-
"@dxos/echo-
|
|
83
|
-
"@dxos/echo-
|
|
84
|
-
"@dxos/
|
|
85
|
-
"@dxos/
|
|
86
|
-
"@dxos/react-client": "0.4.7-main.
|
|
87
|
-
"@dxos/
|
|
88
|
-
"@dxos/
|
|
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.
|
|
93
|
-
"@vitest/ui": "^1.
|
|
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.
|
|
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 {
|
|
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}
|
|
@@ -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
|
-
() => [
|
|
233
|
+
() => [
|
|
234
|
+
createBasicExtensions({ lineWrapping, placeholder }),
|
|
235
|
+
createThemeExtensions({ themeMode }),
|
|
236
|
+
...(_extensions ?? []),
|
|
237
|
+
],
|
|
233
238
|
[themeMode, placeholder, lineWrapping, _extensions],
|
|
234
239
|
);
|
|
235
240
|
|
|
@@ -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}
|