@dxos/react-ui-editor 0.3.11-main.3d4adea → 0.3.11-main.42059c4
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 +148 -111
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +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/comments.stories.d.ts +1 -1
- package/dist/types/src/components/TextEditor/comments.stories.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/defs.d.ts +4 -4
- package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/index.d.ts +0 -1
- package/dist/types/src/extensions/automerge/index.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/semaphore.d.ts +4 -9
- package/dist/types/src/extensions/automerge/semaphore.d.ts.map +1 -1
- package/dist/types/src/extensions/comments.d.ts +12 -3
- package/dist/types/src/extensions/comments.d.ts.map +1 -1
- package/dist/types/src/extensions/tasklist.d.ts +5 -1
- package/dist/types/src/extensions/tasklist.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +1 -1
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/package.json +25 -25
- package/src/components/TextEditor/TextEditor.tsx +10 -10
- package/src/components/TextEditor/comments.stories.tsx +78 -38
- package/src/extensions/automerge/automerge.ts +11 -11
- package/src/extensions/automerge/defs.ts +13 -9
- package/src/extensions/automerge/index.ts +0 -1
- package/src/extensions/automerge/semaphore.ts +10 -12
- package/src/extensions/comments.ts +104 -27
- package/src/extensions/tasklist.ts +51 -75
- package/src/extensions/yjs/yjs.test.ts +1 -1
- package/src/hooks/index.ts +2 -1
|
@@ -51,7 +51,7 @@ var autocomplete = ({ onSearch }) => {
|
|
|
51
51
|
};
|
|
52
52
|
|
|
53
53
|
// packages/ui/react-ui-editor/src/extensions/automerge/automerge.ts
|
|
54
|
-
import {
|
|
54
|
+
import { StateField } from "@codemirror/state";
|
|
55
55
|
import { ViewPlugin } from "@codemirror/view";
|
|
56
56
|
import { next as A } from "@dxos/automerge/automerge";
|
|
57
57
|
|
|
@@ -92,7 +92,7 @@ var cursorConverter = (handle, path) => ({
|
|
|
92
92
|
});
|
|
93
93
|
|
|
94
94
|
// packages/ui/react-ui-editor/src/extensions/automerge/defs.ts
|
|
95
|
-
import { Annotation, StateEffect } from "@codemirror/state";
|
|
95
|
+
import { Annotation, StateEffect, Facet } from "@codemirror/state";
|
|
96
96
|
var effectType = StateEffect.define({});
|
|
97
97
|
var updateHeads = (newHeads) => effectType.of({
|
|
98
98
|
newHeads
|
|
@@ -101,6 +101,9 @@ var getLastHeads = (state, field) => state.field(field).lastHeads;
|
|
|
101
101
|
var getPath = (state, field) => state.field(field).path;
|
|
102
102
|
var reconcileAnnotationType = Annotation.define();
|
|
103
103
|
var isReconcileTx = (tr) => !!tr.annotation(reconcileAnnotationType);
|
|
104
|
+
var semaphoreFacet = Facet.define({
|
|
105
|
+
combine: (values) => values.at(-1)
|
|
106
|
+
});
|
|
104
107
|
|
|
105
108
|
// packages/ui/react-ui-editor/src/extensions/automerge/semaphore.ts
|
|
106
109
|
import { next as automerge2 } from "@dxos/automerge/automerge";
|
|
@@ -237,11 +240,11 @@ var charPath = (textPath, candidatePath) => {
|
|
|
237
240
|
|
|
238
241
|
// packages/ui/react-ui-editor/src/extensions/automerge/semaphore.ts
|
|
239
242
|
var PatchSemaphore = class {
|
|
240
|
-
constructor(_field) {
|
|
243
|
+
constructor(_handle, _field) {
|
|
244
|
+
this._handle = _handle;
|
|
241
245
|
this._field = _field;
|
|
242
246
|
this._inReconcile = false;
|
|
243
|
-
this.
|
|
244
|
-
this.reconcile = (handle, view) => {
|
|
247
|
+
this.reconcile = (view) => {
|
|
245
248
|
if (this._inReconcile) {
|
|
246
249
|
return;
|
|
247
250
|
}
|
|
@@ -259,11 +262,11 @@ var PatchSemaphore = class {
|
|
|
259
262
|
annotations: reconcileAnnotationType.of(true)
|
|
260
263
|
});
|
|
261
264
|
}
|
|
262
|
-
let newHeads = updateAutomerge(this._field,
|
|
265
|
+
let newHeads = updateAutomerge(this._field, this._handle, transactions, view.state);
|
|
263
266
|
if (newHeads === null || newHeads === void 0) {
|
|
264
|
-
newHeads = automerge2.getHeads(
|
|
267
|
+
newHeads = automerge2.getHeads(this._handle.docSync());
|
|
265
268
|
}
|
|
266
|
-
const diff = automerge2.equals(oldHeads, newHeads) ? [] : automerge2.diff(
|
|
269
|
+
const diff = automerge2.equals(oldHeads, newHeads) ? [] : automerge2.diff(this._handle.docSync(), oldHeads, newHeads);
|
|
267
270
|
updateCodeMirror(view, selection, path, diff);
|
|
268
271
|
view.dispatch({
|
|
269
272
|
effects: updateHeads(newHeads),
|
|
@@ -275,14 +278,14 @@ var PatchSemaphore = class {
|
|
|
275
278
|
};
|
|
276
279
|
|
|
277
280
|
// packages/ui/react-ui-editor/src/extensions/cursor.ts
|
|
278
|
-
import { Facet } from "@codemirror/state";
|
|
281
|
+
import { Facet as Facet2 } from "@codemirror/state";
|
|
279
282
|
var defaultCursorConverter = {
|
|
280
283
|
toCursor: (position) => position.toString(),
|
|
281
284
|
fromCursor: (cursor) => parseInt(cursor)
|
|
282
285
|
};
|
|
283
286
|
var Cursor = class {
|
|
284
287
|
static {
|
|
285
|
-
this.converter =
|
|
288
|
+
this.converter = Facet2.define({
|
|
286
289
|
combine: (providers) => providers[0] ?? defaultCursorConverter
|
|
287
290
|
});
|
|
288
291
|
}
|
|
@@ -310,9 +313,6 @@ var Cursor = class {
|
|
|
310
313
|
};
|
|
311
314
|
|
|
312
315
|
// packages/ui/react-ui-editor/src/extensions/automerge/automerge.ts
|
|
313
|
-
var semaphoreFacet = Facet2.define({
|
|
314
|
-
combine: (values) => values.at(-1)
|
|
315
|
-
});
|
|
316
316
|
var automerge3 = ({ handle, path }) => {
|
|
317
317
|
const stateField = StateField.define({
|
|
318
318
|
create: () => ({
|
|
@@ -343,19 +343,19 @@ var automerge3 = ({ handle, path }) => {
|
|
|
343
343
|
return result;
|
|
344
344
|
}
|
|
345
345
|
});
|
|
346
|
-
const semaphore = new PatchSemaphore(stateField);
|
|
347
|
-
const viewPlugin = ViewPlugin.fromClass(class
|
|
346
|
+
const semaphore = new PatchSemaphore(handle, stateField);
|
|
347
|
+
const viewPlugin = ViewPlugin.fromClass(class AutomergeViewPlugin {
|
|
348
348
|
constructor(_view) {
|
|
349
349
|
this._view = _view;
|
|
350
350
|
this._handleChange = () => {
|
|
351
|
-
this._view.state.facet(semaphoreFacet).reconcile(
|
|
351
|
+
this._view.state.facet(semaphoreFacet).reconcile(this._view);
|
|
352
352
|
};
|
|
353
353
|
handle.addListener("change", this._handleChange);
|
|
354
354
|
}
|
|
355
355
|
update(update2) {
|
|
356
356
|
if (update2.transactions.length > 0 && update2.transactions.some((tr) => !isReconcileTx(tr))) {
|
|
357
357
|
queueMicrotask(() => {
|
|
358
|
-
this._view.state.facet(semaphoreFacet).reconcile(
|
|
358
|
+
this._view.state.facet(semaphoreFacet).reconcile(this._view);
|
|
359
359
|
});
|
|
360
360
|
}
|
|
361
361
|
}
|
|
@@ -1105,7 +1105,6 @@ import { hoverTooltip, keymap as keymap3, Decoration as Decoration3, EditorView
|
|
|
1105
1105
|
import sortBy from "lodash.sortby";
|
|
1106
1106
|
import { debounce } from "@dxos/async";
|
|
1107
1107
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
1108
|
-
import { log as log2 } from "@dxos/log";
|
|
1109
1108
|
import { nonNullable } from "@dxos/util";
|
|
1110
1109
|
|
|
1111
1110
|
// packages/ui/react-ui-editor/src/util.ts
|
|
@@ -1173,7 +1172,7 @@ var commentsStateField = StateField2.define({
|
|
|
1173
1172
|
...effect.value
|
|
1174
1173
|
};
|
|
1175
1174
|
}
|
|
1176
|
-
if (effect.is(setCommentRange)) {
|
|
1175
|
+
if (effect.is(setCommentRange) && effect.value.comments.length > 0) {
|
|
1177
1176
|
const { comments: comments2 } = effect.value;
|
|
1178
1177
|
const ranges = comments2.map((comment) => {
|
|
1179
1178
|
const range = Cursor.getRangeFromCursor(cursorConverter3, comment.cursor);
|
|
@@ -1214,6 +1213,65 @@ var highlightDecorations = EditorView5.decorations.compute([
|
|
|
1214
1213
|
}).filter(nonNullable) ?? [];
|
|
1215
1214
|
return Decoration3.set(decorations);
|
|
1216
1215
|
});
|
|
1216
|
+
var trackPastedComments = (onUpdate) => {
|
|
1217
|
+
let tracked = null;
|
|
1218
|
+
const handleTrack = (event, view) => {
|
|
1219
|
+
const comments2 = view.state.field(commentsStateField);
|
|
1220
|
+
const { main } = view.state.selection;
|
|
1221
|
+
const selectedRanges = comments2.ranges.filter((range) => range.from >= main.from && range.to <= main.to && range.from < range.to);
|
|
1222
|
+
if (!selectedRanges.length) {
|
|
1223
|
+
tracked = null;
|
|
1224
|
+
} else {
|
|
1225
|
+
tracked = {
|
|
1226
|
+
text: view.state.doc.slice(main.from, main.to),
|
|
1227
|
+
comments: selectedRanges.map((range) => ({
|
|
1228
|
+
id: range.id,
|
|
1229
|
+
from: range.from - main.from,
|
|
1230
|
+
to: range.to - main.from
|
|
1231
|
+
}))
|
|
1232
|
+
};
|
|
1233
|
+
}
|
|
1234
|
+
};
|
|
1235
|
+
return [
|
|
1236
|
+
EditorView5.domEventHandlers({
|
|
1237
|
+
cut: handleTrack,
|
|
1238
|
+
copy: handleTrack
|
|
1239
|
+
}),
|
|
1240
|
+
// Handle paste.
|
|
1241
|
+
EditorView5.updateListener.of(({ view, state, transactions }) => {
|
|
1242
|
+
if (tracked) {
|
|
1243
|
+
const paste = transactions.find((tr) => tr.isUserEvent("input.paste"));
|
|
1244
|
+
if (paste) {
|
|
1245
|
+
let found = -1;
|
|
1246
|
+
paste.changes.iterChanges((fromA, toA, fromB, toB, text) => {
|
|
1247
|
+
if (text.eq(tracked.text)) {
|
|
1248
|
+
for (let i = transactions.indexOf(paste) + 1; i < transactions.length; i++) {
|
|
1249
|
+
fromB = transactions[i].changes.mapPos(fromB);
|
|
1250
|
+
}
|
|
1251
|
+
found = fromB;
|
|
1252
|
+
}
|
|
1253
|
+
});
|
|
1254
|
+
if (found > -1) {
|
|
1255
|
+
const comments2 = tracked.comments;
|
|
1256
|
+
view.state.facet(semaphoreFacet).reconcile(view);
|
|
1257
|
+
const active = state.field(commentsStateField).ranges;
|
|
1258
|
+
for (const moved of comments2) {
|
|
1259
|
+
if (active.some((range) => range.id === moved.id && range.from === range.to)) {
|
|
1260
|
+
const range = {
|
|
1261
|
+
from: found + moved.from,
|
|
1262
|
+
to: found + moved.to
|
|
1263
|
+
};
|
|
1264
|
+
const cursor = Cursor.getCursorFromRange(state.facet(Cursor.converter), range);
|
|
1265
|
+
onUpdate(moved.id, cursor);
|
|
1266
|
+
}
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
tracked = null;
|
|
1270
|
+
}
|
|
1271
|
+
}
|
|
1272
|
+
})
|
|
1273
|
+
];
|
|
1274
|
+
};
|
|
1217
1275
|
var comments = (options = {}) => {
|
|
1218
1276
|
const { key: shortcut = "meta-'" } = options;
|
|
1219
1277
|
const handleSelect = debounce((state) => options.onSelect?.(state), 200);
|
|
@@ -1221,14 +1279,14 @@ var comments = (options = {}) => {
|
|
|
1221
1279
|
const cursorConverter3 = view.state.facet(Cursor.converter);
|
|
1222
1280
|
invariant2(options.onCreate, void 0, {
|
|
1223
1281
|
F: __dxlog_file3,
|
|
1224
|
-
L:
|
|
1282
|
+
L: 262,
|
|
1225
1283
|
S: void 0,
|
|
1226
1284
|
A: [
|
|
1227
1285
|
"options.onCreate",
|
|
1228
1286
|
""
|
|
1229
1287
|
]
|
|
1230
1288
|
});
|
|
1231
|
-
const {
|
|
1289
|
+
const { from, to } = view.state.selection.main;
|
|
1232
1290
|
if (from === to) {
|
|
1233
1291
|
return false;
|
|
1234
1292
|
}
|
|
@@ -1247,18 +1305,6 @@ var comments = (options = {}) => {
|
|
|
1247
1305
|
anchor: from
|
|
1248
1306
|
}
|
|
1249
1307
|
});
|
|
1250
|
-
if (options.footnote) {
|
|
1251
|
-
const tag = `[^${id}]`;
|
|
1252
|
-
view.dispatch({
|
|
1253
|
-
changes: {
|
|
1254
|
-
from: head,
|
|
1255
|
-
insert: tag
|
|
1256
|
-
},
|
|
1257
|
-
selection: {
|
|
1258
|
-
anchor: head + tag.length
|
|
1259
|
-
}
|
|
1260
|
-
});
|
|
1261
|
-
}
|
|
1262
1308
|
return true;
|
|
1263
1309
|
}
|
|
1264
1310
|
}
|
|
@@ -1320,14 +1366,7 @@ var comments = (options = {}) => {
|
|
|
1320
1366
|
if (from2 === to2) {
|
|
1321
1367
|
const newRange = Cursor.getRangeFromCursor(cursorConverter3, range.cursor);
|
|
1322
1368
|
if (!newRange || newRange.to - newRange.from === 0) {
|
|
1323
|
-
|
|
1324
|
-
thread: range.id
|
|
1325
|
-
}, {
|
|
1326
|
-
F: __dxlog_file3,
|
|
1327
|
-
L: 274,
|
|
1328
|
-
S: void 0,
|
|
1329
|
-
C: (f, a) => f(...a)
|
|
1330
|
-
});
|
|
1369
|
+
options.onDelete?.(range.id);
|
|
1331
1370
|
}
|
|
1332
1371
|
}
|
|
1333
1372
|
if (from <= range.to) {
|
|
@@ -1377,7 +1416,8 @@ var comments = (options = {}) => {
|
|
|
1377
1416
|
});
|
|
1378
1417
|
}
|
|
1379
1418
|
}
|
|
1380
|
-
})
|
|
1419
|
+
}),
|
|
1420
|
+
options.onUpdate ? trackPastedComments(options.onUpdate) : []
|
|
1381
1421
|
];
|
|
1382
1422
|
};
|
|
1383
1423
|
|
|
@@ -2025,87 +2065,85 @@ var TableWidget = class extends WidgetType5 {
|
|
|
2025
2065
|
};
|
|
2026
2066
|
|
|
2027
2067
|
// packages/ui/react-ui-editor/src/extensions/tasklist.ts
|
|
2028
|
-
import {
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
paddingLeft: "4px",
|
|
2032
|
-
paddingRight: "8px"
|
|
2033
|
-
}
|
|
2034
|
-
});
|
|
2068
|
+
import { syntaxTree as syntaxTree4 } from "@codemirror/language";
|
|
2069
|
+
import { RangeSetBuilder as RangeSetBuilder3 } from "@codemirror/state";
|
|
2070
|
+
import { EditorView as EditorView11, Decoration as Decoration8, WidgetType as WidgetType6, ViewPlugin as ViewPlugin6 } from "@codemirror/view";
|
|
2035
2071
|
var CheckboxWidget = class extends WidgetType6 {
|
|
2036
|
-
constructor(_checked
|
|
2072
|
+
constructor(_checked) {
|
|
2037
2073
|
super();
|
|
2038
2074
|
this._checked = _checked;
|
|
2039
|
-
this._indent = _indent;
|
|
2040
|
-
this._onCheck = _onCheck;
|
|
2041
2075
|
}
|
|
2042
2076
|
eq(other) {
|
|
2043
|
-
return this._checked === other._checked
|
|
2077
|
+
return this._checked === other._checked;
|
|
2044
2078
|
}
|
|
2045
2079
|
toDOM(view) {
|
|
2046
|
-
const
|
|
2047
|
-
wrap.className = "cm-task-item";
|
|
2048
|
-
wrap.setAttribute("aria-hidden", "true");
|
|
2049
|
-
wrap.style.setProperty("margin-left", this._indent * 24 + "px");
|
|
2050
|
-
const input = wrap.appendChild(document.createElement("input"));
|
|
2080
|
+
const input = document.createElement("input");
|
|
2051
2081
|
input.type = "checkbox";
|
|
2052
2082
|
input.checked = this._checked;
|
|
2053
|
-
if (
|
|
2083
|
+
if (view.state.readOnly) {
|
|
2054
2084
|
input.setAttribute("disabled", "true");
|
|
2055
|
-
}
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2085
|
+
} else {
|
|
2086
|
+
input.onmousedown = (event) => {
|
|
2087
|
+
const pos = view.posAtDOM(input);
|
|
2088
|
+
const text = view.state.sliceDoc(pos, pos + 3);
|
|
2089
|
+
if (text === (this._checked ? "[x]" : "[ ]")) {
|
|
2090
|
+
view.dispatch({
|
|
2091
|
+
changes: {
|
|
2092
|
+
from: pos + 1,
|
|
2093
|
+
to: pos + 2,
|
|
2094
|
+
insert: this._checked ? " " : "x"
|
|
2095
|
+
}
|
|
2096
|
+
});
|
|
2097
|
+
event.preventDefault();
|
|
2098
|
+
}
|
|
2060
2099
|
};
|
|
2061
2100
|
}
|
|
2062
|
-
return
|
|
2101
|
+
return input;
|
|
2063
2102
|
}
|
|
2064
2103
|
ignoreEvent() {
|
|
2065
2104
|
return false;
|
|
2066
2105
|
}
|
|
2067
2106
|
};
|
|
2107
|
+
var checkedDeco = Decoration8.replace({
|
|
2108
|
+
widget: new CheckboxWidget(true)
|
|
2109
|
+
});
|
|
2110
|
+
var uncheckedDeco = Decoration8.replace({
|
|
2111
|
+
widget: new CheckboxWidget(false)
|
|
2112
|
+
});
|
|
2068
2113
|
var tasklist = (options = {}) => {
|
|
2069
|
-
|
|
2070
|
-
regexp: /^(\s*)- \[([ xX])\]\s/g,
|
|
2071
|
-
decoration: (match, view, pos) => {
|
|
2072
|
-
const indent = Math.floor(match[1].length / 2);
|
|
2073
|
-
const checked = match[2] === "x" || match[2] === "X";
|
|
2074
|
-
return Decoration8.replace({
|
|
2075
|
-
widget: new CheckboxWidget(checked, indent, view.state.readOnly ? void 0 : (checked2) => {
|
|
2076
|
-
const idx = pos + match[0].indexOf("[") + 1;
|
|
2077
|
-
view.dispatch({
|
|
2078
|
-
changes: {
|
|
2079
|
-
from: idx,
|
|
2080
|
-
to: idx + 1,
|
|
2081
|
-
insert: checked2 ? "x" : " "
|
|
2082
|
-
},
|
|
2083
|
-
// TODO(burdon): Restore cursor position? More useful to move to end of line (can indent).
|
|
2084
|
-
selection: {
|
|
2085
|
-
anchor: idx + 3
|
|
2086
|
-
}
|
|
2087
|
-
});
|
|
2088
|
-
})
|
|
2089
|
-
});
|
|
2090
|
-
}
|
|
2091
|
-
});
|
|
2092
|
-
const tasks = ViewPlugin6.fromClass(class {
|
|
2114
|
+
return ViewPlugin6.fromClass(class {
|
|
2093
2115
|
constructor(view) {
|
|
2094
|
-
this.
|
|
2116
|
+
this.decorations = buildDecorations3(view);
|
|
2095
2117
|
}
|
|
2096
2118
|
update(update2) {
|
|
2097
|
-
|
|
2119
|
+
if (update2.docChanged || update2.viewportChanged || update2.selectionSet) {
|
|
2120
|
+
this.decorations = buildDecorations3(update2.view);
|
|
2121
|
+
}
|
|
2098
2122
|
}
|
|
2099
2123
|
}, {
|
|
2100
|
-
decorations: (
|
|
2124
|
+
decorations: (v) => v.decorations,
|
|
2101
2125
|
provide: (plugin) => EditorView11.atomicRanges.of((view) => {
|
|
2102
|
-
return view.plugin(plugin)?.
|
|
2126
|
+
return view.plugin(plugin)?.decorations || Decoration8.none;
|
|
2103
2127
|
})
|
|
2104
2128
|
});
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
|
|
2108
|
-
|
|
2129
|
+
};
|
|
2130
|
+
var buildDecorations3 = (view) => {
|
|
2131
|
+
const builder = new RangeSetBuilder3();
|
|
2132
|
+
const { state } = view;
|
|
2133
|
+
const cursor = state.selection.main.head;
|
|
2134
|
+
for (const { from, to } of view.visibleRanges) {
|
|
2135
|
+
syntaxTree4(state).iterate({
|
|
2136
|
+
enter: (node) => {
|
|
2137
|
+
if (node.name === "TaskMarker" && (cursor < node.from || cursor > node.to)) {
|
|
2138
|
+
const checked = state.doc.sliceString(node.from + 1, node.to - 1) === "x";
|
|
2139
|
+
builder.add(node.from, node.to, checked ? checkedDeco : uncheckedDeco);
|
|
2140
|
+
}
|
|
2141
|
+
},
|
|
2142
|
+
from,
|
|
2143
|
+
to
|
|
2144
|
+
});
|
|
2145
|
+
}
|
|
2146
|
+
return builder.finish();
|
|
2109
2147
|
};
|
|
2110
2148
|
|
|
2111
2149
|
// packages/ui/react-ui-editor/src/extensions/typewriter.ts
|
|
@@ -2427,7 +2465,7 @@ var EditorModes = [
|
|
|
2427
2465
|
"default",
|
|
2428
2466
|
"vim"
|
|
2429
2467
|
];
|
|
2430
|
-
var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model,
|
|
2468
|
+
var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, autofocus, readonly, selection, comments: comments2, extensions = [], editorMode, theme, slots = defaultSlots }, forwardedRef) => {
|
|
2431
2469
|
const tabsterDOMAttribute = useFocusableGroup({
|
|
2432
2470
|
tabBehavior: "limited"
|
|
2433
2471
|
});
|
|
@@ -2438,12 +2476,12 @@ var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, focus, selection, read
|
|
|
2438
2476
|
view
|
|
2439
2477
|
]);
|
|
2440
2478
|
useEffect(() => {
|
|
2441
|
-
if (
|
|
2442
|
-
view
|
|
2479
|
+
if (autofocus) {
|
|
2480
|
+
view?.focus();
|
|
2443
2481
|
}
|
|
2444
2482
|
}, [
|
|
2445
|
-
|
|
2446
|
-
|
|
2483
|
+
autofocus,
|
|
2484
|
+
view
|
|
2447
2485
|
]);
|
|
2448
2486
|
const { awareness: awareness2, peer } = model;
|
|
2449
2487
|
useEffect(() => {
|
|
@@ -2534,11 +2572,11 @@ var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, focus, selection, read
|
|
|
2534
2572
|
return /* @__PURE__ */ React.createElement("div", {
|
|
2535
2573
|
key: model.id,
|
|
2536
2574
|
role: "none",
|
|
2537
|
-
ref: rootRef,
|
|
2538
2575
|
tabIndex: 0,
|
|
2539
2576
|
onKeyUp: handleKeyUp,
|
|
2540
2577
|
...slots.root,
|
|
2541
|
-
...editorMode !== "vim" && tabsterDOMAttribute
|
|
2578
|
+
...editorMode !== "vim" && tabsterDOMAttribute,
|
|
2579
|
+
ref: rootRef
|
|
2542
2580
|
});
|
|
2543
2581
|
});
|
|
2544
2582
|
var TextEditor = /* @__PURE__ */ forwardRef(({ readonly, placeholder: placeholder3, extensions = [], theme = textTheme, slots, ...props }, forwardedRef) => {
|
|
@@ -2581,7 +2619,7 @@ var MarkdownEditor = /* @__PURE__ */ forwardRef(({ readonly, placeholder: placeh
|
|
|
2581
2619
|
});
|
|
2582
2620
|
var defaultSlots = {
|
|
2583
2621
|
root: {
|
|
2584
|
-
className: mx3("p-2 overflow-y-auto", inputSurface)
|
|
2622
|
+
className: mx3("w-full p-2 overflow-y-auto", inputSurface)
|
|
2585
2623
|
}
|
|
2586
2624
|
};
|
|
2587
2625
|
var defaultTextSlots = {
|
|
@@ -2600,7 +2638,7 @@ import { isNotNullOrUndefined } from "@dxos/util";
|
|
|
2600
2638
|
import { DeferredTask, Event as Event2, sleep } from "@dxos/async";
|
|
2601
2639
|
import { Context as Context2 } from "@dxos/context";
|
|
2602
2640
|
import { invariant as invariant3 } from "@dxos/invariant";
|
|
2603
|
-
import { log as
|
|
2641
|
+
import { log as log2 } from "@dxos/log";
|
|
2604
2642
|
var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/awareness-provider.ts";
|
|
2605
2643
|
var DEBOUNCE_INTERVAL = 100;
|
|
2606
2644
|
var SpaceAwarenessProvider = class {
|
|
@@ -2639,7 +2677,7 @@ var SpaceAwarenessProvider = class {
|
|
|
2639
2677
|
void this._space.postMessage(this._channel, {
|
|
2640
2678
|
kind: "query"
|
|
2641
2679
|
}).catch((err) => {
|
|
2642
|
-
|
|
2680
|
+
log2.debug("failed to query awareness", {
|
|
2643
2681
|
err
|
|
2644
2682
|
}, {
|
|
2645
2683
|
F: __dxlog_file4,
|
|
@@ -2712,7 +2750,7 @@ import * as encoding from "lib0/encoding";
|
|
|
2712
2750
|
import { Observable } from "lib0/observable";
|
|
2713
2751
|
import * as YP from "y-protocols/awareness";
|
|
2714
2752
|
import { invariant as invariant4 } from "@dxos/invariant";
|
|
2715
|
-
import { log as
|
|
2753
|
+
import { log as log3 } from "@dxos/log";
|
|
2716
2754
|
var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/yjs.ts";
|
|
2717
2755
|
var createYjsModel = ({ identity, space, text }) => {
|
|
2718
2756
|
invariant4(text?.doc && text?.content, void 0, {
|
|
@@ -2775,7 +2813,7 @@ var YAwarenessProvider = class extends Observable {
|
|
|
2775
2813
|
return this._awareness;
|
|
2776
2814
|
}
|
|
2777
2815
|
_handleAwarenessUpdate({ added, updated, removed }, origin) {
|
|
2778
|
-
|
|
2816
|
+
log3("awareness update", {
|
|
2779
2817
|
added,
|
|
2780
2818
|
updated,
|
|
2781
2819
|
removed,
|
|
@@ -2793,7 +2831,7 @@ var YAwarenessProvider = class extends Observable {
|
|
|
2793
2831
|
void this._space.postMessage(this._channel, encoding.toUint8Array(encoderAwareness));
|
|
2794
2832
|
}
|
|
2795
2833
|
_handleSpaceMessage({ payload }) {
|
|
2796
|
-
|
|
2834
|
+
log3("space message", payload, {
|
|
2797
2835
|
F: __dxlog_file5,
|
|
2798
2836
|
L: 109,
|
|
2799
2837
|
S: this,
|
|
@@ -2926,7 +2964,6 @@ export {
|
|
|
2926
2964
|
comments,
|
|
2927
2965
|
createAutomergeModel,
|
|
2928
2966
|
createYjsModel,
|
|
2929
|
-
cursorConverter,
|
|
2930
2967
|
defaultMarkdownSlots,
|
|
2931
2968
|
defaultOptions,
|
|
2932
2969
|
defaultSlots,
|