@dxos/react-ui-editor 0.6.12 → 0.6.13-main.548ca8d

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.
Files changed (123) hide show
  1. package/dist/lib/browser/chunk-CIQSMP7K.mjs +148 -0
  2. package/dist/lib/browser/chunk-CIQSMP7K.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +227 -345
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/state/index.mjs +17 -0
  7. package/dist/lib/browser/state/index.mjs.map +7 -0
  8. package/dist/lib/node/chunk-GZWIENFM.cjs +169 -0
  9. package/dist/lib/node/chunk-GZWIENFM.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +5480 -0
  11. package/dist/lib/node/index.cjs.map +7 -0
  12. package/dist/lib/node/meta.json +1 -0
  13. package/dist/lib/node/state/index.cjs +39 -0
  14. package/dist/lib/node/state/index.cjs.map +7 -0
  15. package/dist/lib/node-esm/chunk-GP5RCZ3X.mjs +150 -0
  16. package/dist/lib/node-esm/chunk-GP5RCZ3X.mjs.map +7 -0
  17. package/dist/lib/node-esm/index.mjs +5471 -0
  18. package/dist/lib/node-esm/index.mjs.map +7 -0
  19. package/dist/lib/node-esm/meta.json +1 -0
  20. package/dist/lib/node-esm/state/index.mjs +18 -0
  21. package/dist/lib/node-esm/state/index.mjs.map +7 -0
  22. package/dist/types/src/TextEditor.stories.d.ts +4 -1
  23. package/dist/types/src/TextEditor.stories.d.ts.map +1 -1
  24. package/dist/types/src/defaults.d.ts.map +1 -1
  25. package/dist/types/src/extensions/autocomplete.d.ts +2 -1
  26. package/dist/types/src/extensions/autocomplete.d.ts.map +1 -1
  27. package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +1 -1
  28. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  29. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  30. package/dist/types/src/extensions/awareness/awareness.d.ts +2 -2
  31. package/dist/types/src/extensions/awareness/awareness.d.ts.map +1 -1
  32. package/dist/types/src/extensions/command/state.d.ts +2 -2
  33. package/dist/types/src/extensions/command/state.d.ts.map +1 -1
  34. package/dist/types/src/extensions/comments.d.ts +1 -1
  35. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  36. package/dist/types/src/extensions/debug.d.ts +2 -2
  37. package/dist/types/src/extensions/debug.d.ts.map +1 -1
  38. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  39. package/dist/types/src/extensions/index.d.ts +0 -4
  40. package/dist/types/src/extensions/index.d.ts.map +1 -1
  41. package/dist/types/src/extensions/listener.d.ts +1 -0
  42. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  43. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  44. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +1 -1
  45. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
  46. package/dist/types/src/extensions/markdown/link.d.ts +1 -1
  47. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  48. package/dist/types/src/extensions/markdown/styles.d.ts.map +1 -1
  49. package/dist/types/src/extensions/modes.d.ts +3 -3
  50. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  51. package/dist/types/src/extensions/util/overlap.d.ts +1 -1
  52. package/dist/types/src/extensions/util/overlap.d.ts.map +1 -1
  53. package/dist/types/src/extensions/util/react.d.ts +1 -1
  54. package/dist/types/src/extensions/util/react.d.ts.map +1 -1
  55. package/dist/types/src/hooks/useTextEditor.d.ts +1 -1
  56. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  57. package/dist/types/src/index.d.ts +1 -0
  58. package/dist/types/src/index.d.ts.map +1 -1
  59. package/dist/types/src/{extensions → state}/cursor.d.ts +2 -2
  60. package/dist/types/src/state/cursor.d.ts.map +1 -0
  61. package/dist/types/src/state/doc.d.ts +5 -0
  62. package/dist/types/src/state/doc.d.ts.map +1 -0
  63. package/dist/types/src/state/index.d.ts +6 -0
  64. package/dist/types/src/state/index.d.ts.map +1 -0
  65. package/dist/types/src/{extensions → state}/state.d.ts +2 -2
  66. package/dist/types/src/state/state.d.ts.map +1 -0
  67. package/dist/types/src/state/types.d.ts.map +1 -0
  68. package/dist/types/src/state/util.d.ts +3 -0
  69. package/dist/types/src/state/util.d.ts.map +1 -0
  70. package/dist/types/src/styles/markdown.d.ts +1 -2
  71. package/dist/types/src/styles/markdown.d.ts.map +1 -1
  72. package/dist/types/src/styles/theme.d.ts.map +1 -1
  73. package/dist/types/src/util.d.ts +6 -0
  74. package/dist/types/src/util.d.ts.map +1 -1
  75. package/package.json +59 -38
  76. package/src/TextEditor.stories.tsx +22 -17
  77. package/src/defaults.ts +0 -2
  78. package/src/extensions/annotations.ts +1 -1
  79. package/src/extensions/autocomplete.ts +9 -8
  80. package/src/extensions/automerge/automerge.stories.tsx +1 -1
  81. package/src/extensions/automerge/{automerge.spec.tsx → automerge.test.tsx} +1 -0
  82. package/src/extensions/automerge/automerge.ts +2 -2
  83. package/src/extensions/automerge/cursor.ts +1 -1
  84. package/src/extensions/awareness/awareness.ts +3 -5
  85. package/src/extensions/command/hint.ts +1 -1
  86. package/src/extensions/command/state.ts +3 -4
  87. package/src/extensions/comments.ts +44 -45
  88. package/src/extensions/debug.ts +2 -2
  89. package/src/extensions/folding.tsx +4 -2
  90. package/src/extensions/index.ts +0 -4
  91. package/src/extensions/listener.ts +1 -0
  92. package/src/extensions/markdown/changes.test.ts +1 -3
  93. package/src/extensions/markdown/decorate.ts +49 -6
  94. package/src/extensions/markdown/formatting.test.ts +1 -3
  95. package/src/extensions/markdown/highlight.ts +0 -5
  96. package/src/extensions/markdown/link.ts +3 -2
  97. package/src/extensions/markdown/parser.test.ts +1 -2
  98. package/src/extensions/markdown/styles.ts +10 -0
  99. package/src/extensions/markdown/table.ts +3 -3
  100. package/src/extensions/modes.ts +6 -5
  101. package/src/extensions/util/overlap.ts +1 -1
  102. package/src/extensions/util/react.tsx +5 -1
  103. package/src/hooks/useTextEditor.ts +30 -31
  104. package/src/index.ts +1 -0
  105. package/src/{extensions → state}/cursor.ts +3 -6
  106. package/src/state/doc.ts +10 -0
  107. package/src/state/index.ts +11 -0
  108. package/src/{extensions → state}/state.ts +7 -3
  109. package/src/state/util.ts +13 -0
  110. package/src/styles/markdown.ts +1 -3
  111. package/src/styles/theme.ts +3 -1
  112. package/src/util.ts +10 -0
  113. package/dist/types/src/extensions/automerge/automerge.spec.d.ts +0 -2
  114. package/dist/types/src/extensions/automerge/automerge.spec.d.ts.map +0 -1
  115. package/dist/types/src/extensions/cursor.d.ts.map +0 -1
  116. package/dist/types/src/extensions/doc.d.ts +0 -6
  117. package/dist/types/src/extensions/doc.d.ts.map +0 -1
  118. package/dist/types/src/extensions/state.d.ts.map +0 -1
  119. package/dist/types/src/extensions/types.d.ts.map +0 -1
  120. package/src/extensions/automerge/automerge.test.ts +0 -13
  121. package/src/extensions/doc.ts +0 -17
  122. /package/dist/types/src/{extensions → state}/types.d.ts +0 -0
  123. /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 keymap11 } from "@codemirror/view";
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
 
@@ -50,47 +59,6 @@ import { getSize as getSize2 } from "@dxos/react-ui-theme";
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 extentions = [
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
- extentions.push(
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 extentions;
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, Facet as Facet2, RangeSet } from "@codemirror/state";
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 = Facet2.define({
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: 82
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 { Facet as Facet3, StateEffect as StateEffect2, StateField as StateField3 } from "@codemirror/state";
1113
+ import { StateEffect as StateEffect2, StateField as StateField3 } from "@codemirror/state";
1148
1114
  import { showTooltip } from "@codemirror/view";
1149
- var commandConfig = Facet3.define({
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 { Facet as Facet4, StateEffect as StateEffect3, StateField as StateField4 } from "@codemirror/state";
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: 18,
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: 39,
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: 147,
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 = Facet4.define({
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 ? keymap4.of([
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 ? hoverTooltip((view, pos) => {
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 ? trackPastedComments(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
- // TODO(burdon): Replace with widget.
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-hoverSurface)"
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 __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
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: __dxlog_file9,
2209
+ F: __dxlog_file8,
2263
2210
  L: 93,
2264
2211
  S: void 0,
2265
2212
  C: (f, a) => f(...a)
@@ -2356,9 +2303,10 @@ var folding = (_props = {}) => [
2356
2303
  }),
2357
2304
  foldGutter({
2358
2305
  markerDOM: (open) => {
2359
- return renderRoot(createElement("div", {
2306
+ const el = createElement("div", {
2360
2307
  className: "flex h-full items-center"
2361
- }), /* @__PURE__ */ React2.createElement(Icon, {
2308
+ });
2309
+ return renderRoot(el, /* @__PURE__ */ React2.createElement(Icon, {
2362
2310
  icon: "ph--caret-right--regular",
2363
2311
  classNames: [
2364
2312
  getSize(3),
@@ -3345,7 +3293,7 @@ var getFormatting = (state2) => {
3345
3293
  null
3346
3294
  ];
3347
3295
  let link = false;
3348
- let blockQuote = null;
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 (blockQuote === null) {
3458
- blockQuote = hasQuote;
3459
- } else if (!hasQuote && blockQuote) {
3460
- blockQuote = false;
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: blockQuote ?? false,
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 invariant4 } from "@dxos/invariant";
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 __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/markdown/decorate.ts";
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
- invariant4(level > 0, void 0, {
4369
- F: __dxlog_file10,
4370
- L: 176,
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
- invariant4(listLevels.length, void 0, {
4408
- F: __dxlog_file10,
4409
- L: 198,
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 first = block.from <= node.from;
4513
- const last = block.to >= node.to && /^(\s>)*-->$/.test(state2.doc.sliceString(block.from, block.to));
4514
- deco.add(block.from, block.from, first ? commentBlockLineFirst : last ? commentBlockLineLast : commentBlockLine);
4515
- if (!editing && (first || last)) {
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) => hoverTooltip2((view, pos, side) => {
4665
- const syntax = syntaxTree8(view.state).resolveInner(pos, side);
4666
- let link = null;
4667
- for (let i = 0, node = syntax; !link && node && i < 5; node = node.parent, i++) {
4668
- link = node.name === "Link" ? node : null;
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 __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/mention.ts";
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: __dxlog_file11,
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 = Facet6.define({
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 keymap10 } from "@codemirror/view";
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
- keymap10.of([
4775
+ keymap9.of([
4886
4776
  {
4887
4777
  // Reset.
4888
4778
  key: "alt-meta-'",
@@ -5313,20 +5203,20 @@ var Toolbar = {
5313
5203
  };
5314
5204
 
5315
5205
  // packages/ui/react-ui-editor/src/defaults.ts
5316
- import { EditorView as EditorView18 } from "@codemirror/view";
5206
+ import { EditorView as EditorView17 } from "@codemirror/view";
5317
5207
  import { mx as mx3 } from "@dxos/react-ui-theme";
5318
5208
  var margin = "!mt-[1rem]";
5319
5209
  var editorContent = mx3(margin, "!mli-auto w-full max-w-[min(50rem,100%-2rem)]");
5320
5210
  var editorFullWidth = mx3(margin);
5321
5211
  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 = EditorView18.theme({
5212
+ var editorGutter = EditorView17.theme({
5323
5213
  // Match margin from content.
5324
5214
  ".cm-gutters": {
5325
5215
  marginTop: "16px",
5326
5216
  paddingRight: "1rem"
5327
5217
  }
5328
5218
  });
5329
- var editorMonospace = EditorView18.theme({
5219
+ var editorMonospace = EditorView17.theme({
5330
5220
  ".cm-content": {
5331
5221
  fontFamily: fontMono
5332
5222
  }
@@ -5339,17 +5229,16 @@ var useActionHandler = (view) => {
5339
5229
 
5340
5230
  // packages/ui/react-ui-editor/src/hooks/useTextEditor.ts
5341
5231
  import { EditorState as EditorState2 } from "@codemirror/state";
5342
- import { EditorView as EditorView19 } from "@codemirror/view";
5232
+ import { EditorView as EditorView18 } from "@codemirror/view";
5343
5233
  import { useFocusableGroup } from "@fluentui/react-tabster";
5344
5234
  import { useCallback, useEffect as useEffect3, useMemo as useMemo3, useRef as useRef2, useState as useState4 } from "react";
5345
5235
  import { log as log8 } from "@dxos/log";
5346
- import { getProviderValue, isNotFalsy as isNotFalsy4 } from "@dxos/util";
5347
- var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
5236
+ import { getProviderValue, isNotFalsy as isNotFalsy3 } from "@dxos/util";
5237
+ var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
5348
5238
  var instanceCount = 0;
5349
5239
  var useTextEditor = (props = {}, deps = []) => {
5350
5240
  const { id, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = useMemo3(() => getProviderValue(props), deps ?? []);
5351
5241
  const [instanceId] = useState4(() => `text-editor-${++instanceCount}`);
5352
- const onUpdate = useRef2();
5353
5242
  const [view, setView] = useState4();
5354
5243
  const parentRef = useRef2(null);
5355
5244
  useEffect3(() => {
@@ -5360,7 +5249,7 @@ var useTextEditor = (props = {}, deps = []) => {
5360
5249
  instanceId,
5361
5250
  doc: initialValue?.length ?? 0
5362
5251
  }, {
5363
- F: __dxlog_file13,
5252
+ F: __dxlog_file11,
5364
5253
  L: 76,
5365
5254
  S: void 0,
5366
5255
  C: (f, a) => f(...a)
@@ -5381,44 +5270,36 @@ var useTextEditor = (props = {}, deps = []) => {
5381
5270
  doc: initialValue,
5382
5271
  selection: initialSelection,
5383
5272
  extensions: [
5384
- id && documentId2.of(id),
5385
- // NOTE: Doesn't catch errors in keymap functions.
5386
- EditorView19.exceptionSink.of((err) => {
5273
+ id && documentId.of(id),
5274
+ extensions,
5275
+ // NOTE: This doesn't catch errors in keymap functions.
5276
+ EditorView18.exceptionSink.of((err) => {
5387
5277
  log8.catch(err, void 0, {
5388
- F: __dxlog_file13,
5278
+ F: __dxlog_file11,
5389
5279
  L: 98,
5390
5280
  S: void 0,
5391
5281
  C: (f, a) => f(...a)
5392
5282
  });
5393
- }),
5394
- extensions,
5395
- EditorView19.updateListener.of(() => {
5396
- setTimeout(() => {
5397
- onUpdate.current?.();
5398
- });
5399
5283
  })
5400
- ].filter(isNotFalsy4)
5284
+ ].filter(isNotFalsy3)
5401
5285
  });
5402
- view2 = new EditorView19({
5286
+ view2 = new EditorView18({
5403
5287
  parent: parentRef.current,
5404
- selection: initialSelection,
5405
5288
  state: state2,
5406
- // NOTE: Uncomment to debug/monitor all transactions.
5407
- // https://codemirror.net/docs/ref/#view.EditorView.dispatch
5408
- dispatchTransactions: (trs, view3) => {
5409
- if (debug) {
5410
- logChanges(trs);
5411
- }
5412
- view3.update(trs);
5413
- }
5289
+ scrollTo: scrollTo ? EditorView18.scrollIntoView(scrollTo, {
5290
+ yMargin: 96
5291
+ }) : void 0,
5292
+ dispatchTransactions: debug ? debugDispatcher : void 0
5414
5293
  });
5415
- if (!initialValue && moveToEndOfLine) {
5294
+ if (moveToEndOfLine && !initialSelection) {
5416
5295
  const { to } = view2.state.doc.lineAt(0);
5417
- view2.dispatch({
5418
- selection: {
5419
- anchor: to
5420
- }
5421
- });
5296
+ if (to) {
5297
+ view2.dispatch({
5298
+ selection: {
5299
+ anchor: to
5300
+ }
5301
+ });
5302
+ }
5422
5303
  }
5423
5304
  setView(view2);
5424
5305
  }
@@ -5426,8 +5307,8 @@ var useTextEditor = (props = {}, deps = []) => {
5426
5307
  log8("destroy", {
5427
5308
  id
5428
5309
  }, {
5429
- F: __dxlog_file13,
5430
- L: 134,
5310
+ F: __dxlog_file11,
5311
+ L: 135,
5431
5312
  S: void 0,
5432
5313
  C: (f, a) => f(...a)
5433
5314
  });
@@ -5436,21 +5317,20 @@ var useTextEditor = (props = {}, deps = []) => {
5436
5317
  }, deps);
5437
5318
  useEffect3(() => {
5438
5319
  if (view) {
5439
- onUpdate.current = () => {
5440
- onUpdate.current = void 0;
5441
- view.dispatch(createEditorStateTransaction({
5320
+ if (view.state.facet(editorInputMode).noTabster) {
5321
+ parentRef.current?.removeAttribute("data-tabster");
5322
+ }
5323
+ if (scrollTo || selection) {
5324
+ view.dispatch(createEditorStateTransaction(view.state, {
5442
5325
  scrollTo,
5443
5326
  selection
5444
5327
  }));
5445
- };
5446
- if (view.state.facet(editorInputMode).noTabster) {
5447
- parentRef.current?.removeAttribute("data-tabster");
5448
5328
  }
5449
5329
  }
5450
5330
  }, [
5451
5331
  view,
5452
- selection,
5453
- scrollTo
5332
+ scrollTo,
5333
+ selection
5454
5334
  ]);
5455
5335
  useEffect3(() => {
5456
5336
  if (view && autoFocus) {
@@ -5521,11 +5401,12 @@ export {
5521
5401
  createExternalCommentSync,
5522
5402
  createMarkdownExtensions,
5523
5403
  createThemeExtensions,
5404
+ debugDispatcher,
5524
5405
  debugNodeLogger,
5525
5406
  debugTree,
5526
5407
  decorateMarkdown,
5527
5408
  defaultOptions,
5528
- documentId2 as documentId,
5409
+ documentId,
5529
5410
  dropFile,
5530
5411
  editorContent,
5531
5412
  editorFullWidth,
@@ -5541,7 +5422,7 @@ export {
5541
5422
  image,
5542
5423
  imageUpload,
5543
5424
  insertTable,
5544
- keymap11 as keymap,
5425
+ keymap10 as keymap,
5545
5426
  linkTooltip,
5546
5427
  listener,
5547
5428
  localStorageStateStoreAdapter,
@@ -5564,6 +5445,7 @@ export {
5564
5445
  setHeading,
5565
5446
  setSelection,
5566
5447
  setStyle,
5448
+ singleValueFacet,
5567
5449
  state,
5568
5450
  table,
5569
5451
  tags2 as tags,