@dxos/react-ui-editor 0.3.11-main.a6c4a82 → 0.3.11-main.b4b98ab

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