@dxos/react-ui-editor 0.6.13-main.ed424a1 → 0.6.13-staging.1e988a3
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 +346 -241
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/types/src/TextEditor.stories.d.ts +1 -4
- package/dist/types/src/TextEditor.stories.d.ts.map +1 -1
- package/dist/types/src/defaults.d.ts.map +1 -1
- package/dist/types/src/extensions/autocomplete.d.ts +1 -2
- package/dist/types/src/extensions/autocomplete.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/automerge.spec.d.ts +2 -0
- package/dist/types/src/extensions/automerge/automerge.spec.d.ts.map +1 -0
- package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
- package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
- package/dist/types/src/extensions/awareness/awareness.d.ts +2 -2
- package/dist/types/src/extensions/awareness/awareness.d.ts.map +1 -1
- package/dist/types/src/extensions/command/state.d.ts +2 -2
- package/dist/types/src/extensions/command/state.d.ts.map +1 -1
- package/dist/types/src/extensions/comments.d.ts +1 -1
- package/dist/types/src/extensions/comments.d.ts.map +1 -1
- package/dist/types/src/{state → extensions}/cursor.d.ts +2 -2
- package/dist/types/src/extensions/cursor.d.ts.map +1 -0
- package/dist/types/src/extensions/debug.d.ts +2 -2
- package/dist/types/src/extensions/debug.d.ts.map +1 -1
- package/dist/types/src/extensions/doc.d.ts +6 -0
- package/dist/types/src/extensions/doc.d.ts.map +1 -0
- package/dist/types/src/extensions/folding.d.ts.map +1 -1
- package/dist/types/src/extensions/index.d.ts +4 -0
- package/dist/types/src/extensions/index.d.ts.map +1 -1
- package/dist/types/src/extensions/listener.d.ts +0 -1
- package/dist/types/src/extensions/listener.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/link.d.ts +1 -1
- package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/styles.d.ts.map +1 -1
- package/dist/types/src/extensions/modes.d.ts +3 -3
- package/dist/types/src/extensions/modes.d.ts.map +1 -1
- package/dist/types/src/{state → extensions}/state.d.ts +2 -2
- package/dist/types/src/extensions/state.d.ts.map +1 -0
- package/dist/types/src/extensions/types.d.ts.map +1 -0
- package/dist/types/src/extensions/util/overlap.d.ts +1 -1
- package/dist/types/src/extensions/util/overlap.d.ts.map +1 -1
- package/dist/types/src/extensions/util/react.d.ts +1 -1
- package/dist/types/src/extensions/util/react.d.ts.map +1 -1
- package/dist/types/src/hooks/useTextEditor.d.ts +1 -1
- package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +0 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/styles/markdown.d.ts +2 -1
- package/dist/types/src/styles/markdown.d.ts.map +1 -1
- package/dist/types/src/styles/theme.d.ts.map +1 -1
- package/dist/types/src/util.d.ts +0 -6
- package/dist/types/src/util.d.ts.map +1 -1
- package/package.json +38 -59
- package/src/TextEditor.stories.tsx +20 -25
- package/src/defaults.ts +2 -0
- package/src/extensions/annotations.ts +1 -1
- package/src/extensions/autocomplete.ts +8 -9
- package/src/extensions/automerge/{automerge.test.tsx → automerge.spec.tsx} +0 -1
- package/src/extensions/automerge/automerge.stories.tsx +1 -1
- package/src/extensions/automerge/automerge.test.ts +13 -0
- package/src/extensions/automerge/automerge.ts +2 -2
- package/src/extensions/automerge/cursor.ts +1 -1
- package/src/extensions/awareness/awareness.ts +5 -3
- package/src/extensions/command/hint.ts +1 -1
- package/src/extensions/command/state.ts +4 -3
- package/src/extensions/comments.ts +45 -44
- package/src/{state → extensions}/cursor.ts +6 -3
- package/src/extensions/debug.ts +2 -2
- package/src/extensions/doc.ts +17 -0
- package/src/extensions/folding.tsx +2 -4
- package/src/extensions/index.ts +4 -0
- package/src/extensions/listener.ts +0 -1
- package/src/extensions/markdown/changes.test.ts +3 -1
- package/src/extensions/markdown/decorate.ts +6 -49
- package/src/extensions/markdown/formatting.test.ts +3 -1
- package/src/extensions/markdown/highlight.ts +5 -0
- package/src/extensions/markdown/link.ts +2 -3
- package/src/extensions/markdown/parser.test.ts +2 -1
- package/src/extensions/markdown/styles.ts +0 -10
- package/src/extensions/markdown/table.ts +3 -3
- package/src/extensions/modes.ts +5 -6
- package/src/{state → extensions}/state.ts +3 -7
- package/src/extensions/util/overlap.ts +1 -1
- package/src/extensions/util/react.tsx +1 -5
- package/src/hooks/useTextEditor.ts +32 -36
- package/src/index.ts +0 -1
- package/src/styles/markdown.ts +3 -1
- package/src/styles/theme.ts +1 -3
- package/src/util.ts +0 -10
- package/dist/lib/browser/chunk-CIQSMP7K.mjs +0 -148
- package/dist/lib/browser/chunk-CIQSMP7K.mjs.map +0 -7
- package/dist/lib/browser/state/index.mjs +0 -17
- package/dist/lib/browser/state/index.mjs.map +0 -7
- package/dist/lib/node/chunk-GZWIENFM.cjs +0 -169
- package/dist/lib/node/chunk-GZWIENFM.cjs.map +0 -7
- package/dist/lib/node/index.cjs +0 -5493
- package/dist/lib/node/index.cjs.map +0 -7
- package/dist/lib/node/meta.json +0 -1
- package/dist/lib/node/state/index.cjs +0 -39
- package/dist/lib/node/state/index.cjs.map +0 -7
- package/dist/lib/node-esm/chunk-GP5RCZ3X.mjs +0 -150
- package/dist/lib/node-esm/chunk-GP5RCZ3X.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -5484
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/state/index.mjs +0 -18
- package/dist/lib/node-esm/state/index.mjs.map +0 -7
- package/dist/types/src/state/cursor.d.ts.map +0 -1
- package/dist/types/src/state/doc.d.ts +0 -5
- package/dist/types/src/state/doc.d.ts.map +0 -1
- package/dist/types/src/state/index.d.ts +0 -6
- package/dist/types/src/state/index.d.ts.map +0 -1
- package/dist/types/src/state/state.d.ts.map +0 -1
- package/dist/types/src/state/types.d.ts.map +0 -1
- package/dist/types/src/state/util.d.ts +0 -3
- package/dist/types/src/state/util.d.ts.map +0 -1
- package/src/state/doc.ts +0 -10
- package/src/state/index.ts +0 -11
- package/src/state/util.ts +0 -13
- /package/dist/types/src/{state → extensions}/types.d.ts +0 -0
- /package/src/{state → extensions}/types.ts +0 -0
@@ -19,12 +19,10 @@ import {
|
|
19
19
|
import { log } from '@dxos/log';
|
20
20
|
import { getProviderValue, isNotFalsy, type MaybeProvider } from '@dxos/util';
|
21
21
|
|
22
|
-
import { editorInputMode } from '../extensions';
|
23
|
-
import {
|
24
|
-
import { debugDispatcher } from '../util';
|
22
|
+
import { createEditorStateTransaction, documentId, editorInputMode, type EditorSelection } from '../extensions';
|
23
|
+
import { logChanges } from '../util';
|
25
24
|
|
26
25
|
export type UseTextEditor = {
|
27
|
-
// TODO(burdon): Rename.
|
28
26
|
parentRef: RefObject<HTMLDivElement>;
|
29
27
|
view?: EditorView;
|
30
28
|
focusAttributes: ReturnType<typeof useFocusableGroup> & {
|
@@ -67,6 +65,8 @@ export const useTextEditor = (
|
|
67
65
|
|
68
66
|
// NOTE: Increments by 2 in strict mode.
|
69
67
|
const [instanceId] = useState(() => `text-editor-${++instanceCount}`);
|
68
|
+
// Callback once view is created.
|
69
|
+
const onUpdate = useRef<() => void>();
|
70
70
|
const [view, setView] = useState<EditorView>();
|
71
71
|
const parentRef = useRef<HTMLDivElement>(null);
|
72
72
|
|
@@ -87,45 +87,44 @@ export const useTextEditor = (
|
|
87
87
|
}
|
88
88
|
|
89
89
|
// https://codemirror.net/docs/ref/#state.EditorStateConfig
|
90
|
+
// NOTE: Don't set selection here in case it is invalid (and crashes the state); dispatch below.
|
90
91
|
const state = EditorState.create({
|
91
92
|
doc: initialValue,
|
92
|
-
|
93
|
+
selection: initialSelection,
|
93
94
|
extensions: [
|
94
95
|
id && documentId.of(id),
|
95
|
-
|
96
|
-
// NOTE: This doesn't catch errors in keymap functions.
|
96
|
+
// NOTE: Doesn't catch errors in keymap functions.
|
97
97
|
EditorView.exceptionSink.of((err) => {
|
98
98
|
log.catch(err);
|
99
99
|
}),
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
//
|
107
|
-
// destroy() {
|
108
|
-
// log('destroy', { id });
|
109
|
-
// }
|
110
|
-
// },
|
111
|
-
// ),
|
100
|
+
extensions,
|
101
|
+
EditorView.updateListener.of(() => {
|
102
|
+
setTimeout(() => {
|
103
|
+
onUpdate.current?.();
|
104
|
+
});
|
105
|
+
}),
|
112
106
|
].filter(isNotFalsy),
|
113
107
|
});
|
114
108
|
|
115
109
|
// https://codemirror.net/docs/ref/#view.EditorViewConfig
|
116
110
|
view = new EditorView({
|
117
111
|
parent: parentRef.current,
|
112
|
+
selection: initialSelection,
|
118
113
|
state,
|
119
|
-
|
120
|
-
|
114
|
+
// NOTE: Uncomment to debug/monitor all transactions.
|
115
|
+
// https://codemirror.net/docs/ref/#view.EditorView.dispatch
|
116
|
+
dispatchTransactions: (trs, view) => {
|
117
|
+
if (debug) {
|
118
|
+
logChanges(trs);
|
119
|
+
}
|
120
|
+
view.update(trs);
|
121
|
+
},
|
121
122
|
});
|
122
123
|
|
123
|
-
// Move to end of line after document loaded
|
124
|
-
if (
|
124
|
+
// Move to end of line after document loaded.
|
125
|
+
if (!initialValue && moveToEndOfLine) {
|
125
126
|
const { to } = view.state.doc.lineAt(0);
|
126
|
-
|
127
|
-
view.dispatch({ selection: { anchor: to } });
|
128
|
-
}
|
127
|
+
view.dispatch({ selection: { anchor: to } });
|
129
128
|
}
|
130
129
|
|
131
130
|
setView(view);
|
@@ -139,21 +138,18 @@ export const useTextEditor = (
|
|
139
138
|
|
140
139
|
useEffect(() => {
|
141
140
|
if (view) {
|
141
|
+
// NOTE: Set selection after first update (since content may rerender on focus).
|
142
|
+
onUpdate.current = () => {
|
143
|
+
onUpdate.current = undefined;
|
144
|
+
view.dispatch(createEditorStateTransaction({ scrollTo, selection }));
|
145
|
+
};
|
146
|
+
|
142
147
|
// Remove tabster attribute (rely on custom keymap).
|
143
148
|
if (view.state.facet(editorInputMode).noTabster) {
|
144
149
|
parentRef.current?.removeAttribute('data-tabster');
|
145
150
|
}
|
146
|
-
|
147
|
-
if (scrollTo || selection) {
|
148
|
-
if (selection && selection.anchor > view.state.doc.length) {
|
149
|
-
log.warn('invalid selection', { length: view.state.doc.length, scrollTo, selection });
|
150
|
-
return;
|
151
|
-
}
|
152
|
-
|
153
|
-
view.dispatch(createEditorStateTransaction(view.state, { scrollTo, selection }));
|
154
|
-
}
|
155
151
|
}
|
156
|
-
}, [view,
|
152
|
+
}, [view, selection, scrollTo]);
|
157
153
|
|
158
154
|
useEffect(() => {
|
159
155
|
if (view && autoFocus) {
|
package/src/index.ts
CHANGED
package/src/styles/markdown.ts
CHANGED
@@ -17,9 +17,11 @@ const headings: Record<HeadingLevel, string> = {
|
|
17
17
|
};
|
18
18
|
|
19
19
|
export const theme = {
|
20
|
+
mark: 'opacity-50',
|
20
21
|
code: 'font-mono !no-underline text-neutral-700 dark:text-neutral-300',
|
21
22
|
codeMark: 'font-mono text-primary-500',
|
22
|
-
|
23
|
+
// TODO(burdon): Replace with widget.
|
24
|
+
blockquote: 'pl-1 mr-1 border-is-4 border-orange-500 dark:border-orange-500 dark:text-neutral-500',
|
23
25
|
heading: (level: HeadingLevel) => {
|
24
26
|
return mx(headings[level], 'dark:text-primary-400');
|
25
27
|
},
|
package/src/styles/theme.ts
CHANGED
@@ -71,11 +71,9 @@ export const defaultTheme: ThemeStyles = {
|
|
71
71
|
/**
|
72
72
|
* Gutters
|
73
73
|
* NOTE: Gutters should have the same top margin as the content.
|
74
|
-
* NOTE: They can't be transparent since the content needs to scroll below.
|
75
74
|
*/
|
76
75
|
'.cm-gutters': {
|
77
76
|
background: 'var(--surface-bg)',
|
78
|
-
borderRight: 'none',
|
79
77
|
},
|
80
78
|
'.cm-gutter': {},
|
81
79
|
'.cm-gutter.cm-lineNumbers .cm-gutterElement': {
|
@@ -97,7 +95,7 @@ export const defaultTheme: ThemeStyles = {
|
|
97
95
|
paddingInline: 0,
|
98
96
|
},
|
99
97
|
'.cm-activeLine': {
|
100
|
-
background: 'var(--dx-
|
98
|
+
background: 'var(--dx-hoverSurface)',
|
101
99
|
},
|
102
100
|
|
103
101
|
/**
|
package/src/util.ts
CHANGED
@@ -3,7 +3,6 @@
|
|
3
3
|
//
|
4
4
|
|
5
5
|
import type { Transaction } from '@codemirror/state';
|
6
|
-
import { type EditorView } from '@codemirror/view';
|
7
6
|
|
8
7
|
import { log } from '@dxos/log';
|
9
8
|
|
@@ -20,15 +19,6 @@ export const callbackWrapper = <T extends Function>(fn: T): T =>
|
|
20
19
|
}
|
21
20
|
}) as unknown as T;
|
22
21
|
|
23
|
-
/**
|
24
|
-
* Log all changes before dispatching them to the view.
|
25
|
-
* https://codemirror.net/docs/ref/#view.EditorView.dispatch
|
26
|
-
*/
|
27
|
-
export const debugDispatcher = (trs: readonly Transaction[], view: EditorView) => {
|
28
|
-
logChanges(trs);
|
29
|
-
view.update(trs);
|
30
|
-
};
|
31
|
-
|
32
22
|
export const logChanges = (trs: readonly Transaction[]) => {
|
33
23
|
const changes = trs
|
34
24
|
.flatMap((tr) => {
|
@@ -1,148 +0,0 @@
|
|
1
|
-
// packages/ui/react-ui-editor/src/state/util.ts
|
2
|
-
import { Facet } from "@codemirror/state";
|
3
|
-
var singleValueFacet = (defaultValue) => Facet.define({
|
4
|
-
// Called immediately.
|
5
|
-
combine: (providers) => {
|
6
|
-
return providers[0] ?? defaultValue;
|
7
|
-
}
|
8
|
-
});
|
9
|
-
|
10
|
-
// packages/ui/react-ui-editor/src/state/cursor.ts
|
11
|
-
var defaultCursorConverter = {
|
12
|
-
toCursor: (position) => position.toString(),
|
13
|
-
fromCursor: (cursor) => parseInt(cursor)
|
14
|
-
};
|
15
|
-
var Cursor = class _Cursor {
|
16
|
-
static {
|
17
|
-
this.converter = singleValueFacet(defaultCursorConverter);
|
18
|
-
}
|
19
|
-
static {
|
20
|
-
this.getCursorFromRange = (state2, range) => {
|
21
|
-
const cursorConverter = state2.facet(_Cursor.converter);
|
22
|
-
const from = cursorConverter.toCursor(range.from);
|
23
|
-
const to = cursorConverter.toCursor(range.to, -1);
|
24
|
-
return [
|
25
|
-
from,
|
26
|
-
to
|
27
|
-
].join(":");
|
28
|
-
};
|
29
|
-
}
|
30
|
-
static {
|
31
|
-
this.getRangeFromCursor = (state2, cursor) => {
|
32
|
-
const cursorConverter = state2.facet(_Cursor.converter);
|
33
|
-
const parts = cursor.split(":");
|
34
|
-
const from = cursorConverter.fromCursor(parts[0]);
|
35
|
-
const to = cursorConverter.fromCursor(parts[1]);
|
36
|
-
return from !== void 0 && to !== void 0 ? {
|
37
|
-
from,
|
38
|
-
to
|
39
|
-
} : void 0;
|
40
|
-
};
|
41
|
-
}
|
42
|
-
};
|
43
|
-
|
44
|
-
// packages/ui/react-ui-editor/src/state/doc.ts
|
45
|
-
var documentId = singleValueFacet();
|
46
|
-
|
47
|
-
// packages/ui/react-ui-editor/src/state/state.ts
|
48
|
-
import { Transaction } from "@codemirror/state";
|
49
|
-
import { EditorView, keymap } from "@codemirror/view";
|
50
|
-
import { debounce } from "@dxos/async";
|
51
|
-
import { invariant } from "@dxos/invariant";
|
52
|
-
import { isNotFalsy } from "@dxos/util";
|
53
|
-
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/state/state.ts";
|
54
|
-
var stateRestoreAnnotation = "dxos.org/cm/state-restore";
|
55
|
-
var keyPrefix = "dxos.org/react-ui-editor/state";
|
56
|
-
var localStorageStateStoreAdapter = {
|
57
|
-
getState: (id) => {
|
58
|
-
invariant(id, void 0, {
|
59
|
-
F: __dxlog_file,
|
60
|
-
L: 34,
|
61
|
-
S: void 0,
|
62
|
-
A: [
|
63
|
-
"id",
|
64
|
-
""
|
65
|
-
]
|
66
|
-
});
|
67
|
-
const state2 = localStorage.getItem(`${keyPrefix}/${id}`);
|
68
|
-
return state2 ? JSON.parse(state2) : void 0;
|
69
|
-
},
|
70
|
-
setState: (id, state2) => {
|
71
|
-
invariant(id, void 0, {
|
72
|
-
F: __dxlog_file,
|
73
|
-
L: 40,
|
74
|
-
S: void 0,
|
75
|
-
A: [
|
76
|
-
"id",
|
77
|
-
""
|
78
|
-
]
|
79
|
-
});
|
80
|
-
localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state2));
|
81
|
-
}
|
82
|
-
};
|
83
|
-
var createEditorStateTransaction = (state2, { scrollTo, selection }) => {
|
84
|
-
return {
|
85
|
-
selection,
|
86
|
-
scrollIntoView: !scrollTo,
|
87
|
-
effects: scrollTo ? EditorView.scrollIntoView(scrollTo, {
|
88
|
-
yMargin: 96
|
89
|
-
}) : void 0,
|
90
|
-
annotations: Transaction.userEvent.of(stateRestoreAnnotation)
|
91
|
-
};
|
92
|
-
};
|
93
|
-
var state = ({ getState, setState } = {}) => {
|
94
|
-
const setStateDebounced = debounce(setState, 1e3);
|
95
|
-
return [
|
96
|
-
// TODO(burdon): Track scrolling (currently only updates when cursor moves).
|
97
|
-
// EditorView.domEventHandlers({
|
98
|
-
// scroll: (event) => {
|
99
|
-
// setStateDebounced(id, {});
|
100
|
-
// },
|
101
|
-
// }),
|
102
|
-
EditorView.updateListener.of(({ view, transactions }) => {
|
103
|
-
const id = view.state.facet(documentId);
|
104
|
-
if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
|
105
|
-
return;
|
106
|
-
}
|
107
|
-
if (setState) {
|
108
|
-
const { scrollTop } = view.scrollDOM;
|
109
|
-
const pos = view.posAtCoords({
|
110
|
-
x: 0,
|
111
|
-
y: scrollTop
|
112
|
-
});
|
113
|
-
if (pos !== null) {
|
114
|
-
const { anchor, head } = view.state.selection.main;
|
115
|
-
setStateDebounced(id, {
|
116
|
-
scrollTo: pos,
|
117
|
-
selection: {
|
118
|
-
anchor,
|
119
|
-
head
|
120
|
-
}
|
121
|
-
});
|
122
|
-
}
|
123
|
-
}
|
124
|
-
}),
|
125
|
-
getState && keymap.of([
|
126
|
-
{
|
127
|
-
key: "ctrl-r",
|
128
|
-
run: (view) => {
|
129
|
-
const state2 = getState(view.state.facet(documentId));
|
130
|
-
if (state2) {
|
131
|
-
view.dispatch(createEditorStateTransaction(view.state, state2));
|
132
|
-
}
|
133
|
-
return true;
|
134
|
-
}
|
135
|
-
}
|
136
|
-
])
|
137
|
-
].filter(isNotFalsy);
|
138
|
-
};
|
139
|
-
|
140
|
-
export {
|
141
|
-
singleValueFacet,
|
142
|
-
Cursor,
|
143
|
-
documentId,
|
144
|
-
localStorageStateStoreAdapter,
|
145
|
-
createEditorStateTransaction,
|
146
|
-
state
|
147
|
-
};
|
148
|
-
//# sourceMappingURL=chunk-CIQSMP7K.mjs.map
|
@@ -1,7 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"version": 3,
|
3
|
-
"sources": ["../../../src/state/util.ts", "../../../src/state/cursor.ts", "../../../src/state/doc.ts", "../../../src/state/state.ts"],
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Facet } from '@codemirror/state';\n\nexport const singleValueFacet = <I, O = I>(defaultValue?: O) =>\n Facet.define<I, O>({\n // Called immediately.\n combine: (providers) => {\n return (providers[0] ?? defaultValue) as O;\n },\n });\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EditorState } from '@codemirror/state';\n\nimport { type Range } from './types';\nimport { singleValueFacet } from './util';\n\n/**\n * Converts indexes into the text document into stable peer-independent cursors.\n *\n * See:\n * - https://automerge.org/automerge/api-docs/js/functions/next.getCursor.html\n * - https://github.com/yjs/yjs?tab=readme-ov-file#relative-positions\n *\n * @param {assoc} number Negative values will associate the cursor with the previous character\n * while positive - with the next one.\n */\nexport interface CursorConverter {\n toCursor(position: number, assoc?: -1 | 1 | undefined): string;\n fromCursor(cursor: string): number;\n}\n\nconst defaultCursorConverter: CursorConverter = {\n toCursor: (position) => position.toString(),\n fromCursor: (cursor) => parseInt(cursor),\n};\n\nexport class Cursor {\n static readonly converter = singleValueFacet(defaultCursorConverter);\n\n static readonly getCursorFromRange = (state: EditorState, range: Range) => {\n const cursorConverter = state.facet(Cursor.converter);\n\n const from = cursorConverter.toCursor(range.from);\n const to = cursorConverter.toCursor(range.to, -1);\n return [from, to].join(':');\n };\n\n static readonly getRangeFromCursor = (state: EditorState, cursor: string) => {\n const cursorConverter = state.facet(Cursor.converter);\n\n const parts = cursor.split(':');\n const from = cursorConverter.fromCursor(parts[0]);\n const to = cursorConverter.fromCursor(parts[1]);\n return from !== undefined && to !== undefined ? { from, to } : undefined;\n };\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { singleValueFacet } from './util';\n\n/**\n * Currently edited document id as FQ string.\n */\nexport const documentId = singleValueFacet<string>();\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EditorState, type Extension, Transaction, type TransactionSpec } from '@codemirror/state';\nimport { EditorView, keymap } from '@codemirror/view';\n\nimport { debounce } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { documentId } from './doc';\n\nconst stateRestoreAnnotation = 'dxos.org/cm/state-restore';\n\nexport type EditorSelection = {\n anchor: number;\n head?: number;\n};\n\nexport type EditorSelectionState = {\n scrollTo?: number;\n selection?: EditorSelection;\n};\n\nexport type EditorStateOptions = {\n setState: (id: string, state: EditorSelectionState) => void;\n getState: (id: string) => EditorSelectionState | undefined;\n};\n\nconst keyPrefix = 'dxos.org/react-ui-editor/state';\nexport const localStorageStateStoreAdapter: EditorStateOptions = {\n getState: (id) => {\n invariant(id);\n const state = localStorage.getItem(`${keyPrefix}/${id}`);\n return state ? JSON.parse(state) : undefined;\n },\n\n setState: (id, state) => {\n invariant(id);\n localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state));\n },\n};\n\nexport const createEditorStateTransaction = (\n state: EditorState,\n { scrollTo, selection }: EditorSelectionState,\n): TransactionSpec => {\n return {\n selection,\n scrollIntoView: !scrollTo,\n effects: scrollTo ? EditorView.scrollIntoView(scrollTo, { yMargin: 96 }) : undefined,\n annotations: Transaction.userEvent.of(stateRestoreAnnotation),\n };\n};\n\n/**\n * Track scrolling and selection state to be restored when switching to document.\n */\n// TODO(burdon): Rename.\nexport const state = ({ getState, setState }: Partial<EditorStateOptions> = {}): Extension => {\n const setStateDebounced = debounce(setState!, 1_000);\n\n return [\n // TODO(burdon): Track scrolling (currently only updates when cursor moves).\n // EditorView.domEventHandlers({\n // scroll: (event) => {\n // setStateDebounced(id, {});\n // },\n // }),\n EditorView.updateListener.of(({ view, transactions }) => {\n const id = view.state.facet(documentId);\n if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {\n return;\n }\n\n if (setState) {\n const { scrollTop } = view.scrollDOM;\n const pos = view.posAtCoords({ x: 0, y: scrollTop });\n if (pos !== null) {\n const { anchor, head } = view.state.selection.main;\n setStateDebounced(id, { scrollTo: pos, selection: { anchor, head } });\n }\n }\n }),\n getState &&\n keymap.of([\n {\n key: 'ctrl-r', // TODO(burdon): Setting to jump back to selection.\n run: (view) => {\n const state = getState(view.state.facet(documentId));\n if (state) {\n view.dispatch(createEditorStateTransaction(view.state, state));\n }\n return true;\n },\n },\n ]),\n ].filter(isNotFalsy);\n};\n"],
|
5
|
-
"mappings": "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",
|
6
|
-
"names": ["Facet", "singleValueFacet", "defaultValue", "Facet", "define", "combine", "providers", "defaultCursorConverter", "toCursor", "position", "toString", "fromCursor", "cursor", "parseInt", "Cursor", "converter", "singleValueFacet", "getCursorFromRange", "state", "range", "cursorConverter", "facet", "from", "to", "join", "getRangeFromCursor", "parts", "split", "undefined", "documentId", "singleValueFacet", "Transaction", "EditorView", "keymap", "debounce", "invariant", "isNotFalsy", "stateRestoreAnnotation", "keyPrefix", "localStorageStateStoreAdapter", "getState", "id", "invariant", "state", "localStorage", "getItem", "JSON", "parse", "undefined", "setState", "setItem", "stringify", "createEditorStateTransaction", "scrollTo", "selection", "scrollIntoView", "effects", "EditorView", "yMargin", "annotations", "Transaction", "userEvent", "of", "setStateDebounced", "debounce", "updateListener", "view", "transactions", "facet", "documentId", "some", "tr", "isUserEvent", "scrollTop", "scrollDOM", "pos", "posAtCoords", "x", "y", "anchor", "head", "main", "keymap", "key", "run", "dispatch", "filter", "isNotFalsy"]
|
7
|
-
}
|
@@ -1,17 +0,0 @@
|
|
1
|
-
import {
|
2
|
-
Cursor,
|
3
|
-
createEditorStateTransaction,
|
4
|
-
documentId,
|
5
|
-
localStorageStateStoreAdapter,
|
6
|
-
singleValueFacet,
|
7
|
-
state
|
8
|
-
} from "../chunk-CIQSMP7K.mjs";
|
9
|
-
export {
|
10
|
-
Cursor,
|
11
|
-
createEditorStateTransaction,
|
12
|
-
documentId,
|
13
|
-
localStorageStateStoreAdapter,
|
14
|
-
singleValueFacet,
|
15
|
-
state
|
16
|
-
};
|
17
|
-
//# sourceMappingURL=index.mjs.map
|
@@ -1,169 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __defProp = Object.defineProperty;
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
6
|
-
var __export = (target, all) => {
|
7
|
-
for (var name in all)
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
9
|
-
};
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
12
|
-
for (let key of __getOwnPropNames(from))
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
15
|
-
}
|
16
|
-
return to;
|
17
|
-
};
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
19
|
-
var chunk_GZWIENFM_exports = {};
|
20
|
-
__export(chunk_GZWIENFM_exports, {
|
21
|
-
Cursor: () => Cursor,
|
22
|
-
createEditorStateTransaction: () => createEditorStateTransaction,
|
23
|
-
documentId: () => documentId,
|
24
|
-
localStorageStateStoreAdapter: () => localStorageStateStoreAdapter,
|
25
|
-
singleValueFacet: () => singleValueFacet,
|
26
|
-
state: () => state
|
27
|
-
});
|
28
|
-
module.exports = __toCommonJS(chunk_GZWIENFM_exports);
|
29
|
-
var import_state = require("@codemirror/state");
|
30
|
-
var import_state2 = require("@codemirror/state");
|
31
|
-
var import_view = require("@codemirror/view");
|
32
|
-
var import_async = require("@dxos/async");
|
33
|
-
var import_invariant = require("@dxos/invariant");
|
34
|
-
var import_util = require("@dxos/util");
|
35
|
-
var singleValueFacet = (defaultValue) => import_state.Facet.define({
|
36
|
-
// Called immediately.
|
37
|
-
combine: (providers) => {
|
38
|
-
return providers[0] ?? defaultValue;
|
39
|
-
}
|
40
|
-
});
|
41
|
-
var defaultCursorConverter = {
|
42
|
-
toCursor: (position) => position.toString(),
|
43
|
-
fromCursor: (cursor) => parseInt(cursor)
|
44
|
-
};
|
45
|
-
var Cursor = class _Cursor {
|
46
|
-
static {
|
47
|
-
this.converter = singleValueFacet(defaultCursorConverter);
|
48
|
-
}
|
49
|
-
static {
|
50
|
-
this.getCursorFromRange = (state2, range) => {
|
51
|
-
const cursorConverter = state2.facet(_Cursor.converter);
|
52
|
-
const from = cursorConverter.toCursor(range.from);
|
53
|
-
const to = cursorConverter.toCursor(range.to, -1);
|
54
|
-
return [
|
55
|
-
from,
|
56
|
-
to
|
57
|
-
].join(":");
|
58
|
-
};
|
59
|
-
}
|
60
|
-
static {
|
61
|
-
this.getRangeFromCursor = (state2, cursor) => {
|
62
|
-
const cursorConverter = state2.facet(_Cursor.converter);
|
63
|
-
const parts = cursor.split(":");
|
64
|
-
const from = cursorConverter.fromCursor(parts[0]);
|
65
|
-
const to = cursorConverter.fromCursor(parts[1]);
|
66
|
-
return from !== void 0 && to !== void 0 ? {
|
67
|
-
from,
|
68
|
-
to
|
69
|
-
} : void 0;
|
70
|
-
};
|
71
|
-
}
|
72
|
-
};
|
73
|
-
var documentId = singleValueFacet();
|
74
|
-
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/state/state.ts";
|
75
|
-
var stateRestoreAnnotation = "dxos.org/cm/state-restore";
|
76
|
-
var keyPrefix = "dxos.org/react-ui-editor/state";
|
77
|
-
var localStorageStateStoreAdapter = {
|
78
|
-
getState: (id) => {
|
79
|
-
(0, import_invariant.invariant)(id, void 0, {
|
80
|
-
F: __dxlog_file,
|
81
|
-
L: 34,
|
82
|
-
S: void 0,
|
83
|
-
A: [
|
84
|
-
"id",
|
85
|
-
""
|
86
|
-
]
|
87
|
-
});
|
88
|
-
const state2 = localStorage.getItem(`${keyPrefix}/${id}`);
|
89
|
-
return state2 ? JSON.parse(state2) : void 0;
|
90
|
-
},
|
91
|
-
setState: (id, state2) => {
|
92
|
-
(0, import_invariant.invariant)(id, void 0, {
|
93
|
-
F: __dxlog_file,
|
94
|
-
L: 40,
|
95
|
-
S: void 0,
|
96
|
-
A: [
|
97
|
-
"id",
|
98
|
-
""
|
99
|
-
]
|
100
|
-
});
|
101
|
-
localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state2));
|
102
|
-
}
|
103
|
-
};
|
104
|
-
var createEditorStateTransaction = (state2, { scrollTo, selection }) => {
|
105
|
-
return {
|
106
|
-
selection,
|
107
|
-
scrollIntoView: !scrollTo,
|
108
|
-
effects: scrollTo ? import_view.EditorView.scrollIntoView(scrollTo, {
|
109
|
-
yMargin: 96
|
110
|
-
}) : void 0,
|
111
|
-
annotations: import_state2.Transaction.userEvent.of(stateRestoreAnnotation)
|
112
|
-
};
|
113
|
-
};
|
114
|
-
var state = ({ getState, setState } = {}) => {
|
115
|
-
const setStateDebounced = (0, import_async.debounce)(setState, 1e3);
|
116
|
-
return [
|
117
|
-
// TODO(burdon): Track scrolling (currently only updates when cursor moves).
|
118
|
-
// EditorView.domEventHandlers({
|
119
|
-
// scroll: (event) => {
|
120
|
-
// setStateDebounced(id, {});
|
121
|
-
// },
|
122
|
-
// }),
|
123
|
-
import_view.EditorView.updateListener.of(({ view, transactions }) => {
|
124
|
-
const id = view.state.facet(documentId);
|
125
|
-
if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
|
126
|
-
return;
|
127
|
-
}
|
128
|
-
if (setState) {
|
129
|
-
const { scrollTop } = view.scrollDOM;
|
130
|
-
const pos = view.posAtCoords({
|
131
|
-
x: 0,
|
132
|
-
y: scrollTop
|
133
|
-
});
|
134
|
-
if (pos !== null) {
|
135
|
-
const { anchor, head } = view.state.selection.main;
|
136
|
-
setStateDebounced(id, {
|
137
|
-
scrollTo: pos,
|
138
|
-
selection: {
|
139
|
-
anchor,
|
140
|
-
head
|
141
|
-
}
|
142
|
-
});
|
143
|
-
}
|
144
|
-
}
|
145
|
-
}),
|
146
|
-
getState && import_view.keymap.of([
|
147
|
-
{
|
148
|
-
key: "ctrl-r",
|
149
|
-
run: (view) => {
|
150
|
-
const state2 = getState(view.state.facet(documentId));
|
151
|
-
if (state2) {
|
152
|
-
view.dispatch(createEditorStateTransaction(view.state, state2));
|
153
|
-
}
|
154
|
-
return true;
|
155
|
-
}
|
156
|
-
}
|
157
|
-
])
|
158
|
-
].filter(import_util.isNotFalsy);
|
159
|
-
};
|
160
|
-
// Annotate the CommonJS export names for ESM import in node:
|
161
|
-
0 && (module.exports = {
|
162
|
-
Cursor,
|
163
|
-
createEditorStateTransaction,
|
164
|
-
documentId,
|
165
|
-
localStorageStateStoreAdapter,
|
166
|
-
singleValueFacet,
|
167
|
-
state
|
168
|
-
});
|
169
|
-
//# sourceMappingURL=chunk-GZWIENFM.cjs.map
|
@@ -1,7 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"version": 3,
|
3
|
-
"sources": ["../../../src/state/util.ts", "../../../src/state/cursor.ts", "../../../src/state/doc.ts", "../../../src/state/state.ts"],
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Facet } from '@codemirror/state';\n\nexport const singleValueFacet = <I, O = I>(defaultValue?: O) =>\n Facet.define<I, O>({\n // Called immediately.\n combine: (providers) => {\n return (providers[0] ?? defaultValue) as O;\n },\n });\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EditorState } from '@codemirror/state';\n\nimport { type Range } from './types';\nimport { singleValueFacet } from './util';\n\n/**\n * Converts indexes into the text document into stable peer-independent cursors.\n *\n * See:\n * - https://automerge.org/automerge/api-docs/js/functions/next.getCursor.html\n * - https://github.com/yjs/yjs?tab=readme-ov-file#relative-positions\n *\n * @param {assoc} number Negative values will associate the cursor with the previous character\n * while positive - with the next one.\n */\nexport interface CursorConverter {\n toCursor(position: number, assoc?: -1 | 1 | undefined): string;\n fromCursor(cursor: string): number;\n}\n\nconst defaultCursorConverter: CursorConverter = {\n toCursor: (position) => position.toString(),\n fromCursor: (cursor) => parseInt(cursor),\n};\n\nexport class Cursor {\n static readonly converter = singleValueFacet(defaultCursorConverter);\n\n static readonly getCursorFromRange = (state: EditorState, range: Range) => {\n const cursorConverter = state.facet(Cursor.converter);\n\n const from = cursorConverter.toCursor(range.from);\n const to = cursorConverter.toCursor(range.to, -1);\n return [from, to].join(':');\n };\n\n static readonly getRangeFromCursor = (state: EditorState, cursor: string) => {\n const cursorConverter = state.facet(Cursor.converter);\n\n const parts = cursor.split(':');\n const from = cursorConverter.fromCursor(parts[0]);\n const to = cursorConverter.fromCursor(parts[1]);\n return from !== undefined && to !== undefined ? { from, to } : undefined;\n };\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { singleValueFacet } from './util';\n\n/**\n * Currently edited document id as FQ string.\n */\nexport const documentId = singleValueFacet<string>();\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EditorState, type Extension, Transaction, type TransactionSpec } from '@codemirror/state';\nimport { EditorView, keymap } from '@codemirror/view';\n\nimport { debounce } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { documentId } from './doc';\n\nconst stateRestoreAnnotation = 'dxos.org/cm/state-restore';\n\nexport type EditorSelection = {\n anchor: number;\n head?: number;\n};\n\nexport type EditorSelectionState = {\n scrollTo?: number;\n selection?: EditorSelection;\n};\n\nexport type EditorStateOptions = {\n setState: (id: string, state: EditorSelectionState) => void;\n getState: (id: string) => EditorSelectionState | undefined;\n};\n\nconst keyPrefix = 'dxos.org/react-ui-editor/state';\nexport const localStorageStateStoreAdapter: EditorStateOptions = {\n getState: (id) => {\n invariant(id);\n const state = localStorage.getItem(`${keyPrefix}/${id}`);\n return state ? JSON.parse(state) : undefined;\n },\n\n setState: (id, state) => {\n invariant(id);\n localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state));\n },\n};\n\nexport const createEditorStateTransaction = (\n state: EditorState,\n { scrollTo, selection }: EditorSelectionState,\n): TransactionSpec => {\n return {\n selection,\n scrollIntoView: !scrollTo,\n effects: scrollTo ? EditorView.scrollIntoView(scrollTo, { yMargin: 96 }) : undefined,\n annotations: Transaction.userEvent.of(stateRestoreAnnotation),\n };\n};\n\n/**\n * Track scrolling and selection state to be restored when switching to document.\n */\n// TODO(burdon): Rename.\nexport const state = ({ getState, setState }: Partial<EditorStateOptions> = {}): Extension => {\n const setStateDebounced = debounce(setState!, 1_000);\n\n return [\n // TODO(burdon): Track scrolling (currently only updates when cursor moves).\n // EditorView.domEventHandlers({\n // scroll: (event) => {\n // setStateDebounced(id, {});\n // },\n // }),\n EditorView.updateListener.of(({ view, transactions }) => {\n const id = view.state.facet(documentId);\n if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {\n return;\n }\n\n if (setState) {\n const { scrollTop } = view.scrollDOM;\n const pos = view.posAtCoords({ x: 0, y: scrollTop });\n if (pos !== null) {\n const { anchor, head } = view.state.selection.main;\n setStateDebounced(id, { scrollTo: pos, selection: { anchor, head } });\n }\n }\n }),\n getState &&\n keymap.of([\n {\n key: 'ctrl-r', // TODO(burdon): Setting to jump back to selection.\n run: (view) => {\n const state = getState(view.state.facet(documentId));\n if (state) {\n view.dispatch(createEditorStateTransaction(view.state, state));\n }\n return true;\n },\n },\n ]),\n ].filter(isNotFalsy);\n};\n"],
|
5
|
-
"mappings": "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",
|
6
|
-
"names": ["import_state", "singleValueFacet", "defaultValue", "Facet", "define", "combine", "providers", "defaultCursorConverter", "toCursor", "position", "toString", "fromCursor", "cursor", "parseInt", "Cursor", "converter", "getCursorFromRange", "state", "range", "cursorConverter", "facet", "from", "to", "join", "getRangeFromCursor", "parts", "split", "undefined", "documentId", "stateRestoreAnnotation", "keyPrefix", "localStorageStateStoreAdapter", "getState", "id", "invariant", "localStorage", "getItem", "JSON", "parse", "setState", "setItem", "stringify", "createEditorStateTransaction", "scrollTo", "selection", "scrollIntoView", "effects", "EditorView", "yMargin", "annotations", "Transaction", "userEvent", "of", "setStateDebounced", "debounce", "updateListener", "view", "transactions", "some", "tr", "isUserEvent", "scrollTop", "scrollDOM", "pos", "posAtCoords", "x", "y", "anchor", "head", "main", "keymap", "key", "run", "dispatch", "filter", "isNotFalsy"]
|
7
|
-
}
|