@dxos/react-ui-editor 0.3.10-main.ee543cf → 0.3.10-main.f460bb8
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 +1417 -386
- 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 +26 -2
- package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/TextEditor.d.ts +3 -1
- package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts +3 -0
- package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/autocomplete.d.ts +3 -2
- package/dist/types/src/components/TextEditor/extensions/autocomplete.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/basic.d.ts +2 -1
- package/dist/types/src/components/TextEditor/extensions/basic.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/blast.d.ts +25 -0
- package/dist/types/src/components/TextEditor/extensions/blast.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/code.d.ts +2 -0
- package/dist/types/src/components/TextEditor/extensions/code.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/comments.d.ts +18 -0
- package/dist/types/src/components/TextEditor/extensions/comments.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/demo.d.ts +11 -0
- package/dist/types/src/components/TextEditor/extensions/demo.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/experimental.d.ts +1 -1
- package/dist/types/src/components/TextEditor/extensions/experimental.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/highlight.d.ts +24 -0
- package/dist/types/src/components/TextEditor/extensions/highlight.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/image.d.ts +4 -0
- package/dist/types/src/components/TextEditor/extensions/image.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/index.d.ts +8 -0
- package/dist/types/src/components/TextEditor/extensions/index.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/link.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/listener.d.ts +4 -2
- package/dist/types/src/components/TextEditor/extensions/listener.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts +10 -1
- package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/markdown/highlight.d.ts +9 -3
- package/dist/types/src/components/TextEditor/extensions/markdown/highlight.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/extensions/mention.d.ts +6 -0
- package/dist/types/src/components/TextEditor/extensions/mention.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/table.d.ts +8 -0
- package/dist/types/src/components/TextEditor/extensions/table.d.ts.map +1 -0
- package/dist/types/src/components/TextEditor/extensions/tasklist.d.ts +2 -4
- package/dist/types/src/components/TextEditor/extensions/tasklist.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/themes/default.d.ts +8 -0
- package/dist/types/src/components/TextEditor/themes/default.d.ts.map +1 -1
- package/dist/types/src/hooks/automerge/PatchSemaphore.d.ts +3 -0
- package/dist/types/src/hooks/automerge/PatchSemaphore.d.ts.map +1 -1
- package/dist/types/src/hooks/automerge/automerge.stories.d.ts +8 -1
- package/dist/types/src/hooks/automerge/automerge.stories.d.ts.map +1 -1
- package/dist/types/src/hooks/automerge/index.d.ts +1 -1
- package/dist/types/src/hooks/automerge/index.d.ts.map +1 -1
- package/dist/types/src/hooks/automerge/plugin.d.ts.map +1 -1
- package/dist/types/src/hooks/automerge/translation/automerge-to-codemirror.d.ts +5 -0
- package/dist/types/src/hooks/automerge/translation/automerge-to-codemirror.d.ts.map +1 -0
- package/dist/types/src/hooks/automerge/translation/codemirror-to-automerge.d.ts +6 -0
- package/dist/types/src/hooks/automerge/translation/codemirror-to-automerge.d.ts.map +1 -0
- package/dist/types/src/hooks/automerge/translation/index.d.ts +3 -0
- package/dist/types/src/hooks/automerge/translation/index.d.ts.map +1 -0
- package/dist/types/src/hooks/useTextModel.d.ts +6 -0
- package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
- package/dist/types/src/{components/TextEditor → hooks/yjs}/yjs.stories.d.ts +2 -2
- package/dist/types/src/hooks/yjs/yjs.stories.d.ts.map +1 -0
- package/dist/types/src/styles/markdown.d.ts +3 -2
- package/dist/types/src/styles/markdown.d.ts.map +1 -1
- package/dist/types/src/testing/replicator.d.ts.map +1 -1
- package/package.json +22 -19
- package/src/components/TextEditor/MarkdownEditor.stories.tsx +161 -36
- package/src/components/TextEditor/TextEditor.stories.tsx +12 -1
- package/src/components/TextEditor/TextEditor.tsx +43 -15
- package/src/components/TextEditor/extensions/autocomplete.ts +9 -22
- package/src/components/TextEditor/extensions/basic.ts +6 -4
- package/src/components/TextEditor/extensions/blast.ts +373 -0
- package/src/components/TextEditor/extensions/code.ts +99 -0
- package/src/components/TextEditor/extensions/comments.ts +173 -0
- package/src/components/TextEditor/extensions/demo.ts +69 -0
- package/src/components/TextEditor/extensions/experimental.tsx +15 -35
- package/src/components/TextEditor/extensions/highlight.ts +128 -0
- package/src/components/TextEditor/extensions/image.ts +67 -0
- package/src/components/TextEditor/extensions/index.ts +8 -0
- package/src/components/TextEditor/extensions/link.ts +27 -27
- package/src/components/TextEditor/extensions/listener.ts +4 -3
- package/src/components/TextEditor/extensions/markdown/bundle.ts +46 -43
- package/src/components/TextEditor/extensions/markdown/highlight.ts +148 -107
- package/src/components/TextEditor/extensions/mention.ts +31 -0
- package/src/components/TextEditor/extensions/table.ts +119 -0
- package/src/components/TextEditor/extensions/tasklist.ts +89 -81
- package/src/components/TextEditor/themes/default.ts +112 -4
- package/src/hooks/automerge/PatchSemaphore.ts +12 -9
- package/src/hooks/automerge/automerge.stories.tsx +4 -2
- package/src/hooks/automerge/index.ts +1 -1
- package/src/hooks/automerge/plugin.ts +1 -0
- package/src/hooks/automerge/{amToCodemirror.ts → translation/automerge-to-codemirror.ts} +10 -2
- package/src/hooks/automerge/{codeMirrorToAm.ts → translation/codemirror-to-automerge.ts} +7 -4
- package/src/hooks/automerge/translation/index.ts +6 -0
- package/src/hooks/useTextModel.ts +20 -8
- package/src/{components/TextEditor → hooks/yjs}/yjs.stories.tsx +2 -2
- package/src/styles/markdown.ts +15 -8
- package/src/testing/replicator.ts +6 -5
- package/dist/types/src/components/TextEditor/yjs.stories.d.ts.map +0 -1
- package/dist/types/src/hooks/automerge/amToCodemirror.d.ts +0 -6
- package/dist/types/src/hooks/automerge/amToCodemirror.d.ts.map +0 -1
- package/dist/types/src/hooks/automerge/codeMirrorToAm.d.ts +0 -7
- package/dist/types/src/hooks/automerge/codeMirrorToAm.d.ts.map +0 -1
|
@@ -26,11 +26,19 @@ import { SpaceAwarenessProvider } from './yjs';
|
|
|
26
26
|
// TODO(burdon): Move.
|
|
27
27
|
type Awareness = awarenessProtocol.Awareness;
|
|
28
28
|
|
|
29
|
+
export type DocumentRange = {
|
|
30
|
+
id: string;
|
|
31
|
+
from: number;
|
|
32
|
+
to: number;
|
|
33
|
+
};
|
|
34
|
+
|
|
29
35
|
// TODO(wittjosiah): Factor out to common package? @dxos/react-client?
|
|
30
36
|
export type EditorModel = {
|
|
31
37
|
id: string;
|
|
38
|
+
// TODO(burdon): Remove.
|
|
32
39
|
content: string | YText | YXmlFragment | DocAccessor;
|
|
33
40
|
text: () => string;
|
|
41
|
+
ranges: DocumentRange[];
|
|
34
42
|
extension?: Extension;
|
|
35
43
|
awareness?: Awareness;
|
|
36
44
|
peer?: {
|
|
@@ -57,28 +65,31 @@ export const useTextModel = ({ identity, space, text }: UseTextModelOptions): Ed
|
|
|
57
65
|
};
|
|
58
66
|
|
|
59
67
|
const createModel = (options: UseTextModelOptions) => {
|
|
60
|
-
const {
|
|
61
|
-
|
|
68
|
+
const { text } = options;
|
|
62
69
|
if (isActualAutomergeObject(text)) {
|
|
63
70
|
return createAutomergeModel(options);
|
|
64
71
|
} else {
|
|
65
|
-
if (!
|
|
72
|
+
if (!text?.doc) {
|
|
66
73
|
return undefined;
|
|
67
74
|
}
|
|
75
|
+
|
|
68
76
|
return createYjsModel(options);
|
|
69
77
|
}
|
|
70
78
|
};
|
|
71
79
|
|
|
72
80
|
const createYjsModel = ({ identity, space, text }: UseTextModelOptions): EditorModel => {
|
|
73
|
-
invariant(
|
|
74
|
-
const provider =
|
|
81
|
+
invariant(text?.doc && text?.content);
|
|
82
|
+
const provider = space
|
|
83
|
+
? new SpaceAwarenessProvider({ space, doc: text.doc, channel: `yjs.awareness.${text.id}` })
|
|
84
|
+
: undefined;
|
|
75
85
|
|
|
76
86
|
return {
|
|
77
87
|
id: text.doc.guid,
|
|
78
88
|
content: text.content,
|
|
79
89
|
text: () => text.content!.toString(),
|
|
80
|
-
|
|
81
|
-
|
|
90
|
+
ranges: [],
|
|
91
|
+
extension: yCollab(text.content as YText, provider?.awareness),
|
|
92
|
+
awareness: provider?.awareness,
|
|
82
93
|
peer: identity
|
|
83
94
|
? {
|
|
84
95
|
id: identity.identityKey.toHex(),
|
|
@@ -88,7 +99,7 @@ const createYjsModel = ({ identity, space, text }: UseTextModelOptions): EditorM
|
|
|
88
99
|
};
|
|
89
100
|
};
|
|
90
101
|
|
|
91
|
-
const createAutomergeModel = ({ identity,
|
|
102
|
+
const createAutomergeModel = ({ identity, text }: UseTextModelOptions): EditorModel => {
|
|
92
103
|
const obj = text as any as AutomergeTextCompat;
|
|
93
104
|
const doc = getRawDoc(obj, [obj.field]);
|
|
94
105
|
|
|
@@ -96,6 +107,7 @@ const createAutomergeModel = ({ identity, space, text }: UseTextModelOptions): E
|
|
|
96
107
|
id: obj.id,
|
|
97
108
|
content: doc,
|
|
98
109
|
text: () => get(doc.handle.docSync(), doc.path),
|
|
110
|
+
ranges: [],
|
|
99
111
|
extension: automergePlugin(doc.handle, doc.path),
|
|
100
112
|
peer: identity
|
|
101
113
|
? {
|
|
@@ -12,10 +12,11 @@ import { ClientRepeater, textGenerator, useDataGenerator } from '@dxos/react-cli
|
|
|
12
12
|
import { useId, Input } from '@dxos/react-ui';
|
|
13
13
|
import { withTheme } from '@dxos/storybook-utils';
|
|
14
14
|
|
|
15
|
-
import { MarkdownEditor } from '
|
|
15
|
+
import { MarkdownEditor } from '../../components';
|
|
16
16
|
import { Replicator, useYjsModel } from '../../testing';
|
|
17
17
|
|
|
18
18
|
export default {
|
|
19
|
+
title: 'react-ui-editor/YJS',
|
|
19
20
|
component: MarkdownEditor,
|
|
20
21
|
decorators: [withTheme],
|
|
21
22
|
};
|
|
@@ -50,7 +51,6 @@ const Story = () => {
|
|
|
50
51
|
};
|
|
51
52
|
|
|
52
53
|
export const Default = {
|
|
53
|
-
title: 'react-ui-editor/YJS',
|
|
54
54
|
// TODO(wittjosiah): Decorator for doing this without clients being initialized?
|
|
55
55
|
render: () => <ClientRepeater count={2} Component={Story} />,
|
|
56
56
|
};
|
package/src/styles/markdown.ts
CHANGED
|
@@ -6,14 +6,20 @@ import { mx } from '@dxos/react-ui-theme';
|
|
|
6
6
|
|
|
7
7
|
export type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
|
|
8
8
|
|
|
9
|
+
// TODO(burdon): Better way to align vertically than negative margin? Font-specific?
|
|
9
10
|
// https://tailwindcss.com/docs/font-weight
|
|
10
|
-
export const
|
|
11
|
-
1: 'mbs-4 mbe-2 font-medium text-inherit no-underline text-4xl',
|
|
12
|
-
2: 'mbs-4 mbe-2 font-medium text-inherit no-underline text-3xl',
|
|
13
|
-
3: 'mbs-4 mbe-2 font-medium text-inherit no-underline text-2xl',
|
|
14
|
-
4: 'mbs-4 mbe-2 font-medium text-inherit no-underline text-xl',
|
|
15
|
-
5: 'mbs-4 mbe-2 font-medium text-inherit no-underline text-lg',
|
|
16
|
-
6: 'mbs-4 mbe-2 font-medium text-inherit no-underline',
|
|
11
|
+
export const headings: Record<HeadingLevel, string[]> = {
|
|
12
|
+
1: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-4xl', '-ml-[10px]'],
|
|
13
|
+
2: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-3xl', '-ml-[8px]'],
|
|
14
|
+
3: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-2xl', '-ml-[7px]'],
|
|
15
|
+
4: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-xl', '-ml-[6px]'],
|
|
16
|
+
5: ['mbs-4 mbe-2 font-medium text-inherit no-underline text-lg', '-ml-[5px]'],
|
|
17
|
+
6: ['mbs-4 mbe-2 font-medium text-inherit no-underline', '-ml-[4px]'],
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const heading = (level: HeadingLevel, readonly?: boolean) => {
|
|
21
|
+
const [style, offset] = headings[level];
|
|
22
|
+
return mx(style, readonly && offset);
|
|
17
23
|
};
|
|
18
24
|
|
|
19
25
|
export const text = 'text-neutral-800 dark:text-neutral-200';
|
|
@@ -37,7 +43,8 @@ export const inlineUrl = mx(code, 'px-1');
|
|
|
37
43
|
export const blockquote = mx('pl-1 mr-1 border-is-4 border-primary-500/70 dark:border-primary-500/30', light);
|
|
38
44
|
|
|
39
45
|
// TODO(burdon): Replace with widget.
|
|
40
|
-
export const horizontalRule =
|
|
46
|
+
export const horizontalRule =
|
|
47
|
+
'flex mlb-4 border-b text-neutral-100 dark:text-neutral-900 border-neutral-200 dark:border-neutral-800';
|
|
41
48
|
|
|
42
49
|
// TODO(thure): Tailwind was not seeing `[&>li:before]:content-["•"]` as a utility class, but it would work if instead of `"•"` it was `"X"`… why?
|
|
43
50
|
export const unorderedList =
|
|
@@ -163,16 +163,18 @@ export class Replicator {
|
|
|
163
163
|
colorLight: cursorColor.light,
|
|
164
164
|
});
|
|
165
165
|
|
|
166
|
+
const field = 'content';
|
|
167
|
+
const content = this._kind === TextKind.PLAIN ? doc.getText(field) : doc.getXmlFragment(field);
|
|
166
168
|
const model: EditorModel = {
|
|
167
169
|
id: doc.guid,
|
|
168
|
-
|
|
169
|
-
|
|
170
|
+
text: () => content.toString(),
|
|
171
|
+
content,
|
|
172
|
+
ranges: [],
|
|
170
173
|
awareness: provider.awareness,
|
|
171
174
|
peer: { id },
|
|
172
175
|
};
|
|
173
176
|
|
|
174
177
|
this._peers.push(model);
|
|
175
|
-
|
|
176
178
|
return model;
|
|
177
179
|
};
|
|
178
180
|
}
|
|
@@ -184,6 +186,5 @@ export type UseYjsModelOptions = {
|
|
|
184
186
|
};
|
|
185
187
|
|
|
186
188
|
export const useYjsModel = ({ replicator, id, doc }: UseYjsModelOptions): EditorModel => {
|
|
187
|
-
|
|
188
|
-
return peer;
|
|
189
|
+
return useMemo(() => replicator.createPeer(id, doc), [doc]);
|
|
189
190
|
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"yjs.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/TextEditor/yjs.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,YAAY,CAAC;AAEpB,OAAO,KAAmB,MAAM,OAAO,CAAC;;;;;AAWxC,wBAGE;AA+BF,eAAO,MAAM,OAAO;;;CAInB,CAAC"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { type EditorSelection } from '@codemirror/state';
|
|
2
|
-
import { type EditorView } from '@codemirror/view';
|
|
3
|
-
import { type Patch, type Prop } from '@dxos/automerge/automerge';
|
|
4
|
-
declare const _default: (view: EditorView, selection: EditorSelection, target: Prop[], patches: Patch[]) => void;
|
|
5
|
-
export default _default;
|
|
6
|
-
//# sourceMappingURL=amToCodemirror.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"amToCodemirror.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/automerge/amToCodemirror.ts"],"names":[],"mappings":"AAIA,OAAO,EAA8B,KAAK,eAAe,EAAoB,MAAM,mBAAmB,CAAC;AACvG,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,IAAI,EAGV,MAAM,2BAA2B,CAAC;+BAIb,UAAU,aAAa,eAAe,UAAU,IAAI,EAAE,WAAW,KAAK,EAAE;AAA9F,wBAgBE"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { type EditorState, type Transaction } from '@codemirror/state';
|
|
2
|
-
import { type Heads } from '@dxos/automerge/automerge';
|
|
3
|
-
import { type IDocHandle } from './handle';
|
|
4
|
-
import { type Field } from './plugin';
|
|
5
|
-
declare const _default: (field: Field, handle: IDocHandle, transactions: Transaction[], state: EditorState) => Heads | undefined;
|
|
6
|
-
export default _default;
|
|
7
|
-
//# sourceMappingURL=codeMirrorToAm.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codeMirrorToAm.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/automerge/codeMirrorToAm.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,WAAW,EAAa,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAElF,OAAO,EAAc,KAAK,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAEnE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;+CAI5B,UAAU,gBACJ,WAAW,EAAE,SACpB,WAAW,KACjB,KAAK,GAAG,SAAS;AALpB,wBA6BE"}
|