@dxos/react-ui-editor 0.6.13-staging.1e988a3 → 0.6.14-main.7bd9c89
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/chunk-CIQSMP7K.mjs +148 -0
- package/dist/lib/browser/chunk-CIQSMP7K.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +248 -355
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/state/index.mjs +17 -0
- package/dist/lib/browser/state/index.mjs.map +7 -0
- package/dist/lib/node/chunk-GZWIENFM.cjs +169 -0
- package/dist/lib/node/chunk-GZWIENFM.cjs.map +7 -0
- package/dist/lib/node/index.cjs +5491 -0
- package/dist/lib/node/index.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -0
- package/dist/lib/node/state/index.cjs +39 -0
- package/dist/lib/node/state/index.cjs.map +7 -0
- package/dist/lib/node-esm/chunk-GP5RCZ3X.mjs +150 -0
- package/dist/lib/node-esm/chunk-GP5RCZ3X.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +5482 -0
- package/dist/lib/node-esm/index.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -0
- package/dist/lib/node-esm/state/index.mjs +18 -0
- package/dist/lib/node-esm/state/index.mjs.map +7 -0
- package/dist/types/src/InputMode.stories.d.ts +11 -11
- package/dist/types/src/InputMode.stories.d.ts.map +1 -1
- package/dist/types/src/TextEditor.stories.d.ts +4 -1
- package/dist/types/src/TextEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/types/src/defaults.d.ts.map +1 -1
- package/dist/types/src/extensions/autocomplete.d.ts +2 -1
- package/dist/types/src/extensions/autocomplete.d.ts.map +1 -1
- 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/extensions/debug.d.ts +2 -2
- package/dist/types/src/extensions/debug.d.ts.map +1 -1
- package/dist/types/src/extensions/folding.d.ts.map +1 -1
- package/dist/types/src/extensions/index.d.ts +0 -4
- package/dist/types/src/extensions/index.d.ts.map +1 -1
- package/dist/types/src/extensions/listener.d.ts +1 -0
- 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/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 +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/{extensions → state}/cursor.d.ts +2 -2
- package/dist/types/src/state/cursor.d.ts.map +1 -0
- package/dist/types/src/state/doc.d.ts +5 -0
- package/dist/types/src/state/doc.d.ts.map +1 -0
- package/dist/types/src/state/index.d.ts +6 -0
- package/dist/types/src/state/index.d.ts.map +1 -0
- package/dist/types/src/{extensions → state}/state.d.ts +2 -2
- package/dist/types/src/state/state.d.ts.map +1 -0
- package/dist/types/src/state/types.d.ts.map +1 -0
- package/dist/types/src/state/util.d.ts +3 -0
- package/dist/types/src/state/util.d.ts.map +1 -0
- package/dist/types/src/styles/markdown.d.ts +1 -2
- 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 +6 -0
- package/dist/types/src/util.d.ts.map +1 -1
- package/package.json +60 -41
- package/src/InputMode.stories.tsx +8 -8
- package/src/TextEditor.stories.tsx +93 -70
- package/src/components/Toolbar/Toolbar.tsx +8 -11
- package/src/defaults.ts +0 -2
- package/src/extensions/annotations.ts +1 -1
- package/src/extensions/autocomplete.ts +9 -8
- package/src/extensions/automerge/automerge.stories.tsx +2 -2
- package/src/extensions/automerge/{automerge.spec.tsx → automerge.test.tsx} +1 -0
- package/src/extensions/automerge/automerge.ts +2 -2
- package/src/extensions/automerge/cursor.ts +1 -1
- package/src/extensions/awareness/awareness.ts +3 -5
- package/src/extensions/command/hint.ts +1 -1
- package/src/extensions/command/state.ts +3 -4
- package/src/extensions/comments.ts +44 -45
- package/src/extensions/debug.ts +2 -2
- package/src/extensions/folding.tsx +6 -4
- package/src/extensions/index.ts +0 -4
- package/src/extensions/listener.ts +1 -0
- package/src/extensions/markdown/changes.test.ts +1 -3
- package/src/extensions/markdown/decorate.ts +49 -6
- package/src/extensions/markdown/formatting.test.ts +1 -3
- package/src/extensions/markdown/highlight.ts +0 -5
- package/src/extensions/markdown/link.ts +3 -2
- package/src/extensions/markdown/parser.test.ts +1 -2
- package/src/extensions/markdown/styles.ts +10 -0
- package/src/extensions/markdown/table.ts +3 -3
- package/src/extensions/modes.ts +6 -5
- package/src/extensions/util/overlap.ts +1 -1
- package/src/extensions/util/react.tsx +6 -1
- package/src/hooks/useTextEditor.ts +36 -32
- package/src/index.ts +1 -0
- package/src/{extensions → state}/cursor.ts +3 -6
- package/src/state/doc.ts +10 -0
- package/src/state/index.ts +11 -0
- package/src/{extensions → state}/state.ts +7 -3
- package/src/state/util.ts +13 -0
- package/src/styles/markdown.ts +1 -3
- package/src/styles/theme.ts +3 -1
- package/src/util.ts +10 -0
- package/dist/types/src/extensions/automerge/automerge.spec.d.ts +0 -2
- package/dist/types/src/extensions/automerge/automerge.spec.d.ts.map +0 -1
- package/dist/types/src/extensions/cursor.d.ts.map +0 -1
- package/dist/types/src/extensions/doc.d.ts +0 -6
- package/dist/types/src/extensions/doc.d.ts.map +0 -1
- package/dist/types/src/extensions/state.d.ts.map +0 -1
- package/dist/types/src/extensions/types.d.ts.map +0 -1
- package/src/extensions/automerge/automerge.test.ts +0 -13
- package/src/extensions/doc.ts +0 -17
- /package/dist/types/src/{extensions → state}/types.d.ts +0 -0
- /package/src/{extensions → state}/types.ts +0 -0
@@ -1,3 +1,12 @@
|
|
1
|
+
import {
|
2
|
+
Cursor,
|
3
|
+
createEditorStateTransaction,
|
4
|
+
documentId,
|
5
|
+
localStorageStateStoreAdapter,
|
6
|
+
singleValueFacet,
|
7
|
+
state
|
8
|
+
} from "./chunk-CIQSMP7K.mjs";
|
9
|
+
|
1
10
|
// packages/ui/react-ui-editor/src/translations.ts
|
2
11
|
var translationKey = "react-ui-editor";
|
3
12
|
var translations_default = [
|
@@ -34,7 +43,7 @@ var translations_default = [
|
|
34
43
|
];
|
35
44
|
|
36
45
|
// packages/ui/react-ui-editor/src/index.ts
|
37
|
-
import { keymap as
|
46
|
+
import { keymap as keymap10 } from "@codemirror/view";
|
38
47
|
import { tags as tags2 } from "@lezer/highlight";
|
39
48
|
import { TextKind } from "@dxos/protocols/proto/dxos/echo/model/text";
|
40
49
|
|
@@ -43,54 +52,13 @@ import { ChatText, Code, CodeBlock, Image, Link, ListBullets, ListChecks, ListNu
|
|
43
52
|
import { createContext } from "@radix-ui/react-context";
|
44
53
|
import React3, { useEffect as useEffect2, useRef, useState as useState3 } from "react";
|
45
54
|
import { useDropzone } from "react-dropzone";
|
46
|
-
import { Button,
|
47
|
-
import { getSize
|
55
|
+
import { Button, DropdownMenu, ElevationProvider, Toolbar as NaturalToolbar, Tooltip, useTranslation } from "@dxos/react-ui";
|
56
|
+
import { getSize } from "@dxos/react-ui-theme";
|
48
57
|
|
49
58
|
// packages/ui/react-ui-editor/src/extensions/annotations.ts
|
50
59
|
import { StateField } from "@codemirror/state";
|
51
60
|
import { Decoration, EditorView } from "@codemirror/view";
|
52
61
|
import { isNotFalsy } from "@dxos/util";
|
53
|
-
|
54
|
-
// packages/ui/react-ui-editor/src/extensions/cursor.ts
|
55
|
-
import { Facet } from "@codemirror/state";
|
56
|
-
var defaultCursorConverter = {
|
57
|
-
toCursor: (position) => position.toString(),
|
58
|
-
fromCursor: (cursor) => parseInt(cursor)
|
59
|
-
};
|
60
|
-
var Cursor = class _Cursor {
|
61
|
-
static {
|
62
|
-
this.converter = Facet.define({
|
63
|
-
combine: (providers) => {
|
64
|
-
return providers[0] ?? defaultCursorConverter;
|
65
|
-
}
|
66
|
-
});
|
67
|
-
}
|
68
|
-
static {
|
69
|
-
this.getCursorFromRange = (state2, range) => {
|
70
|
-
const cursorConverter2 = state2.facet(_Cursor.converter);
|
71
|
-
const from = cursorConverter2.toCursor(range.from);
|
72
|
-
const to = cursorConverter2.toCursor(range.to, -1);
|
73
|
-
return [
|
74
|
-
from,
|
75
|
-
to
|
76
|
-
].join(":");
|
77
|
-
};
|
78
|
-
}
|
79
|
-
static {
|
80
|
-
this.getRangeFromCursor = (state2, cursor) => {
|
81
|
-
const cursorConverter2 = state2.facet(_Cursor.converter);
|
82
|
-
const parts = cursor.split(":");
|
83
|
-
const from = cursorConverter2.fromCursor(parts[0]);
|
84
|
-
const to = cursorConverter2.fromCursor(parts[1]);
|
85
|
-
return from !== void 0 && to !== void 0 ? {
|
86
|
-
from,
|
87
|
-
to
|
88
|
-
} : void 0;
|
89
|
-
};
|
90
|
-
}
|
91
|
-
};
|
92
|
-
|
93
|
-
// packages/ui/react-ui-editor/src/extensions/annotations.ts
|
94
62
|
var annotationMark = Decoration.mark({
|
95
63
|
class: "cm-annotation"
|
96
64
|
});
|
@@ -153,7 +121,7 @@ import { autocompletion, completionKeymap } from "@codemirror/autocomplete";
|
|
153
121
|
import { markdownLanguage } from "@codemirror/lang-markdown";
|
154
122
|
import { keymap } from "@codemirror/view";
|
155
123
|
var autocomplete = ({ activateOnTyping, override, onSearch } = {}) => {
|
156
|
-
const
|
124
|
+
const extensions = [
|
157
125
|
// https://codemirror.net/docs/ref/#view.keymap
|
158
126
|
// https://discuss.codemirror.net/t/how-can-i-replace-the-default-autocompletion-keymap-v6/3322
|
159
127
|
// TODO(burdon): Set custom keymap.
|
@@ -170,7 +138,7 @@ var autocomplete = ({ activateOnTyping, override, onSearch } = {}) => {
|
|
170
138
|
})
|
171
139
|
];
|
172
140
|
if (onSearch) {
|
173
|
-
|
141
|
+
extensions.push(
|
174
142
|
// TODO(burdon): Optional decoration via addToOptions
|
175
143
|
markdownLanguage.data.of({
|
176
144
|
autocomplete: (context) => {
|
@@ -186,7 +154,7 @@ var autocomplete = ({ activateOnTyping, override, onSearch } = {}) => {
|
|
186
154
|
})
|
187
155
|
);
|
188
156
|
}
|
189
|
-
return
|
157
|
+
return extensions;
|
190
158
|
};
|
191
159
|
|
192
160
|
// packages/ui/react-ui-editor/src/extensions/automerge/automerge.ts
|
@@ -484,7 +452,7 @@ var automerge = (accessor) => {
|
|
484
452
|
};
|
485
453
|
|
486
454
|
// packages/ui/react-ui-editor/src/extensions/awareness/awareness.ts
|
487
|
-
import { Annotation as Annotation2,
|
455
|
+
import { Annotation as Annotation2, RangeSet } from "@codemirror/state";
|
488
456
|
import { Decoration as Decoration2, EditorView as EditorView3, ViewPlugin as ViewPlugin2, WidgetType } from "@codemirror/view";
|
489
457
|
import { Event } from "@dxos/async";
|
490
458
|
import { Context } from "@dxos/context";
|
@@ -499,9 +467,7 @@ var dummyProvider = {
|
|
499
467
|
update: () => {
|
500
468
|
}
|
501
469
|
};
|
502
|
-
var awarenessProvider =
|
503
|
-
combine: (providers) => providers[0] ?? dummyProvider
|
504
|
-
});
|
470
|
+
var awarenessProvider = singleValueFacet(dummyProvider);
|
505
471
|
var RemoteSelectionChangedAnnotation = Annotation2.define();
|
506
472
|
var awareness = (provider = dummyProvider) => {
|
507
473
|
return [
|
@@ -516,7 +482,7 @@ var RemoteSelectionsDecorator = class {
|
|
516
482
|
constructor(view) {
|
517
483
|
this._ctx = new Context(void 0, {
|
518
484
|
F: __dxlog_file2,
|
519
|
-
L:
|
485
|
+
L: 80
|
520
486
|
});
|
521
487
|
this.decorations = RangeSet.of([]);
|
522
488
|
this._cursorConverter = view.state.facet(Cursor.converter);
|
@@ -1144,11 +1110,9 @@ import { RangeSetBuilder } from "@codemirror/state";
|
|
1144
1110
|
import { Decoration as Decoration3, EditorView as EditorView5, ViewPlugin as ViewPlugin3, WidgetType as WidgetType2 } from "@codemirror/view";
|
1145
1111
|
|
1146
1112
|
// packages/ui/react-ui-editor/src/extensions/command/state.ts
|
1147
|
-
import {
|
1113
|
+
import { StateEffect as StateEffect2, StateField as StateField3 } from "@codemirror/state";
|
1148
1114
|
import { showTooltip } from "@codemirror/view";
|
1149
|
-
var commandConfig =
|
1150
|
-
combine: (providers) => providers[0]
|
1151
|
-
});
|
1115
|
+
var commandConfig = singleValueFacet();
|
1152
1116
|
var commandState = StateField3.define({
|
1153
1117
|
create: () => ({}),
|
1154
1118
|
update: (state2, tr) => {
|
@@ -1273,6 +1237,51 @@ var clientRectsFor = (dom) => {
|
|
1273
1237
|
}
|
1274
1238
|
};
|
1275
1239
|
|
1240
|
+
// packages/ui/react-ui-editor/src/extensions/util/error.ts
|
1241
|
+
import { log as log3 } from "@dxos/log";
|
1242
|
+
var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/util/error.ts";
|
1243
|
+
var wrapWithCatch = (fn) => {
|
1244
|
+
return (...args) => {
|
1245
|
+
try {
|
1246
|
+
return fn(...args);
|
1247
|
+
} catch (err) {
|
1248
|
+
log3.catch(err, void 0, {
|
1249
|
+
F: __dxlog_file5,
|
1250
|
+
L: 12,
|
1251
|
+
S: void 0,
|
1252
|
+
C: (f, a) => f(...a)
|
1253
|
+
});
|
1254
|
+
}
|
1255
|
+
};
|
1256
|
+
};
|
1257
|
+
|
1258
|
+
// packages/ui/react-ui-editor/src/extensions/util/overlap.ts
|
1259
|
+
var overlap = (a, b) => a.from <= b.to && a.to >= b.from;
|
1260
|
+
|
1261
|
+
// packages/ui/react-ui-editor/src/extensions/util/react.tsx
|
1262
|
+
import React from "react";
|
1263
|
+
import { createRoot } from "react-dom/client";
|
1264
|
+
import { ThemeProvider } from "@dxos/react-ui";
|
1265
|
+
import { defaultTx } from "@dxos/react-ui-theme";
|
1266
|
+
var createElement = (tag, options, children) => {
|
1267
|
+
const el = document.createElement(tag);
|
1268
|
+
if (options?.className) {
|
1269
|
+
el.className = options.className;
|
1270
|
+
}
|
1271
|
+
if (children) {
|
1272
|
+
el.append(...Array.isArray(children) ? children : [
|
1273
|
+
children
|
1274
|
+
]);
|
1275
|
+
}
|
1276
|
+
return el;
|
1277
|
+
};
|
1278
|
+
var renderRoot = (root, node) => {
|
1279
|
+
createRoot(root).render(/* @__PURE__ */ React.createElement(ThemeProvider, {
|
1280
|
+
tx: defaultTx
|
1281
|
+
}, node));
|
1282
|
+
return root;
|
1283
|
+
};
|
1284
|
+
|
1276
1285
|
// packages/ui/react-ui-editor/src/extensions/command/hint.ts
|
1277
1286
|
var CommandHint = class extends WidgetType2 {
|
1278
1287
|
constructor(content) {
|
@@ -1355,7 +1364,7 @@ var command = (options) => {
|
|
1355
1364
|
|
1356
1365
|
// packages/ui/react-ui-editor/src/extensions/comments.ts
|
1357
1366
|
import { invertedEffects } from "@codemirror/commands";
|
1358
|
-
import {
|
1367
|
+
import { StateEffect as StateEffect3, StateField as StateField4 } from "@codemirror/state";
|
1359
1368
|
import { hoverTooltip, keymap as keymap4, Decoration as Decoration4, EditorView as EditorView7, ViewPlugin as ViewPlugin4 } from "@codemirror/view";
|
1360
1369
|
import sortBy from "lodash.sortby";
|
1361
1370
|
import { useEffect, useMemo, useState } from "react";
|
@@ -1363,51 +1372,6 @@ import { debounce } from "@dxos/async";
|
|
1363
1372
|
import { log as log5 } from "@dxos/log";
|
1364
1373
|
import { nonNullable } from "@dxos/util";
|
1365
1374
|
|
1366
|
-
// packages/ui/react-ui-editor/src/extensions/util/error.ts
|
1367
|
-
import { log as log3 } from "@dxos/log";
|
1368
|
-
var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/util/error.ts";
|
1369
|
-
var wrapWithCatch = (fn) => {
|
1370
|
-
return (...args) => {
|
1371
|
-
try {
|
1372
|
-
return fn(...args);
|
1373
|
-
} catch (err) {
|
1374
|
-
log3.catch(err, void 0, {
|
1375
|
-
F: __dxlog_file5,
|
1376
|
-
L: 12,
|
1377
|
-
S: void 0,
|
1378
|
-
C: (f, a) => f(...a)
|
1379
|
-
});
|
1380
|
-
}
|
1381
|
-
};
|
1382
|
-
};
|
1383
|
-
|
1384
|
-
// packages/ui/react-ui-editor/src/extensions/util/overlap.ts
|
1385
|
-
var overlap = (a, b) => a.from <= b.to && a.to >= b.from;
|
1386
|
-
|
1387
|
-
// packages/ui/react-ui-editor/src/extensions/util/react.tsx
|
1388
|
-
import React from "react";
|
1389
|
-
import { createRoot } from "react-dom/client";
|
1390
|
-
import { ThemeProvider } from "@dxos/react-ui";
|
1391
|
-
import { defaultTx } from "@dxos/react-ui-theme";
|
1392
|
-
var createElement = (tag, options, children) => {
|
1393
|
-
const el = document.createElement(tag);
|
1394
|
-
if (options?.className) {
|
1395
|
-
el.className = options.className;
|
1396
|
-
}
|
1397
|
-
if (children) {
|
1398
|
-
el.append(...Array.isArray(children) ? children : [
|
1399
|
-
children
|
1400
|
-
]);
|
1401
|
-
}
|
1402
|
-
return el;
|
1403
|
-
};
|
1404
|
-
var renderRoot = (root, node) => {
|
1405
|
-
createRoot(root).render(/* @__PURE__ */ React.createElement(ThemeProvider, {
|
1406
|
-
tx: defaultTx
|
1407
|
-
}, node));
|
1408
|
-
return root;
|
1409
|
-
};
|
1410
|
-
|
1411
1375
|
// packages/ui/react-ui-editor/src/util.ts
|
1412
1376
|
import { log as log4 } from "@dxos/log";
|
1413
1377
|
var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/util.ts";
|
@@ -1417,12 +1381,16 @@ var callbackWrapper = (fn) => (...args) => {
|
|
1417
1381
|
} catch (err) {
|
1418
1382
|
log4.catch(err, void 0, {
|
1419
1383
|
F: __dxlog_file6,
|
1420
|
-
L:
|
1384
|
+
L: 19,
|
1421
1385
|
S: void 0,
|
1422
1386
|
C: (f, a) => f(...a)
|
1423
1387
|
});
|
1424
1388
|
}
|
1425
1389
|
};
|
1390
|
+
var debugDispatcher = (trs, view) => {
|
1391
|
+
logChanges(trs);
|
1392
|
+
view.update(trs);
|
1393
|
+
};
|
1426
1394
|
var logChanges = (trs) => {
|
1427
1395
|
const changes = trs.flatMap((tr) => {
|
1428
1396
|
if (tr.changes.empty) {
|
@@ -1443,7 +1411,7 @@ var logChanges = (trs) => {
|
|
1443
1411
|
changes
|
1444
1412
|
}, {
|
1445
1413
|
F: __dxlog_file6,
|
1446
|
-
L:
|
1414
|
+
L: 49,
|
1447
1415
|
S: void 0,
|
1448
1416
|
C: (f, a) => f(...a)
|
1449
1417
|
});
|
@@ -1452,9 +1420,6 @@ var logChanges = (trs) => {
|
|
1452
1420
|
|
1453
1421
|
// packages/ui/react-ui-editor/src/extensions/comments.ts
|
1454
1422
|
var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
|
1455
|
-
var documentId = Facet4.define({
|
1456
|
-
combine: (values) => values[0]
|
1457
|
-
});
|
1458
1423
|
var setComments = StateEffect3.define();
|
1459
1424
|
var setSelection = StateEffect3.define();
|
1460
1425
|
var setCommentState = StateEffect3.define();
|
@@ -1525,7 +1490,7 @@ var commentsDecorations = EditorView7.decorations.compute([
|
|
1525
1490
|
if (!range) {
|
1526
1491
|
log5.warn("Invalid range:", range, {
|
1527
1492
|
F: __dxlog_file7,
|
1528
|
-
L:
|
1493
|
+
L: 143,
|
1529
1494
|
S: void 0,
|
1530
1495
|
C: (f, a) => f(...a)
|
1531
1496
|
});
|
@@ -1687,15 +1652,13 @@ var createComment = (view) => {
|
|
1687
1652
|
}
|
1688
1653
|
return false;
|
1689
1654
|
};
|
1690
|
-
var optionsFacet =
|
1691
|
-
combine: (providers) => providers[0]
|
1692
|
-
});
|
1655
|
+
var optionsFacet = singleValueFacet();
|
1693
1656
|
var comments = (options = {}) => {
|
1694
1657
|
const { key: shortcut = "meta-'" } = options;
|
1695
1658
|
const handleSelect = debounce((state2) => options.onSelect?.(state2), 200);
|
1696
1659
|
return [
|
1697
1660
|
optionsFacet.of(options),
|
1698
|
-
documentId.of(options.id),
|
1661
|
+
options.id ? documentId.of(options.id) : void 0,
|
1699
1662
|
commentsState,
|
1700
1663
|
commentsDecorations,
|
1701
1664
|
handleCommentClick,
|
@@ -1703,17 +1666,17 @@ var comments = (options = {}) => {
|
|
1703
1666
|
//
|
1704
1667
|
// Keymap.
|
1705
1668
|
//
|
1706
|
-
options.onCreate
|
1669
|
+
options.onCreate && keymap4.of([
|
1707
1670
|
{
|
1708
1671
|
key: shortcut,
|
1709
1672
|
run: callbackWrapper(createComment)
|
1710
1673
|
}
|
1711
|
-
])
|
1674
|
+
]),
|
1712
1675
|
//
|
1713
1676
|
// Hover tooltip (for key shortcut hints, etc.)
|
1714
1677
|
// TODO(burdon): Factor out to generic hints extension for current selection/line.
|
1715
1678
|
//
|
1716
|
-
options.onHover
|
1679
|
+
options.onHover && hoverTooltip((view, pos) => {
|
1717
1680
|
const selection = view.state.selection.main;
|
1718
1681
|
if (selection && pos >= selection.from && pos <= selection.to) {
|
1719
1682
|
return {
|
@@ -1738,7 +1701,7 @@ var comments = (options = {}) => {
|
|
1738
1701
|
// TODO(burdon): Hide on change triggered immediately?
|
1739
1702
|
// hideOnChange: true,
|
1740
1703
|
hoverTime: 1e3
|
1741
|
-
})
|
1704
|
+
}),
|
1742
1705
|
//
|
1743
1706
|
// Track deleted ranges and update ranges for decorations.
|
1744
1707
|
//
|
@@ -1807,8 +1770,8 @@ var comments = (options = {}) => {
|
|
1807
1770
|
});
|
1808
1771
|
}
|
1809
1772
|
}),
|
1810
|
-
options.onUpdate
|
1811
|
-
];
|
1773
|
+
options.onUpdate && trackPastedComments(options.onUpdate)
|
1774
|
+
].filter(nonNullable);
|
1812
1775
|
};
|
1813
1776
|
var scrollThreadIntoView = (view, id, center = true) => {
|
1814
1777
|
const comment = view.state.field(commentsState).comments.find((range2) => range2.comment.id === id);
|
@@ -1840,8 +1803,11 @@ var scrollThreadIntoView = (view, id, center = true) => {
|
|
1840
1803
|
}
|
1841
1804
|
};
|
1842
1805
|
var selectionOverlapsComment = (state2) => {
|
1806
|
+
const commentState = state2.field(commentsState, false);
|
1807
|
+
if (commentState === void 0) {
|
1808
|
+
return false;
|
1809
|
+
}
|
1843
1810
|
const { selection } = state2;
|
1844
|
-
const commentState = state2.field(commentsState);
|
1845
1811
|
for (const range of selection.ranges) {
|
1846
1812
|
if (commentState.comments.some(({ range: commentRange }) => overlap(commentRange, range))) {
|
1847
1813
|
return true;
|
@@ -1935,25 +1901,6 @@ var debugNodeLogger = (log9 = console.log) => {
|
|
1935
1901
|
});
|
1936
1902
|
};
|
1937
1903
|
|
1938
|
-
// packages/ui/react-ui-editor/src/extensions/doc.ts
|
1939
|
-
import { Facet as Facet5 } from "@codemirror/state";
|
1940
|
-
import { invariant as invariant3 } from "@dxos/invariant";
|
1941
|
-
var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/doc.ts";
|
1942
|
-
var documentId2 = Facet5.define({
|
1943
|
-
combine: (providers) => {
|
1944
|
-
invariant3(providers.length <= 1, void 0, {
|
1945
|
-
F: __dxlog_file8,
|
1946
|
-
L: 14,
|
1947
|
-
S: void 0,
|
1948
|
-
A: [
|
1949
|
-
"providers.length <= 1",
|
1950
|
-
""
|
1951
|
-
]
|
1952
|
-
});
|
1953
|
-
return providers[0];
|
1954
|
-
}
|
1955
|
-
});
|
1956
|
-
|
1957
1904
|
// packages/ui/react-ui-editor/src/extensions/dnd.ts
|
1958
1905
|
import { dropCursor, EditorView as EditorView8 } from "@codemirror/view";
|
1959
1906
|
var styles4 = EditorView8.theme({
|
@@ -2016,11 +1963,9 @@ var headings = {
|
|
2016
1963
|
6: "text-md"
|
2017
1964
|
};
|
2018
1965
|
var theme = {
|
2019
|
-
mark: "opacity-50",
|
2020
1966
|
code: "font-mono !no-underline text-neutral-700 dark:text-neutral-300",
|
2021
1967
|
codeMark: "font-mono text-primary-500",
|
2022
|
-
|
2023
|
-
blockquote: "pl-1 mr-1 border-is-4 border-orange-500 dark:border-orange-500 dark:text-neutral-500",
|
1968
|
+
mark: "opacity-50",
|
2024
1969
|
heading: (level) => {
|
2025
1970
|
return mx(headings[level], "dark:text-primary-400");
|
2026
1971
|
}
|
@@ -2063,9 +2008,11 @@ var defaultTheme = {
|
|
2063
2008
|
/**
|
2064
2009
|
* Gutters
|
2065
2010
|
* NOTE: Gutters should have the same top margin as the content.
|
2011
|
+
* NOTE: They can't be transparent since the content needs to scroll below.
|
2066
2012
|
*/
|
2067
2013
|
".cm-gutters": {
|
2068
|
-
background: "var(--surface-bg)"
|
2014
|
+
background: "var(--surface-bg)",
|
2015
|
+
borderRight: "none"
|
2069
2016
|
},
|
2070
2017
|
".cm-gutter": {},
|
2071
2018
|
".cm-gutter.cm-lineNumbers .cm-gutterElement": {
|
@@ -2086,7 +2033,7 @@ var defaultTheme = {
|
|
2086
2033
|
paddingInline: 0
|
2087
2034
|
},
|
2088
2035
|
".cm-activeLine": {
|
2089
|
-
background: "var(--dx-
|
2036
|
+
background: "var(--dx-cmActiveLine)"
|
2090
2037
|
},
|
2091
2038
|
/**
|
2092
2039
|
* Cursor (layer).
|
@@ -2234,7 +2181,7 @@ var defaultTheme = {
|
|
2234
2181
|
};
|
2235
2182
|
|
2236
2183
|
// packages/ui/react-ui-editor/src/extensions/factories.ts
|
2237
|
-
var
|
2184
|
+
var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
|
2238
2185
|
var preventNewline = EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
|
2239
2186
|
var defaultBasicOptions = {
|
2240
2187
|
allowMultipleSelections: true,
|
@@ -2259,7 +2206,7 @@ var createBasicExtensions = (_props) => {
|
|
2259
2206
|
// NOTE: Doesn't catch errors in keymap functions.
|
2260
2207
|
EditorView9.exceptionSink.of((err) => {
|
2261
2208
|
log6.catch(err, void 0, {
|
2262
|
-
F:
|
2209
|
+
F: __dxlog_file8,
|
2263
2210
|
L: 93,
|
2264
2211
|
S: void 0,
|
2265
2212
|
C: (f, a) => f(...a)
|
@@ -2347,7 +2294,6 @@ import { codeFolding, foldGutter } from "@codemirror/language";
|
|
2347
2294
|
import { EditorView as EditorView10 } from "@codemirror/view";
|
2348
2295
|
import React2 from "react";
|
2349
2296
|
import { Icon } from "@dxos/react-ui";
|
2350
|
-
import { getSize } from "@dxos/react-ui-theme";
|
2351
2297
|
var folding = (_props = {}) => [
|
2352
2298
|
codeFolding({
|
2353
2299
|
placeholderDOM: () => {
|
@@ -2356,12 +2302,13 @@ var folding = (_props = {}) => [
|
|
2356
2302
|
}),
|
2357
2303
|
foldGutter({
|
2358
2304
|
markerDOM: (open) => {
|
2359
|
-
|
2305
|
+
const el = createElement("div", {
|
2360
2306
|
className: "flex h-full items-center"
|
2361
|
-
})
|
2307
|
+
});
|
2308
|
+
return renderRoot(el, /* @__PURE__ */ React2.createElement(Icon, {
|
2362
2309
|
icon: "ph--caret-right--regular",
|
2310
|
+
size: 3,
|
2363
2311
|
classNames: [
|
2364
|
-
getSize(3),
|
2365
2312
|
"mx-3 cursor-pointer",
|
2366
2313
|
open && "rotate-90"
|
2367
2314
|
]
|
@@ -2371,7 +2318,8 @@ var folding = (_props = {}) => [
|
|
2371
2318
|
EditorView10.theme({
|
2372
2319
|
".cm-foldGutter": {
|
2373
2320
|
opacity: 0.3,
|
2374
|
-
transition: "opacity 0.3s"
|
2321
|
+
transition: "opacity 0.3s",
|
2322
|
+
width: "32px"
|
2375
2323
|
},
|
2376
2324
|
".cm-foldGutter:hover": {
|
2377
2325
|
opacity: 1
|
@@ -3345,7 +3293,7 @@ var getFormatting = (state2) => {
|
|
3345
3293
|
null
|
3346
3294
|
];
|
3347
3295
|
let link = false;
|
3348
|
-
let
|
3296
|
+
let blockQuote2 = null;
|
3349
3297
|
let listStyle = null;
|
3350
3298
|
const stack = [];
|
3351
3299
|
let currentBlock = null;
|
@@ -3454,10 +3402,10 @@ var getFormatting = (state2) => {
|
|
3454
3402
|
hasList = stack[i] === "TaskList" ? "task" : stack[i] === "BulletList" ? "bullet" : "ordered";
|
3455
3403
|
}
|
3456
3404
|
}
|
3457
|
-
if (
|
3458
|
-
|
3459
|
-
} else if (!hasQuote &&
|
3460
|
-
|
3405
|
+
if (blockQuote2 === null) {
|
3406
|
+
blockQuote2 = hasQuote;
|
3407
|
+
} else if (!hasQuote && blockQuote2) {
|
3408
|
+
blockQuote2 = false;
|
3461
3409
|
}
|
3462
3410
|
if (listStyle === null) {
|
3463
3411
|
listStyle = hasList;
|
@@ -3476,7 +3424,7 @@ var getFormatting = (state2) => {
|
|
3476
3424
|
return {
|
3477
3425
|
blankLine,
|
3478
3426
|
blockType: blockType || null,
|
3479
|
-
blockQuote:
|
3427
|
+
blockQuote: blockQuote2 ?? false,
|
3480
3428
|
code: inline[3] ?? false,
|
3481
3429
|
emphasis: inline[1] ?? false,
|
3482
3430
|
strong: inline[0] ?? false,
|
@@ -3727,12 +3675,6 @@ var markdownHighlightStyle = (_options = {}) => {
|
|
3727
3675
|
],
|
3728
3676
|
class: theme.code
|
3729
3677
|
},
|
3730
|
-
{
|
3731
|
-
tag: [
|
3732
|
-
markdownTags.QuoteMark
|
3733
|
-
],
|
3734
|
-
class: theme.blockquote
|
3735
|
-
},
|
3736
3678
|
{
|
3737
3679
|
tag: [
|
3738
3680
|
markdownTags.TableCell
|
@@ -3814,7 +3756,7 @@ var convertTreeToJson = (state2) => {
|
|
3814
3756
|
import { syntaxTree as syntaxTree7 } from "@codemirror/language";
|
3815
3757
|
import { RangeSetBuilder as RangeSetBuilder3, StateEffect as StateEffect4 } from "@codemirror/state";
|
3816
3758
|
import { EditorView as EditorView16, Decoration as Decoration7, WidgetType as WidgetType5, ViewPlugin as ViewPlugin6 } from "@codemirror/view";
|
3817
|
-
import { invariant as
|
3759
|
+
import { invariant as invariant3 } from "@dxos/invariant";
|
3818
3760
|
import { mx as mx2 } from "@dxos/react-ui-theme";
|
3819
3761
|
|
3820
3762
|
// packages/ui/react-ui-editor/src/extensions/markdown/changes.ts
|
@@ -4077,6 +4019,15 @@ var formattingStyles = EditorView14.theme({
|
|
4077
4019
|
width: `${orderedListIndentationWidth}px`
|
4078
4020
|
},
|
4079
4021
|
/**
|
4022
|
+
* Blockquote.
|
4023
|
+
*/
|
4024
|
+
"& .cm-blockquote": {
|
4025
|
+
background: "var(--dx-cmCodeblock)",
|
4026
|
+
borderLeft: "2px solid var(--dx-cmSeparator)",
|
4027
|
+
paddingLeft: "1rem",
|
4028
|
+
margin: "0"
|
4029
|
+
},
|
4030
|
+
/**
|
4080
4031
|
* Code and codeblocks.
|
4081
4032
|
*/
|
4082
4033
|
"& .cm-code": {
|
@@ -4236,7 +4187,7 @@ var TableWidget = class extends WidgetType4 {
|
|
4236
4187
|
};
|
4237
4188
|
|
4238
4189
|
// packages/ui/react-ui-editor/src/extensions/markdown/decorate.ts
|
4239
|
-
var
|
4190
|
+
var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/markdown/decorate.ts";
|
4240
4191
|
var Unicode = {
|
4241
4192
|
emDash: "\u2014",
|
4242
4193
|
bullet: "\u2022",
|
@@ -4259,6 +4210,7 @@ var LinkButton = class extends WidgetType5 {
|
|
4259
4210
|
eq(other) {
|
4260
4211
|
return this.url === other.url;
|
4261
4212
|
}
|
4213
|
+
// TODO(burdon): Create icon and link directly without react?
|
4262
4214
|
toDOM(view) {
|
4263
4215
|
const el = document.createElement("span");
|
4264
4216
|
this.render(el, this.url);
|
@@ -4326,6 +4278,9 @@ var TextWidget = class extends WidgetType5 {
|
|
4326
4278
|
}
|
4327
4279
|
};
|
4328
4280
|
var hide = Decoration7.replace({});
|
4281
|
+
var blockQuote = Decoration7.line({
|
4282
|
+
class: mx2("cm-blockquote")
|
4283
|
+
});
|
4329
4284
|
var fencedCodeLine = Decoration7.line({
|
4330
4285
|
class: mx2("cm-code cm-codeblock-line")
|
4331
4286
|
});
|
@@ -4365,9 +4320,9 @@ var buildDecorations2 = (view, options, focus) => {
|
|
4365
4320
|
const { state: state2 } = view;
|
4366
4321
|
const headerLevels = [];
|
4367
4322
|
const getHeaderLevels = (node, level) => {
|
4368
|
-
|
4369
|
-
F:
|
4370
|
-
L:
|
4323
|
+
invariant3(level > 0, void 0, {
|
4324
|
+
F: __dxlog_file9,
|
4325
|
+
L: 178,
|
4371
4326
|
S: void 0,
|
4372
4327
|
A: [
|
4373
4328
|
"level > 0",
|
@@ -4404,9 +4359,9 @@ var buildDecorations2 = (view, options, focus) => {
|
|
4404
4359
|
listLevels.pop();
|
4405
4360
|
};
|
4406
4361
|
const getCurrentListLevel = () => {
|
4407
|
-
|
4408
|
-
F:
|
4409
|
-
L:
|
4362
|
+
invariant3(listLevels.length, void 0, {
|
4363
|
+
F: __dxlog_file9,
|
4364
|
+
L: 200,
|
4410
4365
|
S: void 0,
|
4411
4366
|
A: [
|
4412
4367
|
"listLevels.length",
|
@@ -4499,7 +4454,30 @@ var buildDecorations2 = (view, options, focus) => {
|
|
4499
4454
|
atomicDeco.add(line.from, to, checked ? checkedTask : uncheckedTask);
|
4500
4455
|
break;
|
4501
4456
|
}
|
4457
|
+
//
|
4458
|
+
// Blockquote > QuoteMark > Paragraph
|
4459
|
+
//
|
4460
|
+
case "Blockquote": {
|
4461
|
+
const editing = editingRange(state2, node, focus);
|
4462
|
+
const quoteMark = node.node.getChild("QuoteMark");
|
4463
|
+
const paragraph = node.node.getChild("Paragraph");
|
4464
|
+
if (!editing && quoteMark && paragraph) {
|
4465
|
+
atomicDeco.add(quoteMark.from, paragraph.from, hide);
|
4466
|
+
}
|
4467
|
+
for (const block of view.viewportLineBlocks) {
|
4468
|
+
if (block.to < node.from) {
|
4469
|
+
continue;
|
4470
|
+
}
|
4471
|
+
if (block.from > node.to) {
|
4472
|
+
break;
|
4473
|
+
}
|
4474
|
+
deco.add(block.from, block.from, blockQuote);
|
4475
|
+
}
|
4476
|
+
break;
|
4477
|
+
}
|
4478
|
+
//
|
4502
4479
|
// CommentBlock
|
4480
|
+
//
|
4503
4481
|
case "CommentBlock": {
|
4504
4482
|
const editing = editingRange(state2, node, focus);
|
4505
4483
|
for (const block of view.viewportLineBlocks) {
|
@@ -4509,16 +4487,18 @@ var buildDecorations2 = (view, options, focus) => {
|
|
4509
4487
|
if (block.from > node.to) {
|
4510
4488
|
break;
|
4511
4489
|
}
|
4512
|
-
const
|
4513
|
-
const
|
4514
|
-
deco.add(block.from, block.from,
|
4515
|
-
if (!editing && (
|
4490
|
+
const isFirst = block.from <= node.from;
|
4491
|
+
const isLast = block.to >= node.to && /^(\s>)*-->$/.test(state2.doc.sliceString(block.from, block.to));
|
4492
|
+
deco.add(block.from, block.from, isFirst ? commentBlockLineFirst : isLast ? commentBlockLineLast : commentBlockLine);
|
4493
|
+
if (!editing && (isFirst || isLast)) {
|
4516
4494
|
atomicDeco.add(block.from, block.to, hide);
|
4517
4495
|
}
|
4518
4496
|
}
|
4519
4497
|
break;
|
4520
4498
|
}
|
4499
|
+
//
|
4521
4500
|
// FencedCode > CodeMark > [CodeInfo] > CodeText > CodeMark
|
4501
|
+
//
|
4522
4502
|
case "FencedCode": {
|
4523
4503
|
for (const block of view.viewportLineBlocks) {
|
4524
4504
|
if (block.to < node.from) {
|
@@ -4537,7 +4517,9 @@ var buildDecorations2 = (view, options, focus) => {
|
|
4537
4517
|
}
|
4538
4518
|
return false;
|
4539
4519
|
}
|
4520
|
+
//
|
4540
4521
|
// Link > [LinkMark, URL]
|
4522
|
+
//
|
4541
4523
|
case "Link": {
|
4542
4524
|
const marks = node.node.getChildren("LinkMark");
|
4543
4525
|
const urlNode = node.node.getChild("URL");
|
@@ -4564,7 +4546,9 @@ var buildDecorations2 = (view, options, focus) => {
|
|
4564
4546
|
}
|
4565
4547
|
break;
|
4566
4548
|
}
|
4549
|
+
//
|
4567
4550
|
// HR
|
4551
|
+
//
|
4568
4552
|
case "HorizontalRule": {
|
4569
4553
|
if (!editingRange(state2, node, focus)) {
|
4570
4554
|
deco.add(node.from, node.to, horizontalRule);
|
@@ -4661,40 +4645,42 @@ var decorateMarkdown = (options = {}) => {
|
|
4661
4645
|
import { syntaxTree as syntaxTree8 } from "@codemirror/language";
|
4662
4646
|
import { hoverTooltip as hoverTooltip2 } from "@codemirror/view";
|
4663
4647
|
import { tooltipContent } from "@dxos/react-ui-theme";
|
4664
|
-
var linkTooltip = (render) =>
|
4665
|
-
|
4666
|
-
|
4667
|
-
|
4668
|
-
|
4669
|
-
|
4670
|
-
const url = link && link.getChild("URL");
|
4671
|
-
if (!url || !link) {
|
4672
|
-
return null;
|
4673
|
-
}
|
4674
|
-
const urlText = view.state.sliceDoc(url.from, url.to);
|
4675
|
-
return {
|
4676
|
-
pos: link.from,
|
4677
|
-
end: link.to,
|
4678
|
-
above: true,
|
4679
|
-
create: () => {
|
4680
|
-
const el = document.createElement("div");
|
4681
|
-
el.className = tooltipContent({}, "pli-2 plb-1");
|
4682
|
-
render(el, urlText);
|
4683
|
-
return {
|
4684
|
-
dom: el,
|
4685
|
-
offset: {
|
4686
|
-
x: 0,
|
4687
|
-
y: 4
|
4688
|
-
}
|
4689
|
-
};
|
4648
|
+
var linkTooltip = (render) => {
|
4649
|
+
return hoverTooltip2((view, pos, side) => {
|
4650
|
+
const syntax = syntaxTree8(view.state).resolveInner(pos, side);
|
4651
|
+
let link = null;
|
4652
|
+
for (let i = 0, node = syntax; !link && node && i < 5; node = node.parent, i++) {
|
4653
|
+
link = node.name === "Link" ? node : null;
|
4690
4654
|
}
|
4691
|
-
|
4692
|
-
|
4655
|
+
const url = link && link.getChild("URL");
|
4656
|
+
if (!url || !link) {
|
4657
|
+
return null;
|
4658
|
+
}
|
4659
|
+
const urlText = view.state.sliceDoc(url.from, url.to);
|
4660
|
+
return {
|
4661
|
+
pos: link.from,
|
4662
|
+
end: link.to,
|
4663
|
+
above: true,
|
4664
|
+
create: () => {
|
4665
|
+
const el = document.createElement("div");
|
4666
|
+
el.className = tooltipContent({}, "pli-2 plb-1");
|
4667
|
+
render(el, urlText);
|
4668
|
+
return {
|
4669
|
+
dom: el,
|
4670
|
+
offset: {
|
4671
|
+
x: 0,
|
4672
|
+
y: 4
|
4673
|
+
}
|
4674
|
+
};
|
4675
|
+
}
|
4676
|
+
};
|
4677
|
+
});
|
4678
|
+
};
|
4693
4679
|
|
4694
4680
|
// packages/ui/react-ui-editor/src/extensions/mention.ts
|
4695
4681
|
import { autocompletion as autocompletion2 } from "@codemirror/autocomplete";
|
4696
4682
|
import { log as log7 } from "@dxos/log";
|
4697
|
-
var
|
4683
|
+
var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/mention.ts";
|
4698
4684
|
var mention = ({ onSearch }) => {
|
4699
4685
|
return autocompletion2({
|
4700
4686
|
// TODO(burdon): Not working.
|
@@ -4709,7 +4695,7 @@ var mention = ({ onSearch }) => {
|
|
4709
4695
|
log7.info("completion context", {
|
4710
4696
|
context
|
4711
4697
|
}, {
|
4712
|
-
F:
|
4698
|
+
F: __dxlog_file10,
|
4713
4699
|
L: 26,
|
4714
4700
|
S: void 0,
|
4715
4701
|
C: (f, a) => f(...a)
|
@@ -4730,7 +4716,6 @@ var mention = ({ onSearch }) => {
|
|
4730
4716
|
};
|
4731
4717
|
|
4732
4718
|
// packages/ui/react-ui-editor/src/extensions/modes.ts
|
4733
|
-
import { Facet as Facet6 } from "@codemirror/state";
|
4734
4719
|
import { keymap as keymap8 } from "@codemirror/view";
|
4735
4720
|
import { vim } from "@replit/codemirror-vim";
|
4736
4721
|
import { vscodeKeymap } from "@replit/codemirror-vscode-keymap";
|
@@ -4745,9 +4730,7 @@ var EditorInputModes = [
|
|
4745
4730
|
"vim",
|
4746
4731
|
"vscode"
|
4747
4732
|
];
|
4748
|
-
var editorInputMode =
|
4749
|
-
combine: (modes) => modes[0] ?? {}
|
4750
|
-
});
|
4733
|
+
var editorInputMode = singleValueFacet({});
|
4751
4734
|
var InputModeExtensions = {
|
4752
4735
|
default: [],
|
4753
4736
|
vscode: [
|
@@ -4778,101 +4761,8 @@ var InputModeExtensions = {
|
|
4778
4761
|
]
|
4779
4762
|
};
|
4780
4763
|
|
4781
|
-
// packages/ui/react-ui-editor/src/extensions/state.ts
|
4782
|
-
import { Transaction as Transaction2 } from "@codemirror/state";
|
4783
|
-
import { EditorView as EditorView17, keymap as keymap9 } from "@codemirror/view";
|
4784
|
-
import { debounce as debounce2 } from "@dxos/async";
|
4785
|
-
import { invariant as invariant5 } from "@dxos/invariant";
|
4786
|
-
import { isNotFalsy as isNotFalsy3 } from "@dxos/util";
|
4787
|
-
var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/state.ts";
|
4788
|
-
var stateRestoreAnnotation = "dxos.org/cm/state-restore";
|
4789
|
-
var keyPrefix = "dxos.org/react-ui-editor/state";
|
4790
|
-
var localStorageStateStoreAdapter = {
|
4791
|
-
getState: (id) => {
|
4792
|
-
invariant5(id, void 0, {
|
4793
|
-
F: __dxlog_file12,
|
4794
|
-
L: 34,
|
4795
|
-
S: void 0,
|
4796
|
-
A: [
|
4797
|
-
"id",
|
4798
|
-
""
|
4799
|
-
]
|
4800
|
-
});
|
4801
|
-
const state2 = localStorage.getItem(`${keyPrefix}/${id}`);
|
4802
|
-
return state2 ? JSON.parse(state2) : void 0;
|
4803
|
-
},
|
4804
|
-
setState: (id, state2) => {
|
4805
|
-
invariant5(id, void 0, {
|
4806
|
-
F: __dxlog_file12,
|
4807
|
-
L: 40,
|
4808
|
-
S: void 0,
|
4809
|
-
A: [
|
4810
|
-
"id",
|
4811
|
-
""
|
4812
|
-
]
|
4813
|
-
});
|
4814
|
-
localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state2));
|
4815
|
-
}
|
4816
|
-
};
|
4817
|
-
var createEditorStateTransaction = ({ scrollTo, selection }) => {
|
4818
|
-
return {
|
4819
|
-
selection,
|
4820
|
-
scrollIntoView: !scrollTo,
|
4821
|
-
effects: scrollTo ? EditorView17.scrollIntoView(scrollTo, {
|
4822
|
-
yMargin: 96
|
4823
|
-
}) : void 0,
|
4824
|
-
annotations: Transaction2.userEvent.of(stateRestoreAnnotation)
|
4825
|
-
};
|
4826
|
-
};
|
4827
|
-
var state = ({ getState, setState } = {}) => {
|
4828
|
-
const setStateDebounced = debounce2(setState, 1e3);
|
4829
|
-
return [
|
4830
|
-
// TODO(burdon): Track scrolling (currently only updates when cursor moves).
|
4831
|
-
// EditorView.domEventHandlers({
|
4832
|
-
// scroll: (event) => {
|
4833
|
-
// setStateDebounced(id, {});
|
4834
|
-
// },
|
4835
|
-
// }),
|
4836
|
-
EditorView17.updateListener.of(({ view, transactions }) => {
|
4837
|
-
const id = view.state.facet(documentId2);
|
4838
|
-
if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
|
4839
|
-
return;
|
4840
|
-
}
|
4841
|
-
if (setState) {
|
4842
|
-
const { scrollTop } = view.scrollDOM;
|
4843
|
-
const pos = view.posAtCoords({
|
4844
|
-
x: 0,
|
4845
|
-
y: scrollTop
|
4846
|
-
});
|
4847
|
-
if (pos !== null) {
|
4848
|
-
const { anchor, head } = view.state.selection.main;
|
4849
|
-
setStateDebounced(id, {
|
4850
|
-
scrollTo: pos,
|
4851
|
-
selection: {
|
4852
|
-
anchor,
|
4853
|
-
head
|
4854
|
-
}
|
4855
|
-
});
|
4856
|
-
}
|
4857
|
-
}
|
4858
|
-
}),
|
4859
|
-
getState && keymap9.of([
|
4860
|
-
{
|
4861
|
-
key: "ctrl-r",
|
4862
|
-
run: (view) => {
|
4863
|
-
const state2 = getState(view.state.facet(documentId2));
|
4864
|
-
if (state2) {
|
4865
|
-
view.dispatch(createEditorStateTransaction(state2));
|
4866
|
-
}
|
4867
|
-
return true;
|
4868
|
-
}
|
4869
|
-
}
|
4870
|
-
])
|
4871
|
-
].filter(isNotFalsy3);
|
4872
|
-
};
|
4873
|
-
|
4874
4764
|
// packages/ui/react-ui-editor/src/extensions/typewriter.ts
|
4875
|
-
import { keymap as
|
4765
|
+
import { keymap as keymap9 } from "@codemirror/view";
|
4876
4766
|
var defaultItems = [
|
4877
4767
|
"hello world!",
|
4878
4768
|
"this is a test.",
|
@@ -4882,7 +4772,7 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
|
|
4882
4772
|
let t;
|
4883
4773
|
let idx = 0;
|
4884
4774
|
return [
|
4885
|
-
|
4775
|
+
keymap9.of([
|
4886
4776
|
{
|
4887
4777
|
// Reset.
|
4888
4778
|
key: "alt-meta-'",
|
@@ -4929,7 +4819,7 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
|
|
4929
4819
|
};
|
4930
4820
|
|
4931
4821
|
// packages/ui/react-ui-editor/src/components/Toolbar/Toolbar.tsx
|
4932
|
-
var iconStyles =
|
4822
|
+
var iconStyles = getSize(5);
|
4933
4823
|
var buttonStyles = "min-bs-0 p-2";
|
4934
4824
|
var tooltipProps = {
|
4935
4825
|
side: "top",
|
@@ -4944,8 +4834,6 @@ var ToolbarRoot = ({ children, onAction, classNames, state: state2 }) => {
|
|
4944
4834
|
return /* @__PURE__ */ React3.createElement(ToolbarContextProvider, {
|
4945
4835
|
onAction,
|
4946
4836
|
state: state2
|
4947
|
-
}, /* @__PURE__ */ React3.createElement(DensityProvider, {
|
4948
|
-
density: "fine"
|
4949
4837
|
}, /* @__PURE__ */ React3.createElement(ElevationProvider, {
|
4950
4838
|
elevation: "chrome"
|
4951
4839
|
}, /* @__PURE__ */ React3.createElement(NaturalToolbar.Root, {
|
@@ -4956,7 +4844,7 @@ var ToolbarRoot = ({ children, onAction, classNames, state: state2 }) => {
|
|
4956
4844
|
style: {
|
4957
4845
|
contain: "layout"
|
4958
4846
|
}
|
4959
|
-
}, children)))
|
4847
|
+
}, children)));
|
4960
4848
|
};
|
4961
4849
|
var ToolbarToggleButton = ({ Icon: Icon2, children, ...props }) => {
|
4962
4850
|
return /* @__PURE__ */ React3.createElement(Tooltip.Root, null, /* @__PURE__ */ React3.createElement(Tooltip.Trigger, {
|
@@ -5313,20 +5201,20 @@ var Toolbar = {
|
|
5313
5201
|
};
|
5314
5202
|
|
5315
5203
|
// packages/ui/react-ui-editor/src/defaults.ts
|
5316
|
-
import { EditorView as
|
5204
|
+
import { EditorView as EditorView17 } from "@codemirror/view";
|
5317
5205
|
import { mx as mx3 } from "@dxos/react-ui-theme";
|
5318
5206
|
var margin = "!mt-[1rem]";
|
5319
5207
|
var editorContent = mx3(margin, "!mli-auto w-full max-w-[min(50rem,100%-2rem)]");
|
5320
5208
|
var editorFullWidth = mx3(margin);
|
5321
5209
|
var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden";
|
5322
|
-
var editorGutter =
|
5210
|
+
var editorGutter = EditorView17.theme({
|
5323
5211
|
// Match margin from content.
|
5324
5212
|
".cm-gutters": {
|
5325
5213
|
marginTop: "16px",
|
5326
5214
|
paddingRight: "1rem"
|
5327
5215
|
}
|
5328
5216
|
});
|
5329
|
-
var editorMonospace =
|
5217
|
+
var editorMonospace = EditorView17.theme({
|
5330
5218
|
".cm-content": {
|
5331
5219
|
fontFamily: fontMono
|
5332
5220
|
}
|
@@ -5339,17 +5227,16 @@ var useActionHandler = (view) => {
|
|
5339
5227
|
|
5340
5228
|
// packages/ui/react-ui-editor/src/hooks/useTextEditor.ts
|
5341
5229
|
import { EditorState as EditorState2 } from "@codemirror/state";
|
5342
|
-
import { EditorView as
|
5230
|
+
import { EditorView as EditorView18 } from "@codemirror/view";
|
5343
5231
|
import { useFocusableGroup } from "@fluentui/react-tabster";
|
5344
5232
|
import { useCallback, useEffect as useEffect3, useMemo as useMemo3, useRef as useRef2, useState as useState4 } from "react";
|
5345
5233
|
import { log as log8 } from "@dxos/log";
|
5346
|
-
import { getProviderValue, isNotFalsy as
|
5347
|
-
var
|
5234
|
+
import { getProviderValue, isNotFalsy as isNotFalsy3 } from "@dxos/util";
|
5235
|
+
var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
|
5348
5236
|
var instanceCount = 0;
|
5349
5237
|
var useTextEditor = (props = {}, deps = []) => {
|
5350
5238
|
const { id, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = useMemo3(() => getProviderValue(props), deps ?? []);
|
5351
5239
|
const [instanceId] = useState4(() => `text-editor-${++instanceCount}`);
|
5352
|
-
const onUpdate = useRef2();
|
5353
5240
|
const [view, setView] = useState4();
|
5354
5241
|
const parentRef = useRef2(null);
|
5355
5242
|
useEffect3(() => {
|
@@ -5360,7 +5247,7 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5360
5247
|
instanceId,
|
5361
5248
|
doc: initialValue?.length ?? 0
|
5362
5249
|
}, {
|
5363
|
-
F:
|
5250
|
+
F: __dxlog_file11,
|
5364
5251
|
L: 76,
|
5365
5252
|
S: void 0,
|
5366
5253
|
C: (f, a) => f(...a)
|
@@ -5379,46 +5266,38 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5379
5266
|
}
|
5380
5267
|
const state2 = EditorState2.create({
|
5381
5268
|
doc: initialValue,
|
5382
|
-
selection: initialSelection,
|
5269
|
+
// selection: initialSelection,
|
5383
5270
|
extensions: [
|
5384
|
-
id &&
|
5385
|
-
|
5386
|
-
|
5271
|
+
id && documentId.of(id),
|
5272
|
+
extensions,
|
5273
|
+
// NOTE: This doesn't catch errors in keymap functions.
|
5274
|
+
EditorView18.exceptionSink.of((err) => {
|
5387
5275
|
log8.catch(err, void 0, {
|
5388
|
-
F:
|
5276
|
+
F: __dxlog_file11,
|
5389
5277
|
L: 98,
|
5390
5278
|
S: void 0,
|
5391
5279
|
C: (f, a) => f(...a)
|
5392
5280
|
});
|
5393
|
-
}),
|
5394
|
-
extensions,
|
5395
|
-
EditorView19.updateListener.of(() => {
|
5396
|
-
setTimeout(() => {
|
5397
|
-
onUpdate.current?.();
|
5398
|
-
});
|
5399
5281
|
})
|
5400
|
-
].filter(
|
5282
|
+
].filter(isNotFalsy3)
|
5401
5283
|
});
|
5402
|
-
view2 = new
|
5284
|
+
view2 = new EditorView18({
|
5403
5285
|
parent: parentRef.current,
|
5404
|
-
selection: initialSelection,
|
5405
5286
|
state: state2,
|
5406
|
-
|
5407
|
-
|
5408
|
-
|
5409
|
-
|
5410
|
-
logChanges(trs);
|
5411
|
-
}
|
5412
|
-
view3.update(trs);
|
5413
|
-
}
|
5287
|
+
scrollTo: scrollTo ? EditorView18.scrollIntoView(scrollTo, {
|
5288
|
+
yMargin: 96
|
5289
|
+
}) : void 0,
|
5290
|
+
dispatchTransactions: debug ? debugDispatcher : void 0
|
5414
5291
|
});
|
5415
|
-
if (
|
5292
|
+
if (moveToEndOfLine && !initialSelection) {
|
5416
5293
|
const { to } = view2.state.doc.lineAt(0);
|
5417
|
-
|
5418
|
-
|
5419
|
-
|
5420
|
-
|
5421
|
-
|
5294
|
+
if (to) {
|
5295
|
+
view2.dispatch({
|
5296
|
+
selection: {
|
5297
|
+
anchor: to
|
5298
|
+
}
|
5299
|
+
});
|
5300
|
+
}
|
5422
5301
|
}
|
5423
5302
|
setView(view2);
|
5424
5303
|
}
|
@@ -5426,8 +5305,8 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5426
5305
|
log8("destroy", {
|
5427
5306
|
id
|
5428
5307
|
}, {
|
5429
|
-
F:
|
5430
|
-
L:
|
5308
|
+
F: __dxlog_file11,
|
5309
|
+
L: 135,
|
5431
5310
|
S: void 0,
|
5432
5311
|
C: (f, a) => f(...a)
|
5433
5312
|
});
|
@@ -5436,21 +5315,33 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5436
5315
|
}, deps);
|
5437
5316
|
useEffect3(() => {
|
5438
5317
|
if (view) {
|
5439
|
-
|
5440
|
-
|
5441
|
-
|
5318
|
+
if (view.state.facet(editorInputMode).noTabster) {
|
5319
|
+
parentRef.current?.removeAttribute("data-tabster");
|
5320
|
+
}
|
5321
|
+
if (scrollTo || selection) {
|
5322
|
+
if (selection && selection.anchor > view.state.doc.length) {
|
5323
|
+
log8.warn("invalid selection", {
|
5324
|
+
length: view.state.doc.length,
|
5325
|
+
scrollTo,
|
5326
|
+
selection
|
5327
|
+
}, {
|
5328
|
+
F: __dxlog_file11,
|
5329
|
+
L: 149,
|
5330
|
+
S: void 0,
|
5331
|
+
C: (f, a) => f(...a)
|
5332
|
+
});
|
5333
|
+
return;
|
5334
|
+
}
|
5335
|
+
view.dispatch(createEditorStateTransaction(view.state, {
|
5442
5336
|
scrollTo,
|
5443
5337
|
selection
|
5444
5338
|
}));
|
5445
|
-
};
|
5446
|
-
if (view.state.facet(editorInputMode).noTabster) {
|
5447
|
-
parentRef.current?.removeAttribute("data-tabster");
|
5448
5339
|
}
|
5449
5340
|
}
|
5450
5341
|
}, [
|
5451
5342
|
view,
|
5452
|
-
|
5453
|
-
|
5343
|
+
scrollTo,
|
5344
|
+
selection
|
5454
5345
|
]);
|
5455
5346
|
useEffect3(() => {
|
5456
5347
|
if (view && autoFocus) {
|
@@ -5521,11 +5412,12 @@ export {
|
|
5521
5412
|
createExternalCommentSync,
|
5522
5413
|
createMarkdownExtensions,
|
5523
5414
|
createThemeExtensions,
|
5415
|
+
debugDispatcher,
|
5524
5416
|
debugNodeLogger,
|
5525
5417
|
debugTree,
|
5526
5418
|
decorateMarkdown,
|
5527
5419
|
defaultOptions,
|
5528
|
-
|
5420
|
+
documentId,
|
5529
5421
|
dropFile,
|
5530
5422
|
editorContent,
|
5531
5423
|
editorFullWidth,
|
@@ -5541,7 +5433,7 @@ export {
|
|
5541
5433
|
image,
|
5542
5434
|
imageUpload,
|
5543
5435
|
insertTable,
|
5544
|
-
|
5436
|
+
keymap10 as keymap,
|
5545
5437
|
linkTooltip,
|
5546
5438
|
listener,
|
5547
5439
|
localStorageStateStoreAdapter,
|
@@ -5564,6 +5456,7 @@ export {
|
|
5564
5456
|
setHeading,
|
5565
5457
|
setSelection,
|
5566
5458
|
setStyle,
|
5459
|
+
singleValueFacet,
|
5567
5460
|
state,
|
5568
5461
|
table,
|
5569
5462
|
tags2 as tags,
|