@dxos/ui-editor 0.9.0 → 0.9.1-main.c7dcc2e112
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 +51 -53
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +51 -53
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/defaults.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/styles.d.ts.map +1 -1
- package/dist/types/src/extensions/selection.d.ts +12 -1
- package/dist/types/src/extensions/selection.d.ts.map +1 -1
- package/dist/types/src/extensions/selection.test.d.ts +2 -0
- package/dist/types/src/extensions/selection.test.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +27 -27
- package/src/defaults.ts +3 -1
- package/src/extensions/markdown/styles.ts +2 -1
- package/src/extensions/selection.test.ts +26 -0
- package/src/extensions/selection.ts +14 -15
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/ui-editor",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.1-main.c7dcc2e112",
|
|
4
4
|
"description": "Text editor components.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"@codemirror/lang-yaml": "^6.1.3",
|
|
44
44
|
"@codemirror/language": "^6.12.3",
|
|
45
45
|
"@codemirror/language-data": "^6.5.2",
|
|
46
|
-
"@codemirror/lint": "6.9.
|
|
46
|
+
"@codemirror/lint": "6.9.7",
|
|
47
47
|
"@codemirror/search": "^6.7.0",
|
|
48
48
|
"@codemirror/state": "^6.6.0",
|
|
49
49
|
"@codemirror/theme-one-dark": "^6.1.3",
|
|
@@ -62,23 +62,23 @@
|
|
|
62
62
|
"lodash.merge": "^4.6.2",
|
|
63
63
|
"lodash.sortby": "^4.7.0",
|
|
64
64
|
"style-mod": "^4.1.0",
|
|
65
|
-
"@dxos/
|
|
66
|
-
"@dxos/client": "0.9.
|
|
67
|
-
"@dxos/
|
|
68
|
-
"@dxos/
|
|
69
|
-
"@dxos/
|
|
70
|
-
"@dxos/echo": "0.9.
|
|
71
|
-
"@dxos/echo-client": "0.9.
|
|
72
|
-
"@dxos/
|
|
73
|
-
"@dxos/keys": "0.9.
|
|
74
|
-
"@dxos/
|
|
75
|
-
"@dxos/
|
|
76
|
-
"@dxos/
|
|
77
|
-
"@dxos/
|
|
78
|
-
"@dxos/
|
|
79
|
-
"@dxos/ui-theme": "0.9.
|
|
80
|
-
"@dxos/
|
|
81
|
-
"@dxos/
|
|
65
|
+
"@dxos/app-graph": "0.9.1-main.c7dcc2e112",
|
|
66
|
+
"@dxos/client": "0.9.1-main.c7dcc2e112",
|
|
67
|
+
"@dxos/debug": "0.9.1-main.c7dcc2e112",
|
|
68
|
+
"@dxos/context": "0.9.1-main.c7dcc2e112",
|
|
69
|
+
"@dxos/display-name": "0.9.1-main.c7dcc2e112",
|
|
70
|
+
"@dxos/echo": "0.9.1-main.c7dcc2e112",
|
|
71
|
+
"@dxos/echo-client": "0.9.1-main.c7dcc2e112",
|
|
72
|
+
"@dxos/invariant": "0.9.1-main.c7dcc2e112",
|
|
73
|
+
"@dxos/keys": "0.9.1-main.c7dcc2e112",
|
|
74
|
+
"@dxos/lit-ui": "0.9.1-main.c7dcc2e112",
|
|
75
|
+
"@dxos/log": "0.9.1-main.c7dcc2e112",
|
|
76
|
+
"@dxos/ui": "0.9.1-main.c7dcc2e112",
|
|
77
|
+
"@dxos/protocols": "0.9.1-main.c7dcc2e112",
|
|
78
|
+
"@dxos/async": "0.9.1-main.c7dcc2e112",
|
|
79
|
+
"@dxos/ui-theme": "0.9.1-main.c7dcc2e112",
|
|
80
|
+
"@dxos/util": "0.9.1-main.c7dcc2e112",
|
|
81
|
+
"@dxos/ui-types": "0.9.1-main.c7dcc2e112"
|
|
82
82
|
},
|
|
83
83
|
"devDependencies": {
|
|
84
84
|
"@automerge/automerge": "3.3.0-fragments.1",
|
|
@@ -99,18 +99,18 @@
|
|
|
99
99
|
"vite": "^8.0.16",
|
|
100
100
|
"vite-plugin-top-level-await": "^1.6.0",
|
|
101
101
|
"vite-plugin-wasm": "^3.6.0",
|
|
102
|
-
"@dxos/config": "0.9.
|
|
103
|
-
"@dxos/echo": "0.9.
|
|
104
|
-
"@dxos/
|
|
105
|
-
"@dxos/
|
|
106
|
-
"@dxos/
|
|
107
|
-
"@dxos/
|
|
108
|
-
"@dxos/
|
|
102
|
+
"@dxos/config": "0.9.1-main.c7dcc2e112",
|
|
103
|
+
"@dxos/echo": "0.9.1-main.c7dcc2e112",
|
|
104
|
+
"@dxos/random": "0.9.1-main.c7dcc2e112",
|
|
105
|
+
"@dxos/schema": "0.9.1-main.c7dcc2e112",
|
|
106
|
+
"@dxos/ui-theme": "0.9.1-main.c7dcc2e112",
|
|
107
|
+
"@dxos/keyboard": "0.9.1-main.c7dcc2e112",
|
|
108
|
+
"@dxos/storybook-utils": "0.9.1-main.c7dcc2e112"
|
|
109
109
|
},
|
|
110
110
|
"peerDependencies": {
|
|
111
111
|
"@effect/platform": "0.96.1",
|
|
112
112
|
"effect": "3.21.3",
|
|
113
|
-
"@dxos/ui-theme": "0.9.
|
|
113
|
+
"@dxos/ui-theme": "0.9.1-main.c7dcc2e112"
|
|
114
114
|
},
|
|
115
115
|
"publishConfig": {
|
|
116
116
|
"access": "public"
|
package/src/defaults.ts
CHANGED
|
@@ -9,7 +9,9 @@ import { type ThemeExtensionsOptions } from './extensions';
|
|
|
9
9
|
export const editorClassNames = (role?: string) =>
|
|
10
10
|
mx(
|
|
11
11
|
'dx-attention-surface data-[toolbar=disabled]:pt-2 dx-focus-ring-inset',
|
|
12
|
-
role === '
|
|
12
|
+
role === 'org.dxos.role.section'
|
|
13
|
+
? '[&_.cm-scroller]:overflow-hidden [&_.cm-scroller]:min-h-24'
|
|
14
|
+
: 'dx-container overflow-hidden',
|
|
13
15
|
);
|
|
14
16
|
|
|
15
17
|
export const documentSlots: ThemeExtensionsOptions['slots'] = {
|
|
@@ -82,7 +82,8 @@ export const formattingStyles = EditorView.theme({
|
|
|
82
82
|
},
|
|
83
83
|
'& .cm-codeblock-line': {
|
|
84
84
|
background: 'var(--color-cm-codeblock)',
|
|
85
|
-
|
|
85
|
+
paddingLeft: '1rem !important',
|
|
86
|
+
paddingRight: '1.5rem !important',
|
|
86
87
|
},
|
|
87
88
|
'& .cm-codeblock-start': {
|
|
88
89
|
borderTopLeftRadius: '.25rem',
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
import { describe, test } from 'vitest';
|
|
7
|
+
|
|
8
|
+
import { EditorSelectionStateSchema } from './selection';
|
|
9
|
+
|
|
10
|
+
describe('EditorSelectionStateSchema', () => {
|
|
11
|
+
test('encode/decode preserves the legacy serialized shape', ({ expect }) => {
|
|
12
|
+
const value = { scrollTo: 42, selection: { anchor: 3, head: 9 } };
|
|
13
|
+
const encoded = Schema.encodeSync(EditorSelectionStateSchema)(value);
|
|
14
|
+
expect(encoded).toEqual(value);
|
|
15
|
+
expect(Schema.decodeUnknownSync(EditorSelectionStateSchema)(JSON.parse(JSON.stringify(encoded)))).toEqual(value);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test('accepts an empty state', ({ expect }) => {
|
|
19
|
+
expect(Schema.decodeUnknownSync(EditorSelectionStateSchema)({})).toEqual({});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test('accepts selection without head', ({ expect }) => {
|
|
23
|
+
const value = { selection: { anchor: 5 } };
|
|
24
|
+
expect(Schema.decodeUnknownSync(EditorSelectionStateSchema)(value)).toEqual(value);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
import { type Extension, Transaction, type TransactionSpec } from '@codemirror/state';
|
|
6
6
|
import { EditorView, keymap } from '@codemirror/view';
|
|
7
|
+
import * as Schema from 'effect/Schema';
|
|
7
8
|
|
|
8
9
|
import { debounce } from '@dxos/async';
|
|
9
|
-
import { invariant } from '@dxos/invariant';
|
|
10
10
|
import { isTruthy } from '@dxos/util';
|
|
11
11
|
|
|
12
12
|
import { singleValueFacet } from '../util';
|
|
@@ -26,6 +26,16 @@ export type EditorSelectionState = {
|
|
|
26
26
|
selection?: EditorSelection;
|
|
27
27
|
};
|
|
28
28
|
|
|
29
|
+
export const EditorSelectionSchema = Schema.Struct({
|
|
30
|
+
anchor: Schema.Number,
|
|
31
|
+
head: Schema.optional(Schema.Number),
|
|
32
|
+
}).pipe(Schema.mutable);
|
|
33
|
+
|
|
34
|
+
export const EditorSelectionStateSchema = Schema.Struct({
|
|
35
|
+
scrollTo: Schema.optional(Schema.Number),
|
|
36
|
+
selection: Schema.optional(EditorSelectionSchema),
|
|
37
|
+
}).pipe(Schema.mutable);
|
|
38
|
+
|
|
29
39
|
export type EditorStateStore = {
|
|
30
40
|
setState: (id: string, state: EditorSelectionState) => void;
|
|
31
41
|
getState: (id: string) => EditorSelectionState | undefined;
|
|
@@ -42,19 +52,6 @@ export const createEditorStateTransaction = ({ scrollTo, selection }: EditorSele
|
|
|
42
52
|
};
|
|
43
53
|
};
|
|
44
54
|
|
|
45
|
-
export const createEditorStateStore = (keyPrefix: string): EditorStateStore => ({
|
|
46
|
-
getState: (id) => {
|
|
47
|
-
invariant(id);
|
|
48
|
-
const state = localStorage.getItem(`${keyPrefix}/${id}`);
|
|
49
|
-
return state ? JSON.parse(state) : undefined;
|
|
50
|
-
},
|
|
51
|
-
|
|
52
|
-
setState: (id, state) => {
|
|
53
|
-
invariant(id);
|
|
54
|
-
localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state));
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
|
|
58
55
|
/**
|
|
59
56
|
* Track scrolling and selection state to be restored when switching to document.
|
|
60
57
|
*/
|
|
@@ -89,7 +86,9 @@ export const selectionState = ({ getState, setState }: Partial<EditorStateStore>
|
|
|
89
86
|
key: 'Ctrl-r', // TODO(burdon): Setting to jump back to selection.
|
|
90
87
|
run: (view) => {
|
|
91
88
|
const state = getState(view.state.facet(documentId));
|
|
92
|
-
|
|
89
|
+
// Only restore when something was actually stored; a store may return an empty state
|
|
90
|
+
// (no scroll/selection) for an unseen document, which would otherwise dispatch a no-op.
|
|
91
|
+
if (state && (state.scrollTo != null || state.selection)) {
|
|
93
92
|
view.dispatch(createEditorStateTransaction(state));
|
|
94
93
|
}
|
|
95
94
|
return true;
|