@dxos/react-ui-editor 0.4.2 → 0.4.3-main.c3bfede
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 +233 -185
- 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 +20 -0
- package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts +20 -0
- package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/automerge.stories.d.ts +22 -2
- package/dist/types/src/components/TextEditor/automerge.stories.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/hooks.stories.d.ts +20 -0
- package/dist/types/src/components/TextEditor/hooks.stories.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.d.ts +7 -10
- package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +23 -6
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/{semaphore.d.ts → sync.d.ts} +6 -5
- package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/styles/index.d.ts +1 -0
- package/dist/types/src/styles/index.d.ts.map +1 -1
- package/dist/types/src/styles/layout.d.ts +2 -0
- package/dist/types/src/styles/layout.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +20 -0
- package/dist/types/src/translations.d.ts.map +1 -0
- package/package.json +24 -24
- package/src/components/TextEditor/MarkdownEditor.stories.tsx +13 -16
- package/src/components/TextEditor/TextEditor.stories.tsx +11 -14
- package/src/components/TextEditor/TextEditor.tsx +3 -3
- package/src/components/TextEditor/automerge.stories.tsx +38 -44
- package/src/components/TextEditor/hooks.stories.tsx +15 -16
- package/src/components/Toolbar/Toolbar.stories.tsx +16 -12
- package/src/components/Toolbar/Toolbar.tsx +156 -129
- package/src/extensions/automerge/automerge.ts +5 -21
- package/src/extensions/automerge/{semaphore.ts → sync.ts} +32 -34
- package/src/index.ts +1 -1
- package/src/styles/index.ts +1 -0
- package/src/styles/layout.ts +6 -0
- package/src/translations.ts +25 -0
- package/dist/types/src/extensions/automerge/semaphore.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../src/styles/layout.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,uBAAuB,4GACuE,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const translationKey = "react-ui-editor";
|
|
2
|
+
declare const _default: {
|
|
3
|
+
'en-US': {
|
|
4
|
+
"react-ui-editor": {
|
|
5
|
+
'strong label': string;
|
|
6
|
+
'emphasis label': string;
|
|
7
|
+
'strikethrough label': string;
|
|
8
|
+
'code label': string;
|
|
9
|
+
'bullet label': string;
|
|
10
|
+
'ordered label': string;
|
|
11
|
+
'task label': string;
|
|
12
|
+
'blockquote label': string;
|
|
13
|
+
'codeblock label': string;
|
|
14
|
+
'comment label': string;
|
|
15
|
+
'heading label': string;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
}[];
|
|
19
|
+
export default _default;
|
|
20
|
+
//# sourceMappingURL=translations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translations.d.ts","sourceRoot":"","sources":["../../../src/translations.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,cAAc,oBAAoB,CAAC;;;;;;;;;;;;;;;;;;AAEhD,wBAkBE"}
|
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.3-main.c3bfede",
|
|
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",
|
|
@@ -36,20 +36,20 @@
|
|
|
36
36
|
"lodash.pick": "^4.4.0",
|
|
37
37
|
"lodash.sortby": "^4.7.0",
|
|
38
38
|
"style-mod": "^4.1.0",
|
|
39
|
-
"@dxos/async": "0.4.
|
|
40
|
-
"@dxos/
|
|
41
|
-
"@dxos/
|
|
42
|
-
"@dxos/
|
|
43
|
-
"@dxos/echo-schema": "0.4.
|
|
44
|
-
"@dxos/
|
|
45
|
-
"@dxos/
|
|
46
|
-
"@dxos/
|
|
47
|
-
"@dxos/react-
|
|
48
|
-
"@dxos/
|
|
49
|
-
"@dxos/
|
|
50
|
-
"@dxos/react-ui-theme": "0.4.
|
|
51
|
-
"@dxos/text-model": "0.4.
|
|
52
|
-
"@dxos/util": "0.4.
|
|
39
|
+
"@dxos/async": "0.4.3-main.c3bfede",
|
|
40
|
+
"@dxos/automerge": "0.4.3-main.c3bfede",
|
|
41
|
+
"@dxos/debug": "0.4.3-main.c3bfede",
|
|
42
|
+
"@dxos/context": "0.4.3-main.c3bfede",
|
|
43
|
+
"@dxos/echo-schema": "0.4.3-main.c3bfede",
|
|
44
|
+
"@dxos/display-name": "0.4.3-main.c3bfede",
|
|
45
|
+
"@dxos/protocols": "0.4.3-main.c3bfede",
|
|
46
|
+
"@dxos/invariant": "0.4.3-main.c3bfede",
|
|
47
|
+
"@dxos/react-async": "0.4.3-main.c3bfede",
|
|
48
|
+
"@dxos/log": "0.4.3-main.c3bfede",
|
|
49
|
+
"@dxos/react-ui": "0.4.3-main.c3bfede",
|
|
50
|
+
"@dxos/react-ui-theme": "0.4.3-main.c3bfede",
|
|
51
|
+
"@dxos/text-model": "0.4.3-main.c3bfede",
|
|
52
|
+
"@dxos/util": "0.4.3-main.c3bfede"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@automerge/automerge-repo-network-broadcastchannel": "^1.1.0",
|
|
@@ -76,20 +76,20 @@
|
|
|
76
76
|
"vite-plugin-top-level-await": "^1.4.1",
|
|
77
77
|
"vite-plugin-wasm": "^3.3.0",
|
|
78
78
|
"vitest": "^1.2.1",
|
|
79
|
-
"@dxos/config": "0.4.
|
|
80
|
-
"@dxos/echo-
|
|
81
|
-
"@dxos/
|
|
82
|
-
"@dxos/random": "0.4.
|
|
83
|
-
"@dxos/
|
|
84
|
-
"@dxos/react-client": "0.4.
|
|
85
|
-
"@dxos/react-ui": "0.4.
|
|
86
|
-
"@dxos/storybook-utils": "0.4.
|
|
79
|
+
"@dxos/config": "0.4.3-main.c3bfede",
|
|
80
|
+
"@dxos/echo-signals": "0.4.3-main.c3bfede",
|
|
81
|
+
"@dxos/keyboard": "0.4.3-main.c3bfede",
|
|
82
|
+
"@dxos/random": "0.4.3-main.c3bfede",
|
|
83
|
+
"@dxos/echo-typegen": "0.4.3-main.c3bfede",
|
|
84
|
+
"@dxos/react-client": "0.4.3-main.c3bfede",
|
|
85
|
+
"@dxos/react-ui": "0.4.3-main.c3bfede",
|
|
86
|
+
"@dxos/storybook-utils": "0.4.3-main.c3bfede"
|
|
87
87
|
},
|
|
88
88
|
"peerDependencies": {
|
|
89
89
|
"@phosphor-icons/react": "^2.0.5",
|
|
90
90
|
"react": "^18.2.0",
|
|
91
91
|
"react-dom": "^18.2.0",
|
|
92
|
-
"@dxos/react-client": "0.4.
|
|
92
|
+
"@dxos/react-client": "0.4.3-main.c3bfede"
|
|
93
93
|
},
|
|
94
94
|
"publishConfig": {
|
|
95
95
|
"access": "public"
|
|
@@ -14,7 +14,7 @@ import { TextObject } from '@dxos/echo-schema';
|
|
|
14
14
|
import { keySymbols, parseShortcut } from '@dxos/keyboard';
|
|
15
15
|
import { PublicKey } from '@dxos/keys';
|
|
16
16
|
import { faker } from '@dxos/random';
|
|
17
|
-
import {
|
|
17
|
+
import { getSize, mx, textBlockWidth } from '@dxos/react-ui-theme';
|
|
18
18
|
import { withTheme } from '@dxos/storybook-utils';
|
|
19
19
|
|
|
20
20
|
import { MarkdownEditor, type TextEditorProps } from './TextEditor';
|
|
@@ -39,6 +39,7 @@ import {
|
|
|
39
39
|
annotations,
|
|
40
40
|
} from '../../extensions';
|
|
41
41
|
import { type Comment, useTextModel } from '../../hooks';
|
|
42
|
+
import translations from '../../translations';
|
|
42
43
|
|
|
43
44
|
faker.seed(101);
|
|
44
45
|
|
|
@@ -224,21 +225,16 @@ const Story = ({ text, comments, placeholder = 'New document.', ...props }: Stor
|
|
|
224
225
|
}
|
|
225
226
|
|
|
226
227
|
return (
|
|
227
|
-
<
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
{...props}
|
|
238
|
-
/>
|
|
239
|
-
</div>
|
|
240
|
-
</div>
|
|
241
|
-
</div>
|
|
228
|
+
<MarkdownEditor
|
|
229
|
+
ref={view}
|
|
230
|
+
model={model}
|
|
231
|
+
placeholder={placeholder}
|
|
232
|
+
slots={{
|
|
233
|
+
root: { className: mx(textBlockWidth, 'min-bs-dvh') },
|
|
234
|
+
editor: { className: 'min-bs-dvh p-2 bg-white dark:bg-black' },
|
|
235
|
+
}}
|
|
236
|
+
{...props}
|
|
237
|
+
/>
|
|
242
238
|
);
|
|
243
239
|
};
|
|
244
240
|
|
|
@@ -247,6 +243,7 @@ export default {
|
|
|
247
243
|
component: MarkdownEditor,
|
|
248
244
|
decorators: [withTheme],
|
|
249
245
|
render: Story,
|
|
246
|
+
parameters: { translations, layout: 'fullscreen' },
|
|
250
247
|
};
|
|
251
248
|
|
|
252
249
|
const defaults = [
|
|
@@ -7,12 +7,13 @@ import '@dxosTheme';
|
|
|
7
7
|
import React, { useState } from 'react';
|
|
8
8
|
|
|
9
9
|
import { TextObject } from '@dxos/echo-schema';
|
|
10
|
-
import {
|
|
10
|
+
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
14
|
import { listener } from '../../extensions';
|
|
15
15
|
import { useTextModel } from '../../hooks';
|
|
16
|
+
import translations from '../../translations';
|
|
16
17
|
|
|
17
18
|
const initialText = [
|
|
18
19
|
'# TextEditor',
|
|
@@ -36,19 +37,14 @@ const Story = ({
|
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
return (
|
|
39
|
-
<
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
{...props}
|
|
48
|
-
/>
|
|
49
|
-
</div>
|
|
50
|
-
</div>
|
|
51
|
-
</div>
|
|
40
|
+
<TextEditor
|
|
41
|
+
model={model}
|
|
42
|
+
slots={{
|
|
43
|
+
root: { className: mx(textBlockWidth, 'min-bs-dvh') },
|
|
44
|
+
editor: { className: 'min-bs-dvh p-2 bg-white dark:bg-black' },
|
|
45
|
+
}}
|
|
46
|
+
{...props}
|
|
47
|
+
/>
|
|
52
48
|
);
|
|
53
49
|
};
|
|
54
50
|
|
|
@@ -57,6 +53,7 @@ export default {
|
|
|
57
53
|
component: TextEditor,
|
|
58
54
|
decorators: [withTheme],
|
|
59
55
|
render: Story,
|
|
56
|
+
parameters: { translations, layout: 'fullscreen' },
|
|
60
57
|
};
|
|
61
58
|
|
|
62
59
|
export const Default = {
|
|
@@ -20,7 +20,7 @@ import React, {
|
|
|
20
20
|
|
|
21
21
|
import { log } from '@dxos/log';
|
|
22
22
|
import { useThemeContext } from '@dxos/react-ui';
|
|
23
|
-
import { focusRing
|
|
23
|
+
import { focusRing } from '@dxos/react-ui-theme';
|
|
24
24
|
import { isNotFalsy } from '@dxos/util';
|
|
25
25
|
|
|
26
26
|
import { createBasicBundle, createMarkdownExtensions } from '../../extensions';
|
|
@@ -259,10 +259,10 @@ export const MarkdownEditor = forwardRef<EditorView, TextEditorProps>(
|
|
|
259
259
|
|
|
260
260
|
export const defaultSlots: TextEditorSlots = {
|
|
261
261
|
root: {
|
|
262
|
-
className:
|
|
262
|
+
className: focusRing,
|
|
263
263
|
},
|
|
264
264
|
editor: {
|
|
265
|
-
className: 'bs-full',
|
|
265
|
+
className: 'min-bs-full',
|
|
266
266
|
},
|
|
267
267
|
};
|
|
268
268
|
|
|
@@ -5,11 +5,10 @@
|
|
|
5
5
|
import '@dxosTheme';
|
|
6
6
|
|
|
7
7
|
import { BroadcastChannelNetworkAdapter } from '@automerge/automerge-repo-network-broadcastchannel';
|
|
8
|
-
import
|
|
9
|
-
import '@
|
|
10
|
-
import { basicSetup } from 'codemirror';
|
|
8
|
+
import '@preact/signals-react';
|
|
9
|
+
import { EditorView } from '@codemirror/view'; // Register react integration.
|
|
11
10
|
import get from 'lodash.get';
|
|
12
|
-
import React, { useEffect,
|
|
11
|
+
import React, { useEffect, useState } from 'react';
|
|
13
12
|
|
|
14
13
|
import { type Prop } from '@dxos/automerge/automerge';
|
|
15
14
|
import { Repo, type DocHandle } from '@dxos/automerge/automerge-repo';
|
|
@@ -21,38 +20,42 @@ import { ClientRepeater } from '@dxos/react-client/testing';
|
|
|
21
20
|
import { withTheme } from '@dxos/storybook-utils';
|
|
22
21
|
|
|
23
22
|
import { MarkdownEditor } from './TextEditor';
|
|
24
|
-
import { type IDocHandle, automerge, awareness } from '../../extensions';
|
|
25
|
-
import { useTextModel } from '../../hooks';
|
|
23
|
+
import { type IDocHandle, automerge, awareness, createBasicBundle } from '../../extensions';
|
|
24
|
+
import { useTextEditor, useTextModel } from '../../hooks';
|
|
25
|
+
import { defaultTheme } from '../../themes';
|
|
26
|
+
import translations from '../../translations';
|
|
26
27
|
|
|
27
|
-
|
|
28
|
+
const initialContent = 'Hello world!';
|
|
29
|
+
|
|
30
|
+
type TestObject = {
|
|
31
|
+
text: string;
|
|
32
|
+
};
|
|
28
33
|
|
|
29
34
|
type EditorProps = {
|
|
30
35
|
handle: IDocHandle;
|
|
31
|
-
path
|
|
36
|
+
path?: Prop[];
|
|
32
37
|
};
|
|
33
38
|
|
|
34
|
-
const Editor = ({ handle, path }: EditorProps) => {
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
};
|
|
48
|
-
}, []);
|
|
39
|
+
const Editor = ({ handle, path = ['text'] }: EditorProps) => {
|
|
40
|
+
const { parentRef } = useTextEditor({
|
|
41
|
+
autoFocus: true,
|
|
42
|
+
doc: get(handle.docSync()!, path),
|
|
43
|
+
extensions: [
|
|
44
|
+
//
|
|
45
|
+
EditorView.baseTheme(defaultTheme),
|
|
46
|
+
EditorView.editorAttributes.of({ class: 'p-2 bg-white' }),
|
|
47
|
+
createBasicBundle({ placeholder: 'Type here...' }),
|
|
48
|
+
automerge({ handle, path }),
|
|
49
|
+
awareness(),
|
|
50
|
+
],
|
|
51
|
+
});
|
|
49
52
|
|
|
50
|
-
return <div
|
|
53
|
+
return <div ref={parentRef} />;
|
|
51
54
|
};
|
|
52
55
|
|
|
53
56
|
const Story = () => {
|
|
54
|
-
const [object1, setObject1] = useState<DocHandle<
|
|
55
|
-
const [object2, setObject2] = useState<DocHandle<
|
|
57
|
+
const [object1, setObject1] = useState<DocHandle<TestObject>>();
|
|
58
|
+
const [object2, setObject2] = useState<DocHandle<TestObject>>();
|
|
56
59
|
|
|
57
60
|
useEffect(() => {
|
|
58
61
|
queueMicrotask(async () => {
|
|
@@ -64,8 +67,8 @@ const Story = () => {
|
|
|
64
67
|
});
|
|
65
68
|
|
|
66
69
|
const object1 = repo1.create();
|
|
67
|
-
object1.change((doc:
|
|
68
|
-
doc.text =
|
|
70
|
+
object1.change((doc: TestObject) => {
|
|
71
|
+
doc.text = initialContent;
|
|
69
72
|
});
|
|
70
73
|
|
|
71
74
|
const object2 = repo2.find(object1.url);
|
|
@@ -81,13 +84,9 @@ const Story = () => {
|
|
|
81
84
|
}
|
|
82
85
|
|
|
83
86
|
return (
|
|
84
|
-
<div
|
|
85
|
-
<
|
|
86
|
-
|
|
87
|
-
</div>
|
|
88
|
-
<div>
|
|
89
|
-
<Editor handle={object2} path={['text']} />
|
|
90
|
-
</div>
|
|
87
|
+
<div role='none' className='grid grid-cols-2 bs-full is-full gap-2'>
|
|
88
|
+
<Editor handle={object1} path={['text']} />
|
|
89
|
+
<Editor handle={object2} path={['text']} />
|
|
91
90
|
</div>
|
|
92
91
|
);
|
|
93
92
|
};
|
|
@@ -96,6 +95,7 @@ export default {
|
|
|
96
95
|
title: 'react-ui-editor/Automerge',
|
|
97
96
|
component: Editor,
|
|
98
97
|
render: () => <Story />,
|
|
98
|
+
parameters: { translations, layout: 'fullscreen' },
|
|
99
99
|
};
|
|
100
100
|
|
|
101
101
|
export const Default = {};
|
|
@@ -115,16 +115,11 @@ const EchoStory = ({ spaceKey }: { spaceKey: PublicKey }) => {
|
|
|
115
115
|
return null;
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
return
|
|
119
|
-
<div className='flex overflow-hidden'>
|
|
120
|
-
<div className='flex flex-col w-[800px] overflow-y-scroll'>
|
|
121
|
-
<MarkdownEditor model={model} />
|
|
122
|
-
</div>
|
|
123
|
-
</div>
|
|
124
|
-
);
|
|
118
|
+
return <MarkdownEditor model={model} />;
|
|
125
119
|
};
|
|
126
120
|
|
|
127
121
|
export const WithEcho = {
|
|
122
|
+
decorators: [withTheme],
|
|
128
123
|
render: () => {
|
|
129
124
|
return (
|
|
130
125
|
<ClientRepeater
|
|
@@ -134,7 +129,7 @@ export const WithEcho = {
|
|
|
134
129
|
space.db.add(
|
|
135
130
|
new Expando({
|
|
136
131
|
type: 'test',
|
|
137
|
-
content: new TextObject(
|
|
132
|
+
content: new TextObject(initialContent),
|
|
138
133
|
}),
|
|
139
134
|
);
|
|
140
135
|
}}
|
|
@@ -142,5 +137,4 @@ export const WithEcho = {
|
|
|
142
137
|
/>
|
|
143
138
|
);
|
|
144
139
|
},
|
|
145
|
-
decorators: [withTheme],
|
|
146
140
|
};
|
|
@@ -7,7 +7,7 @@ import '@dxosTheme';
|
|
|
7
7
|
import React from 'react';
|
|
8
8
|
|
|
9
9
|
import { useThemeContext } from '@dxos/react-ui';
|
|
10
|
-
import {
|
|
10
|
+
import { mx, textBlockWidth } from '@dxos/react-ui-theme';
|
|
11
11
|
import { withTheme } from '@dxos/storybook-utils';
|
|
12
12
|
|
|
13
13
|
import { TextEditor } from './TextEditor';
|
|
@@ -24,7 +24,9 @@ import {
|
|
|
24
24
|
useFormattingState,
|
|
25
25
|
} from '../../extensions';
|
|
26
26
|
import { createDataExtensions, createThemeExtensions, useActionHandler, useTextEditor } from '../../hooks';
|
|
27
|
+
import { editorWithToolbarLayout } from '../../styles/layout';
|
|
27
28
|
import { markdownTheme } from '../../themes';
|
|
29
|
+
import translations from '../../translations';
|
|
28
30
|
import { Toolbar } from '../Toolbar';
|
|
29
31
|
|
|
30
32
|
// TODO(burdon): Demo toolbar with hooks.
|
|
@@ -53,11 +55,7 @@ const Story = ({ autoFocus, placeholder, doc, readonly }: StoryProps) => {
|
|
|
53
55
|
themeMode,
|
|
54
56
|
theme: markdownTheme,
|
|
55
57
|
slots: {
|
|
56
|
-
|
|
57
|
-
// Semantic tokens (e.g., replacement of input surface).
|
|
58
|
-
editor: {
|
|
59
|
-
className: 'h-full p-4 bg-white text-black dark:bg-black dark:text-white',
|
|
60
|
-
},
|
|
58
|
+
editor: { className: 'min-bs-full' },
|
|
61
59
|
},
|
|
62
60
|
}),
|
|
63
61
|
// TODO(burdon): Move lineWrapping.
|
|
@@ -80,16 +78,16 @@ const Story = ({ autoFocus, placeholder, doc, readonly }: StoryProps) => {
|
|
|
80
78
|
// FIXME This doesn't update the state on view changes. Also not
|
|
81
79
|
// sure if view is even guaranteed to exist at this point.
|
|
82
80
|
return (
|
|
83
|
-
<div className={mx(
|
|
84
|
-
<
|
|
85
|
-
<
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
{
|
|
91
|
-
|
|
92
|
-
|
|
81
|
+
<div role='none' className={mx('fixed inset-0', editorWithToolbarLayout)}>
|
|
82
|
+
<Toolbar.Root onAction={handleAction} state={formattingState} classNames={textBlockWidth}>
|
|
83
|
+
<Toolbar.Markdown />
|
|
84
|
+
</Toolbar.Root>
|
|
85
|
+
<div role='none' className='overflow-y-auto'>
|
|
86
|
+
<div
|
|
87
|
+
role='textbox'
|
|
88
|
+
className={mx(textBlockWidth, 'min-bs-full p-4 surface-attention fg-base')}
|
|
89
|
+
ref={parentRef}
|
|
90
|
+
/>
|
|
93
91
|
</div>
|
|
94
92
|
</div>
|
|
95
93
|
);
|
|
@@ -100,6 +98,7 @@ export default {
|
|
|
100
98
|
component: TextEditor,
|
|
101
99
|
decorators: [withTheme],
|
|
102
100
|
render: (args: StoryProps) => <Story {...args} />,
|
|
101
|
+
parameters: { translations, layout: 'fullscreen' },
|
|
103
102
|
};
|
|
104
103
|
|
|
105
104
|
export const Default = {
|
|
@@ -9,7 +9,7 @@ import React, { type FC, useMemo, useState } from 'react';
|
|
|
9
9
|
import { TextObject } from '@dxos/echo-schema';
|
|
10
10
|
import { PublicKey } from '@dxos/keys';
|
|
11
11
|
import { faker } from '@dxos/random';
|
|
12
|
-
import {
|
|
12
|
+
import { mx, textBlockWidth } from '@dxos/react-ui-theme';
|
|
13
13
|
import { withTheme } from '@dxos/storybook-utils';
|
|
14
14
|
|
|
15
15
|
import { Toolbar } from './Toolbar';
|
|
@@ -25,6 +25,8 @@ import {
|
|
|
25
25
|
useFormattingState,
|
|
26
26
|
} from '../../extensions';
|
|
27
27
|
import { type Comment, useActionHandler, useEditorView, useTextModel } from '../../hooks';
|
|
28
|
+
import { editorWithToolbarLayout } from '../../styles';
|
|
29
|
+
import translations from '../../translations';
|
|
28
30
|
import { MarkdownEditor } from '../TextEditor';
|
|
29
31
|
|
|
30
32
|
faker.seed(101);
|
|
@@ -63,17 +65,18 @@ const Story: FC<{ content: string }> = ({ content }) => {
|
|
|
63
65
|
}
|
|
64
66
|
|
|
65
67
|
return (
|
|
66
|
-
<div className={mx(
|
|
67
|
-
<
|
|
68
|
-
<
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
68
|
+
<div role='none' className={mx('fixed inset-0', editorWithToolbarLayout)}>
|
|
69
|
+
<Toolbar.Root onAction={handleAction} state={formattingState} classNames={textBlockWidth}>
|
|
70
|
+
<Toolbar.Markdown />
|
|
71
|
+
<Toolbar.Separator />
|
|
72
|
+
<Toolbar.Extended />
|
|
73
|
+
</Toolbar.Root>
|
|
74
|
+
<MarkdownEditor
|
|
75
|
+
ref={editorRef}
|
|
76
|
+
model={model}
|
|
77
|
+
extensions={extensions}
|
|
78
|
+
slots={{ root: { className: mx(textBlockWidth, 'pli-2') } }}
|
|
79
|
+
/>
|
|
77
80
|
</div>
|
|
78
81
|
);
|
|
79
82
|
};
|
|
@@ -83,6 +86,7 @@ export default {
|
|
|
83
86
|
component: Toolbar,
|
|
84
87
|
render: (args: any) => <Story {...args} />,
|
|
85
88
|
decorators: [withTheme],
|
|
89
|
+
parameters: { translations, layout: 'fullscreen' },
|
|
86
90
|
};
|
|
87
91
|
|
|
88
92
|
const content = [
|