@dxos/react-ui-editor 0.6.14-main.7bd9c89 → 0.6.14-staging.934c9de
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 +650 -479
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +726 -545
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +650 -478
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/TextEditor.stories.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/comments.d.ts +1 -1
- package/dist/types/src/extensions/comments.d.ts.map +1 -1
- package/dist/types/src/extensions/factories.d.ts +1 -0
- package/dist/types/src/extensions/factories.d.ts.map +1 -1
- package/dist/types/src/extensions/focus.d.ts +7 -0
- package/dist/types/src/extensions/focus.d.ts.map +1 -0
- package/dist/types/src/extensions/index.d.ts +2 -0
- package/dist/types/src/extensions/index.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/image.d.ts +3 -6
- package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
- package/dist/types/src/extensions/selection.d.ts +24 -0
- package/dist/types/src/extensions/selection.d.ts.map +1 -0
- 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 +1 -1
- package/dist/types/src/types.d.ts.map +1 -0
- package/dist/types/src/{state → util}/cursor.d.ts +7 -1
- package/dist/types/src/util/cursor.d.ts.map +1 -0
- package/dist/types/src/{util.d.ts → util/debug.d.ts} +6 -2
- package/dist/types/src/util/debug.d.ts.map +1 -0
- package/dist/types/src/util/dom.d.ts.map +1 -0
- package/dist/types/src/{state/util.d.ts → util/facet.d.ts} +1 -1
- package/dist/types/src/util/facet.d.ts.map +1 -0
- package/dist/types/src/util/index.d.ts +6 -0
- package/dist/types/src/util/index.d.ts.map +1 -0
- package/dist/types/src/util/react.d.ts.map +1 -0
- package/package.json +28 -42
- package/src/TextEditor.stories.tsx +8 -6
- package/src/extensions/annotations.ts +1 -1
- package/src/extensions/automerge/automerge.ts +1 -1
- package/src/extensions/automerge/cursor.ts +1 -1
- package/src/extensions/awareness/awareness.ts +1 -1
- package/src/extensions/command/hint.ts +1 -1
- package/src/extensions/command/state.ts +1 -1
- package/src/extensions/comments.ts +3 -4
- package/src/extensions/factories.ts +5 -1
- package/src/extensions/focus.ts +35 -0
- package/src/extensions/folding.tsx +1 -1
- package/src/extensions/index.ts +2 -0
- package/src/extensions/markdown/decorate.ts +1 -1
- package/src/extensions/markdown/image.ts +53 -42
- package/src/extensions/modes.ts +1 -1
- package/src/{state/state.ts → extensions/selection.ts} +22 -22
- package/src/hooks/useTextEditor.ts +2 -3
- package/src/index.ts +1 -1
- package/src/{state → util}/cursor.ts +9 -3
- package/src/{util.ts → util/debug.ts} +15 -2
- package/src/{extensions/util → util}/index.ts +3 -2
- 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/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/state/index.mjs +0 -18
- package/dist/lib/node-esm/state/index.mjs.map +0 -7
- package/dist/types/src/extensions/util/dom.d.ts.map +0 -1
- package/dist/types/src/extensions/util/error.d.ts +0 -2
- package/dist/types/src/extensions/util/error.d.ts.map +0 -1
- package/dist/types/src/extensions/util/index.d.ts +0 -5
- package/dist/types/src/extensions/util/index.d.ts.map +0 -1
- package/dist/types/src/extensions/util/overlap.d.ts +0 -8
- package/dist/types/src/extensions/util/overlap.d.ts.map +0 -1
- package/dist/types/src/extensions/util/react.d.ts.map +0 -1
- 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 +0 -20
- 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.map +0 -1
- package/dist/types/src/util.d.ts.map +0 -1
- package/src/extensions/util/error.ts +0 -15
- package/src/extensions/util/overlap.ts +0 -12
- package/src/state/doc.ts +0 -10
- package/src/state/index.ts +0 -11
- /package/dist/types/src/{state/types.d.ts → types.d.ts} +0 -0
- /package/dist/types/src/{extensions/util → util}/dom.d.ts +0 -0
- /package/dist/types/src/{extensions/util → util}/react.d.ts +0 -0
- /package/src/{state/types.ts → types.ts} +0 -0
- /package/src/{extensions/util → util}/dom.ts +0 -0
- /package/src/{state/util.ts → util/facet.ts} +0 -0
- /package/src/{extensions/util → util}/react.tsx +0 -0
@@ -2,15 +2,25 @@
|
|
2
2
|
// Copyright 2024 DXOS.org
|
3
3
|
//
|
4
4
|
|
5
|
-
import type
|
5
|
+
import { type Transaction } from '@codemirror/state';
|
6
6
|
import { type EditorView } from '@codemirror/view';
|
7
7
|
|
8
8
|
import { log } from '@dxos/log';
|
9
9
|
|
10
|
+
export const wrapWithCatch = (fn: (...args: any[]) => any) => {
|
11
|
+
return (...args: any[]) => {
|
12
|
+
try {
|
13
|
+
return fn(...args);
|
14
|
+
} catch (err) {
|
15
|
+
log.catch(err);
|
16
|
+
}
|
17
|
+
};
|
18
|
+
};
|
19
|
+
|
10
20
|
/**
|
11
21
|
* CodeMirror callbacks swallow errors so wrap handlers.
|
12
22
|
*/
|
13
|
-
// TODO(burdon):
|
23
|
+
// TODO(burdon): Reconcile with wrapWithCatch.
|
14
24
|
export const callbackWrapper = <T extends Function>(fn: T): T =>
|
15
25
|
((...args: any[]) => {
|
16
26
|
try {
|
@@ -29,6 +39,9 @@ export const debugDispatcher = (trs: readonly Transaction[], view: EditorView) =
|
|
29
39
|
view.update(trs);
|
30
40
|
};
|
31
41
|
|
42
|
+
/**
|
43
|
+
* Util to log transactions in update listener.
|
44
|
+
*/
|
32
45
|
export const logChanges = (trs: readonly Transaction[]) => {
|
33
46
|
const changes = trs
|
34
47
|
.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": ";AAIA,SAASA,aAAa;AAEf,IAAMC,mBAAmB,CAAWC,iBACzCC,MAAMC,OAAa;;EAEjBC,SAAS,CAACC,cAAAA;AACR,WAAQA,UAAU,CAAA,KAAMJ;EAC1B;AACF,CAAA;;;ACYF,IAAMK,yBAA0C;EAC9CC,UAAU,CAACC,aAAaA,SAASC,SAAQ;EACzCC,YAAY,CAACC,WAAWC,SAASD,MAAAA;AACnC;AAEO,IAAME,SAAN,MAAMA,QAAAA;EACX;SAAgBC,YAAYC,iBAAiBT,sBAAAA;;EAE7C;SAAgBU,qBAAqB,CAACC,QAAoBC,UAAAA;AACxD,YAAMC,kBAAkBF,OAAMG,MAAMP,QAAOC,SAAS;AAEpD,YAAMO,OAAOF,gBAAgBZ,SAASW,MAAMG,IAAI;AAChD,YAAMC,KAAKH,gBAAgBZ,SAASW,MAAMI,IAAI,EAAC;AAC/C,aAAO;QAACD;QAAMC;QAAIC,KAAK,GAAA;IACzB;;EAEA;SAAgBC,qBAAqB,CAACP,QAAoBN,WAAAA;AACxD,YAAMQ,kBAAkBF,OAAMG,MAAMP,QAAOC,SAAS;AAEpD,YAAMW,QAAQd,OAAOe,MAAM,GAAA;AAC3B,YAAML,OAAOF,gBAAgBT,WAAWe,MAAM,CAAA,CAAE;AAChD,YAAMH,KAAKH,gBAAgBT,WAAWe,MAAM,CAAA,CAAE;AAC9C,aAAOJ,SAASM,UAAaL,OAAOK,SAAY;QAAEN;QAAMC;MAAG,IAAIK;IACjE;;AACF;;;ACvCO,IAAMC,aAAaC,iBAAAA;;;ACL1B,SAA2CC,mBAAyC;AACpF,SAASC,YAAYC,cAAc;AAEnC,SAASC,gBAAgB;AACzB,SAASC,iBAAiB;AAC1B,SAASC,kBAAkB;;AAI3B,IAAMC,yBAAyB;AAiB/B,IAAMC,YAAY;AACX,IAAMC,gCAAoD;EAC/DC,UAAU,CAACC,OAAAA;AACTC,cAAUD,IAAAA,QAAAA;;;;;;;;;AACV,UAAME,SAAQC,aAAaC,QAAQ,GAAGP,SAAAA,IAAaG,EAAAA,EAAI;AACvD,WAAOE,SAAQG,KAAKC,MAAMJ,MAAAA,IAASK;EACrC;EAEAC,UAAU,CAACR,IAAIE,WAAAA;AACbD,cAAUD,IAAAA,QAAAA;;;;;;;;;AACVG,iBAAaM,QAAQ,GAAGZ,SAAAA,IAAaG,EAAAA,IAAMK,KAAKK,UAAUR,MAAAA,CAAAA;EAC5D;AACF;AAEO,IAAMS,+BAA+B,CAC1CT,QACA,EAAEU,UAAUC,UAAS,MAAwB;AAE7C,SAAO;IACLA;IACAC,gBAAgB,CAACF;IACjBG,SAASH,WAAWI,WAAWF,eAAeF,UAAU;MAAEK,SAAS;IAAG,CAAA,IAAKV;IAC3EW,aAAaC,YAAYC,UAAUC,GAAGzB,sBAAAA;EACxC;AACF;AAMO,IAAMM,QAAQ,CAAC,EAAEH,UAAUS,SAAQ,IAAkC,CAAC,MAAC;AAC5E,QAAMc,oBAAoBC,SAASf,UAAW,GAAA;AAE9C,SAAO;;;;;;;IAOLQ,WAAWQ,eAAeH,GAAG,CAAC,EAAEI,MAAMC,aAAY,MAAE;AAClD,YAAM1B,KAAKyB,KAAKvB,MAAMyB,MAAMC,UAAAA;AAC5B,UAAI,CAAC5B,MAAM0B,aAAaG,KAAK,CAACC,OAAOA,GAAGC,YAAYnC,sBAAAA,CAAAA,GAA0B;AAC5E;MACF;AAEA,UAAIY,UAAU;AACZ,cAAM,EAAEwB,UAAS,IAAKP,KAAKQ;AAC3B,cAAMC,MAAMT,KAAKU,YAAY;UAAEC,GAAG;UAAGC,GAAGL;QAAU,CAAA;AAClD,YAAIE,QAAQ,MAAM;AAChB,gBAAM,EAAEI,QAAQC,KAAI,IAAKd,KAAKvB,MAAMW,UAAU2B;AAC9ClB,4BAAkBtB,IAAI;YAAEY,UAAUsB;YAAKrB,WAAW;cAAEyB;cAAQC;YAAK;UAAE,CAAA;QACrE;MACF;IACF,CAAA;IACAxC,YACE0C,OAAOpB,GAAG;MACR;QACEqB,KAAK;QACLC,KAAK,CAAClB,SAAAA;AACJ,gBAAMvB,SAAQH,SAAS0B,KAAKvB,MAAMyB,MAAMC,UAAAA,CAAAA;AACxC,cAAI1B,QAAO;AACTuB,iBAAKmB,SAASjC,6BAA6Bc,KAAKvB,OAAOA,MAAAA,CAAAA;UACzD;AACA,iBAAO;QACT;MACF;KACD;IACH2C,OAAOC,UAAAA;AACX;",
|
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
|
-
}
|
@@ -1,39 +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 state_exports = {};
|
20
|
-
__export(state_exports, {
|
21
|
-
Cursor: () => import_chunk_GZWIENFM.Cursor,
|
22
|
-
createEditorStateTransaction: () => import_chunk_GZWIENFM.createEditorStateTransaction,
|
23
|
-
documentId: () => import_chunk_GZWIENFM.documentId,
|
24
|
-
localStorageStateStoreAdapter: () => import_chunk_GZWIENFM.localStorageStateStoreAdapter,
|
25
|
-
singleValueFacet: () => import_chunk_GZWIENFM.singleValueFacet,
|
26
|
-
state: () => import_chunk_GZWIENFM.state
|
27
|
-
});
|
28
|
-
module.exports = __toCommonJS(state_exports);
|
29
|
-
var import_chunk_GZWIENFM = require("../chunk-GZWIENFM.cjs");
|
30
|
-
// Annotate the CommonJS export names for ESM import in node:
|
31
|
-
0 && (module.exports = {
|
32
|
-
Cursor,
|
33
|
-
createEditorStateTransaction,
|
34
|
-
documentId,
|
35
|
-
localStorageStateStoreAdapter,
|
36
|
-
singleValueFacet,
|
37
|
-
state
|
38
|
-
});
|
39
|
-
//# sourceMappingURL=index.cjs.map
|
@@ -1,7 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"version": 3,
|
3
|
-
"sources": ["index.cjs"],
|
4
|
-
"sourcesContent": ["import {\n Cursor,\n createEditorStateTransaction,\n documentId,\n localStorageStateStoreAdapter,\n singleValueFacet,\n state\n} from \"../chunk-GZWIENFM.cjs\";\nexport {\n Cursor,\n createEditorStateTransaction,\n documentId,\n localStorageStateStoreAdapter,\n singleValueFacet,\n state\n};\n//# sourceMappingURL=index.cjs.map\n"],
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAOO;",
|
6
|
-
"names": []
|
7
|
-
}
|
@@ -1,150 +0,0 @@
|
|
1
|
-
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
2
|
-
|
3
|
-
// packages/ui/react-ui-editor/src/state/util.ts
|
4
|
-
import { Facet } from "@codemirror/state";
|
5
|
-
var singleValueFacet = (defaultValue) => Facet.define({
|
6
|
-
// Called immediately.
|
7
|
-
combine: (providers) => {
|
8
|
-
return providers[0] ?? defaultValue;
|
9
|
-
}
|
10
|
-
});
|
11
|
-
|
12
|
-
// packages/ui/react-ui-editor/src/state/cursor.ts
|
13
|
-
var defaultCursorConverter = {
|
14
|
-
toCursor: (position) => position.toString(),
|
15
|
-
fromCursor: (cursor) => parseInt(cursor)
|
16
|
-
};
|
17
|
-
var Cursor = class _Cursor {
|
18
|
-
static {
|
19
|
-
this.converter = singleValueFacet(defaultCursorConverter);
|
20
|
-
}
|
21
|
-
static {
|
22
|
-
this.getCursorFromRange = (state2, range) => {
|
23
|
-
const cursorConverter = state2.facet(_Cursor.converter);
|
24
|
-
const from = cursorConverter.toCursor(range.from);
|
25
|
-
const to = cursorConverter.toCursor(range.to, -1);
|
26
|
-
return [
|
27
|
-
from,
|
28
|
-
to
|
29
|
-
].join(":");
|
30
|
-
};
|
31
|
-
}
|
32
|
-
static {
|
33
|
-
this.getRangeFromCursor = (state2, cursor) => {
|
34
|
-
const cursorConverter = state2.facet(_Cursor.converter);
|
35
|
-
const parts = cursor.split(":");
|
36
|
-
const from = cursorConverter.fromCursor(parts[0]);
|
37
|
-
const to = cursorConverter.fromCursor(parts[1]);
|
38
|
-
return from !== void 0 && to !== void 0 ? {
|
39
|
-
from,
|
40
|
-
to
|
41
|
-
} : void 0;
|
42
|
-
};
|
43
|
-
}
|
44
|
-
};
|
45
|
-
|
46
|
-
// packages/ui/react-ui-editor/src/state/doc.ts
|
47
|
-
var documentId = singleValueFacet();
|
48
|
-
|
49
|
-
// packages/ui/react-ui-editor/src/state/state.ts
|
50
|
-
import { Transaction } from "@codemirror/state";
|
51
|
-
import { EditorView, keymap } from "@codemirror/view";
|
52
|
-
import { debounce } from "@dxos/async";
|
53
|
-
import { invariant } from "@dxos/invariant";
|
54
|
-
import { isNotFalsy } from "@dxos/util";
|
55
|
-
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/state/state.ts";
|
56
|
-
var stateRestoreAnnotation = "dxos.org/cm/state-restore";
|
57
|
-
var keyPrefix = "dxos.org/react-ui-editor/state";
|
58
|
-
var localStorageStateStoreAdapter = {
|
59
|
-
getState: (id) => {
|
60
|
-
invariant(id, void 0, {
|
61
|
-
F: __dxlog_file,
|
62
|
-
L: 34,
|
63
|
-
S: void 0,
|
64
|
-
A: [
|
65
|
-
"id",
|
66
|
-
""
|
67
|
-
]
|
68
|
-
});
|
69
|
-
const state2 = localStorage.getItem(`${keyPrefix}/${id}`);
|
70
|
-
return state2 ? JSON.parse(state2) : void 0;
|
71
|
-
},
|
72
|
-
setState: (id, state2) => {
|
73
|
-
invariant(id, void 0, {
|
74
|
-
F: __dxlog_file,
|
75
|
-
L: 40,
|
76
|
-
S: void 0,
|
77
|
-
A: [
|
78
|
-
"id",
|
79
|
-
""
|
80
|
-
]
|
81
|
-
});
|
82
|
-
localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state2));
|
83
|
-
}
|
84
|
-
};
|
85
|
-
var createEditorStateTransaction = (state2, { scrollTo, selection }) => {
|
86
|
-
return {
|
87
|
-
selection,
|
88
|
-
scrollIntoView: !scrollTo,
|
89
|
-
effects: scrollTo ? EditorView.scrollIntoView(scrollTo, {
|
90
|
-
yMargin: 96
|
91
|
-
}) : void 0,
|
92
|
-
annotations: Transaction.userEvent.of(stateRestoreAnnotation)
|
93
|
-
};
|
94
|
-
};
|
95
|
-
var state = ({ getState, setState } = {}) => {
|
96
|
-
const setStateDebounced = debounce(setState, 1e3);
|
97
|
-
return [
|
98
|
-
// TODO(burdon): Track scrolling (currently only updates when cursor moves).
|
99
|
-
// EditorView.domEventHandlers({
|
100
|
-
// scroll: (event) => {
|
101
|
-
// setStateDebounced(id, {});
|
102
|
-
// },
|
103
|
-
// }),
|
104
|
-
EditorView.updateListener.of(({ view, transactions }) => {
|
105
|
-
const id = view.state.facet(documentId);
|
106
|
-
if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
|
107
|
-
return;
|
108
|
-
}
|
109
|
-
if (setState) {
|
110
|
-
const { scrollTop } = view.scrollDOM;
|
111
|
-
const pos = view.posAtCoords({
|
112
|
-
x: 0,
|
113
|
-
y: scrollTop
|
114
|
-
});
|
115
|
-
if (pos !== null) {
|
116
|
-
const { anchor, head } = view.state.selection.main;
|
117
|
-
setStateDebounced(id, {
|
118
|
-
scrollTo: pos,
|
119
|
-
selection: {
|
120
|
-
anchor,
|
121
|
-
head
|
122
|
-
}
|
123
|
-
});
|
124
|
-
}
|
125
|
-
}
|
126
|
-
}),
|
127
|
-
getState && keymap.of([
|
128
|
-
{
|
129
|
-
key: "ctrl-r",
|
130
|
-
run: (view) => {
|
131
|
-
const state2 = getState(view.state.facet(documentId));
|
132
|
-
if (state2) {
|
133
|
-
view.dispatch(createEditorStateTransaction(view.state, state2));
|
134
|
-
}
|
135
|
-
return true;
|
136
|
-
}
|
137
|
-
}
|
138
|
-
])
|
139
|
-
].filter(isNotFalsy);
|
140
|
-
};
|
141
|
-
|
142
|
-
export {
|
143
|
-
singleValueFacet,
|
144
|
-
Cursor,
|
145
|
-
documentId,
|
146
|
-
localStorageStateStoreAdapter,
|
147
|
-
createEditorStateTransaction,
|
148
|
-
state
|
149
|
-
};
|
150
|
-
//# sourceMappingURL=chunk-GP5RCZ3X.mjs.map
|