@dxos/ui-editor 0.8.4-main.422d1c7879 → 0.8.4-main.51f1e5ca51

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 (117) hide show
  1. package/dist/lib/browser/index.mjs +503 -468
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/browser/types/index.mjs +26 -6
  5. package/dist/lib/browser/types/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/index.mjs +503 -467
  7. package/dist/lib/node-esm/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/meta.json +1 -1
  9. package/dist/lib/node-esm/types/index.mjs +27 -6
  10. package/dist/lib/node-esm/types/index.mjs.map +4 -4
  11. package/dist/types/src/defaults.d.ts.map +1 -1
  12. package/dist/types/src/extensions/annotations.d.ts.map +1 -1
  13. package/dist/types/src/extensions/auto-scroll.d.ts.map +1 -1
  14. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +1 -1
  15. package/dist/types/src/extensions/autocomplete/match.d.ts.map +1 -1
  16. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +1 -1
  17. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +1 -1
  18. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  19. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  20. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
  21. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  22. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  23. package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +1 -1
  24. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
  25. package/dist/types/src/extensions/awareness/awareness.d.ts.map +1 -1
  26. package/dist/types/src/extensions/blast.d.ts.map +1 -1
  27. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  28. package/dist/types/src/extensions/debug.d.ts.map +1 -1
  29. package/dist/types/src/extensions/dnd.d.ts.map +1 -1
  30. package/dist/types/src/extensions/factories.d.ts +2 -1
  31. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  32. package/dist/types/src/extensions/factories.test.d.ts +2 -0
  33. package/dist/types/src/extensions/factories.test.d.ts.map +1 -0
  34. package/dist/types/src/extensions/focus.d.ts +1 -1
  35. package/dist/types/src/extensions/index.d.ts +1 -1
  36. package/dist/types/src/extensions/index.d.ts.map +1 -1
  37. package/dist/types/src/extensions/json.d.ts.map +1 -1
  38. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  39. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  40. package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
  41. package/dist/types/src/extensions/markdown/debug.d.ts.map +1 -1
  42. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  43. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  44. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
  45. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
  46. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  47. package/dist/types/src/extensions/markdown/table.d.ts.map +1 -1
  48. package/dist/types/src/extensions/mention.d.ts.map +1 -1
  49. package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -1
  50. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
  51. package/dist/types/src/extensions/outliner/selection.d.ts.map +1 -1
  52. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
  53. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  54. package/dist/types/src/extensions/replacer.d.ts.map +1 -1
  55. package/dist/types/src/extensions/scroller.d.ts.map +1 -1
  56. package/dist/types/src/extensions/selection.d.ts.map +1 -1
  57. package/dist/types/src/extensions/snippets.d.ts +10 -0
  58. package/dist/types/src/extensions/snippets.d.ts.map +1 -0
  59. package/dist/types/src/extensions/submit.d.ts.map +1 -1
  60. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +1 -1
  61. package/dist/types/src/extensions/tags/fader.d.ts.map +1 -1
  62. package/dist/types/src/extensions/tags/index.d.ts +3 -1
  63. package/dist/types/src/extensions/tags/index.d.ts.map +1 -1
  64. package/dist/types/src/extensions/tags/typewriter.d.ts +43 -0
  65. package/dist/types/src/extensions/tags/typewriter.d.ts.map +1 -0
  66. package/dist/types/src/extensions/tags/typewriter.test.d.ts +2 -0
  67. package/dist/types/src/extensions/tags/typewriter.test.d.ts.map +1 -0
  68. package/dist/types/src/extensions/tags/xml-block-decoration.d.ts +31 -0
  69. package/dist/types/src/extensions/tags/xml-block-decoration.d.ts.map +1 -0
  70. package/dist/types/src/extensions/tags/xml-formatting.d.ts +24 -0
  71. package/dist/types/src/extensions/tags/xml-formatting.d.ts.map +1 -0
  72. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -1
  73. package/dist/types/src/extensions/tags/xml-util.d.ts.map +1 -1
  74. package/dist/types/src/index.d.ts +0 -1
  75. package/dist/types/src/index.d.ts.map +1 -1
  76. package/dist/types/src/styles/theme.d.ts.map +1 -1
  77. package/dist/types/src/types/types.d.ts +2 -2
  78. package/dist/types/src/types/types.d.ts.map +1 -1
  79. package/dist/types/src/util/cursor.d.ts.map +1 -1
  80. package/dist/types/src/util/debug.d.ts.map +1 -1
  81. package/dist/types/src/util/decorations.d.ts.map +1 -1
  82. package/dist/types/src/util/dom.d.ts.map +1 -1
  83. package/dist/types/src/util/facet.d.ts.map +1 -1
  84. package/dist/types/src/util/util.d.ts.map +1 -1
  85. package/dist/types/tsconfig.tsbuildinfo +1 -1
  86. package/package.json +27 -27
  87. package/src/defaults.ts +5 -2
  88. package/src/extensions/automerge/automerge.test.tsx +28 -8
  89. package/src/extensions/factories.test.ts +88 -0
  90. package/src/extensions/factories.ts +20 -2
  91. package/src/extensions/index.ts +1 -1
  92. package/src/extensions/snippets.ts +67 -0
  93. package/src/extensions/tags/index.ts +3 -1
  94. package/src/extensions/tags/testing/text.md +36 -0
  95. package/src/extensions/tags/testing/text.txt +35 -0
  96. package/src/extensions/tags/{wire.test.ts → typewriter.test.ts} +2 -2
  97. package/src/extensions/tags/typewriter.ts +594 -0
  98. package/src/extensions/tags/xml-block-decoration.ts +123 -0
  99. package/src/extensions/tags/xml-formatting.ts +125 -0
  100. package/src/extensions/tags/xml-tags.ts +0 -1
  101. package/src/extensions/tags/xml-util.test.ts +90 -3
  102. package/src/extensions/tags/xml-util.ts +62 -5
  103. package/src/index.ts +0 -1
  104. package/src/styles/theme.ts +9 -3
  105. package/src/typings.d.ts +8 -0
  106. package/dist/lib/browser/chunk-D724USEC.mjs +0 -34
  107. package/dist/lib/browser/chunk-D724USEC.mjs.map +0 -7
  108. package/dist/lib/node-esm/chunk-JRVJWKQF.mjs +0 -36
  109. package/dist/lib/node-esm/chunk-JRVJWKQF.mjs.map +0 -7
  110. package/dist/types/src/extensions/tags/wire.d.ts +0 -23
  111. package/dist/types/src/extensions/tags/wire.d.ts.map +0 -1
  112. package/dist/types/src/extensions/tags/wire.test.d.ts +0 -2
  113. package/dist/types/src/extensions/tags/wire.test.d.ts.map +0 -1
  114. package/dist/types/src/extensions/typewriter.d.ts +0 -10
  115. package/dist/types/src/extensions/typewriter.d.ts.map +0 -1
  116. package/src/extensions/tags/wire.ts +0 -459
  117. package/src/extensions/typewriter.ts +0 -68
@@ -1,13 +1,6 @@
1
- import {
2
- EditorInputMode,
3
- EditorInputModes,
4
- EditorViewMode,
5
- EditorViewModes
6
- } from "./chunk-D724USEC.mjs";
7
-
8
1
  // src/index.ts
9
2
  import { EditorState as EditorState4 } from "@codemirror/state";
10
- import { EditorView as EditorView32, keymap as keymap15 } from "@codemirror/view";
3
+ import { EditorView as EditorView33, keymap as keymap15 } from "@codemirror/view";
11
4
  import { tags as tags2 } from "@lezer/highlight";
12
5
  import { TextKind } from "@dxos/protocols/proto/dxos/echo/model/text";
13
6
 
@@ -23,8 +16,11 @@ var documentSlots = {
23
16
  * NOTE: Max width - 4rem = 2rem left/right margin (or 2rem gutter plus 1rem left/right margin).
24
17
  */
25
18
  className: mx(
26
- // NOTE: Container for widget sizing (must have `max-w-[100cqi]`).
27
- "dx-size-container",
19
+ // Inline-size container for widget sizing (children use `max-w-[100cqi]`).
20
+ // NOTE: Use inline-size, not full size containment — `container-type: size` on the
21
+ // editor content breaks CodeMirror's viewport measurement, leaving blank gaps during
22
+ // scroll until a click forces a re-measure.
23
+ "dx-inline-size-container",
28
24
  // Wider margin for web (vs. mobile).
29
25
  "pointer-fine:max-w-[min(50rem,100%-4rem)] pointer-coarse:max-w-[min(50rem,100%-2rem)]",
30
26
  "mx-auto! w-full"
@@ -275,12 +271,7 @@ var wrapWithCatch = (fn, label) => {
275
271
  } catch (err) {
276
272
  log.catch(err, {
277
273
  label
278
- }, {
279
- F: __dxlog_file,
280
- L: 20,
281
- S: void 0,
282
- C: (f, a) => f(...a)
283
- });
274
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 13, S: void 0 });
284
275
  }
285
276
  };
286
277
  };
@@ -306,12 +297,7 @@ var logChanges = (trs) => {
306
297
  if (changes.length) {
307
298
  log("changes", {
308
299
  changes
309
- }, {
310
- F: __dxlog_file,
311
- L: 54,
312
- S: void 0,
313
- C: (f, a) => f(...a)
314
- });
300
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 44, S: void 0 });
315
301
  }
316
302
  };
317
303
 
@@ -602,12 +588,7 @@ var scroller = ({ overScroll = 0 } = {}) => {
602
588
  }
603
589
  }
604
590
  } catch (err) {
605
- log2.catch(err, void 0, {
606
- F: __dxlog_file2,
607
- L: 146,
608
- S: void 0,
609
- C: (f, a) => f(...a)
610
- });
591
+ log2.catch(err, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 91, S: void 0 });
611
592
  }
612
593
  });
613
594
  }),
@@ -873,12 +854,7 @@ var cursorConverter = (accessor) => ({
873
854
  try {
874
855
  return toCursor(accessor, pos, assoc);
875
856
  } catch (err) {
876
- log3.catch(err, void 0, {
877
- F: __dxlog_file3,
878
- L: 15,
879
- S: void 0,
880
- C: (f, a) => f(...a)
881
- });
857
+ log3.catch(err, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 11, S: void 0 });
882
858
  return "";
883
859
  }
884
860
  },
@@ -886,12 +862,7 @@ var cursorConverter = (accessor) => ({
886
862
  try {
887
863
  return fromCursor(accessor, cursor);
888
864
  } catch (err) {
889
- log3.catch(err, void 0, {
890
- F: __dxlog_file3,
891
- L: 24,
892
- S: void 0,
893
- C: (f, a) => f(...a)
894
- });
865
+ log3.catch(err, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 19, S: void 0 });
895
866
  return 0;
896
867
  }
897
868
  }
@@ -1076,12 +1047,7 @@ var Syncer = class {
1076
1047
  this._pending = false;
1077
1048
  }
1078
1049
  onEditorChange(view) {
1079
- log4("onEditorChange", void 0, {
1080
- F: __dxlog_file4,
1081
- L: 45,
1082
- S: this,
1083
- C: (f, a) => f(...a)
1084
- });
1050
+ log4("onEditorChange", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 35, S: this });
1085
1051
  const transactions = view.state.field(this._state).unreconciledTransactions.filter((tx) => !isReconcile(tx));
1086
1052
  const newHeads = updateAutomerge(this._state, this._handle, transactions, view.state);
1087
1053
  if (newHeads) {
@@ -1092,12 +1058,7 @@ var Syncer = class {
1092
1058
  }
1093
1059
  }
1094
1060
  onAutomergeChange(view) {
1095
- log4("onAutomergeChange", void 0, {
1096
- F: __dxlog_file4,
1097
- L: 60,
1098
- S: this,
1099
- C: (f, a) => f(...a)
1100
- });
1061
+ log4("onAutomergeChange", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 47, S: this });
1101
1062
  const oldHeads = getLastHeads(view.state, this._state);
1102
1063
  const newHeads = A2.getHeads(this._handle.doc());
1103
1064
  const diff = A2.equals(oldHeads, newHeads) ? [] : A2.diff(this._handle.doc(), oldHeads, newHeads);
@@ -1220,10 +1181,7 @@ var awareness = (provider = dummyProvider) => {
1220
1181
  ];
1221
1182
  };
1222
1183
  var RemoteSelectionsDecorator = class {
1223
- _ctx = new Context(void 0, {
1224
- F: __dxlog_file5,
1225
- L: 80
1226
- });
1184
+ _ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 33 });
1227
1185
  _cursorConverter;
1228
1186
  _provider;
1229
1187
  _lastAnchor;
@@ -1454,10 +1412,7 @@ var SpaceAwarenessProvider = class {
1454
1412
  this._info = info;
1455
1413
  }
1456
1414
  open() {
1457
- this._ctx = new Context2(void 0, {
1458
- F: __dxlog_file6,
1459
- L: 57
1460
- });
1415
+ this._ctx = new Context2(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 28 });
1461
1416
  this._postTask = new DeferredTask(this._ctx, async () => {
1462
1417
  if (this._localState) {
1463
1418
  await this._messenger.postMessage(this._channel, {
@@ -1484,12 +1439,7 @@ var SpaceAwarenessProvider = class {
1484
1439
  }).catch((err) => {
1485
1440
  log5.debug("failed to query awareness", {
1486
1441
  err
1487
- }, {
1488
- F: __dxlog_file6,
1489
- L: 91,
1490
- S: this,
1491
- C: (f, a) => f(...a)
1492
- });
1442
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 57, S: this });
1493
1443
  });
1494
1444
  }
1495
1445
  close() {
@@ -1501,15 +1451,7 @@ var SpaceAwarenessProvider = class {
1501
1451
  return Array.from(this._remoteStates.values());
1502
1452
  }
1503
1453
  update(position) {
1504
- invariant(this._postTask, void 0, {
1505
- F: __dxlog_file6,
1506
- L: 106,
1507
- S: this,
1508
- A: [
1509
- "this._postTask",
1510
- ""
1511
- ]
1512
- });
1454
+ invariant(this._postTask, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 71, S: this, A: ["this._postTask", ""] });
1513
1455
  this._localState = {
1514
1456
  peerId: this._peerId,
1515
1457
  position,
@@ -1518,27 +1460,11 @@ var SpaceAwarenessProvider = class {
1518
1460
  this._postTask.schedule();
1519
1461
  }
1520
1462
  _handleQueryMessage() {
1521
- invariant(this._postTask, void 0, {
1522
- F: __dxlog_file6,
1523
- L: 117,
1524
- S: this,
1525
- A: [
1526
- "this._postTask",
1527
- ""
1528
- ]
1529
- });
1463
+ invariant(this._postTask, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 80, S: this, A: ["this._postTask", ""] });
1530
1464
  this._postTask.schedule();
1531
1465
  }
1532
1466
  _handlePostMessage(message) {
1533
- invariant(message.kind === "post", void 0, {
1534
- F: __dxlog_file6,
1535
- L: 122,
1536
- S: this,
1537
- A: [
1538
- "message.kind === 'post'",
1539
- ""
1540
- ]
1541
- });
1467
+ invariant(message.kind === "post", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 84, S: this, A: ["message.kind === 'post'", ""] });
1542
1468
  this._remoteStates.set(message.state.peerId, message.state);
1543
1469
  this.remoteStateChange.emit();
1544
1470
  }
@@ -1667,15 +1593,7 @@ var Blaster = class {
1667
1593
  return this._node;
1668
1594
  }
1669
1595
  initialize() {
1670
- invariant2(!this._canvas && !this._ctx, void 0, {
1671
- F: __dxlog_file7,
1672
- L: 142,
1673
- S: this,
1674
- A: [
1675
- "!this._canvas && !this._ctx",
1676
- ""
1677
- ]
1678
- });
1596
+ invariant2(!this._canvas && !this._ctx, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 134, S: this, A: ["!this._canvas && !this._ctx", ""] });
1679
1597
  this._canvas = document.createElement("canvas");
1680
1598
  this._canvas.id = "code-blast-canvas";
1681
1599
  this._canvas.style.position = "absolute";
@@ -1704,15 +1622,7 @@ var Blaster = class {
1704
1622
  }
1705
1623
  }
1706
1624
  start() {
1707
- invariant2(this._canvas && this._ctx, void 0, {
1708
- F: __dxlog_file7,
1709
- L: 181,
1710
- S: this,
1711
- A: [
1712
- "this._canvas && this._ctx",
1713
- ""
1714
- ]
1715
- });
1625
+ invariant2(this._canvas && this._ctx, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 166, S: this, A: ["this._canvas && this._ctx", ""] });
1716
1626
  this._running = true;
1717
1627
  this.loop();
1718
1628
  }
@@ -1962,12 +1872,7 @@ var bookmarks = () => {
1962
1872
  key: "Mod-ArrowUp",
1963
1873
  run: (view) => {
1964
1874
  const bookmarks2 = view.state.field(bookmarksField);
1965
- log6("up", bookmarks2, {
1966
- F: __dxlog_file8,
1967
- L: 29,
1968
- S: void 0,
1969
- C: (f, a) => f(...a)
1970
- });
1875
+ log6("up", bookmarks2, { "~LogMeta": "~LogMeta", F: __dxlog_file8, L: 18, S: void 0 });
1971
1876
  return true;
1972
1877
  }
1973
1878
  },
@@ -1975,12 +1880,7 @@ var bookmarks = () => {
1975
1880
  key: "Mod-ArrowDown",
1976
1881
  run: (view) => {
1977
1882
  const bookmarks2 = view.state.field(bookmarksField);
1978
- log6("down", bookmarks2, {
1979
- F: __dxlog_file8,
1980
- L: 37,
1981
- S: void 0,
1982
- C: (f, a) => f(...a)
1983
- });
1883
+ log6("down", bookmarks2, { "~LogMeta": "~LogMeta", F: __dxlog_file8, L: 26, S: void 0 });
1984
1884
  return true;
1985
1885
  }
1986
1886
  }
@@ -2045,28 +1945,12 @@ var createEditorStateTransaction = ({ scrollTo, selection }) => {
2045
1945
  };
2046
1946
  var createEditorStateStore = (keyPrefix) => ({
2047
1947
  getState: (id) => {
2048
- invariant3(id, void 0, {
2049
- F: __dxlog_file9,
2050
- L: 47,
2051
- S: void 0,
2052
- A: [
2053
- "id",
2054
- ""
2055
- ]
2056
- });
1948
+ invariant3(id, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 26, S: void 0, A: ["id", ""] });
2057
1949
  const state = localStorage.getItem(`${keyPrefix}/${id}`);
2058
1950
  return state ? JSON.parse(state) : void 0;
2059
1951
  },
2060
1952
  setState: (id, state) => {
2061
- invariant3(id, void 0, {
2062
- F: __dxlog_file9,
2063
- L: 53,
2064
- S: void 0,
2065
- A: [
2066
- "id",
2067
- ""
2068
- ]
2069
- });
1953
+ invariant3(id, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file9, L: 31, S: void 0, A: ["id", ""] });
2070
1954
  localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state));
2071
1955
  }
2072
1956
  });
@@ -2188,12 +2072,7 @@ var commentsDecorations = EditorView11.decorations.compute([
2188
2072
  const decorations2 = sortBy(comments2 ?? [], (range) => range.range.from)?.flatMap((comment) => {
2189
2073
  const range = comment.range;
2190
2074
  if (!range) {
2191
- log7.warn("Invalid range:", range, {
2192
- F: __dxlog_file10,
2193
- L: 139,
2194
- S: void 0,
2195
- C: (f, a) => f(...a)
2196
- });
2075
+ log7.warn("Invalid range:", range, { "~LogMeta": "~LogMeta", F: __dxlog_file10, L: 93, S: void 0 });
2197
2076
  return void 0;
2198
2077
  } else if (range.from === range.to) {
2199
2078
  return void 0;
@@ -2659,9 +2538,15 @@ var baseTheme = EditorView13.baseTheme({
2659
2538
  overflowAnchor: "auto"
2660
2539
  },
2661
2540
  ".cm-scroller::-webkit-scrollbar": {
2662
- width: "8px"
2541
+ width: "var(--scrollbar-size,8px)",
2542
+ height: "var(--scrollbar-size,8px)"
2543
+ },
2544
+ ".cm-scroller::-webkit-scrollbar-corner": {
2545
+ background: "transparent"
2546
+ },
2547
+ ".cm-scroller::-webkit-scrollbar-track": {
2548
+ background: "transparent"
2663
2549
  },
2664
- ".cm-scroller::-webkit-scrollbar-track": {},
2665
2550
  ".cm-scroller::-webkit-scrollbar-thumb": {
2666
2551
  background: "transparent",
2667
2552
  transition: "background 0.15s"
@@ -2698,7 +2583,7 @@ var baseTheme = EditorView13.baseTheme({
2698
2583
  * Height is set to match the corresponding line (which may have wrapped).
2699
2584
  */
2700
2585
  ".cm-gutterElement": {
2701
- lineHeight: 1.5,
2586
+ lineHeight: "24px",
2702
2587
  fontSize: "12px"
2703
2588
  },
2704
2589
  /**
@@ -3013,12 +2898,7 @@ var createBasicExtensions = (propsProp) => {
3013
2898
  return [
3014
2899
  // NOTE: Doesn't catch errors in keymap functions.
3015
2900
  EditorView16.exceptionSink.of((err) => {
3016
- log8.catch(err, void 0, {
3017
- F: __dxlog_file11,
3018
- L: 130,
3019
- S: void 0,
3020
- C: (f, a) => f(...a)
3021
- });
2901
+ log8.catch(err, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file11, L: 79, S: void 0 });
3022
2902
  }),
3023
2903
  props.allowMultipleSelections && EditorState.allowMultipleSelections.of(true),
3024
2904
  props.bracketMatching && bracketMatching(),
@@ -3038,6 +2918,13 @@ var createBasicExtensions = (propsProp) => {
3038
2918
  props.lineWrapping && EditorView16.lineWrapping,
3039
2919
  props.placeholder && placeholder2(props.placeholder),
3040
2920
  props.readOnly !== void 0 && EditorState.readOnly.of(props.readOnly),
2921
+ // `EditorState.readOnly` is advisory — CodeMirror doesn't auto-reject doc-changing
2922
+ // transactions. Some extensions (e.g. `@codemirror/lang-markdown`'s Enter handler that
2923
+ // continues a list) dispatch programmatic edits regardless. Drop user-initiated edits
2924
+ // (`input` / `delete` keymap dispatches plus `undo` / `redo` from the history extension)
2925
+ // but pass programmatic dispatches — streaming `MarkdownStream` and similar consumers
2926
+ // depend on being able to populate the doc themselves.
2927
+ props.readOnly && EditorState.transactionFilter.of((tr) => tr.docChanged && (tr.isUserEvent("input") || tr.isUserEvent("delete") || tr.isUserEvent("undo") || tr.isUserEvent("redo")) ? [] : tr),
3041
2928
  props.scrollPastEnd && scrollPastEnd(),
3042
2929
  props.tabbable && tabbable,
3043
2930
  props.tabSize && EditorState.tabSize.of(props.tabSize),
@@ -3080,7 +2967,7 @@ var defaultStyles = {
3080
2967
  dark: vscodeDarkStyle,
3081
2968
  light: vscodeLightStyle
3082
2969
  };
3083
- var createThemeExtensions = ({ monospace, themeMode, slots: slotsProp, syntaxHighlighting: syntaxHighlightingProp } = {}) => {
2970
+ var createThemeExtensions = ({ monospace, scrollbarThin, slots: slotsProp, syntaxHighlighting: syntaxHighlightingProp, themeMode } = {}) => {
3084
2971
  const slots = defaultsDeep2({}, slotsProp, defaultThemeSlots);
3085
2972
  return [
3086
2973
  baseTheme,
@@ -3095,11 +2982,14 @@ var createThemeExtensions = ({ monospace, themeMode, slots: slotsProp, syntaxHig
3095
2982
  slots.content?.className && EditorView16.contentAttributes.of({
3096
2983
  class: slots.content.className
3097
2984
  }),
3098
- slots.scroller?.className && ViewPlugin12.fromClass(class {
2985
+ (slots.scroller?.className || scrollbarThin) && ViewPlugin12.fromClass(class {
3099
2986
  constructor(view) {
3100
2987
  if (slots.scroller?.className) {
3101
2988
  view.scrollDOM.classList.add(...slots.scroller.className.split(/\s+/));
3102
2989
  }
2990
+ if (scrollbarThin) {
2991
+ view.scrollDOM.style.setProperty("--scrollbar-size", "4px");
2992
+ }
3103
2993
  }
3104
2994
  })
3105
2995
  ].filter(isTruthy2);
@@ -5356,15 +5246,7 @@ var buildDecorations2 = (view, options, focus2) => {
5356
5246
  const { state } = view;
5357
5247
  const headerLevels = [];
5358
5248
  const getHeaderLevels = (node, level) => {
5359
- invariant4(level > 0, void 0, {
5360
- F: __dxlog_file12,
5361
- L: 177,
5362
- S: void 0,
5363
- A: [
5364
- "level > 0",
5365
- ""
5366
- ]
5367
- });
5249
+ invariant4(level > 0, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file12, L: 160, S: void 0, A: ["level > 0", ""] });
5368
5250
  if (level > headerLevels.length) {
5369
5251
  const len = headerLevels.length;
5370
5252
  headerLevels.length = level;
@@ -5395,15 +5277,7 @@ var buildDecorations2 = (view, options, focus2) => {
5395
5277
  listLevels.pop();
5396
5278
  };
5397
5279
  const getCurrentListLevel = () => {
5398
- invariant4(listLevels.length, void 0, {
5399
- F: __dxlog_file12,
5400
- L: 199,
5401
- S: void 0,
5402
- A: [
5403
- "listLevels.length",
5404
- ""
5405
- ]
5406
- });
5280
+ invariant4(listLevels.length, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file12, L: 192, S: void 0, A: ["listLevels.length", ""] });
5407
5281
  return listLevels[listLevels.length - 1];
5408
5282
  };
5409
5283
  const enterNode = (node) => {
@@ -5825,12 +5699,7 @@ var mention = ({ debug, onSearch }) => {
5825
5699
  (context) => {
5826
5700
  log9.info("completion context", {
5827
5701
  context
5828
- }, {
5829
- F: __dxlog_file13,
5830
- L: 27,
5831
- S: void 0,
5832
- C: (f, a) => f(...a)
5833
- });
5702
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file13, L: 18, S: void 0 });
5834
5703
  const match = context.matchBefore(/@(\w+)?/);
5835
5704
  if (!match || match.from === match.to && !context.explicit) {
5836
5705
  return null;
@@ -6063,15 +5932,7 @@ var outlinerTree = (_options = {}) => {
6063
5932
  break;
6064
5933
  }
6065
5934
  case "BulletList": {
6066
- invariant5(current, void 0, {
6067
- F: __dxlog_file14,
6068
- L: 219,
6069
- S: void 0,
6070
- A: [
6071
- "current",
6072
- ""
6073
- ]
6074
- });
5935
+ invariant5(current, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file14, L: 169, S: void 0, A: ["current", ""] });
6075
5936
  parent = current;
6076
5937
  if (current) {
6077
5938
  current.lineRange.to = current.node.from;
@@ -6080,15 +5941,7 @@ var outlinerTree = (_options = {}) => {
6080
5941
  break;
6081
5942
  }
6082
5943
  case "ListItem": {
6083
- invariant5(parent, void 0, {
6084
- F: __dxlog_file14,
6085
- L: 228,
6086
- S: void 0,
6087
- A: [
6088
- "parent",
6089
- ""
6090
- ]
6091
- });
5944
+ invariant5(parent, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file14, L: 179, S: void 0, A: ["parent", ""] });
6092
5945
  const nextSibling = node.node.nextSibling ?? node.node.parent?.nextSibling;
6093
5946
  const docRange = {
6094
5947
  from: state.doc.lineAt(node.from).from,
@@ -6122,42 +5975,18 @@ var outlinerTree = (_options = {}) => {
6122
5975
  break;
6123
5976
  }
6124
5977
  case "ListMark": {
6125
- invariant5(current, void 0, {
6126
- F: __dxlog_file14,
6127
- L: 272,
6128
- S: void 0,
6129
- A: [
6130
- "current",
6131
- ""
6132
- ]
6133
- });
5978
+ invariant5(current, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file14, L: 219, S: void 0, A: ["current", ""] });
6134
5979
  current.type = "bullet";
6135
5980
  current.contentRange.from = node.from + "- ".length;
6136
5981
  break;
6137
5982
  }
6138
5983
  case "Task": {
6139
- invariant5(current, void 0, {
6140
- F: __dxlog_file14,
6141
- L: 278,
6142
- S: void 0,
6143
- A: [
6144
- "current",
6145
- ""
6146
- ]
6147
- });
5984
+ invariant5(current, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file14, L: 226, S: void 0, A: ["current", ""] });
6148
5985
  current.type = "task";
6149
5986
  break;
6150
5987
  }
6151
5988
  case "TaskMarker": {
6152
- invariant5(current, void 0, {
6153
- F: __dxlog_file14,
6154
- L: 283,
6155
- S: void 0,
6156
- A: [
6157
- "current",
6158
- ""
6159
- ]
6160
- });
5989
+ invariant5(current, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file14, L: 232, S: void 0, A: ["current", ""] });
6161
5990
  current.contentRange.from = node.from + "[ ] ".length;
6162
5991
  break;
6163
5992
  }
@@ -6165,29 +5994,13 @@ var outlinerTree = (_options = {}) => {
6165
5994
  },
6166
5995
  leave: (node) => {
6167
5996
  if (node.name === "BulletList") {
6168
- invariant5(parent, void 0, {
6169
- F: __dxlog_file14,
6170
- L: 291,
6171
- S: void 0,
6172
- A: [
6173
- "parent",
6174
- ""
6175
- ]
6176
- });
5997
+ invariant5(parent, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file14, L: 240, S: void 0, A: ["parent", ""] });
6177
5998
  prevSiblings[level--] = void 0;
6178
5999
  parent = parent.parent;
6179
6000
  }
6180
6001
  }
6181
6002
  });
6182
- invariant5(tree, void 0, {
6183
- F: __dxlog_file14,
6184
- L: 298,
6185
- S: void 0,
6186
- A: [
6187
- "tree",
6188
- ""
6189
- ]
6190
- });
6003
+ invariant5(tree, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file14, L: 246, S: void 0, A: ["tree", ""] });
6191
6004
  return tree;
6192
6005
  };
6193
6006
  return [
@@ -6629,35 +6442,20 @@ var editor = () => [
6629
6442
  text: insert.toString(),
6630
6443
  length: insert.length
6631
6444
  }
6632
- }, {
6633
- F: __dxlog_file15,
6634
- L: 164,
6635
- S: void 0,
6636
- C: (f, a) => f(...a)
6637
- });
6445
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file15, L: 174, S: void 0 });
6638
6446
  }
6639
6447
  });
6640
6448
  if (changes.length > 0) {
6641
6449
  log10("modified,", {
6642
6450
  changes
6643
- }, {
6644
- F: __dxlog_file15,
6645
- L: 175,
6646
- S: void 0,
6647
- C: (f, a) => f(...a)
6648
- });
6451
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file15, L: 196, S: void 0 });
6649
6452
  return [
6650
6453
  {
6651
6454
  changes
6652
6455
  }
6653
6456
  ];
6654
6457
  } else if (cancel) {
6655
- log10("cancel", void 0, {
6656
- F: __dxlog_file15,
6657
- L: 178,
6658
- S: void 0,
6659
- C: (f, a) => f(...a)
6660
- });
6458
+ log10("cancel", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file15, L: 205, S: void 0 });
6661
6459
  return [];
6662
6460
  }
6663
6461
  return tr;
@@ -7098,12 +6896,69 @@ var replacer = ({ replacements = defaultReplacements } = {}) => {
7098
6896
  });
7099
6897
  };
7100
6898
 
6899
+ // src/extensions/snippets.ts
6900
+ import { keymap as keymap12 } from "@codemirror/view";
6901
+ var defaultItems = [
6902
+ "hello world!",
6903
+ "this is a test.",
6904
+ "this is [DXOS](https://dxos.org)"
6905
+ ];
6906
+ var snippets2 = ({ delay = 75, items = defaultItems } = {}) => {
6907
+ let timer;
6908
+ let index = 0;
6909
+ return [
6910
+ keymap12.of([
6911
+ {
6912
+ // Reset.
6913
+ key: "alt-meta-'",
6914
+ run: () => {
6915
+ clearTimeout(timer);
6916
+ index = 0;
6917
+ return true;
6918
+ }
6919
+ },
6920
+ {
6921
+ // Next snippet.
6922
+ // TODO(burdon): Press 1-9 to select snippet?
6923
+ key: "Shift-Meta-'",
6924
+ run: (view) => {
6925
+ clearTimeout(timer);
6926
+ const text = items[index++];
6927
+ if (index === items?.length) {
6928
+ index = 0;
6929
+ }
6930
+ let offset = 0;
6931
+ const insert = (delayMs = 0) => {
6932
+ timer = setTimeout(() => {
6933
+ const pos = view.state.selection.main.head;
6934
+ view.dispatch({
6935
+ changes: {
6936
+ from: pos,
6937
+ insert: text[offset++]
6938
+ },
6939
+ selection: {
6940
+ anchor: pos + 1
6941
+ }
6942
+ });
6943
+ if (offset < text.length) {
6944
+ insert(Math.random() * delay * (text[offset] === " " ? 2 : 1));
6945
+ }
6946
+ }, delayMs);
6947
+ };
6948
+ insert();
6949
+ return true;
6950
+ }
6951
+ }
6952
+ ])
6953
+ ];
6954
+ };
6955
+
7101
6956
  // src/extensions/submit.ts
7102
6957
  import { Prec as Prec6 } from "@codemirror/state";
7103
- import { keymap as keymap12 } from "@codemirror/view";
6958
+ import { keymap as keymap13 } from "@codemirror/view";
7104
6959
  var submit = ({ fireIfEmpty = false, onSubmit } = {}) => {
7105
6960
  return [
7106
- Prec6.highest(keymap12.of([
6961
+ Prec6.highest(keymap13.of([
7107
6962
  {
7108
6963
  key: "Enter",
7109
6964
  preventDefault: true,
@@ -7429,36 +7284,46 @@ var fader = (options = {}) => {
7429
7284
  ];
7430
7285
  };
7431
7286
 
7432
- // src/extensions/tags/wire.ts
7287
+ // src/extensions/tags/typewriter.ts
7433
7288
  import { Annotation as Annotation3, ChangeSet as ChangeSet2, EditorState as EditorState3, StateEffect as StateEffect11, StateField as StateField13 } from "@codemirror/state";
7434
7289
  import { Decoration as Decoration15, EditorView as EditorView30, ViewPlugin as ViewPlugin21, WidgetType as WidgetType9 } from "@codemirror/view";
7435
7290
  import { Domino as Domino3 } from "@dxos/ui";
7436
- var wireBypass = Annotation3.define();
7437
- var DEFAULT_RATE = 200;
7291
+ var typewriterBypass = Annotation3.define();
7292
+ var typewriterDrainingEffect = StateEffect11.define();
7438
7293
  var CURSOR_LINGER = 3e3;
7439
- var wire = (options = {}) => {
7440
- const rate = options.rate ?? DEFAULT_RATE;
7441
- const interval = 1e3 / rate;
7294
+ var FRAME_BUDGET_MS = 4;
7295
+ var CHARS_PER_FRAME = 5;
7296
+ var FLUSH_THRESHOLD = 2e3;
7297
+ var COMPACT_HEAD_THRESHOLD = 4096;
7298
+ var typewriter = (options = {}) => {
7442
7299
  const streamingTags = options.streamingTags ?? /* @__PURE__ */ new Set();
7300
+ const flushThreshold = options.flushThreshold ?? FLUSH_THRESHOLD;
7301
+ const frameBudgetMs = options.frameBudgetMs ?? FRAME_BUDGET_MS;
7302
+ const charsPerFrame = options.charsPerFrame ?? CHARS_PER_FRAME;
7443
7303
  const suppressAppend = StateEffect11.define();
7444
7304
  const insertChunk = StateEffect11.define();
7445
7305
  const bufferField = StateField13.define({
7446
7306
  create: () => ({
7447
7307
  text: "",
7308
+ head: 0,
7448
7309
  insertAt: 0
7449
7310
  }),
7450
7311
  update: (value, tr) => {
7451
- let { text, insertAt } = value;
7312
+ let { text, head, insertAt } = value;
7452
7313
  for (const effect of tr.effects) {
7453
7314
  if (effect.is(suppressAppend)) {
7454
- text += effect.value.text;
7455
- if (text.length === effect.value.text.length) {
7315
+ if (text.length === head) {
7456
7316
  insertAt = effect.value.from;
7457
7317
  }
7318
+ text += effect.value.text;
7458
7319
  }
7459
7320
  if (effect.is(insertChunk)) {
7460
- text = text.slice(effect.value.text.length);
7321
+ head += effect.value.text.length;
7461
7322
  insertAt = effect.value.from + effect.value.text.length;
7323
+ if (head >= COMPACT_HEAD_THRESHOLD || head > 0 && head * 2 >= text.length) {
7324
+ text = text.slice(head);
7325
+ head = 0;
7326
+ }
7462
7327
  }
7463
7328
  }
7464
7329
  if (tr.docChanged) {
@@ -7473,6 +7338,7 @@ var wire = (options = {}) => {
7473
7338
  if (isReset) {
7474
7339
  return {
7475
7340
  text: "",
7341
+ head: 0,
7476
7342
  insertAt: 0
7477
7343
  };
7478
7344
  }
@@ -7482,6 +7348,7 @@ var wire = (options = {}) => {
7482
7348
  }
7483
7349
  return {
7484
7350
  text,
7351
+ head,
7485
7352
  insertAt
7486
7353
  };
7487
7354
  }
@@ -7490,7 +7357,7 @@ var wire = (options = {}) => {
7490
7357
  if (!tr.docChanged) {
7491
7358
  return tr;
7492
7359
  }
7493
- if (tr.annotation(wireBypass) || tr.effects.some((effect) => effect.is(insertChunk))) {
7360
+ if (tr.annotation(typewriterBypass) || tr.effects.some((effect) => effect.is(insertChunk))) {
7494
7361
  return tr;
7495
7362
  }
7496
7363
  let appendedText = "";
@@ -7519,40 +7386,82 @@ var wire = (options = {}) => {
7519
7386
  });
7520
7387
  const drainPlugin = ViewPlugin21.fromClass(class {
7521
7388
  view;
7522
- #timer;
7523
- #activeStreamTag = null;
7389
+ _raf;
7390
+ _activeStreamTag = null;
7524
7391
  constructor(view) {
7525
7392
  this.view = view;
7526
- this.#start();
7527
7393
  }
7528
7394
  update(update2) {
7529
- const buffer = update2.state.field(bufferField);
7530
- if (buffer.text.length === 0) {
7531
- this.#activeStreamTag = null;
7395
+ const { text, head } = update2.state.field(bufferField);
7396
+ const pending = text.length - head;
7397
+ if (pending === 0) {
7398
+ this._activeStreamTag = null;
7532
7399
  }
7533
- if (buffer.text.length > 0 && this.#timer === void 0) {
7534
- this.#start();
7400
+ if (pending > 0 && this._raf === void 0) {
7401
+ this._start();
7535
7402
  }
7536
7403
  }
7537
- #start() {
7538
- this.#timer = setInterval(() => {
7539
- const { text, insertAt } = this.view.state.field(bufferField);
7540
- if (text.length === 0) {
7541
- clearInterval(this.#timer);
7542
- this.#timer = void 0;
7543
- return;
7544
- }
7545
- const result = flushable(text, streamingTags, this.#activeStreamTag);
7404
+ _start() {
7405
+ queueMicrotask(() => {
7406
+ this.view.dispatch({
7407
+ effects: typewriterDrainingEffect.of(true),
7408
+ annotations: typewriterBypass.of(true)
7409
+ });
7410
+ });
7411
+ this._raf = requestAnimationFrame(this._tick);
7412
+ }
7413
+ _tick = () => {
7414
+ const { text, head, insertAt } = this.view.state.field(bufferField);
7415
+ const pending = text.length - head;
7416
+ if (pending === 0) {
7417
+ this.view.dispatch({
7418
+ effects: typewriterDrainingEffect.of(false),
7419
+ annotations: typewriterBypass.of(true)
7420
+ });
7421
+ this._raf = void 0;
7422
+ return;
7423
+ }
7424
+ if (pending > flushThreshold) {
7425
+ const chunk = text.slice(head);
7426
+ this._activeStreamTag = null;
7427
+ this.view.dispatch({
7428
+ changes: {
7429
+ from: insertAt,
7430
+ insert: chunk
7431
+ },
7432
+ effects: insertChunk.of({
7433
+ from: insertAt,
7434
+ text: chunk
7435
+ })
7436
+ });
7437
+ this._raf = requestAnimationFrame(this._tick);
7438
+ return;
7439
+ }
7440
+ const startTime = performance.now();
7441
+ let pos = head;
7442
+ let activeTag = this._activeStreamTag;
7443
+ let charsEmitted = 0;
7444
+ while (pos < text.length && performance.now() - startTime < frameBudgetMs) {
7445
+ const result = flushable(text, pos, streamingTags, activeTag);
7546
7446
  if (result.count === 0) {
7547
- return;
7447
+ break;
7448
+ }
7449
+ if (charsEmitted > 0 && charsEmitted + result.count > charsPerFrame) {
7450
+ break;
7548
7451
  }
7549
7452
  if (result.enterTag) {
7550
- this.#activeStreamTag = result.enterTag;
7453
+ activeTag = result.enterTag;
7551
7454
  }
7552
7455
  if (result.exitTag) {
7553
- this.#activeStreamTag = null;
7456
+ activeTag = null;
7554
7457
  }
7555
- const chunk = text.slice(0, result.count);
7458
+ pos += result.count;
7459
+ charsEmitted += result.count;
7460
+ }
7461
+ const totalCount = pos - head;
7462
+ if (totalCount > 0) {
7463
+ const chunk = text.slice(head, head + totalCount);
7464
+ this._activeStreamTag = activeTag;
7556
7465
  this.view.dispatch({
7557
7466
  changes: {
7558
7467
  from: insertAt,
@@ -7563,20 +7472,23 @@ var wire = (options = {}) => {
7563
7472
  text: chunk
7564
7473
  })
7565
7474
  });
7566
- }, interval);
7567
- }
7475
+ }
7476
+ this._raf = requestAnimationFrame(this._tick);
7477
+ };
7568
7478
  destroy() {
7569
- clearInterval(this.#timer);
7479
+ if (this._raf !== void 0) {
7480
+ cancelAnimationFrame(this._raf);
7481
+ }
7570
7482
  }
7571
7483
  });
7572
7484
  return [
7573
7485
  bufferField,
7574
7486
  filter,
7575
7487
  drainPlugin,
7576
- options.cursor && wireCursor(bufferField)
7488
+ options.cursor && typewriterCursor(bufferField)
7577
7489
  ].filter(Boolean);
7578
7490
  };
7579
- var wireCursor = (bufferField) => {
7491
+ var typewriterCursor = (bufferField) => {
7580
7492
  const hideCursor = StateEffect11.define();
7581
7493
  const visibilityField = StateField13.define({
7582
7494
  create: () => ({
@@ -7585,8 +7497,9 @@ var wireCursor = (bufferField) => {
7585
7497
  lastNonWsAt: 0
7586
7498
  }),
7587
7499
  update: (value, tr) => {
7588
- const { text, insertAt } = tr.state.field(bufferField);
7589
- if (text.length > 0) {
7500
+ const { text, head, insertAt } = tr.state.field(bufferField);
7501
+ const pending = text.length - head;
7502
+ if (pending > 0) {
7590
7503
  let lastNonWsAt = tr.changes.mapPos(Math.min(value.lastNonWsAt, tr.startState.doc.length));
7591
7504
  if (tr.docChanged) {
7592
7505
  tr.changes.iterChanges((_fromA, _toA, _fromB, _toB, inserted) => {
@@ -7620,8 +7533,8 @@ var wireCursor = (bufferField) => {
7620
7533
  if (!visible) {
7621
7534
  return Decoration15.none;
7622
7535
  }
7623
- const { text } = tr.state.field(bufferField);
7624
- const cursorAt = text.length > 0 ? insertAt : lastNonWsAt;
7536
+ const { text, head } = tr.state.field(bufferField);
7537
+ const cursorAt = text.length > head ? insertAt : lastNonWsAt;
7625
7538
  const pos = Math.min(cursorAt, tr.state.doc.length);
7626
7539
  return Decoration15.set([
7627
7540
  Decoration15.widget({
@@ -7634,27 +7547,28 @@ var wireCursor = (bufferField) => {
7634
7547
  });
7635
7548
  const timerPlugin = ViewPlugin21.fromClass(class {
7636
7549
  view;
7637
- #timer;
7550
+ _timer;
7638
7551
  constructor(view) {
7639
7552
  this.view = view;
7640
7553
  }
7641
7554
  update(update2) {
7642
- const { text } = update2.state.field(bufferField);
7555
+ const { text, head } = update2.state.field(bufferField);
7643
7556
  const { visible } = update2.state.field(visibilityField);
7644
- if (text.length > 0) {
7645
- clearTimeout(this.#timer);
7646
- this.#timer = void 0;
7647
- } else if (visible && this.#timer === void 0) {
7648
- this.#timer = setTimeout(() => {
7557
+ const pending = text.length - head;
7558
+ if (pending > 0) {
7559
+ clearTimeout(this._timer);
7560
+ this._timer = void 0;
7561
+ } else if (visible && this._timer === void 0) {
7562
+ this._timer = setTimeout(() => {
7649
7563
  this.view.dispatch({
7650
7564
  effects: hideCursor.of(null)
7651
7565
  });
7652
- this.#timer = void 0;
7566
+ this._timer = void 0;
7653
7567
  }, CURSOR_LINGER);
7654
7568
  }
7655
7569
  }
7656
7570
  destroy() {
7657
- clearTimeout(this.#timer);
7571
+ clearTimeout(this._timer);
7658
7572
  }
7659
7573
  });
7660
7574
  return [
@@ -7663,7 +7577,12 @@ var wireCursor = (bufferField) => {
7663
7577
  timerPlugin
7664
7578
  ];
7665
7579
  };
7666
- var CursorWidget = class extends WidgetType9 {
7580
+ var CursorWidget = class _CursorWidget extends WidgetType9 {
7581
+ // All instances are interchangeable — let CM reuse the existing DOM across drips so
7582
+ // the blink animation isn't restarted on every transaction.
7583
+ eq(other) {
7584
+ return other instanceof _CursorWidget;
7585
+ }
7667
7586
  toDOM() {
7668
7587
  const inner = Domino3.of("span").text("\u2217").style({
7669
7588
  animation: "blink 1s infinite",
@@ -7675,35 +7594,37 @@ var CursorWidget = class extends WidgetType9 {
7675
7594
  }
7676
7595
  };
7677
7596
  var OPENING_TAG_NAME = /^<([a-zA-Z][\w-]*)/;
7597
+ var TAG_NAME_PROBE = 64;
7678
7598
  var escapeRegExpSource2 = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
7679
- var flushable = (buffer, streamingTags, activeStreamTag) => {
7680
- if (buffer.length === 0) {
7599
+ var flushable = (buffer, start, streamingTags, activeStreamTag) => {
7600
+ if (start >= buffer.length) {
7681
7601
  return {
7682
7602
  count: 0
7683
7603
  };
7684
7604
  }
7685
7605
  if (activeStreamTag) {
7686
7606
  const closeTag = `</${activeStreamTag}>`;
7687
- if (buffer.startsWith(closeTag)) {
7607
+ if (buffer.startsWith(closeTag, start)) {
7688
7608
  return {
7689
7609
  count: closeTag.length,
7690
7610
  exitTag: true
7691
7611
  };
7692
7612
  }
7693
- if (buffer[0] === "<") {
7613
+ if (buffer[start] === "<") {
7694
7614
  return {
7695
- count: xmlElementLength(buffer)
7615
+ count: xmlElementLength(buffer, start)
7696
7616
  };
7697
7617
  }
7698
7618
  return {
7699
7619
  count: 1
7700
7620
  };
7701
7621
  }
7702
- const ch = buffer[0];
7622
+ const ch = buffer[start];
7703
7623
  if (ch === "<") {
7704
- const nameMatch = buffer.match(OPENING_TAG_NAME);
7624
+ const probe = buffer.slice(start, start + TAG_NAME_PROBE);
7625
+ const nameMatch = probe.match(OPENING_TAG_NAME);
7705
7626
  if (nameMatch && streamingTags.has(nameMatch[1])) {
7706
- const close = buffer.indexOf(">");
7627
+ const close = buffer.indexOf(">", start);
7707
7628
  if (close === -1) {
7708
7629
  return {
7709
7630
  count: 0
@@ -7711,62 +7632,64 @@ var flushable = (buffer, streamingTags, activeStreamTag) => {
7711
7632
  }
7712
7633
  if (buffer[close - 1] === "/") {
7713
7634
  return {
7714
- count: close + 1
7635
+ count: close + 1 - start
7715
7636
  };
7716
7637
  }
7717
7638
  return {
7718
- count: close + 1,
7639
+ count: close + 1 - start,
7719
7640
  enterTag: nameMatch[1]
7720
7641
  };
7721
7642
  }
7722
7643
  return {
7723
- count: xmlElementLength(buffer)
7644
+ count: xmlElementLength(buffer, start)
7724
7645
  };
7725
7646
  }
7726
- if (ch === "!" && buffer.length > 1 && buffer[1] === "[") {
7647
+ if (ch === "!" && buffer.length > start + 1 && buffer[start + 1] === "[") {
7727
7648
  return {
7728
- count: linkLength(buffer, 1)
7649
+ count: linkLength(buffer, start, start + 1)
7729
7650
  };
7730
7651
  }
7731
7652
  if (ch === "[") {
7732
7653
  return {
7733
- count: linkLength(buffer, 0)
7654
+ count: linkLength(buffer, start, start)
7734
7655
  };
7735
7656
  }
7736
7657
  return {
7737
7658
  count: 1
7738
7659
  };
7739
7660
  };
7740
- var xmlElementLength = (buffer) => {
7741
- const close = buffer.indexOf(">");
7661
+ var xmlElementLength = (buffer, start = 0) => {
7662
+ const close = buffer.indexOf(">", start);
7742
7663
  if (close === -1) {
7743
7664
  return 0;
7744
7665
  }
7745
7666
  if (buffer[close - 1] === "/") {
7746
- return close + 1;
7667
+ return close + 1 - start;
7747
7668
  }
7748
- if (buffer[1] === "/") {
7749
- return close + 1;
7669
+ if (buffer[start + 1] === "/") {
7670
+ return close + 1 - start;
7750
7671
  }
7751
- const nameMatch = buffer.match(OPENING_TAG_NAME);
7672
+ const probe = buffer.slice(start, start + TAG_NAME_PROBE);
7673
+ const nameMatch = probe.match(OPENING_TAG_NAME);
7752
7674
  if (!nameMatch) {
7753
7675
  return 1;
7754
7676
  }
7755
7677
  const tagName = nameMatch[1];
7756
7678
  let depth = 0;
7757
7679
  const tagPattern = new RegExp(`<(/?)${escapeRegExpSource2(tagName)}(\\s[^>]*)?>`, "g");
7680
+ tagPattern.lastIndex = start;
7758
7681
  let match;
7759
7682
  while ((match = tagPattern.exec(buffer)) !== null) {
7760
7683
  const isSelfClosing = match[0].endsWith("/>");
7761
7684
  const isClosing = match[1] === "/";
7762
7685
  if (isSelfClosing) {
7763
7686
  if (depth === 0) {
7764
- return match.index + match[0].length;
7687
+ return match.index + match[0].length - start;
7765
7688
  }
7766
7689
  } else if (isClosing) {
7767
7690
  depth--;
7768
7691
  if (depth === 0) {
7769
- return match.index + match[0].length;
7692
+ return match.index + match[0].length - start;
7770
7693
  }
7771
7694
  } else {
7772
7695
  depth++;
@@ -7774,8 +7697,8 @@ var xmlElementLength = (buffer) => {
7774
7697
  }
7775
7698
  return 0;
7776
7699
  };
7777
- var linkLength = (buffer, offset) => {
7778
- const bracketClose = buffer.indexOf("]", offset + 1);
7700
+ var linkLength = (buffer, start, bracketAt) => {
7701
+ const bracketClose = buffer.indexOf("]", bracketAt + 1);
7779
7702
  if (bracketClose === -1) {
7780
7703
  return 0;
7781
7704
  }
@@ -7789,13 +7712,179 @@ var linkLength = (buffer, offset) => {
7789
7712
  if (parenClose === -1) {
7790
7713
  return 0;
7791
7714
  }
7792
- return parenClose + 1;
7715
+ return parenClose + 1 - start;
7716
+ };
7717
+
7718
+ // src/extensions/tags/xml-block-decoration.ts
7719
+ import { xmlLanguage as xmlLanguage2 } from "@codemirror/lang-xml";
7720
+ import { Decoration as Decoration16, ViewPlugin as ViewPlugin22 } from "@codemirror/view";
7721
+ var xmlBlockDecoration = ({ tag, lineClass, contentClass, hideTags }) => {
7722
+ const lineDecoration = lineClass ? Decoration16.line({
7723
+ class: lineClass
7724
+ }) : void 0;
7725
+ const contentDecoration = contentClass ? Decoration16.mark({
7726
+ class: contentClass
7727
+ }) : void 0;
7728
+ const hideDecoration = hideTags ? Decoration16.replace({}) : void 0;
7729
+ const buildDecorations5 = (view) => {
7730
+ const text = view.state.sliceDoc(0, view.state.doc.length);
7731
+ if (!text.includes(`<${tag}`)) {
7732
+ return Decoration16.none;
7733
+ }
7734
+ const tree = xmlLanguage2.parser.parse(text);
7735
+ const ranges = [];
7736
+ tree.iterate({
7737
+ enter: (node) => {
7738
+ if (node.type.name !== "Element") {
7739
+ return;
7740
+ }
7741
+ const openTag = node.node.getChild("OpenTag");
7742
+ const closeTag = node.node.getChild("CloseTag") ?? node.node.getChild("MismatchedCloseTag");
7743
+ const tagNameNode = openTag?.getChild("TagName");
7744
+ if (!openTag || !tagNameNode) {
7745
+ return;
7746
+ }
7747
+ if (text.slice(tagNameNode.from, tagNameNode.to) !== tag) {
7748
+ return;
7749
+ }
7750
+ const contentFrom = openTag.to;
7751
+ const contentTo = closeTag?.from ?? node.node.to;
7752
+ if (hideDecoration) {
7753
+ ranges.push(hideDecoration.range(openTag.from, openTag.to));
7754
+ if (closeTag) {
7755
+ ranges.push(hideDecoration.range(closeTag.from, closeTag.to));
7756
+ }
7757
+ }
7758
+ if (contentDecoration && contentFrom < contentTo) {
7759
+ ranges.push(contentDecoration.range(contentFrom, contentTo));
7760
+ }
7761
+ if (lineDecoration && contentFrom <= view.state.doc.length) {
7762
+ let pos = contentFrom;
7763
+ while (pos <= contentTo && pos <= view.state.doc.length) {
7764
+ const line = view.state.doc.lineAt(pos);
7765
+ ranges.push(lineDecoration.range(line.from));
7766
+ if (line.to >= contentTo) {
7767
+ break;
7768
+ }
7769
+ pos = line.to + 1;
7770
+ }
7771
+ }
7772
+ }
7773
+ });
7774
+ return Decoration16.set(ranges, true);
7775
+ };
7776
+ return ViewPlugin22.fromClass(class {
7777
+ decorations;
7778
+ constructor(view) {
7779
+ this.decorations = buildDecorations5(view);
7780
+ }
7781
+ update(update2) {
7782
+ if (update2.docChanged) {
7783
+ this.decorations = buildDecorations5(update2.view);
7784
+ }
7785
+ }
7786
+ }, {
7787
+ decorations: (instance) => instance.decorations
7788
+ });
7789
+ };
7790
+
7791
+ // src/extensions/tags/xml-formatting.ts
7792
+ import { xmlLanguage as xmlLanguage3 } from "@codemirror/lang-xml";
7793
+ import { Decoration as Decoration17, EditorView as EditorView31, ViewPlugin as ViewPlugin23 } from "@codemirror/view";
7794
+ var XML_TAG_NODES = /* @__PURE__ */ new Set([
7795
+ "OpenTag",
7796
+ "CloseTag",
7797
+ "SelfClosingTag",
7798
+ "MismatchedCloseTag"
7799
+ ]);
7800
+ var xmlElementMark = Decoration17.mark({
7801
+ class: "cm-xml-element"
7802
+ });
7803
+ var xmlTagMark = Decoration17.mark({
7804
+ class: "cm-xml-tag"
7805
+ });
7806
+ var xmlContentMark = Decoration17.mark({
7807
+ class: "cm-xml-content"
7808
+ });
7809
+ var xmlFormatting = ({ skip } = {}) => {
7810
+ const skipSet = skip && skip.length > 0 ? new Set(skip) : void 0;
7811
+ const buildDecorations5 = (view) => {
7812
+ const text = view.state.sliceDoc(0, view.state.doc.length);
7813
+ if (!text.includes("<")) {
7814
+ return Decoration17.none;
7815
+ }
7816
+ const tagNameAt = (node) => text.slice(node.from, node.to);
7817
+ const tree = xmlLanguage3.parser.parse(text);
7818
+ const ranges = [];
7819
+ tree.iterate({
7820
+ enter: (node) => {
7821
+ const name = node.type.name;
7822
+ if (name === "SelfClosingTag" && node.from < node.to) {
7823
+ if (skipSet) {
7824
+ const tagNameNode = node.node.getChild("TagName");
7825
+ if (tagNameNode && skipSet.has(tagNameAt(tagNameNode))) {
7826
+ return false;
7827
+ }
7828
+ }
7829
+ ranges.push(xmlElementMark.range(node.from, node.to));
7830
+ ranges.push(xmlTagMark.range(node.from, node.to));
7831
+ return;
7832
+ }
7833
+ if (XML_TAG_NODES.has(name) && node.from < node.to) {
7834
+ ranges.push(xmlTagMark.range(node.from, node.to));
7835
+ return;
7836
+ }
7837
+ if (name === "Element" && node.from < node.to) {
7838
+ const openTag = node.node.getChild("OpenTag");
7839
+ if (openTag && skipSet) {
7840
+ const tagNameNode = openTag.getChild("TagName");
7841
+ if (tagNameNode && skipSet.has(tagNameAt(tagNameNode))) {
7842
+ return false;
7843
+ }
7844
+ }
7845
+ const closeTag = node.node.getChild("CloseTag") ?? node.node.getChild("MismatchedCloseTag");
7846
+ ranges.push(xmlElementMark.range(node.from, node.to));
7847
+ if (openTag && closeTag && openTag.to < closeTag.from) {
7848
+ ranges.push(xmlContentMark.range(openTag.to, closeTag.from));
7849
+ }
7850
+ }
7851
+ }
7852
+ });
7853
+ return Decoration17.set(ranges, true);
7854
+ };
7855
+ return [
7856
+ ViewPlugin23.fromClass(class {
7857
+ decorations;
7858
+ constructor(view) {
7859
+ this.decorations = buildDecorations5(view);
7860
+ }
7861
+ update(update2) {
7862
+ if (update2.docChanged) {
7863
+ this.decorations = buildDecorations5(update2.view);
7864
+ }
7865
+ }
7866
+ }, {
7867
+ decorations: (instance) => instance.decorations
7868
+ }),
7869
+ EditorView31.baseTheme({
7870
+ ".cm-xml-element": {
7871
+ backgroundColor: "var(--color-active-surface)",
7872
+ borderRadius: "0.25rem",
7873
+ padding: "0.25rem"
7874
+ },
7875
+ ".cm-xml-tag": {
7876
+ color: "var(--color-blue-500)",
7877
+ fontFamily: "var(--font-mono)"
7878
+ },
7879
+ ".cm-xml-content": {}
7880
+ })
7881
+ ];
7793
7882
  };
7794
7883
 
7795
7884
  // src/extensions/tags/xml-tags.ts
7796
7885
  import { syntaxTree as syntaxTree11 } from "@codemirror/language";
7797
7886
  import { Prec as Prec7, RangeSetBuilder as RangeSetBuilder7, StateEffect as StateEffect12, StateField as StateField14 } from "@codemirror/state";
7798
- import { Decoration as Decoration16, EditorView as EditorView31, ViewPlugin as ViewPlugin22, WidgetType as WidgetType10, keymap as keymap13 } from "@codemirror/view";
7887
+ import { Decoration as Decoration18, EditorView as EditorView32, ViewPlugin as ViewPlugin24, WidgetType as WidgetType10, keymap as keymap14 } from "@codemirror/view";
7799
7888
  import { invariant as invariant7 } from "@dxos/invariant";
7800
7889
  import { log as log11 } from "@dxos/log";
7801
7890
  import { Domino as Domino4 } from "@dxos/ui";
@@ -7804,15 +7893,7 @@ import { Domino as Domino4 } from "@dxos/ui";
7804
7893
  import { invariant as invariant6 } from "@dxos/invariant";
7805
7894
  var __dxlog_file16 = "/__w/dxos/dxos/packages/ui/ui-editor/src/extensions/tags/xml-util.ts";
7806
7895
  var nodeToJson = (state, node) => {
7807
- invariant6(node.type.name === "Element", "Node is not an Element", {
7808
- F: __dxlog_file16,
7809
- L: 18,
7810
- S: void 0,
7811
- A: [
7812
- "node.type.name === 'Element'",
7813
- "'Node is not an Element'"
7814
- ]
7815
- });
7896
+ invariant6(node.type.name === "Element", "Node is not an Element", { "~LogMeta": "~LogMeta", F: __dxlog_file16, L: 8, S: void 0, A: ["node.type.name === 'Element'", "'Node is not an Element'"] });
7816
7897
  const openTag = node.node.getChild("OpenTag") || node.node.getChild("SelfClosingTag");
7817
7898
  if (openTag) {
7818
7899
  const tagName = openTag.getChild("TagName");
@@ -7844,13 +7925,23 @@ var nodeToJson = (state, node) => {
7844
7925
  if (node.type.name === "Element" && openTag.type.name !== "SelfClosingTag") {
7845
7926
  const children = [];
7846
7927
  let child = node.node.firstChild;
7928
+ const appendText = (raw) => {
7929
+ if (raw.length === 0) {
7930
+ return;
7931
+ }
7932
+ const last = children[children.length - 1];
7933
+ if (typeof last === "string") {
7934
+ children[children.length - 1] = last + raw;
7935
+ } else {
7936
+ children.push(raw);
7937
+ }
7938
+ };
7847
7939
  while (child) {
7848
7940
  if (child.type.name !== "OpenTag" && child.type.name !== "CloseTag") {
7849
7941
  if (child.type.name === "Text") {
7850
- const text = state.doc.sliceString(child.from, child.to).trim();
7851
- if (text) {
7852
- children.push(text);
7853
- }
7942
+ appendText(state.doc.sliceString(child.from, child.to));
7943
+ } else if (child.type.name === "EntityReference" || child.type.name === "CharacterReference") {
7944
+ appendText(decodeXmlEntity(state.doc.sliceString(child.from, child.to)));
7854
7945
  } else if (child.type.name === "Element") {
7855
7946
  const data = nodeToJson(state, child);
7856
7947
  if (data) {
@@ -7860,13 +7951,48 @@ var nodeToJson = (state, node) => {
7860
7951
  }
7861
7952
  child = child.nextSibling;
7862
7953
  }
7954
+ if (children.length > 0 && typeof children[0] === "string") {
7955
+ children[0] = children[0].trimStart();
7956
+ }
7863
7957
  if (children.length > 0) {
7864
- tag.children = children;
7958
+ const lastIndex = children.length - 1;
7959
+ const last = children[lastIndex];
7960
+ if (typeof last === "string") {
7961
+ children[lastIndex] = last.trimEnd();
7962
+ }
7963
+ }
7964
+ const trimmed = children.filter((value) => typeof value !== "string" || value.length > 0);
7965
+ if (trimmed.length > 0) {
7966
+ tag.children = trimmed;
7865
7967
  }
7866
7968
  }
7867
7969
  return tag;
7868
7970
  }
7869
7971
  };
7972
+ var XML_NAMED_ENTITIES = {
7973
+ "&lt;": "<",
7974
+ "&gt;": ">",
7975
+ "&amp;": "&",
7976
+ "&quot;": '"',
7977
+ "&apos;": "'"
7978
+ };
7979
+ var decodeXmlEntity = (raw) => {
7980
+ const named = XML_NAMED_ENTITIES[raw];
7981
+ if (named !== void 0) {
7982
+ return named;
7983
+ }
7984
+ const numeric = /^&#(x?)([0-9a-fA-F]+);$/.exec(raw);
7985
+ if (numeric) {
7986
+ const code = parseInt(numeric[2], numeric[1] ? 16 : 10);
7987
+ if (Number.isFinite(code)) {
7988
+ try {
7989
+ return String.fromCodePoint(code);
7990
+ } catch {
7991
+ }
7992
+ }
7993
+ }
7994
+ return raw;
7995
+ };
7870
7996
 
7871
7997
  // src/extensions/tags/xml-tags.ts
7872
7998
  var __dxlog_file17 = "/__w/dxos/dxos/packages/ui/ui-editor/src/extensions/tags/xml-tags.ts";
@@ -7904,12 +8030,7 @@ var widgetStateMapStateField = StateField14.define({
7904
8030
  log11("widget updated", {
7905
8031
  id,
7906
8032
  value
7907
- }, {
7908
- F: __dxlog_file17,
7909
- L: 184,
7910
- S: void 0,
7911
- C: (f, a) => f(...a)
7912
- });
8033
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file17, L: 59, S: void 0 });
7913
8034
  const state = typeof value === "function" ? value(map[id]) : value;
7914
8035
  return {
7915
8036
  ...map,
@@ -7939,12 +8060,7 @@ var createWidgetMap = (setWidgets) => {
7939
8060
  log11("widget mounted", {
7940
8061
  id: state.id,
7941
8062
  tag: state.props._tag
7942
- }, {
7943
- F: __dxlog_file17,
7944
- L: 238,
7945
- S: void 0,
7946
- C: (f, a) => f(...a)
7947
- });
8063
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file17, L: 101, S: void 0 });
7948
8064
  widgets.set(state.id, state);
7949
8065
  setWidgets?.([
7950
8066
  ...widgets.values()
@@ -7955,12 +8071,7 @@ var createWidgetMap = (setWidgets) => {
7955
8071
  log11("widget unmounted", {
7956
8072
  id,
7957
8073
  tag: state?.props._tag
7958
- }, {
7959
- F: __dxlog_file17,
7960
- L: 244,
7961
- S: void 0,
7962
- C: (f, a) => f(...a)
7963
- });
8074
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file17, L: 112, S: void 0 });
7964
8075
  widgets.delete(id);
7965
8076
  setWidgets?.([
7966
8077
  ...widgets.values()
@@ -7969,7 +8080,7 @@ var createWidgetMap = (setWidgets) => {
7969
8080
  };
7970
8081
  return notifier;
7971
8082
  };
7972
- var keyHandlers = keymap13.of([
8083
+ var keyHandlers = keymap14.of([
7973
8084
  {
7974
8085
  key: "Mod-ArrowUp",
7975
8086
  run: (view) => {
@@ -7990,7 +8101,7 @@ var keyHandlers = keymap13.of([
7990
8101
  }
7991
8102
  ]);
7992
8103
  var createNavigationEffectPlugin = (widgetDecorationsField, bookmarks2) => {
7993
- return EditorView31.updateListener.of((update2) => {
8104
+ return EditorView32.updateListener.of((update2) => {
7994
8105
  update2.transactions.forEach((transaction) => {
7995
8106
  for (const effect of transaction.effects) {
7996
8107
  if (effect.is(navigatePreviousEffect)) {
@@ -8075,7 +8186,7 @@ var createNavigationEffectPlugin = (widgetDecorationsField, bookmarks2) => {
8075
8186
  });
8076
8187
  });
8077
8188
  };
8078
- var createWidgetUpdatePlugin = (widgetDecorationsField, notifier) => ViewPlugin22.fromClass(class {
8189
+ var createWidgetUpdatePlugin = (widgetDecorationsField, notifier) => ViewPlugin24.fromClass(class {
8079
8190
  update(update2) {
8080
8191
  const widgetStateMap = update2.state.field(widgetStateMapStateField);
8081
8192
  const { decorations: decorations2 } = update2.state.field(widgetDecorationsField);
@@ -8120,7 +8231,7 @@ var createWidgetDecorationsField = (registry = {}, notifier) => StateField14.def
8120
8231
  }
8121
8232
  return {
8122
8233
  from: 0,
8123
- decorations: Decoration16.none
8234
+ decorations: Decoration18.none
8124
8235
  };
8125
8236
  }
8126
8237
  }
@@ -8131,12 +8242,7 @@ var createWidgetDecorationsField = (registry = {}, notifier) => StateField14.def
8131
8242
  log11("document reset", {
8132
8243
  from,
8133
8244
  to: state.doc.length
8134
- }, {
8135
- F: __dxlog_file17,
8136
- L: 406,
8137
- S: void 0,
8138
- C: (f, a) => f(...a)
8139
- });
8245
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file17, L: 298, S: void 0 });
8140
8246
  return buildDecorations4(state, {
8141
8247
  from: 0,
8142
8248
  to: state.doc.length
@@ -8165,8 +8271,8 @@ var createWidgetDecorationsField = (registry = {}, notifier) => StateField14.def
8165
8271
  };
8166
8272
  },
8167
8273
  provide: (field) => [
8168
- EditorView31.decorations.from(field, (v) => v.decorations),
8169
- EditorView31.atomicRanges.of((view) => view.state.field(field).decorations || Decoration16.none)
8274
+ EditorView32.decorations.from(field, (v) => v.decorations),
8275
+ EditorView32.atomicRanges.of((view) => view.state.field(field).decorations || Decoration18.none)
8170
8276
  ]
8171
8277
  });
8172
8278
  var buildDecorations4 = (state, range, registry, notifier) => {
@@ -8177,7 +8283,7 @@ var buildDecorations4 = (state, range, registry, notifier) => {
8177
8283
  if (!tree || tree.type.name === "Program" && tree.length === 0) {
8178
8284
  return {
8179
8285
  from: range.from,
8180
- decorations: Decoration16.none
8286
+ decorations: Decoration18.none
8181
8287
  };
8182
8288
  }
8183
8289
  let last = range.from;
@@ -8213,7 +8319,7 @@ var buildDecorations4 = (state, range, registry, notifier) => {
8213
8319
  };
8214
8320
  const widget = factory ? factory(props) ?? void 0 : Component ? new PlaceholderWidget2(widgetId, Component, props, notifier) : void 0;
8215
8321
  if (widget) {
8216
- builder.add(nodeRange.from, nodeRange.to, Decoration16.replace({
8322
+ builder.add(nodeRange.from, nodeRange.to, Decoration18.replace({
8217
8323
  widget,
8218
8324
  block,
8219
8325
  atomic: true,
@@ -8225,12 +8331,7 @@ var buildDecorations4 = (state, range, registry, notifier) => {
8225
8331
  }
8226
8332
  }
8227
8333
  } catch (err) {
8228
- log11.catch(err, void 0, {
8229
- F: __dxlog_file17,
8230
- L: 515,
8231
- S: void 0,
8232
- C: (f, a) => f(...a)
8233
- });
8334
+ log11.catch(err, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file17, L: 401, S: void 0 });
8234
8335
  }
8235
8336
  return false;
8236
8337
  }
@@ -8277,7 +8378,7 @@ var buildDecorations4 = (state, range, registry, notifier) => {
8277
8378
  };
8278
8379
  const widget = def.factory ? def.factory(mergedProps) ?? void 0 : def.Component ? new PlaceholderWidget2(widgetId, def.Component, mergedProps, notifier, true) : void 0;
8279
8380
  if (widget) {
8280
- builder.add(absoluteFrom, range.to, Decoration16.replace({
8381
+ builder.add(absoluteFrom, range.to, Decoration18.replace({
8281
8382
  widget,
8282
8383
  block: def.block,
8283
8384
  atomic: true,
@@ -8309,15 +8410,7 @@ var PlaceholderWidget2 = class extends WidgetType10 {
8309
8410
  #view;
8310
8411
  constructor(id, Component, props, notifier, streaming) {
8311
8412
  super(), this.id = id, this.Component = Component, this.props = props, this.notifier = notifier, this.streaming = streaming;
8312
- invariant7(id, void 0, {
8313
- F: __dxlog_file17,
8314
- L: 618,
8315
- S: this,
8316
- A: [
8317
- "id",
8318
- ""
8319
- ]
8320
- });
8413
+ invariant7(id, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file17, L: 488, S: this, A: ["id", ""] });
8321
8414
  }
8322
8415
  get root() {
8323
8416
  return this.#root;
@@ -8364,71 +8457,10 @@ var PlaceholderWidget2 = class extends WidgetType10 {
8364
8457
  this.#view = void 0;
8365
8458
  }
8366
8459
  };
8367
-
8368
- // src/extensions/typewriter.ts
8369
- import { keymap as keymap14 } from "@codemirror/view";
8370
- var defaultItems = [
8371
- "hello world!",
8372
- "this is a test.",
8373
- "this is [DXOS](https://dxos.org)"
8374
- ];
8375
- var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
8376
- let t;
8377
- let idx = 0;
8378
- return [
8379
- keymap14.of([
8380
- {
8381
- // Reset.
8382
- key: "alt-meta-'",
8383
- run: () => {
8384
- clearTimeout(t);
8385
- idx = 0;
8386
- return true;
8387
- }
8388
- },
8389
- {
8390
- // Next prompt.
8391
- // TODO(burdon): Press 1-9 to select prompt?
8392
- key: "Shift-Meta-'",
8393
- run: (view) => {
8394
- clearTimeout(t);
8395
- const text = items[idx++];
8396
- if (idx === items?.length) {
8397
- idx = 0;
8398
- }
8399
- let i = 0;
8400
- const insert = (d = 0) => {
8401
- t = setTimeout(() => {
8402
- const pos = view.state.selection.main.head;
8403
- view.dispatch({
8404
- changes: {
8405
- from: pos,
8406
- insert: text[i++]
8407
- },
8408
- selection: {
8409
- anchor: pos + 1
8410
- }
8411
- });
8412
- if (i < text.length) {
8413
- insert(Math.random() * delay * (text[i] === " " ? 2 : 1));
8414
- }
8415
- }, d);
8416
- };
8417
- insert();
8418
- return true;
8419
- }
8420
- }
8421
- ])
8422
- ];
8423
- };
8424
8460
  export {
8425
8461
  Cursor,
8426
- EditorInputMode,
8427
- EditorInputModes,
8428
8462
  EditorState4 as EditorState,
8429
- EditorView32 as EditorView,
8430
- EditorViewMode,
8431
- EditorViewModes,
8463
+ EditorView33 as EditorView,
8432
8464
  Inline,
8433
8465
  InputModeExtensions,
8434
8466
  List,
@@ -8557,6 +8589,7 @@ export {
8557
8589
  setSelection,
8558
8590
  setStyle,
8559
8591
  singleValueFacet,
8592
+ snippets2 as snippets,
8560
8593
  staticCompletion,
8561
8594
  submit,
8562
8595
  tabbable,
@@ -8576,10 +8609,12 @@ export {
8576
8609
  treeFacet,
8577
8610
  typeahead,
8578
8611
  typewriter,
8579
- wire,
8580
- wireBypass,
8612
+ typewriterBypass,
8613
+ typewriterDrainingEffect,
8581
8614
  wrapWithCatch,
8615
+ xmlBlockDecoration,
8582
8616
  xmlElementLength,
8617
+ xmlFormatting,
8583
8618
  xmlTagContextEffect,
8584
8619
  xmlTagResetEffect,
8585
8620
  xmlTagUpdateEffect,