@dxos/react-ui-editor 0.3.11-main.a6c4a82 → 0.3.11-main.b4b98ab
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 +140 -124
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts +0 -3
- package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/TextEditor.d.ts +2 -2
- package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
- package/dist/types/src/components/TextEditor/index.d.ts +0 -2
- package/dist/types/src/components/TextEditor/index.d.ts.map +1 -1
- package/dist/types/src/extensions/autocomplete.d.ts.map +1 -0
- package/dist/types/src/extensions/basic.d.ts.map +1 -0
- package/dist/types/src/extensions/blast.d.ts.map +1 -0
- package/dist/types/src/extensions/code.d.ts.map +1 -0
- package/dist/types/src/{components/TextEditor/extensions → extensions}/comments.d.ts +1 -1
- package/dist/types/src/extensions/comments.d.ts.map +1 -0
- package/dist/types/src/extensions/hr.d.ts.map +1 -0
- package/dist/types/src/extensions/image.d.ts.map +1 -0
- package/dist/types/src/{components/TextEditor/extensions → extensions}/index.d.ts +0 -1
- package/dist/types/src/extensions/index.d.ts.map +1 -0
- package/dist/types/src/{components/TextEditor/extensions → extensions}/link.d.ts +1 -0
- package/dist/types/src/extensions/link.d.ts.map +1 -0
- package/dist/types/src/extensions/listener.d.ts +10 -0
- package/dist/types/src/extensions/listener.d.ts.map +1 -0
- package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -0
- package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -0
- package/dist/types/src/extensions/markdown/index.d.ts.map +1 -0
- package/dist/types/src/extensions/mention.d.ts.map +1 -0
- package/dist/types/src/extensions/mermaid.d.ts.map +1 -0
- package/dist/types/src/extensions/table.d.ts.map +1 -0
- package/dist/types/src/extensions/tasklist.d.ts.map +1 -0
- package/dist/types/src/extensions/typewriter.d.ts.map +1 -0
- package/dist/types/src/extensions/util.d.ts.map +1 -0
- package/dist/types/src/hooks/useTextModel.d.ts +1 -1
- package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/{components/TextEditor/themes → themes}/default.d.ts +1 -1
- package/dist/types/src/themes/default.d.ts.map +1 -0
- package/dist/types/src/themes/index.d.ts.map +1 -0
- package/package.json +21 -21
- package/src/components/TextEditor/MarkdownEditor.stories.tsx +11 -13
- package/src/components/TextEditor/TextEditor.stories.tsx +1 -1
- package/src/components/TextEditor/TextEditor.tsx +6 -6
- package/src/components/TextEditor/index.ts +0 -3
- package/src/{components/TextEditor/extensions → extensions}/code.ts +1 -1
- package/src/{components/TextEditor/extensions → extensions}/comments.ts +10 -7
- package/src/{components/TextEditor/extensions → extensions}/hr.ts +1 -1
- package/src/{components/TextEditor/extensions → extensions}/index.ts +0 -1
- package/src/{components/TextEditor/extensions → extensions}/link.ts +66 -10
- package/src/extensions/listener.ts +35 -0
- package/src/{components/TextEditor/extensions → extensions}/markdown/highlight.ts +1 -1
- package/src/{components/TextEditor/extensions → extensions}/typewriter.ts +1 -1
- package/src/hooks/useTextModel.ts +5 -4
- package/src/index.ts +2 -0
- package/src/{components/TextEditor/themes → themes}/default.ts +1 -1
- package/dist/types/src/components/TextEditor/extensions/autocomplete.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/basic.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/blast.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/code.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/comments.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/hr.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/image.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/index.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/link.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/listener.d.ts +0 -9
- package/dist/types/src/components/TextEditor/extensions/listener.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/markdown/highlight.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/markdown/index.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/mention.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/mermaid.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/table.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/tasklist.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/tooltip.d.ts +0 -12
- package/dist/types/src/components/TextEditor/extensions/tooltip.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/typewriter.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/extensions/util.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/themes/default.d.ts.map +0 -1
- package/dist/types/src/components/TextEditor/themes/index.d.ts.map +0 -1
- package/src/components/TextEditor/extensions/listener.ts +0 -23
- package/src/components/TextEditor/extensions/tooltip.ts +0 -61
- /package/dist/types/src/{components/TextEditor/extensions → extensions}/autocomplete.d.ts +0 -0
- /package/dist/types/src/{components/TextEditor/extensions → extensions}/basic.d.ts +0 -0
- /package/dist/types/src/{components/TextEditor/extensions → extensions}/blast.d.ts +0 -0
- /package/dist/types/src/{components/TextEditor/extensions → extensions}/code.d.ts +0 -0
- /package/dist/types/src/{components/TextEditor/extensions → extensions}/hr.d.ts +0 -0
- /package/dist/types/src/{components/TextEditor/extensions → extensions}/image.d.ts +0 -0
- /package/dist/types/src/{components/TextEditor/extensions → extensions}/markdown/bundle.d.ts +0 -0
- /package/dist/types/src/{components/TextEditor/extensions → extensions}/markdown/highlight.d.ts +0 -0
- /package/dist/types/src/{components/TextEditor/extensions → extensions}/markdown/index.d.ts +0 -0
- /package/dist/types/src/{components/TextEditor/extensions → extensions}/mention.d.ts +0 -0
- /package/dist/types/src/{components/TextEditor/extensions → extensions}/mermaid.d.ts +0 -0
- /package/dist/types/src/{components/TextEditor/extensions → extensions}/table.d.ts +0 -0
- /package/dist/types/src/{components/TextEditor/extensions → extensions}/tasklist.d.ts +0 -0
- /package/dist/types/src/{components/TextEditor/extensions → extensions}/typewriter.d.ts +0 -0
- /package/dist/types/src/{components/TextEditor/extensions → extensions}/util.d.ts +0 -0
- /package/dist/types/src/{components/TextEditor/themes → themes}/index.d.ts +0 -0
- /package/src/{components/TextEditor/extensions → extensions}/autocomplete.ts +0 -0
- /package/src/{components/TextEditor/extensions → extensions}/basic.ts +0 -0
- /package/src/{components/TextEditor/extensions → extensions}/blast.ts +0 -0
- /package/src/{components/TextEditor/extensions → extensions}/image.ts +0 -0
- /package/src/{components/TextEditor/extensions → extensions}/markdown/bundle.ts +0 -0
- /package/src/{components/TextEditor/extensions → extensions}/markdown/index.ts +0 -0
- /package/src/{components/TextEditor/extensions → extensions}/mention.ts +0 -0
- /package/src/{components/TextEditor/extensions → extensions}/mermaid.ts +0 -0
- /package/src/{components/TextEditor/extensions → extensions}/table.ts +0 -0
- /package/src/{components/TextEditor/extensions → extensions}/tasklist.ts +0 -0
- /package/src/{components/TextEditor/extensions → extensions}/util.ts +0 -0
- /package/src/{components/TextEditor/themes → themes}/index.ts +0 -0
|
@@ -5,7 +5,18 @@ import { Doc, YText, YXmlFragment } from "@dxos/text-model";
|
|
|
5
5
|
// packages/ui/react-ui-editor/src/components/TextEditor/index.ts
|
|
6
6
|
import { tags as tags2 } from "@lezer/highlight";
|
|
7
7
|
|
|
8
|
-
// packages/ui/react-ui-editor/src/components/TextEditor/
|
|
8
|
+
// packages/ui/react-ui-editor/src/components/TextEditor/TextEditor.tsx
|
|
9
|
+
import { EditorState as EditorState2 } from "@codemirror/state";
|
|
10
|
+
import { EditorView as EditorView12 } from "@codemirror/view";
|
|
11
|
+
import { useFocusableGroup } from "@fluentui/react-tabster";
|
|
12
|
+
import { vim } from "@replit/codemirror-vim";
|
|
13
|
+
import defaultsDeep2 from "lodash.defaultsdeep";
|
|
14
|
+
import React, { forwardRef, useCallback, useEffect as useEffect2, useImperativeHandle, useState as useState2 } from "react";
|
|
15
|
+
import { generateName } from "@dxos/display-name";
|
|
16
|
+
import { useThemeContext } from "@dxos/react-ui";
|
|
17
|
+
import { getColorForValue, inputSurface, mx as mx3 } from "@dxos/react-ui-theme";
|
|
18
|
+
|
|
19
|
+
// packages/ui/react-ui-editor/src/extensions/autocomplete.ts
|
|
9
20
|
import { autocompletion, completionKeymap } from "@codemirror/autocomplete";
|
|
10
21
|
import { keymap } from "@codemirror/view";
|
|
11
22
|
var autocomplete = ({ onSearch }) => {
|
|
@@ -38,7 +49,7 @@ var autocomplete = ({ onSearch }) => {
|
|
|
38
49
|
];
|
|
39
50
|
};
|
|
40
51
|
|
|
41
|
-
// packages/ui/react-ui-editor/src/
|
|
52
|
+
// packages/ui/react-ui-editor/src/extensions/basic.ts
|
|
42
53
|
import { closeBrackets } from "@codemirror/autocomplete";
|
|
43
54
|
import { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from "@codemirror/language";
|
|
44
55
|
import { oneDarkHighlightStyle } from "@codemirror/theme-one-dark";
|
|
@@ -55,11 +66,11 @@ var basicBundle = ({ readonly, themeMode, placeholder: _placeholder }) => [
|
|
|
55
66
|
themeMode === "dark" ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle)
|
|
56
67
|
].filter(Boolean);
|
|
57
68
|
|
|
58
|
-
// packages/ui/react-ui-editor/src/
|
|
69
|
+
// packages/ui/react-ui-editor/src/extensions/blast.ts
|
|
59
70
|
import { EditorView as EditorView2, keymap as keymap2 } from "@codemirror/view";
|
|
60
71
|
import defaultsDeep from "lodash.defaultsdeep";
|
|
61
72
|
import { invariant } from "@dxos/invariant";
|
|
62
|
-
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/
|
|
73
|
+
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/blast.ts";
|
|
63
74
|
var defaultOptions = {
|
|
64
75
|
effect: 2,
|
|
65
76
|
maxParticles: 200,
|
|
@@ -365,7 +376,7 @@ var random = (min, max) => {
|
|
|
365
376
|
return min + ~~(Math.random() * (max - min + 1));
|
|
366
377
|
};
|
|
367
378
|
|
|
368
|
-
// packages/ui/react-ui-editor/src/
|
|
379
|
+
// packages/ui/react-ui-editor/src/extensions/code.ts
|
|
369
380
|
import { ViewPlugin, EditorView as EditorView3, Decoration } from "@codemirror/view";
|
|
370
381
|
import get from "lodash.get";
|
|
371
382
|
import { mx as mx2 } from "@dxos/react-ui-theme";
|
|
@@ -416,7 +427,7 @@ var blockquote = mx("pl-1 mr-1 border-is-4 border-primary-500/70 dark:border-pri
|
|
|
416
427
|
import { tailwindConfig } from "@dxos/react-ui-theme";
|
|
417
428
|
var tokens = tailwindConfig({}).theme;
|
|
418
429
|
|
|
419
|
-
// packages/ui/react-ui-editor/src/
|
|
430
|
+
// packages/ui/react-ui-editor/src/extensions/code.ts
|
|
420
431
|
var CODE_REGEX = /```[\s\S]*?```/gs;
|
|
421
432
|
var styles = EditorView3.baseTheme({
|
|
422
433
|
"& .cm-codeblock": {
|
|
@@ -487,7 +498,7 @@ var code2 = () => {
|
|
|
487
498
|
];
|
|
488
499
|
};
|
|
489
500
|
|
|
490
|
-
// packages/ui/react-ui-editor/src/
|
|
501
|
+
// packages/ui/react-ui-editor/src/extensions/comments.ts
|
|
491
502
|
import { StateEffect as StateEffect2, StateField as StateField3 } from "@codemirror/state";
|
|
492
503
|
import { hoverTooltip, keymap as keymap3, Decoration as Decoration2, EditorView as EditorView4, MatchDecorator, ViewPlugin as ViewPlugin3, WidgetType } from "@codemirror/view";
|
|
493
504
|
import sortBy from "lodash.sortby";
|
|
@@ -496,9 +507,9 @@ import { invariant as invariant3 } from "@dxos/invariant";
|
|
|
496
507
|
import { log as log3 } from "@dxos/log";
|
|
497
508
|
import { nonNullable } from "@dxos/util";
|
|
498
509
|
|
|
499
|
-
// packages/ui/react-ui-editor/src/
|
|
510
|
+
// packages/ui/react-ui-editor/src/extensions/util.ts
|
|
500
511
|
import { log } from "@dxos/log";
|
|
501
|
-
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/
|
|
512
|
+
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/util.ts";
|
|
502
513
|
var callbackWrapper = (fn) => (...args) => {
|
|
503
514
|
try {
|
|
504
515
|
return fn(...args);
|
|
@@ -966,13 +977,22 @@ var createYjsModel = ({ identity, space, text }) => {
|
|
|
966
977
|
].join(":");
|
|
967
978
|
},
|
|
968
979
|
getRangeFromCursor: (cursor) => {
|
|
980
|
+
invariant2(text.doc, void 0, {
|
|
981
|
+
F: __dxlog_file4,
|
|
982
|
+
L: 113,
|
|
983
|
+
S: void 0,
|
|
984
|
+
A: [
|
|
985
|
+
"text.doc",
|
|
986
|
+
""
|
|
987
|
+
]
|
|
988
|
+
});
|
|
969
989
|
const parts = cursor.split(":");
|
|
970
990
|
const from = Y.createAbsolutePositionFromRelativePosition(Y.decodeRelativePosition(stringToArray(parts[0])), text.doc);
|
|
971
991
|
const to = Y.createAbsolutePositionFromRelativePosition(Y.decodeRelativePosition(stringToArray(parts[1])), text.doc);
|
|
972
|
-
return {
|
|
992
|
+
return from && to ? {
|
|
973
993
|
from: from.index,
|
|
974
994
|
to: to.index
|
|
975
|
-
};
|
|
995
|
+
} : void 0;
|
|
976
996
|
},
|
|
977
997
|
extension: [
|
|
978
998
|
yCollab(text.content, provider?.awareness),
|
|
@@ -1008,8 +1028,8 @@ var createAutomergeModel = ({ identity, text }) => {
|
|
|
1008
1028
|
return model;
|
|
1009
1029
|
};
|
|
1010
1030
|
|
|
1011
|
-
// packages/ui/react-ui-editor/src/
|
|
1012
|
-
var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/
|
|
1031
|
+
// packages/ui/react-ui-editor/src/extensions/comments.ts
|
|
1032
|
+
var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
|
|
1013
1033
|
var styles2 = EditorView4.baseTheme({
|
|
1014
1034
|
"& .cm-bookmark": {
|
|
1015
1035
|
cursor: "pointer",
|
|
@@ -1054,11 +1074,11 @@ var commentsStateField = StateField3.define({
|
|
|
1054
1074
|
const { model, comments: comments2 } = effect.value;
|
|
1055
1075
|
const ranges = comments2.map((comment) => {
|
|
1056
1076
|
const range = model.getRangeFromCursor(comment.cursor);
|
|
1057
|
-
return {
|
|
1077
|
+
return range && {
|
|
1058
1078
|
...comment,
|
|
1059
1079
|
...range
|
|
1060
1080
|
};
|
|
1061
|
-
});
|
|
1081
|
+
}).filter(nonNullable);
|
|
1062
1082
|
return {
|
|
1063
1083
|
...value,
|
|
1064
1084
|
ranges
|
|
@@ -1099,7 +1119,7 @@ var BookmarkWidget = class extends WidgetType {
|
|
|
1099
1119
|
this._handleClick = _handleClick;
|
|
1100
1120
|
invariant3(this._id, void 0, {
|
|
1101
1121
|
F: __dxlog_file5,
|
|
1102
|
-
L:
|
|
1122
|
+
L: 153,
|
|
1103
1123
|
S: this,
|
|
1104
1124
|
A: [
|
|
1105
1125
|
"this._id",
|
|
@@ -1125,7 +1145,7 @@ var comments = (options = {}) => {
|
|
|
1125
1145
|
const createCommentThread = (view) => {
|
|
1126
1146
|
invariant3(options.onCreate, void 0, {
|
|
1127
1147
|
F: __dxlog_file5,
|
|
1128
|
-
L:
|
|
1148
|
+
L: 207,
|
|
1129
1149
|
S: void 0,
|
|
1130
1150
|
A: [
|
|
1131
1151
|
"options.onCreate",
|
|
@@ -1207,7 +1227,7 @@ var comments = (options = {}) => {
|
|
|
1207
1227
|
options.onCreate ? keymap3.of([
|
|
1208
1228
|
{
|
|
1209
1229
|
key: options?.key ?? "meta-'",
|
|
1210
|
-
run: createCommentThread
|
|
1230
|
+
run: callbackWrapper(createCommentThread)
|
|
1211
1231
|
}
|
|
1212
1232
|
]) : [],
|
|
1213
1233
|
//
|
|
@@ -1251,7 +1271,7 @@ var comments = (options = {}) => {
|
|
|
1251
1271
|
changes.iterChanges((from, to, from2, to2) => {
|
|
1252
1272
|
invariant3(model, void 0, {
|
|
1253
1273
|
F: __dxlog_file5,
|
|
1254
|
-
L:
|
|
1274
|
+
L: 336,
|
|
1255
1275
|
S: void 0,
|
|
1256
1276
|
A: [
|
|
1257
1277
|
"model",
|
|
@@ -1261,12 +1281,12 @@ var comments = (options = {}) => {
|
|
|
1261
1281
|
ranges.forEach((range) => {
|
|
1262
1282
|
if (from2 === to2) {
|
|
1263
1283
|
const newRange = model.getRangeFromCursor(range.cursor);
|
|
1264
|
-
if (newRange.to - newRange.from === 0) {
|
|
1284
|
+
if (!newRange || newRange.to - newRange.from === 0) {
|
|
1265
1285
|
log3.info("deleted comment", {
|
|
1266
1286
|
thread: range.id
|
|
1267
1287
|
}, {
|
|
1268
1288
|
F: __dxlog_file5,
|
|
1269
|
-
L:
|
|
1289
|
+
L: 342,
|
|
1270
1290
|
S: void 0,
|
|
1271
1291
|
C: (f, a) => f(...a)
|
|
1272
1292
|
});
|
|
@@ -1323,7 +1343,7 @@ var comments = (options = {}) => {
|
|
|
1323
1343
|
];
|
|
1324
1344
|
};
|
|
1325
1345
|
|
|
1326
|
-
// packages/ui/react-ui-editor/src/
|
|
1346
|
+
// packages/ui/react-ui-editor/src/extensions/hr.ts
|
|
1327
1347
|
import { Decoration as Decoration3, EditorView as EditorView5, MatchDecorator as MatchDecorator2, ViewPlugin as ViewPlugin4, WidgetType as WidgetType2 } from "@codemirror/view";
|
|
1328
1348
|
import get3 from "lodash.get";
|
|
1329
1349
|
var styles3 = EditorView5.baseTheme({
|
|
@@ -1371,7 +1391,7 @@ var hr = () => [
|
|
|
1371
1391
|
})
|
|
1372
1392
|
];
|
|
1373
1393
|
|
|
1374
|
-
// packages/ui/react-ui-editor/src/
|
|
1394
|
+
// packages/ui/react-ui-editor/src/extensions/image.ts
|
|
1375
1395
|
import { syntaxTree } from "@codemirror/language";
|
|
1376
1396
|
import { RangeSetBuilder, StateField as StateField4 } from "@codemirror/state";
|
|
1377
1397
|
import { Decoration as Decoration4, EditorView as EditorView6, WidgetType as WidgetType3 } from "@codemirror/view";
|
|
@@ -1419,16 +1439,67 @@ var ImageWidget = class extends WidgetType3 {
|
|
|
1419
1439
|
}
|
|
1420
1440
|
};
|
|
1421
1441
|
|
|
1422
|
-
// packages/ui/react-ui-editor/src/
|
|
1442
|
+
// packages/ui/react-ui-editor/src/extensions/link.ts
|
|
1423
1443
|
import { syntaxTree as syntaxTree2 } from "@codemirror/language";
|
|
1424
1444
|
import { RangeSetBuilder as RangeSetBuilder2, StateField as StateField5 } from "@codemirror/state";
|
|
1425
|
-
import { Decoration as Decoration5, EditorView as EditorView7, WidgetType as WidgetType4 } from "@codemirror/view";
|
|
1445
|
+
import { Decoration as Decoration5, EditorView as EditorView7, WidgetType as WidgetType4, hoverTooltip as hoverTooltip2 } from "@codemirror/view";
|
|
1446
|
+
import { tooltipContent } from "@dxos/react-ui-theme";
|
|
1447
|
+
var markdownLinkRegexp = /\[([^\]]+)]\(([^)]+)\)/;
|
|
1426
1448
|
var link = (options = {}) => {
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1449
|
+
const extensions = [
|
|
1450
|
+
StateField5.define({
|
|
1451
|
+
create: (state) => update2(state, options),
|
|
1452
|
+
update: (_, tr) => update2(tr.state, options),
|
|
1453
|
+
provide: (field) => EditorView7.decorations.from(field)
|
|
1454
|
+
})
|
|
1455
|
+
];
|
|
1456
|
+
if (options.onHover) {
|
|
1457
|
+
extensions.push(
|
|
1458
|
+
// https://codemirror.net/examples/tooltip
|
|
1459
|
+
// https://codemirror.net/docs/ref/#view.hoverTooltip
|
|
1460
|
+
// https://github.com/codemirror/view/blob/main/src/tooltip.ts
|
|
1461
|
+
hoverTooltip2((view, pos) => {
|
|
1462
|
+
const { from, text } = view.state.doc.lineAt(pos);
|
|
1463
|
+
const p = pos - from;
|
|
1464
|
+
let idx = 0;
|
|
1465
|
+
let match;
|
|
1466
|
+
do {
|
|
1467
|
+
match = text.substring(idx).match(markdownLinkRegexp);
|
|
1468
|
+
if (!match) {
|
|
1469
|
+
match = void 0;
|
|
1470
|
+
break;
|
|
1471
|
+
}
|
|
1472
|
+
idx = text.indexOf(match[0]);
|
|
1473
|
+
if (p >= idx && p < idx + match[0].length) {
|
|
1474
|
+
break;
|
|
1475
|
+
}
|
|
1476
|
+
idx += match[0].length;
|
|
1477
|
+
} while (true);
|
|
1478
|
+
if (!match) {
|
|
1479
|
+
return null;
|
|
1480
|
+
}
|
|
1481
|
+
const [, , url] = match ?? [];
|
|
1482
|
+
return {
|
|
1483
|
+
pos: idx + from,
|
|
1484
|
+
end: idx + from + match[0].length,
|
|
1485
|
+
above: true,
|
|
1486
|
+
create: () => {
|
|
1487
|
+
const el = document.createElement("div");
|
|
1488
|
+
el.className = tooltipContent({}, "pli-2 plb-1");
|
|
1489
|
+
options.onHover(el, url);
|
|
1490
|
+
return {
|
|
1491
|
+
dom: el,
|
|
1492
|
+
offset: {
|
|
1493
|
+
x: 0,
|
|
1494
|
+
y: 4
|
|
1495
|
+
}
|
|
1496
|
+
};
|
|
1497
|
+
}
|
|
1498
|
+
};
|
|
1499
|
+
})
|
|
1500
|
+
);
|
|
1501
|
+
}
|
|
1502
|
+
return extensions;
|
|
1432
1503
|
};
|
|
1433
1504
|
var LinkButton = class extends WidgetType4 {
|
|
1434
1505
|
constructor(_pos, _url, _onAttach) {
|
|
@@ -1447,14 +1518,13 @@ var LinkButton = class extends WidgetType4 {
|
|
|
1447
1518
|
}
|
|
1448
1519
|
};
|
|
1449
1520
|
var LinkText = class extends WidgetType4 {
|
|
1450
|
-
constructor(
|
|
1521
|
+
constructor(_text, _url) {
|
|
1451
1522
|
super();
|
|
1452
|
-
this._pos = _pos;
|
|
1453
1523
|
this._text = _text;
|
|
1454
1524
|
this._url = _url;
|
|
1455
1525
|
}
|
|
1456
1526
|
eq(other) {
|
|
1457
|
-
return this.
|
|
1527
|
+
return this._url === other._url;
|
|
1458
1528
|
}
|
|
1459
1529
|
toDOM(view) {
|
|
1460
1530
|
const link2 = document.createElement("a");
|
|
@@ -1468,7 +1538,7 @@ var LinkText = class extends WidgetType4 {
|
|
|
1468
1538
|
link2.onclick = () => {
|
|
1469
1539
|
view.dispatch({
|
|
1470
1540
|
selection: {
|
|
1471
|
-
anchor:
|
|
1541
|
+
anchor: view.posAtDOM(link2)
|
|
1472
1542
|
}
|
|
1473
1543
|
});
|
|
1474
1544
|
};
|
|
@@ -1491,7 +1561,7 @@ var update2 = (state, options) => {
|
|
|
1491
1561
|
}
|
|
1492
1562
|
if (state.readOnly || cursor < node.from || cursor > node.to) {
|
|
1493
1563
|
builder.add(node.from, node.to, Decoration5.replace({
|
|
1494
|
-
widget: new LinkText(
|
|
1564
|
+
widget: new LinkText(text, options.link ? url : void 0)
|
|
1495
1565
|
}));
|
|
1496
1566
|
}
|
|
1497
1567
|
if (options.onRender) {
|
|
@@ -1506,21 +1576,21 @@ var update2 = (state, options) => {
|
|
|
1506
1576
|
return builder.finish();
|
|
1507
1577
|
};
|
|
1508
1578
|
|
|
1509
|
-
// packages/ui/react-ui-editor/src/
|
|
1510
|
-
import {
|
|
1511
|
-
var listener = ({ onChange }) => {
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1579
|
+
// packages/ui/react-ui-editor/src/extensions/listener.ts
|
|
1580
|
+
import { EditorView as EditorView8 } from "@codemirror/view";
|
|
1581
|
+
var listener = ({ onFocus, onChange }) => {
|
|
1582
|
+
const extensions = [];
|
|
1583
|
+
onFocus && extensions.push(EditorView8.focusChangeEffect.of((_, focused) => {
|
|
1584
|
+
onFocus(focused);
|
|
1585
|
+
return null;
|
|
1586
|
+
}));
|
|
1587
|
+
onChange && extensions.push(EditorView8.updateListener.of((update4) => {
|
|
1588
|
+
onChange(update4.state.doc.toString());
|
|
1589
|
+
}));
|
|
1590
|
+
return extensions;
|
|
1521
1591
|
};
|
|
1522
1592
|
|
|
1523
|
-
// packages/ui/react-ui-editor/src/
|
|
1593
|
+
// packages/ui/react-ui-editor/src/extensions/markdown/bundle.ts
|
|
1524
1594
|
import { closeBrackets as closeBrackets2, closeBracketsKeymap } from "@codemirror/autocomplete";
|
|
1525
1595
|
import { history, historyKeymap, indentWithTab, standardKeymap } from "@codemirror/commands";
|
|
1526
1596
|
import { markdownLanguage as markdownLanguage2, markdown } from "@codemirror/lang-markdown";
|
|
@@ -1529,9 +1599,9 @@ import { languages } from "@codemirror/language-data";
|
|
|
1529
1599
|
import { searchKeymap } from "@codemirror/search";
|
|
1530
1600
|
import { EditorState } from "@codemirror/state";
|
|
1531
1601
|
import { oneDarkHighlightStyle as oneDarkHighlightStyle2 } from "@codemirror/theme-one-dark";
|
|
1532
|
-
import { crosshairCursor, drawSelection as drawSelection2, dropCursor, EditorView as
|
|
1602
|
+
import { crosshairCursor, drawSelection as drawSelection2, dropCursor, EditorView as EditorView9, highlightActiveLine, keymap as keymap4, placeholder as placeholder2 } from "@codemirror/view";
|
|
1533
1603
|
|
|
1534
|
-
// packages/ui/react-ui-editor/src/
|
|
1604
|
+
// packages/ui/react-ui-editor/src/extensions/markdown/highlight.ts
|
|
1535
1605
|
import { markdownLanguage } from "@codemirror/lang-markdown";
|
|
1536
1606
|
import { HighlightStyle } from "@codemirror/language";
|
|
1537
1607
|
import { tags, styleTags, Tag } from "@lezer/highlight";
|
|
@@ -1727,12 +1797,12 @@ var markdownHighlightStyle = (readonly) => {
|
|
|
1727
1797
|
});
|
|
1728
1798
|
};
|
|
1729
1799
|
|
|
1730
|
-
// packages/ui/react-ui-editor/src/
|
|
1800
|
+
// packages/ui/react-ui-editor/src/extensions/markdown/bundle.ts
|
|
1731
1801
|
var markdownBundle = ({ readonly, themeMode, placeholder: _placeholder }) => {
|
|
1732
1802
|
return [
|
|
1733
1803
|
EditorState.allowMultipleSelections.of(true),
|
|
1734
1804
|
EditorState.tabSize.of(2),
|
|
1735
|
-
|
|
1805
|
+
EditorView9.lineWrapping,
|
|
1736
1806
|
customKeymap(),
|
|
1737
1807
|
bracketMatching2(),
|
|
1738
1808
|
closeBrackets2(),
|
|
@@ -1780,7 +1850,7 @@ var customKeymap = () => keymap4.of([
|
|
|
1780
1850
|
...searchKeymap
|
|
1781
1851
|
]);
|
|
1782
1852
|
|
|
1783
|
-
// packages/ui/react-ui-editor/src/
|
|
1853
|
+
// packages/ui/react-ui-editor/src/extensions/mention.ts
|
|
1784
1854
|
import { autocompletion as autocompletion2 } from "@codemirror/autocomplete";
|
|
1785
1855
|
var mention = ({ onSearch }) => {
|
|
1786
1856
|
return autocompletion2({
|
|
@@ -1803,20 +1873,20 @@ var mention = ({ onSearch }) => {
|
|
|
1803
1873
|
});
|
|
1804
1874
|
};
|
|
1805
1875
|
|
|
1806
|
-
// packages/ui/react-ui-editor/src/
|
|
1876
|
+
// packages/ui/react-ui-editor/src/extensions/mermaid.ts
|
|
1807
1877
|
var mermaid = () => {
|
|
1808
1878
|
return [];
|
|
1809
1879
|
};
|
|
1810
1880
|
|
|
1811
|
-
// packages/ui/react-ui-editor/src/
|
|
1881
|
+
// packages/ui/react-ui-editor/src/extensions/table.ts
|
|
1812
1882
|
import { syntaxTree as syntaxTree3 } from "@codemirror/language";
|
|
1813
|
-
import { RangeSetBuilder as RangeSetBuilder3, StateField as
|
|
1814
|
-
import { Decoration as Decoration6, EditorView as
|
|
1883
|
+
import { RangeSetBuilder as RangeSetBuilder3, StateField as StateField6 } from "@codemirror/state";
|
|
1884
|
+
import { Decoration as Decoration6, EditorView as EditorView10, WidgetType as WidgetType5 } from "@codemirror/view";
|
|
1815
1885
|
var table = (options = {}) => {
|
|
1816
|
-
return
|
|
1886
|
+
return StateField6.define({
|
|
1817
1887
|
create: (state) => update3(state, options),
|
|
1818
1888
|
update: (_, tr) => update3(tr.state, options),
|
|
1819
|
-
provide: (field) =>
|
|
1889
|
+
provide: (field) => EditorView10.decorations.from(field)
|
|
1820
1890
|
});
|
|
1821
1891
|
};
|
|
1822
1892
|
var update3 = (state, options) => {
|
|
@@ -1904,9 +1974,9 @@ var TableWidget = class extends WidgetType5 {
|
|
|
1904
1974
|
}
|
|
1905
1975
|
};
|
|
1906
1976
|
|
|
1907
|
-
// packages/ui/react-ui-editor/src/
|
|
1908
|
-
import { EditorView as
|
|
1909
|
-
var styles4 =
|
|
1977
|
+
// packages/ui/react-ui-editor/src/extensions/tasklist.ts
|
|
1978
|
+
import { EditorView as EditorView11, Decoration as Decoration7, WidgetType as WidgetType6, MatchDecorator as MatchDecorator3, ViewPlugin as ViewPlugin5 } from "@codemirror/view";
|
|
1979
|
+
var styles4 = EditorView11.baseTheme({
|
|
1910
1980
|
"& .cm-task-item": {
|
|
1911
1981
|
paddingLeft: "4px",
|
|
1912
1982
|
paddingRight: "8px"
|
|
@@ -1979,7 +2049,7 @@ var tasklist = (options = {}) => {
|
|
|
1979
2049
|
}
|
|
1980
2050
|
}, {
|
|
1981
2051
|
decorations: (value) => value.tasks,
|
|
1982
|
-
provide: (plugin) =>
|
|
2052
|
+
provide: (plugin) => EditorView11.atomicRanges.of((view) => {
|
|
1983
2053
|
return view.plugin(plugin)?.tasks || Decoration7.none;
|
|
1984
2054
|
})
|
|
1985
2055
|
});
|
|
@@ -1989,51 +2059,7 @@ var tasklist = (options = {}) => {
|
|
|
1989
2059
|
];
|
|
1990
2060
|
};
|
|
1991
2061
|
|
|
1992
|
-
// packages/ui/react-ui-editor/src/
|
|
1993
|
-
import { hoverTooltip as hoverTooltip2 } from "@codemirror/view";
|
|
1994
|
-
import { tooltipContent } from "@dxos/react-ui-theme";
|
|
1995
|
-
var markdownLinkRegexp = /\[([^\]]+)]\(([^)]+)\)/;
|
|
1996
|
-
var tooltip = ({ onHover, regexp = markdownLinkRegexp }) => hoverTooltip2((view, pos) => {
|
|
1997
|
-
const { from, text } = view.state.doc.lineAt(pos);
|
|
1998
|
-
const p = pos - from;
|
|
1999
|
-
let idx = 0;
|
|
2000
|
-
let match;
|
|
2001
|
-
do {
|
|
2002
|
-
match = text.substring(idx).match(regexp);
|
|
2003
|
-
if (!match) {
|
|
2004
|
-
match = void 0;
|
|
2005
|
-
break;
|
|
2006
|
-
}
|
|
2007
|
-
idx = text.indexOf(match[0]);
|
|
2008
|
-
if (p >= idx && p < idx + match[0].length) {
|
|
2009
|
-
break;
|
|
2010
|
-
}
|
|
2011
|
-
idx += match[0].length;
|
|
2012
|
-
} while (true);
|
|
2013
|
-
if (!match) {
|
|
2014
|
-
return null;
|
|
2015
|
-
}
|
|
2016
|
-
const [, , url] = match ?? [];
|
|
2017
|
-
return {
|
|
2018
|
-
pos: idx + from,
|
|
2019
|
-
end: idx + from + match[0].length,
|
|
2020
|
-
above: true,
|
|
2021
|
-
create: () => {
|
|
2022
|
-
const el = document.createElement("div");
|
|
2023
|
-
el.className = tooltipContent({}, "pli-2 plb-1");
|
|
2024
|
-
onHover(el, url);
|
|
2025
|
-
return {
|
|
2026
|
-
dom: el,
|
|
2027
|
-
offset: {
|
|
2028
|
-
x: 0,
|
|
2029
|
-
y: 4
|
|
2030
|
-
}
|
|
2031
|
-
};
|
|
2032
|
-
}
|
|
2033
|
-
};
|
|
2034
|
-
});
|
|
2035
|
-
|
|
2036
|
-
// packages/ui/react-ui-editor/src/components/TextEditor/extensions/typewriter.ts
|
|
2062
|
+
// packages/ui/react-ui-editor/src/extensions/typewriter.ts
|
|
2037
2063
|
import { keymap as keymap5 } from "@codemirror/view";
|
|
2038
2064
|
var defaultItems = [
|
|
2039
2065
|
"hello world!",
|
|
@@ -2090,7 +2116,7 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
|
|
|
2090
2116
|
];
|
|
2091
2117
|
};
|
|
2092
2118
|
|
|
2093
|
-
// packages/ui/react-ui-editor/src/
|
|
2119
|
+
// packages/ui/react-ui-editor/src/themes/default.ts
|
|
2094
2120
|
import get5 from "lodash.get";
|
|
2095
2121
|
var defaultTheme = {
|
|
2096
2122
|
//
|
|
@@ -2363,20 +2389,11 @@ var codeTheme = {
|
|
|
2363
2389
|
};
|
|
2364
2390
|
|
|
2365
2391
|
// packages/ui/react-ui-editor/src/components/TextEditor/TextEditor.tsx
|
|
2366
|
-
import { EditorState as EditorState2 } from "@codemirror/state";
|
|
2367
|
-
import { EditorView as EditorView11 } from "@codemirror/view";
|
|
2368
|
-
import { useFocusableGroup } from "@fluentui/react-tabster";
|
|
2369
|
-
import { vim } from "@replit/codemirror-vim";
|
|
2370
|
-
import defaultsDeep2 from "lodash.defaultsdeep";
|
|
2371
|
-
import React, { forwardRef, useCallback, useEffect as useEffect2, useImperativeHandle, useState as useState2 } from "react";
|
|
2372
|
-
import { generateName } from "@dxos/display-name";
|
|
2373
|
-
import { useThemeContext } from "@dxos/react-ui";
|
|
2374
|
-
import { getColorForValue, inputSurface, mx as mx3 } from "@dxos/react-ui-theme";
|
|
2375
2392
|
var EditorModes = [
|
|
2376
2393
|
"default",
|
|
2377
2394
|
"vim"
|
|
2378
2395
|
];
|
|
2379
|
-
var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, comments: comments2,
|
|
2396
|
+
var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, readonly, comments: comments2, extensions = [], editorMode, slots = defaultSlots }, forwardedRef) => {
|
|
2380
2397
|
const { themeMode } = useThemeContext();
|
|
2381
2398
|
const tabsterDOMAttribute = useFocusableGroup({
|
|
2382
2399
|
tabBehavior: "limited"
|
|
@@ -2438,9 +2455,9 @@ var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, comments: comments2, r
|
|
|
2438
2455
|
editorMode === "vim" && vim(),
|
|
2439
2456
|
// Theme.
|
|
2440
2457
|
// TODO(burdon): Make theme configurable.
|
|
2441
|
-
|
|
2442
|
-
|
|
2443
|
-
|
|
2458
|
+
EditorView12.baseTheme(defaultTheme),
|
|
2459
|
+
EditorView12.theme(slots?.editor?.theme ?? {}),
|
|
2460
|
+
EditorView12.darkTheme.of(themeMode === "dark"),
|
|
2444
2461
|
// Storage and replication.
|
|
2445
2462
|
model.extension,
|
|
2446
2463
|
// Custom.
|
|
@@ -2450,7 +2467,7 @@ var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, comments: comments2, r
|
|
|
2450
2467
|
view?.destroy();
|
|
2451
2468
|
setEditor({
|
|
2452
2469
|
state: state2,
|
|
2453
|
-
view: new
|
|
2470
|
+
view: new EditorView12({
|
|
2454
2471
|
state: state2,
|
|
2455
2472
|
parent: root
|
|
2456
2473
|
})
|
|
@@ -2583,7 +2600,6 @@ export {
|
|
|
2583
2600
|
tags2 as tags,
|
|
2584
2601
|
tasklist,
|
|
2585
2602
|
textTheme,
|
|
2586
|
-
tooltip,
|
|
2587
2603
|
typewriter,
|
|
2588
2604
|
useTextModel
|
|
2589
2605
|
};
|