@dxos/react-ui-editor 0.4.7-main.ea67fec → 0.4.7-main.f4b92be
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 +1048 -816
- 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/themes/default.d.ts.map +1 -1
- package/package.json +24 -24
- 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/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 +20 -13
- 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 +6 -13
- package/src/index.ts +2 -0
- 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/src/extensions/basic.ts +0 -41
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { closeBrackets } from '@codemirror/autocomplete';
|
|
6
|
+
import { history } from '@codemirror/commands';
|
|
7
|
+
import { bracketMatching } from '@codemirror/language';
|
|
5
8
|
import {
|
|
6
9
|
EditorSelection,
|
|
7
10
|
EditorState,
|
|
@@ -9,7 +12,17 @@ import {
|
|
|
9
12
|
type Extension,
|
|
10
13
|
type StateEffect,
|
|
11
14
|
} from '@codemirror/state';
|
|
12
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
crosshairCursor,
|
|
17
|
+
drawSelection,
|
|
18
|
+
dropCursor,
|
|
19
|
+
EditorView,
|
|
20
|
+
highlightActiveLine,
|
|
21
|
+
lineNumbers,
|
|
22
|
+
placeholder,
|
|
23
|
+
scrollPastEnd,
|
|
24
|
+
} from '@codemirror/view';
|
|
25
|
+
import defaultsDeep from 'lodash.defaultsdeep';
|
|
13
26
|
import { type DependencyList, type RefObject, useEffect, useRef, useState } from 'react';
|
|
14
27
|
|
|
15
28
|
import { log } from '@dxos/log';
|
|
@@ -38,7 +51,7 @@ export type UseTextEditor = {
|
|
|
38
51
|
// TODO(wittjosiah): Does not work in strict mode.
|
|
39
52
|
export const useTextEditor = (
|
|
40
53
|
{ autoFocus, scrollTo, debug, doc, selection, extensions }: UseTextEditorOptions = {},
|
|
41
|
-
deps
|
|
54
|
+
deps: DependencyList = [],
|
|
42
55
|
): UseTextEditor => {
|
|
43
56
|
const onUpdate = useRef<() => void>();
|
|
44
57
|
const [view, setView] = useState<EditorView>();
|
|
@@ -114,23 +127,66 @@ export const useTextEditor = (
|
|
|
114
127
|
|
|
115
128
|
// TODO(burdon): Factor out extension factories.
|
|
116
129
|
|
|
117
|
-
|
|
130
|
+
/**
|
|
131
|
+
* https://codemirror.net/docs/extensions
|
|
132
|
+
* https://github.com/codemirror/basic-setup
|
|
133
|
+
*/
|
|
134
|
+
// TODO(burdon): Reconcile with createMarkdownExtensions.
|
|
135
|
+
export type BasicExtensionsOptions = {
|
|
136
|
+
allowMultipleSelections?: boolean;
|
|
137
|
+
bracketMatching?: boolean;
|
|
138
|
+
closeBrackets?: boolean;
|
|
139
|
+
crosshairCursor?: boolean;
|
|
140
|
+
dropCursor?: boolean;
|
|
141
|
+
drawSelection?: boolean;
|
|
142
|
+
editable?: boolean;
|
|
143
|
+
highlightActiveLine?: boolean;
|
|
144
|
+
history?: boolean;
|
|
145
|
+
lineNumbers?: boolean;
|
|
146
|
+
lineWrapping?: boolean;
|
|
147
|
+
placeholder?: string;
|
|
118
148
|
readonly?: boolean;
|
|
149
|
+
scrollPastEnd?: boolean;
|
|
150
|
+
tabSize?: number;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
const defaults: BasicExtensionsOptions = {
|
|
154
|
+
bracketMatching: true,
|
|
155
|
+
closeBrackets: true,
|
|
156
|
+
drawSelection: true,
|
|
157
|
+
editable: true,
|
|
158
|
+
history: true,
|
|
159
|
+
lineWrapping: true,
|
|
119
160
|
};
|
|
120
161
|
|
|
121
|
-
|
|
122
|
-
|
|
162
|
+
export const createBasicExtensions = (_props?: BasicExtensionsOptions): Extension => {
|
|
163
|
+
const props: BasicExtensionsOptions = defaultsDeep({}, _props, defaults);
|
|
123
164
|
return [
|
|
124
|
-
//
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
165
|
+
// TODO(burdon): Doesn't catch errors in keymap functions.
|
|
166
|
+
EditorView.exceptionSink.of((err) => {
|
|
167
|
+
log.catch(err);
|
|
168
|
+
}),
|
|
169
|
+
|
|
170
|
+
props.allowMultipleSelections && EditorState.allowMultipleSelections.of(true),
|
|
171
|
+
props.bracketMatching && bracketMatching(),
|
|
172
|
+
props.closeBrackets && closeBrackets(),
|
|
173
|
+
props.crosshairCursor && crosshairCursor(),
|
|
174
|
+
props.dropCursor && dropCursor(),
|
|
175
|
+
props.drawSelection && drawSelection(),
|
|
176
|
+
props.highlightActiveLine && highlightActiveLine(),
|
|
177
|
+
props.history && history(),
|
|
178
|
+
props.lineNumbers && lineNumbers(),
|
|
179
|
+
props.lineWrapping && EditorView.lineWrapping,
|
|
180
|
+
props.placeholder && placeholder(props.placeholder),
|
|
181
|
+
props.readonly && [EditorState.readOnly.of(true), EditorView.editable.of(false)],
|
|
182
|
+
props.scrollPastEnd && scrollPastEnd(),
|
|
183
|
+
props.tabSize && EditorState.tabSize.of(props.tabSize),
|
|
184
|
+
].filter(isNotFalsy);
|
|
128
185
|
};
|
|
129
186
|
|
|
130
187
|
export type ThemeExtensionsOptions = {
|
|
131
188
|
theme?: ThemeStyles;
|
|
132
189
|
themeMode?: ThemeMode;
|
|
133
|
-
lineWrap?: boolean;
|
|
134
190
|
slots?: {
|
|
135
191
|
editor?: {
|
|
136
192
|
className?: string;
|
|
@@ -143,11 +199,10 @@ export type ThemeExtensionsOptions = {
|
|
|
143
199
|
|
|
144
200
|
export const createThemeExtensions = ({ theme, themeMode, slots }: ThemeExtensionsOptions = {}): Extension => {
|
|
145
201
|
return [
|
|
146
|
-
//
|
|
147
202
|
EditorView.baseTheme(defaultTheme),
|
|
148
|
-
theme && EditorView.theme(theme),
|
|
149
203
|
EditorView.darkTheme.of(themeMode === 'dark'),
|
|
150
|
-
EditorView.
|
|
151
|
-
EditorView.
|
|
204
|
+
theme && EditorView.theme(theme),
|
|
205
|
+
slots?.editor?.className && EditorView.editorAttributes.of({ class: slots.editor.className }),
|
|
206
|
+
slots?.content?.className && EditorView.contentAttributes.of({ class: slots.content.className }),
|
|
152
207
|
].filter(isNotFalsy);
|
|
153
208
|
};
|
|
@@ -15,7 +15,7 @@ import { hueTokens } from '@dxos/react-ui-theme';
|
|
|
15
15
|
import { hexToHue } from '@dxos/util';
|
|
16
16
|
|
|
17
17
|
import { SpaceAwarenessProvider } from './awareness-provider';
|
|
18
|
-
import { type EditorModel
|
|
18
|
+
import { type EditorModel } from './defs';
|
|
19
19
|
import { automerge, awareness } from '../extensions';
|
|
20
20
|
import { type DocAccessor } from '../extensions/automerge/defs';
|
|
21
21
|
|
|
@@ -68,6 +68,7 @@ export const useTextModel = (props: UseTextModelProps): EditorModel | undefined
|
|
|
68
68
|
* For use primarily in stories & tests so the dependence on TextObject can be avoided.
|
|
69
69
|
* @deprecated
|
|
70
70
|
*/
|
|
71
|
+
// TODO(burdon): Remove.
|
|
71
72
|
export const useInMemoryTextModel = ({
|
|
72
73
|
id,
|
|
73
74
|
defaultContent,
|
|
@@ -76,10 +77,10 @@ export const useInMemoryTextModel = ({
|
|
|
76
77
|
defaultContent?: string;
|
|
77
78
|
}): EditorModel & { setContent: Dispatch<SetStateAction<string>> } => {
|
|
78
79
|
const [content, setContent] = useState(defaultContent ?? '');
|
|
79
|
-
return { id, content,
|
|
80
|
+
return { id, content, text: () => content, setContent };
|
|
80
81
|
};
|
|
81
82
|
|
|
82
|
-
const createModel = ({ space, identity, text }: UseTextModelProps) => {
|
|
83
|
+
const createModel = ({ space, identity, text }: UseTextModelProps): EditorModel | undefined => {
|
|
83
84
|
if (!text) {
|
|
84
85
|
return undefined;
|
|
85
86
|
}
|
|
@@ -104,23 +105,15 @@ const createModel = ({ space, identity, text }: UseTextModelProps) => {
|
|
|
104
105
|
peerId: identity?.identityKey.toHex() ?? 'Anonymous',
|
|
105
106
|
});
|
|
106
107
|
|
|
107
|
-
const extensions = [
|
|
108
|
+
const extensions = [automerge({ handle: doc.handle, path: doc.path })];
|
|
108
109
|
if (awarenessProvider) {
|
|
109
110
|
extensions.push(awareness(awarenessProvider));
|
|
110
111
|
}
|
|
111
112
|
|
|
112
|
-
|
|
113
|
+
return {
|
|
113
114
|
id: obj.id,
|
|
114
115
|
content: doc,
|
|
115
116
|
text: () => get(doc.handle.docSync(), doc.path),
|
|
116
117
|
extension: extensions,
|
|
117
|
-
peer: identity
|
|
118
|
-
? {
|
|
119
|
-
id: identity.identityKey.toHex(),
|
|
120
|
-
name: identity.profile?.displayName,
|
|
121
|
-
}
|
|
122
|
-
: undefined,
|
|
123
118
|
};
|
|
124
|
-
|
|
125
|
-
return model;
|
|
126
119
|
};
|
package/src/index.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
//
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
|
+
|
|
4
5
|
import translations from './translations';
|
|
5
6
|
|
|
6
7
|
export { type Extension, type EditorState } from '@codemirror/state';
|
|
7
8
|
export { type EditorView, keymap } from '@codemirror/view';
|
|
9
|
+
export { tags } from '@lezer/highlight';
|
|
8
10
|
|
|
9
11
|
export { TextKind } from '@dxos/protocols/proto/dxos/echo/model/text';
|
|
10
12
|
export { Doc, YText, YXmlFragment } from '@dxos/text-model';
|
package/src/themes/default.ts
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"automerge.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/TextEditor/automerge.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,YAAY,CAAC;AAGpB,OAAO,uBAAuB,CAAC;AAc/B,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAW9D,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DF,wBAKE;AAEF,eAAO,MAAM,OAAO,IAAK,CAAC;AAoB1B,eAAO,MAAM,QAAQ;;;CAmBpB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/TextEditor/hooks.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,YAAY,CAAC;AAEpB,OAAO,KAA4B,MAAM,OAAO,CAAC;AA4BjD,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,9 +0,0 @@
|
|
|
1
|
-
import { type Extension } from '@codemirror/state';
|
|
2
|
-
import { type ThemeMode } from '@dxos/react-ui';
|
|
3
|
-
import { type TextEditorProps } from '../components';
|
|
4
|
-
export type BasicBundleOptions = {
|
|
5
|
-
themeMode?: ThemeMode;
|
|
6
|
-
bracketMatching?: boolean;
|
|
7
|
-
} & Pick<TextEditorProps, 'placeholder' | 'lineWrapping'>;
|
|
8
|
-
export declare const createBasicBundle: ({ themeMode, placeholder: _placeholder, lineWrapping, bracketMatching: _bracketMatching, }?: BasicBundleOptions) => Extension[];
|
|
9
|
-
//# sourceMappingURL=basic.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"basic.d.ts","sourceRoot":"","sources":["../../../../src/extensions/basic.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAInD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,IAAI,CAAC,eAAe,EAAE,aAAa,GAAG,cAAc,CAAC,CAAC;AAE1D,eAAO,MAAM,iBAAiB,gGAK3B,kBAAkB,KAAQ,SAAS,EAchB,CAAC"}
|
package/src/extensions/basic.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2023 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { closeBrackets } from '@codemirror/autocomplete';
|
|
6
|
-
import { history } from '@codemirror/commands';
|
|
7
|
-
import { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from '@codemirror/language';
|
|
8
|
-
import { type Extension } from '@codemirror/state';
|
|
9
|
-
import { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';
|
|
10
|
-
import { drawSelection, EditorView, highlightActiveLine, placeholder } from '@codemirror/view';
|
|
11
|
-
|
|
12
|
-
import { type ThemeMode } from '@dxos/react-ui';
|
|
13
|
-
import { isNotFalsy } from '@dxos/util';
|
|
14
|
-
|
|
15
|
-
import { type TextEditorProps } from '../components';
|
|
16
|
-
|
|
17
|
-
export type BasicBundleOptions = {
|
|
18
|
-
themeMode?: ThemeMode;
|
|
19
|
-
bracketMatching?: boolean;
|
|
20
|
-
} & Pick<TextEditorProps, 'placeholder' | 'lineWrapping'>;
|
|
21
|
-
|
|
22
|
-
export const createBasicBundle = ({
|
|
23
|
-
themeMode,
|
|
24
|
-
placeholder: _placeholder,
|
|
25
|
-
lineWrapping = true,
|
|
26
|
-
bracketMatching: _bracketMatching = true,
|
|
27
|
-
}: BasicBundleOptions = {}): Extension[] =>
|
|
28
|
-
[
|
|
29
|
-
lineWrapping && EditorView.lineWrapping,
|
|
30
|
-
|
|
31
|
-
// https://codemirror.net/docs/ref/#codemirror.minimalSetup
|
|
32
|
-
_bracketMatching && bracketMatching(),
|
|
33
|
-
closeBrackets(),
|
|
34
|
-
drawSelection(),
|
|
35
|
-
highlightActiveLine(),
|
|
36
|
-
history(),
|
|
37
|
-
_placeholder && placeholder(_placeholder),
|
|
38
|
-
|
|
39
|
-
// https://github.com/codemirror/theme-one-dark
|
|
40
|
-
themeMode === 'dark' ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle),
|
|
41
|
-
].filter(isNotFalsy);
|