@dxos/react-ui-editor 0.4.4-main.2a45fa8 → 0.4.4-main.3a00f69
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 +94 -71
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts +2 -1
- package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
- package/dist/types/src/extensions/comments.d.ts +15 -7
- package/dist/types/src/extensions/comments.d.ts.map +1 -1
- package/dist/types/src/extensions/cursor.d.ts +1 -1
- package/dist/types/src/extensions/cursor.d.ts.map +1 -1
- package/dist/types/src/hooks/useTextModel.d.ts +3 -0
- package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
- package/package.json +24 -24
- package/src/components/TextEditor/MarkdownEditor.stories.tsx +3 -2
- package/src/components/Toolbar/Toolbar.stories.tsx +2 -2
- package/src/extensions/autocomplete.ts +1 -1
- package/src/extensions/automerge/cursor.ts +14 -4
- package/src/extensions/automerge/defs.ts +0 -1
- package/src/extensions/comments.ts +111 -82
- package/src/extensions/cursor.ts +4 -2
- package/src/hooks/useTextModel.ts +8 -2
|
@@ -31,7 +31,9 @@ var defaultCursorConverter = {
|
|
|
31
31
|
var Cursor = class _Cursor {
|
|
32
32
|
static {
|
|
33
33
|
this.converter = Facet.define({
|
|
34
|
-
combine: (providers) =>
|
|
34
|
+
combine: (providers) => {
|
|
35
|
+
return providers[0] ?? defaultCursorConverter;
|
|
36
|
+
}
|
|
35
37
|
});
|
|
36
38
|
}
|
|
37
39
|
static {
|
|
@@ -130,7 +132,7 @@ var autocomplete = ({ onSearch }) => {
|
|
|
130
132
|
// https://codemirror.net/examples/autocompletion
|
|
131
133
|
// https://codemirror.net/docs/ref/#autocomplete.autocompletion
|
|
132
134
|
autocompletion({
|
|
133
|
-
activateOnTyping:
|
|
135
|
+
activateOnTyping: false,
|
|
134
136
|
// closeOnBlur: false,
|
|
135
137
|
// defaultKeymap: false,
|
|
136
138
|
// TODO(burdon): Styles/fragments.
|
|
@@ -172,7 +174,11 @@ var cursorConverter = (handle, path) => ({
|
|
|
172
174
|
if (typeof value === "string" && value.length <= pos) {
|
|
173
175
|
return "end";
|
|
174
176
|
}
|
|
175
|
-
|
|
177
|
+
try {
|
|
178
|
+
return A.getCursor(doc, path.slice(), pos);
|
|
179
|
+
} catch (err) {
|
|
180
|
+
return "";
|
|
181
|
+
}
|
|
176
182
|
},
|
|
177
183
|
fromCursor: (cursor) => {
|
|
178
184
|
if (cursor === "") {
|
|
@@ -190,7 +196,11 @@ var cursorConverter = (handle, path) => ({
|
|
|
190
196
|
return 0;
|
|
191
197
|
}
|
|
192
198
|
}
|
|
193
|
-
|
|
199
|
+
try {
|
|
200
|
+
return A.getCursorPosition(doc, path.slice(), cursor);
|
|
201
|
+
} catch (err) {
|
|
202
|
+
return 0;
|
|
203
|
+
}
|
|
194
204
|
}
|
|
195
205
|
});
|
|
196
206
|
|
|
@@ -1132,68 +1142,15 @@ var logChanges = (trs) => {
|
|
|
1132
1142
|
};
|
|
1133
1143
|
|
|
1134
1144
|
// packages/ui/react-ui-editor/src/extensions/comments.ts
|
|
1135
|
-
var
|
|
1136
|
-
|
|
1137
|
-
mixBlendMode: "darken"
|
|
1138
|
-
},
|
|
1139
|
-
"&dark .cm-comment, &dark .cm-comment-current": {
|
|
1140
|
-
mixBlendMode: "plus-lighter"
|
|
1141
|
-
},
|
|
1142
|
-
"&light .cm-comment": {
|
|
1143
|
-
backgroundColor: getToken("extend.colors.yellow.50")
|
|
1144
|
-
},
|
|
1145
|
-
"&light .cm-comment-current": {
|
|
1146
|
-
backgroundColor: getToken("extend.colors.yellow.100")
|
|
1147
|
-
},
|
|
1148
|
-
"&dark .cm-comment": {
|
|
1149
|
-
color: getToken("extend.colors.yellow.50"),
|
|
1150
|
-
backgroundColor: getToken("extend.colors.yellow.900")
|
|
1151
|
-
},
|
|
1152
|
-
"&dark .cm-comment-current": {
|
|
1153
|
-
color: getToken("extend.colors.yellow.100"),
|
|
1154
|
-
backgroundColor: getToken("extend.colors.yellow.950")
|
|
1155
|
-
}
|
|
1156
|
-
});
|
|
1157
|
-
var commentMark = Decoration3.mark({
|
|
1158
|
-
class: "cm-comment",
|
|
1159
|
-
attributes: {
|
|
1160
|
-
"data-testid": "cm-comment"
|
|
1161
|
-
}
|
|
1162
|
-
});
|
|
1163
|
-
var commentCurrentMark = Decoration3.mark({
|
|
1164
|
-
class: "cm-comment-current",
|
|
1165
|
-
attributes: {
|
|
1166
|
-
"data-testid": "cm-comment"
|
|
1167
|
-
}
|
|
1145
|
+
var documentId = Facet3.define({
|
|
1146
|
+
combine: (values) => values[0]
|
|
1168
1147
|
});
|
|
1169
|
-
var focusComment = (view, id, center = true) => {
|
|
1170
|
-
const comment = view.state.field(commentsState).comments.find((range2) => range2.comment.id === id);
|
|
1171
|
-
if (!comment?.comment.cursor) {
|
|
1172
|
-
return;
|
|
1173
|
-
}
|
|
1174
|
-
const range = Cursor.getRangeFromCursor(view.state, comment.comment.cursor);
|
|
1175
|
-
if (range) {
|
|
1176
|
-
view.dispatch({
|
|
1177
|
-
selection: {
|
|
1178
|
-
anchor: range.from
|
|
1179
|
-
},
|
|
1180
|
-
effects: [
|
|
1181
|
-
//
|
|
1182
|
-
EditorView6.scrollIntoView(range.from, center ? {
|
|
1183
|
-
y: "center"
|
|
1184
|
-
} : void 0),
|
|
1185
|
-
setSelection.of({
|
|
1186
|
-
current: id
|
|
1187
|
-
})
|
|
1188
|
-
]
|
|
1189
|
-
});
|
|
1190
|
-
}
|
|
1191
|
-
};
|
|
1192
1148
|
var setComments = StateEffect2.define();
|
|
1193
1149
|
var setSelection = StateEffect2.define();
|
|
1194
1150
|
var setCommentState = StateEffect2.define();
|
|
1195
1151
|
var commentsState = StateField3.define({
|
|
1196
|
-
create: () => ({
|
|
1152
|
+
create: (state) => ({
|
|
1153
|
+
id: state.facet(documentId),
|
|
1197
1154
|
comments: [],
|
|
1198
1155
|
selection: {}
|
|
1199
1156
|
}),
|
|
@@ -1206,7 +1163,8 @@ var commentsState = StateField3.define({
|
|
|
1206
1163
|
};
|
|
1207
1164
|
}
|
|
1208
1165
|
if (effect.is(setComments)) {
|
|
1209
|
-
const comments2 = effect.value
|
|
1166
|
+
const { comments: comments2 } = effect.value;
|
|
1167
|
+
const commentStates = comments2.map((comment) => {
|
|
1210
1168
|
if (!comment.cursor) {
|
|
1211
1169
|
return void 0;
|
|
1212
1170
|
}
|
|
@@ -1218,7 +1176,7 @@ var commentsState = StateField3.define({
|
|
|
1218
1176
|
}).filter(nonNullable);
|
|
1219
1177
|
return {
|
|
1220
1178
|
...value,
|
|
1221
|
-
comments:
|
|
1179
|
+
comments: commentStates
|
|
1222
1180
|
};
|
|
1223
1181
|
}
|
|
1224
1182
|
if (effect.is(setCommentState)) {
|
|
@@ -1228,6 +1186,40 @@ var commentsState = StateField3.define({
|
|
|
1228
1186
|
return value;
|
|
1229
1187
|
}
|
|
1230
1188
|
});
|
|
1189
|
+
var styles3 = EditorView6.baseTheme({
|
|
1190
|
+
"&light .cm-comment, &light .cm-comment-current": {
|
|
1191
|
+
mixBlendMode: "darken"
|
|
1192
|
+
},
|
|
1193
|
+
"&dark .cm-comment, &dark .cm-comment-current": {
|
|
1194
|
+
mixBlendMode: "plus-lighter"
|
|
1195
|
+
},
|
|
1196
|
+
"&light .cm-comment": {
|
|
1197
|
+
backgroundColor: getToken("extend.colors.yellow.50")
|
|
1198
|
+
},
|
|
1199
|
+
"&light .cm-comment-current": {
|
|
1200
|
+
backgroundColor: getToken("extend.colors.yellow.100")
|
|
1201
|
+
},
|
|
1202
|
+
"&dark .cm-comment": {
|
|
1203
|
+
color: getToken("extend.colors.yellow.50"),
|
|
1204
|
+
backgroundColor: getToken("extend.colors.yellow.900")
|
|
1205
|
+
},
|
|
1206
|
+
"&dark .cm-comment-current": {
|
|
1207
|
+
color: getToken("extend.colors.yellow.100"),
|
|
1208
|
+
backgroundColor: getToken("extend.colors.yellow.950")
|
|
1209
|
+
}
|
|
1210
|
+
});
|
|
1211
|
+
var commentMark = Decoration3.mark({
|
|
1212
|
+
class: "cm-comment",
|
|
1213
|
+
attributes: {
|
|
1214
|
+
"data-testid": "cm-comment"
|
|
1215
|
+
}
|
|
1216
|
+
});
|
|
1217
|
+
var commentCurrentMark = Decoration3.mark({
|
|
1218
|
+
class: "cm-comment-current",
|
|
1219
|
+
attributes: {
|
|
1220
|
+
"data-testid": "cm-comment"
|
|
1221
|
+
}
|
|
1222
|
+
});
|
|
1231
1223
|
var commentsDecorations = EditorView6.decorations.compute([
|
|
1232
1224
|
commentsState
|
|
1233
1225
|
], (state) => {
|
|
@@ -1347,9 +1339,6 @@ var mapTrackedComment = (comment, changes) => ({
|
|
|
1347
1339
|
var restoreCommentEffect = StateEffect2.define({
|
|
1348
1340
|
map: mapTrackedComment
|
|
1349
1341
|
});
|
|
1350
|
-
var optionsFacet = Facet3.define({
|
|
1351
|
-
combine: (providers) => providers[0]
|
|
1352
|
-
});
|
|
1353
1342
|
var createComment = (view) => {
|
|
1354
1343
|
const options = view.state.facet(optionsFacet);
|
|
1355
1344
|
const { from, to } = view.state.selection.main;
|
|
@@ -1388,11 +1377,15 @@ var createComment = (view) => {
|
|
|
1388
1377
|
}
|
|
1389
1378
|
return false;
|
|
1390
1379
|
};
|
|
1380
|
+
var optionsFacet = Facet3.define({
|
|
1381
|
+
combine: (providers) => providers[0]
|
|
1382
|
+
});
|
|
1391
1383
|
var comments = (options = {}) => {
|
|
1392
1384
|
const { key: shortcut = "meta-'" } = options;
|
|
1393
1385
|
const handleSelect = debounce((state) => options.onSelect?.(state), 200);
|
|
1394
1386
|
return [
|
|
1395
1387
|
optionsFacet.of(options),
|
|
1388
|
+
documentId.of(options.id),
|
|
1396
1389
|
commentsState,
|
|
1397
1390
|
commentsDecorations,
|
|
1398
1391
|
styles3,
|
|
@@ -1494,6 +1487,7 @@ var comments = (options = {}) => {
|
|
|
1494
1487
|
});
|
|
1495
1488
|
handleSelect({
|
|
1496
1489
|
selection,
|
|
1490
|
+
id: state.facet(documentId),
|
|
1497
1491
|
comments: comments2.map(({ comment, range }) => ({
|
|
1498
1492
|
comment,
|
|
1499
1493
|
range,
|
|
@@ -1505,14 +1499,41 @@ var comments = (options = {}) => {
|
|
|
1505
1499
|
options.onUpdate ? trackPastedComments(options.onUpdate) : []
|
|
1506
1500
|
];
|
|
1507
1501
|
};
|
|
1508
|
-
var
|
|
1502
|
+
var focusComment = (view, id, center = true) => {
|
|
1503
|
+
const comment = view.state.field(commentsState).comments.find((range2) => range2.comment.id === id);
|
|
1504
|
+
if (!comment?.comment.cursor) {
|
|
1505
|
+
return;
|
|
1506
|
+
}
|
|
1507
|
+
const range = Cursor.getRangeFromCursor(view.state, comment.comment.cursor);
|
|
1508
|
+
if (range) {
|
|
1509
|
+
view.dispatch({
|
|
1510
|
+
selection: {
|
|
1511
|
+
anchor: range.from
|
|
1512
|
+
},
|
|
1513
|
+
effects: [
|
|
1514
|
+
//
|
|
1515
|
+
EditorView6.scrollIntoView(range.from, center ? {
|
|
1516
|
+
y: "center"
|
|
1517
|
+
} : void 0),
|
|
1518
|
+
setSelection.of({
|
|
1519
|
+
current: id
|
|
1520
|
+
})
|
|
1521
|
+
]
|
|
1522
|
+
});
|
|
1523
|
+
}
|
|
1524
|
+
};
|
|
1525
|
+
var useComments = (view, id, comments2 = []) => {
|
|
1509
1526
|
useEffect(() => {
|
|
1510
1527
|
if (view) {
|
|
1511
1528
|
view.dispatch({
|
|
1512
|
-
effects: setComments.of(
|
|
1529
|
+
effects: setComments.of({
|
|
1530
|
+
id,
|
|
1531
|
+
comments: comments2
|
|
1532
|
+
})
|
|
1513
1533
|
});
|
|
1514
1534
|
}
|
|
1515
1535
|
}, [
|
|
1536
|
+
id,
|
|
1516
1537
|
view,
|
|
1517
1538
|
comments2
|
|
1518
1539
|
]);
|
|
@@ -4594,9 +4615,11 @@ import { invariant as invariant3 } from "@dxos/invariant";
|
|
|
4594
4615
|
import { isAutomergeObject } from "@dxos/react-client/echo";
|
|
4595
4616
|
var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextModel.ts";
|
|
4596
4617
|
var useTextModel = (props) => {
|
|
4597
|
-
const { identity, space, text } = props;
|
|
4598
4618
|
const [model, setModel] = useState5();
|
|
4599
|
-
|
|
4619
|
+
const { identity, space, text } = props;
|
|
4620
|
+
useEffect4(() => {
|
|
4621
|
+
setModel(createModel(props));
|
|
4622
|
+
}, [
|
|
4600
4623
|
identity,
|
|
4601
4624
|
space,
|
|
4602
4625
|
text
|
|
@@ -4618,7 +4641,7 @@ var createModel = ({ space, identity, text }) => {
|
|
|
4618
4641
|
}
|
|
4619
4642
|
invariant3(isAutomergeObject(text), void 0, {
|
|
4620
4643
|
F: __dxlog_file6,
|
|
4621
|
-
L:
|
|
4644
|
+
L: 60,
|
|
4622
4645
|
S: void 0,
|
|
4623
4646
|
A: [
|
|
4624
4647
|
"isAutomergeObject(text)",
|