@dxos/react-ui-editor 0.3.10-main.cbe7692 → 0.3.10-main.ec4f2f4

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 (59) hide show
  1. package/dist/lib/browser/index.mjs +129 -698
  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 +1 -19
  5. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -1
  6. package/dist/types/src/components/TextEditor/TextEditor.d.ts +1 -2
  7. package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
  8. package/dist/types/src/components/TextEditor/extensions/autocomplete.d.ts.map +1 -1
  9. package/dist/types/src/components/TextEditor/extensions/basic.d.ts +1 -2
  10. package/dist/types/src/components/TextEditor/extensions/basic.d.ts.map +1 -1
  11. package/dist/types/src/components/TextEditor/extensions/demo.d.ts +1 -2
  12. package/dist/types/src/components/TextEditor/extensions/demo.d.ts.map +1 -1
  13. package/dist/types/src/components/TextEditor/extensions/index.d.ts +0 -4
  14. package/dist/types/src/components/TextEditor/extensions/index.d.ts.map +1 -1
  15. package/dist/types/src/components/TextEditor/extensions/link.d.ts.map +1 -1
  16. package/dist/types/src/components/TextEditor/extensions/listener.d.ts.map +1 -1
  17. package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts +1 -2
  18. package/dist/types/src/components/TextEditor/extensions/markdown/bundle.d.ts.map +1 -1
  19. package/dist/types/src/components/TextEditor/extensions/markdown/highlight.d.ts +2 -6
  20. package/dist/types/src/components/TextEditor/extensions/markdown/highlight.d.ts.map +1 -1
  21. package/dist/types/src/components/TextEditor/extensions/tasklist.d.ts +1 -2
  22. package/dist/types/src/components/TextEditor/extensions/tasklist.d.ts.map +1 -1
  23. package/dist/types/src/components/TextEditor/themes/default.d.ts +0 -5
  24. package/dist/types/src/components/TextEditor/themes/default.d.ts.map +1 -1
  25. package/dist/types/src/{hooks/yjs → components/TextEditor}/yjs.stories.d.ts +1 -1
  26. package/dist/types/src/components/TextEditor/yjs.stories.d.ts.map +1 -0
  27. package/dist/types/src/hooks/automerge/automerge.stories.d.ts +1 -8
  28. package/dist/types/src/hooks/automerge/automerge.stories.d.ts.map +1 -1
  29. package/dist/types/src/styles/markdown.d.ts +2 -3
  30. package/dist/types/src/styles/markdown.d.ts.map +1 -1
  31. package/package.json +20 -20
  32. package/src/components/TextEditor/MarkdownEditor.stories.tsx +25 -98
  33. package/src/components/TextEditor/TextEditor.tsx +7 -16
  34. package/src/components/TextEditor/extensions/autocomplete.ts +20 -5
  35. package/src/components/TextEditor/extensions/basic.ts +1 -2
  36. package/src/components/TextEditor/extensions/demo.ts +1 -4
  37. package/src/components/TextEditor/extensions/index.ts +0 -4
  38. package/src/components/TextEditor/extensions/link.ts +23 -15
  39. package/src/components/TextEditor/extensions/listener.ts +3 -3
  40. package/src/components/TextEditor/extensions/markdown/bundle.ts +11 -19
  41. package/src/components/TextEditor/extensions/markdown/highlight.ts +104 -118
  42. package/src/components/TextEditor/extensions/tasklist.ts +20 -34
  43. package/src/components/TextEditor/themes/default.ts +2 -54
  44. package/src/{hooks/yjs → components/TextEditor}/yjs.stories.tsx +1 -1
  45. package/src/hooks/automerge/automerge.stories.tsx +2 -3
  46. package/src/styles/markdown.ts +8 -14
  47. package/dist/types/src/components/TextEditor/extensions/blast.d.ts +0 -25
  48. package/dist/types/src/components/TextEditor/extensions/blast.d.ts.map +0 -1
  49. package/dist/types/src/components/TextEditor/extensions/image.d.ts +0 -4
  50. package/dist/types/src/components/TextEditor/extensions/image.d.ts.map +0 -1
  51. package/dist/types/src/components/TextEditor/extensions/mention.d.ts +0 -6
  52. package/dist/types/src/components/TextEditor/extensions/mention.d.ts.map +0 -1
  53. package/dist/types/src/components/TextEditor/extensions/table.d.ts +0 -8
  54. package/dist/types/src/components/TextEditor/extensions/table.d.ts.map +0 -1
  55. package/dist/types/src/hooks/yjs/yjs.stories.d.ts.map +0 -1
  56. package/src/components/TextEditor/extensions/blast.ts +0 -375
  57. package/src/components/TextEditor/extensions/image.ts +0 -68
  58. package/src/components/TextEditor/extensions/mention.ts +0 -31
  59. package/src/components/TextEditor/extensions/table.ts +0 -123
@@ -24,13 +24,13 @@ var autocomplete = ({ onSearch }) => {
24
24
  // TODO(burdon): Optional decoration via addToOptions
25
25
  override: [
26
26
  (context) => {
27
- const match = context.matchBefore(/\w*/);
28
- if (!match || match.from === match.to && !context.explicit) {
27
+ const word = context.matchBefore(/\w*/);
28
+ if (!word || word.from === word.to && !context.explicit) {
29
29
  return null;
30
30
  }
31
31
  return {
32
- from: match.from,
33
- options: onSearch(match.text.toLowerCase())
32
+ from: word.from,
33
+ options: onSearch(word.text.toLowerCase())
34
34
  };
35
35
  }
36
36
  ]
@@ -43,7 +43,7 @@ import { closeBrackets } from "@codemirror/autocomplete";
43
43
  import { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from "@codemirror/language";
44
44
  import { oneDarkHighlightStyle } from "@codemirror/theme-one-dark";
45
45
  import { EditorView, placeholder } from "@codemirror/view";
46
- var basicBundle = ({ readonly, themeMode, placeholder: _placeholder }) => [
46
+ var basicBundle = ({ themeMode, placeholder: _placeholder }) => [
47
47
  // TODO(burdon): Compare with minimalSetup.
48
48
  // https://codemirror.net/docs/ref/#codemirror.minimalSetup
49
49
  bracketMatching(),
@@ -54,324 +54,8 @@ var basicBundle = ({ readonly, themeMode, placeholder: _placeholder }) => [
54
54
  themeMode === "dark" ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle)
55
55
  ].filter(Boolean);
56
56
 
57
- // packages/ui/react-ui-editor/src/components/TextEditor/extensions/blast.ts
58
- import { StateField } from "@codemirror/state";
59
- import { EditorView as EditorView2, keymap as keymap2 } from "@codemirror/view";
60
- import defaultsDeep from "lodash.defaultsdeep";
61
- 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";
63
- var defaultOptions = {
64
- maxParticles: 200,
65
- particleGravity: 0.08,
66
- particleAlphaFadeout: 0.996,
67
- particleSize: {
68
- min: 2,
69
- max: 8
70
- },
71
- particleNumRange: {
72
- min: 5,
73
- max: 10
74
- },
75
- particleVelocityRange: {
76
- x: [
77
- -1,
78
- 1
79
- ],
80
- y: [
81
- -3.5,
82
- -1.5
83
- ]
84
- },
85
- particleShrinkRate: 0.95,
86
- shakeIntensity: 5
87
- };
88
- var blast = (options) => {
89
- let blaster;
90
- let last = 0;
91
- const getPoint = (view, pos) => {
92
- const { left: x = 0, top: y = 0 } = view.coordsForChar(pos) ?? {};
93
- const element = document.elementFromPoint(x, y);
94
- const { offsetLeft: left = 0, offsetTop: top = 0 } = view.scrollDOM.parentElement ?? {};
95
- const point = {
96
- x: x - left,
97
- y: y - top
98
- };
99
- return {
100
- element,
101
- point
102
- };
103
- };
104
- return [
105
- // Cursor moved.
106
- EditorView2.updateListener.of((update4) => {
107
- if (blaster?.node !== update4.view.scrollDOM) {
108
- if (blaster) {
109
- blaster.destroy();
110
- }
111
- blaster = new Blaster(update4.view.scrollDOM, defaultsDeep({}, options, defaultOptions));
112
- blaster.initialize();
113
- blaster.start();
114
- } else {
115
- blaster.resize();
116
- }
117
- const current = update4.view.state.selection.main.head;
118
- if (current !== last) {
119
- last = current;
120
- const { element, point } = getPoint(update4.view, current);
121
- if (element && point) {
122
- blaster.spawn({
123
- element,
124
- point
125
- });
126
- }
127
- }
128
- }),
129
- // Document changed.
130
- StateField.define({
131
- create: () => null,
132
- update: (_value, transaction) => {
133
- if (blaster && transaction.docChanged) {
134
- const view = EditorView2.findFromDOM(blaster.node);
135
- const { element, point } = getPoint(view, transaction.selection.main.head);
136
- if (element && point) {
137
- blaster.spawn({
138
- element,
139
- point
140
- });
141
- }
142
- }
143
- return null;
144
- }
145
- }),
146
- keymap2.of([
147
- {
148
- any: (view, event) => {
149
- if (blaster && event.key === "Enter" && event.shiftKey) {
150
- blaster.shake({
151
- time: 0.4
152
- });
153
- }
154
- return false;
155
- }
156
- }
157
- ])
158
- ];
159
- };
160
- var Blaster = class {
161
- constructor(_node, _options) {
162
- this._node = _node;
163
- this._options = _options;
164
- this._running = false;
165
- this._shakeTime = 0;
166
- this._shakeTimeMax = 0;
167
- this._particles = [];
168
- this._particlePointer = 0;
169
- this._lastPoint = {
170
- x: 0,
171
- y: 0
172
- };
173
- this.shake = throttle(({ time }) => {
174
- this._shakeTime = this._shakeTimeMax;
175
- this._shakeTimeMax = time;
176
- }, 100);
177
- this.spawn = throttle(({ element, point }) => {
178
- const color = getRGBComponents(element, this._options.color);
179
- const numParticles = random(this._options.particleNumRange.min, this._options.particleNumRange.max);
180
- const dir = this._lastPoint.x === point.x ? 0 : this._lastPoint.x < point.x ? 1 : -1;
181
- this._lastPoint = point;
182
- for (let i = numParticles; i--; i > 0) {
183
- this._particles[this._particlePointer] = this._effect.create(point.x - dir * 16, point.y, color);
184
- this._particlePointer = (this._particlePointer + 1) % this._options.maxParticles;
185
- }
186
- }, 100);
187
- this._effect = this._options.effect === 1 ? new Effect1(_options) : new Effect2(_options);
188
- }
189
- get node() {
190
- return this._node;
191
- }
192
- initialize() {
193
- invariant(!this._canvas && !this._ctx, void 0, {
194
- F: __dxlog_file,
195
- L: 140,
196
- S: this,
197
- A: [
198
- "!this._canvas && !this._ctx",
199
- ""
200
- ]
201
- });
202
- this._canvas = document.createElement("canvas");
203
- this._canvas.id = "code-blast-canvas";
204
- this._canvas.style.position = "absolute";
205
- this._canvas.style.zIndex = "0";
206
- this._canvas.style.pointerEvents = "none";
207
- this._ctx = this._canvas.getContext("2d");
208
- const parent = this._node.parentElement?.parentElement;
209
- parent?.appendChild(this._canvas);
210
- this.resize();
211
- }
212
- destroy() {
213
- this.stop();
214
- if (this._canvas) {
215
- this._canvas.remove();
216
- this._canvas = void 0;
217
- this._ctx = void 0;
218
- }
219
- }
220
- resize() {
221
- if (this._node.parentElement && this._canvas) {
222
- const { offsetLeft: x, offsetTop: y, offsetWidth: width, offsetHeight: height } = this._node.parentElement;
223
- this._canvas.style.top = `${y}px`;
224
- this._canvas.style.left = `${x}px`;
225
- this._canvas.width = width;
226
- this._canvas.height = height;
227
- }
228
- }
229
- start() {
230
- invariant(this._canvas && this._ctx, void 0, {
231
- F: __dxlog_file,
232
- L: 179,
233
- S: this,
234
- A: [
235
- "this._canvas && this._ctx",
236
- ""
237
- ]
238
- });
239
- this._running = true;
240
- this.loop();
241
- }
242
- stop() {
243
- this._running = false;
244
- this._node.style.transform = "translate(0px, 0px)";
245
- }
246
- loop() {
247
- if (!this._running || !this._canvas || !this._ctx) {
248
- return;
249
- }
250
- this._ctx.clearRect(0, 0, this._canvas.width ?? 0, this._canvas.height ?? 0);
251
- const now = (/* @__PURE__ */ new Date()).getTime();
252
- this._lastTime ??= now;
253
- const dt = (now - this._lastTime) / 1e3;
254
- this._lastTime = now;
255
- if (this._shakeTime > 0) {
256
- this._shakeTime -= dt;
257
- const magnitude = this._shakeTime / this._shakeTimeMax * this._options.shakeIntensity;
258
- const shakeX = random(-magnitude, magnitude);
259
- const shakeY = random(-magnitude, magnitude);
260
- this._node.style.transform = `translate(${shakeX}px,${shakeY}px)`;
261
- }
262
- this.drawParticles();
263
- requestAnimationFrame(this.loop.bind(this));
264
- }
265
- drawParticles() {
266
- for (let i = this._particles.length; i--; i > 0) {
267
- const particle = this._particles[i];
268
- if (!particle) {
269
- continue;
270
- }
271
- if (particle.alpha < 0.01 || particle.size <= 0.5) {
272
- continue;
273
- }
274
- this._effect.update(this._ctx, particle);
275
- }
276
- }
277
- };
278
- var Effect = class {
279
- constructor(_options) {
280
- this._options = _options;
281
- }
282
- };
283
- var Effect1 = class extends Effect {
284
- create(x, y, color) {
285
- return {
286
- x,
287
- y: y + 10,
288
- vx: random(this._options.particleVelocityRange.x[0], this._options.particleVelocityRange.x[1]),
289
- vy: random(this._options.particleVelocityRange.y[0], this._options.particleVelocityRange.y[1]),
290
- size: random(this._options.particleSize.min, this._options.particleSize.max),
291
- color,
292
- alpha: 1
293
- };
294
- }
295
- update(ctx, particle) {
296
- particle.vy += this._options.particleGravity;
297
- particle.x += particle.vx;
298
- particle.y += particle.vy;
299
- particle.alpha *= this._options.particleAlphaFadeout;
300
- ctx.fillStyle = `rgba(${particle.color[0]},${particle.color[1]},${particle.color[2]},${particle.alpha})`;
301
- ctx.fillRect(Math.round(particle.x - 1), Math.round(particle.y - 1), particle.size, particle.size);
302
- }
303
- };
304
- var Effect2 = class extends Effect {
305
- create(x, y, color) {
306
- return {
307
- x,
308
- y: y + 10,
309
- vx: random(this._options.particleVelocityRange.x[0], this._options.particleVelocityRange.x[1]),
310
- vy: random(this._options.particleVelocityRange.y[0], this._options.particleVelocityRange.y[1]),
311
- size: random(this._options.particleSize.min, this._options.particleSize.max),
312
- color,
313
- alpha: 1,
314
- theta: random(0, 360) * Math.PI / 180,
315
- drag: 0.92,
316
- wander: 0.15
317
- };
318
- }
319
- update(ctx, particle) {
320
- particle.vy += this._options.particleGravity;
321
- particle.x += particle.vx;
322
- particle.y += particle.vy;
323
- particle.vx *= particle.drag;
324
- particle.vy *= particle.drag;
325
- particle.theta += random(-0.5, 0.5);
326
- particle.vx += Math.sin(particle.theta) * 0.1;
327
- particle.vy += Math.cos(particle.theta) * 0.1;
328
- particle.size *= this._options.particleShrinkRate;
329
- particle.alpha *= this._options.particleAlphaFadeout;
330
- ctx.fillStyle = `rgba(${particle.color[0]},${particle.color[1]},${particle.color[2]},${particle.alpha})`;
331
- ctx.beginPath();
332
- ctx.arc(Math.round(particle.x - 1), Math.round(particle.y - 1), particle.size, 0, 2 * Math.PI);
333
- ctx.fill();
334
- }
335
- };
336
- function throttle(callback, limit) {
337
- let wait = false;
338
- return function(...args) {
339
- if (!wait) {
340
- callback.apply(this, args);
341
- wait = true;
342
- setTimeout(() => {
343
- wait = false;
344
- }, limit);
345
- }
346
- };
347
- }
348
- var getRGBComponents = (node, color) => {
349
- if (typeof color === "function") {
350
- return color();
351
- }
352
- const bgColor = getComputedStyle(node).color;
353
- if (bgColor) {
354
- const x = bgColor.match(/(\d+), (\d+), (\d+)/)?.slice(1);
355
- if (x) {
356
- return x;
357
- }
358
- }
359
- return [
360
- 50,
361
- 50,
362
- 50
363
- ];
364
- };
365
- var random = (min, max) => {
366
- if (!max) {
367
- max = min;
368
- min = 0;
369
- }
370
- return min + ~~(Math.random() * (max - min + 1));
371
- };
372
-
373
57
  // packages/ui/react-ui-editor/src/components/TextEditor/extensions/demo.ts
374
- import { keymap as keymap3 } from "@codemirror/view";
58
+ import { keymap as keymap2 } from "@codemirror/view";
375
59
  var defaultItems = [
376
60
  "hello world!",
377
61
  "this is a test.",
@@ -381,7 +65,7 @@ var demo = ({ delay = 75, items = defaultItems } = {}) => {
381
65
  let t;
382
66
  let idx = 0;
383
67
  return [
384
- keymap3.of([
68
+ keymap2.of([
385
69
  {
386
70
  // Reset.
387
71
  key: "alt-meta-'",
@@ -428,17 +112,17 @@ var demo = ({ delay = 75, items = defaultItems } = {}) => {
428
112
  };
429
113
 
430
114
  // packages/ui/react-ui-editor/src/components/TextEditor/extensions/comments.ts
431
- import { keymap as keymap4, Decoration, EditorView as EditorView3, MatchDecorator, ViewPlugin, WidgetType } from "@codemirror/view";
115
+ import { keymap as keymap3, Decoration, EditorView as EditorView2, MatchDecorator, ViewPlugin, WidgetType } from "@codemirror/view";
432
116
  import { debounce } from "@dxos/async";
433
- import { invariant as invariant2 } from "@dxos/invariant";
434
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/components/TextEditor/extensions/comments.ts";
117
+ import { invariant } from "@dxos/invariant";
118
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/components/TextEditor/extensions/comments.ts";
435
119
  var BookmarkWidget = class extends WidgetType {
436
120
  constructor(_pos, _id) {
437
121
  super();
438
122
  this._pos = _pos;
439
123
  this._id = _id;
440
- invariant2(this._id, void 0, {
441
- F: __dxlog_file2,
124
+ invariant(this._id, void 0, {
125
+ F: __dxlog_file,
442
126
  L: 41,
443
127
  S: this,
444
128
  A: [
@@ -457,7 +141,7 @@ var BookmarkWidget = class extends WidgetType {
457
141
  return span;
458
142
  }
459
143
  };
460
- var styles = EditorView3.baseTheme({
144
+ var styles = EditorView2.baseTheme({
461
145
  "& .cm-bookmark": {
462
146
  cursor: "pointer",
463
147
  margin: "4px",
@@ -484,12 +168,12 @@ var comments = (options = {}) => {
484
168
  constructor(view) {
485
169
  this.bookmarks = bookmarkMatcher.createDeco(view);
486
170
  }
487
- update(update4) {
488
- this.bookmarks = bookmarkMatcher.updateDeco(update4, this.bookmarks);
171
+ update(update2) {
172
+ this.bookmarks = bookmarkMatcher.updateDeco(update2, this.bookmarks);
489
173
  }
490
174
  }, {
491
175
  decorations: (instance) => instance.bookmarks,
492
- provide: (plugin) => EditorView3.atomicRanges.of((view) => {
176
+ provide: (plugin) => EditorView2.atomicRanges.of((view) => {
493
177
  return view.plugin(plugin)?.bookmarks || Decoration.none;
494
178
  })
495
179
  });
@@ -497,7 +181,7 @@ var comments = (options = {}) => {
497
181
  options.onUpdate?.(data);
498
182
  }, 200);
499
183
  return [
500
- keymap4.of([
184
+ keymap3.of([
501
185
  {
502
186
  key: options?.key ?? "shift-meta-c",
503
187
  run: (view) => {
@@ -522,12 +206,12 @@ var comments = (options = {}) => {
522
206
  ]),
523
207
  bookmarks,
524
208
  // Monitor cursor movement.
525
- EditorView3.updateListener.of((update4) => {
209
+ EditorView2.updateListener.of((update2) => {
526
210
  active = void 0;
527
211
  if (!options.onUpdate) {
528
212
  return;
529
213
  }
530
- const view = update4.view;
214
+ const view = update2.view;
531
215
  const pos = view.state.selection.main.head;
532
216
  const decorations = [];
533
217
  const rangeSet = view.plugin(bookmarks)?.bookmarks;
@@ -563,62 +247,11 @@ var comments = (options = {}) => {
563
247
  ];
564
248
  };
565
249
 
566
- // packages/ui/react-ui-editor/src/components/TextEditor/extensions/image.ts
567
- import { syntaxTree } from "@codemirror/language";
568
- import { RangeSetBuilder, StateField as StateField2 } from "@codemirror/state";
569
- import { Decoration as Decoration2, EditorView as EditorView4, WidgetType as WidgetType2 } from "@codemirror/view";
570
- var image = (options = {}) => {
571
- return StateField2.define({
572
- create: (state) => update(state, options),
573
- update: (_, tr) => update(tr.state, options),
574
- provide: (field) => EditorView4.decorations.from(field)
575
- });
576
- };
577
- var update = (state, options) => {
578
- const builder = new RangeSetBuilder();
579
- syntaxTree(state).iterate({
580
- enter: (node) => {
581
- if (node.name === "Image") {
582
- const urlNode = node.node.getChild("URL");
583
- if (urlNode) {
584
- const url = state.sliceDoc(urlNode.from, urlNode.to);
585
- builder.add(state.readOnly ? node.from : node.to, node.to, Decoration2.widget({
586
- widget: new ImageWidget(url)
587
- }));
588
- }
589
- }
590
- }
591
- });
592
- return builder.finish();
593
- };
594
- var ImageWidget = class extends WidgetType2 {
595
- constructor(_url) {
596
- super();
597
- this._url = _url;
598
- }
599
- eq(other) {
600
- return this._url === other?._url;
601
- }
602
- toDOM(view) {
603
- const img = document.createElement("img");
604
- img.setAttribute("src", this._url);
605
- img.setAttribute("class", "cm-image");
606
- return img;
607
- }
608
- };
609
-
610
250
  // packages/ui/react-ui-editor/src/components/TextEditor/extensions/link.ts
611
- import { syntaxTree as syntaxTree2 } from "@codemirror/language";
612
- import { RangeSetBuilder as RangeSetBuilder2, StateField as StateField3 } from "@codemirror/state";
613
- import { Decoration as Decoration3, EditorView as EditorView5, WidgetType as WidgetType3 } from "@codemirror/view";
614
- var link = (options = {}) => {
615
- return StateField3.define({
616
- create: (state) => update2(state, options),
617
- update: (_, tr) => update2(tr.state, options),
618
- provide: (field) => EditorView5.decorations.from(field)
619
- });
620
- };
621
- var LinkButton = class extends WidgetType3 {
251
+ import { syntaxTree } from "@codemirror/language";
252
+ import { RangeSetBuilder, StateField } from "@codemirror/state";
253
+ import { Decoration as Decoration2, EditorView as EditorView3, WidgetType as WidgetType2 } from "@codemirror/view";
254
+ var LinkButton = class extends WidgetType2 {
622
255
  constructor(_pos, _url, _onAttach) {
623
256
  super();
624
257
  this._pos = _pos;
@@ -634,7 +267,7 @@ var LinkButton = class extends WidgetType3 {
634
267
  return el;
635
268
  }
636
269
  };
637
- var LinkText = class extends WidgetType3 {
270
+ var LinkText = class extends WidgetType2 {
638
271
  constructor(_pos, _text, _url) {
639
272
  super();
640
273
  this._pos = _pos;
@@ -664,10 +297,10 @@ var LinkText = class extends WidgetType3 {
664
297
  return link2;
665
298
  }
666
299
  };
667
- var update2 = (state, options) => {
668
- const builder = new RangeSetBuilder2();
300
+ var update = (state, options) => {
301
+ const builder = new RangeSetBuilder();
669
302
  const cursor = state.selection.main.head;
670
- syntaxTree2(state).iterate({
303
+ syntaxTree(state).iterate({
671
304
  enter: (node) => {
672
305
  if (node.name === "Link") {
673
306
  const marks = node.node.getChildren("LinkMark");
@@ -678,12 +311,12 @@ var update2 = (state, options) => {
678
311
  return false;
679
312
  }
680
313
  if (cursor < node.from || cursor > node.to) {
681
- builder.add(node.from, node.to, Decoration3.replace({
314
+ builder.add(node.from, node.to, Decoration2.replace({
682
315
  widget: new LinkText(node.from, text, options.link ? url : void 0)
683
316
  }));
684
317
  }
685
318
  if (options.onRender) {
686
- builder.add(node.to, node.to, Decoration3.replace({
319
+ builder.add(node.to, node.to, Decoration2.replace({
687
320
  widget: new LinkButton(node.from, url, options.onRender)
688
321
  }));
689
322
  }
@@ -693,70 +326,52 @@ var update2 = (state, options) => {
693
326
  });
694
327
  return builder.finish();
695
328
  };
329
+ var link = (options = {}) => {
330
+ return StateField.define({
331
+ create: (state) => update(state, options),
332
+ update: (_, tr) => update(tr.state, options),
333
+ provide: (field) => EditorView3.decorations.from(field)
334
+ });
335
+ };
696
336
 
697
337
  // packages/ui/react-ui-editor/src/components/TextEditor/extensions/listener.ts
698
- import { StateField as StateField4 } from "@codemirror/state";
699
- var listener = ({ onChange }) => {
700
- return StateField4.define({
701
- create: () => null,
702
- update: (_value, transaction) => {
703
- if (transaction.docChanged && onChange) {
704
- onChange(transaction.newDoc.toString());
705
- }
706
- return null;
338
+ import { StateField as StateField2 } from "@codemirror/state";
339
+ var listener = ({ onChange }) => StateField2.define({
340
+ create: () => null,
341
+ update: (_value, transaction) => {
342
+ if (transaction.docChanged && onChange) {
343
+ onChange(transaction.newDoc.toString());
707
344
  }
708
- });
709
- };
345
+ return null;
346
+ }
347
+ });
710
348
 
711
349
  // packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/bundle.ts
712
350
  import { closeBrackets as closeBrackets2, closeBracketsKeymap } from "@codemirror/autocomplete";
713
- import { defaultKeymap, history, historyKeymap, indentWithTab } from "@codemirror/commands";
351
+ import { defaultKeymap, history, indentWithTab } from "@codemirror/commands";
714
352
  import { markdownLanguage as markdownLanguage2, markdown } from "@codemirror/lang-markdown";
715
353
  import { bracketMatching as bracketMatching2, defaultHighlightStyle as defaultHighlightStyle2, indentOnInput, syntaxHighlighting as syntaxHighlighting2 } from "@codemirror/language";
716
354
  import { languages } from "@codemirror/language-data";
717
355
  import { highlightSelectionMatches, searchKeymap } from "@codemirror/search";
718
356
  import { EditorState } from "@codemirror/state";
719
357
  import { oneDarkHighlightStyle as oneDarkHighlightStyle2 } from "@codemirror/theme-one-dark";
720
- import { crosshairCursor, drawSelection, dropCursor, EditorView as EditorView6, highlightActiveLine, highlightActiveLineGutter, highlightSpecialChars, keymap as keymap5, placeholder as placeholder2, rectangularSelection } from "@codemirror/view";
358
+ import { crosshairCursor, drawSelection, dropCursor, EditorView as EditorView4, highlightActiveLine, highlightActiveLineGutter, highlightSpecialChars, keymap as keymap4, placeholder as placeholder2, rectangularSelection } from "@codemirror/view";
721
359
 
722
360
  // packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/highlight.ts
723
361
  import { markdownLanguage } from "@codemirror/lang-markdown";
724
362
  import { HighlightStyle } from "@codemirror/language";
725
363
  import { tags, styleTags, Tag } from "@lezer/highlight";
726
364
  import get from "lodash.get";
727
- import { mx as mx2 } from "@dxos/react-ui-theme";
728
365
 
729
366
  // packages/ui/react-ui-editor/src/styles/markdown.ts
730
367
  import { mx } from "@dxos/react-ui-theme";
731
- var headings = {
732
- 1: [
733
- "mbs-4 mbe-2 font-medium text-inherit no-underline text-4xl",
734
- "-ml-1.5"
735
- ],
736
- 2: [
737
- "mbs-4 mbe-2 font-medium text-inherit no-underline text-3xl",
738
- "-ml-1.5"
739
- ],
740
- 3: [
741
- "mbs-4 mbe-2 font-medium text-inherit no-underline text-2xl",
742
- "-ml-1.5"
743
- ],
744
- 4: [
745
- "mbs-4 mbe-2 font-medium text-inherit no-underline text-xl",
746
- "-ml-[5px]"
747
- ],
748
- 5: [
749
- "mbs-4 mbe-2 font-medium text-inherit no-underline text-lg",
750
- "-ml-[5px]"
751
- ],
752
- 6: [
753
- "mbs-4 mbe-2 font-medium text-inherit no-underline",
754
- "-ml-[4px]"
755
- ]
756
- };
757
- var heading = (level, readonly) => {
758
- const [style, offset] = headings[level];
759
- return mx(style, readonly && offset);
368
+ var heading = {
369
+ 1: "mbs-4 mbe-2 font-medium text-inherit no-underline text-4xl",
370
+ 2: "mbs-4 mbe-2 font-medium text-inherit no-underline text-3xl",
371
+ 3: "mbs-4 mbe-2 font-medium text-inherit no-underline text-2xl",
372
+ 4: "mbs-4 mbe-2 font-medium text-inherit no-underline text-xl",
373
+ 5: "mbs-4 mbe-2 font-medium text-inherit no-underline text-lg",
374
+ 6: "mbs-4 mbe-2 font-medium text-inherit no-underline"
760
375
  };
761
376
  var light = "text-neutral-200 dark:text-neutral-800";
762
377
  var mark = mx("!font-normal !no-underline !text-inherit opacity-40", light);
@@ -767,7 +382,7 @@ var code = "font-mono !no-underline text-neutral-700 dark:text-neutral-300";
767
382
  var codeMark = "font-mono text-primary-500";
768
383
  var inlineUrl = mx(code, "px-1");
769
384
  var blockquote = mx("pl-1 mr-1 border-is-4 border-primary-500/70 dark:border-primary-500/30", light);
770
- var horizontalRule = "flex mlb-4 border-b text-neutral-100 dark:text-neutral-900 border-neutral-200 dark:border-neutral-800";
385
+ var horizontalRule = "flex mlb-4 border-b text-neutral-100 dark:text-neutral-900 border-neutral-500/50";
771
386
 
772
387
  // packages/ui/react-ui-editor/src/styles/tokens.ts
773
388
  import { tailwindConfig } from "@dxos/react-ui-theme";
@@ -793,7 +408,7 @@ var markdownTagsExtension = {
793
408
  styleTags(markdownTags)
794
409
  ]
795
410
  };
796
- var markdownHighlightStyle = (readonly) => HighlightStyle.define([
411
+ var markdownHighlightStyle = HighlightStyle.define([
797
412
  {
798
413
  tag: [
799
414
  tags.keyword,
@@ -837,54 +452,40 @@ var markdownHighlightStyle = (readonly) => HighlightStyle.define([
837
452
  tag: [
838
453
  tags.meta,
839
454
  tags.processingInstruction,
455
+ markdownTags.CodeMark,
456
+ markdownTags.EmphasisMark,
457
+ markdownTags.HeaderMark,
840
458
  markdownTags.LinkLabel,
841
459
  markdownTags.LinkReference,
842
- markdownTags.ListMark
460
+ markdownTags.ListMark,
461
+ markdownTags.QuoteMark
843
462
  ],
844
463
  class: mark
845
464
  },
846
- // Markdown marks.
847
- {
848
- tag: [
849
- markdownTags.CodeMark,
850
- markdownTags.HeaderMark,
851
- markdownTags.QuoteMark,
852
- markdownTags.EmphasisMark
853
- ],
854
- class: readonly ? "hidden" : mark
855
- },
856
- // E.g., code block language (after ```).
857
- {
858
- tag: [
859
- tags.function(tags.variableName),
860
- tags.labelName
861
- ],
862
- class: readonly ? "hidden" : codeMark
863
- },
864
465
  // Headings.
865
466
  {
866
467
  tag: tags.heading1,
867
- class: heading(1, readonly)
468
+ class: heading[1]
868
469
  },
869
470
  {
870
471
  tag: tags.heading2,
871
- class: heading(2, readonly)
472
+ class: heading[2]
872
473
  },
873
474
  {
874
475
  tag: tags.heading3,
875
- class: heading(3, readonly)
476
+ class: heading[3]
876
477
  },
877
478
  {
878
479
  tag: tags.heading4,
879
- class: heading(4, readonly)
480
+ class: heading[4]
880
481
  },
881
482
  {
882
483
  tag: tags.heading5,
883
- class: heading(5, readonly)
484
+ class: heading[5]
884
485
  },
885
486
  {
886
487
  tag: tags.heading6,
887
- class: heading(6, readonly)
488
+ class: heading[6]
888
489
  },
889
490
  // Emphasis.
890
491
  {
@@ -906,6 +507,14 @@ var markdownHighlightStyle = (readonly) => HighlightStyle.define([
906
507
  ],
907
508
  class: inlineUrl
908
509
  },
510
+ // E.g., code block language (after ```).
511
+ {
512
+ tag: [
513
+ tags.function(tags.variableName),
514
+ tags.labelName
515
+ ],
516
+ class: codeMark
517
+ },
909
518
  // NOTE: The `markdown` extension configures extensions for `lezer` to parse markdown tokens (incl. below).
910
519
  // However, since `codeLanguages` is also defined, the `lezer` will not parse fenced code blocks,
911
520
  // when a language is specified. In this case, the syntax highlighting extensions will colorize
@@ -928,7 +537,7 @@ var markdownHighlightStyle = (readonly) => HighlightStyle.define([
928
537
  tag: [
929
538
  markdownTags.HorizontalRule
930
539
  ],
931
- class: mx2(horizontalRule, readonly && "-indent-[100rem]")
540
+ class: horizontalRule
932
541
  }
933
542
  ], {
934
543
  scope: markdownLanguage,
@@ -938,13 +547,13 @@ var markdownHighlightStyle = (readonly) => HighlightStyle.define([
938
547
  });
939
548
 
940
549
  // packages/ui/react-ui-editor/src/components/TextEditor/extensions/markdown/bundle.ts
941
- var markdownBundle = ({ readonly, themeMode, placeholder: _placeholder }) => {
550
+ var markdownBundle = ({ themeMode, placeholder: _placeholder }) => {
942
551
  return [
943
552
  bracketMatching2(),
944
553
  closeBrackets2(),
945
554
  _placeholder && placeholder2(_placeholder),
946
555
  EditorState.allowMultipleSelections.of(true),
947
- EditorView6.lineWrapping,
556
+ EditorView4.lineWrapping,
948
557
  crosshairCursor(),
949
558
  dropCursor(),
950
559
  drawSelection(),
@@ -955,17 +564,14 @@ var markdownBundle = ({ readonly, themeMode, placeholder: _placeholder }) => {
955
564
  history(),
956
565
  indentOnInput(),
957
566
  rectangularSelection(),
958
- // https://codemirror.net/docs/ref/#view.keymap
959
- keymap5.of([
960
- // https://codemirror.net/docs/ref/#commands.defaultKeymap
961
- ...defaultKeymap,
962
- // https://codemirror.net/docs/ref/#commands.historyKeymap
963
- ...historyKeymap,
964
- // https://codemirror.net/docs/ref/#autocomplete.closeBracketsKeymap
567
+ // TODO(burdon): Review.
568
+ keymap4.of([
965
569
  ...closeBracketsKeymap,
966
- // https://codemirror.net/docs/ref/#search.searchKeymap
570
+ ...defaultKeymap,
571
+ // ...foldKeymap,
572
+ // ...historyKeymap,
573
+ // ...lintKeymap,
967
574
  ...searchKeymap,
968
- // https://codemirror.net/docs/ref/#commands.indentWithTab
969
575
  indentWithTab
970
576
  ]),
971
577
  // Main extension.
@@ -986,132 +592,16 @@ var markdownBundle = ({ readonly, themeMode, placeholder: _placeholder }) => {
986
592
  markdownTagsExtension
987
593
  ]
988
594
  }),
989
- // https://github.com/codemirror/theme-one-dark
990
- themeMode === "dark" ? syntaxHighlighting2(oneDarkHighlightStyle2) : syntaxHighlighting2(defaultHighlightStyle2),
991
595
  // Custom styles.
992
- syntaxHighlighting2(markdownHighlightStyle(readonly))
596
+ syntaxHighlighting2(markdownHighlightStyle),
597
+ // TODO(thure): All but one rule here apply to both themes; rename or refactor.
598
+ themeMode === "dark" ? syntaxHighlighting2(oneDarkHighlightStyle2) : syntaxHighlighting2(defaultHighlightStyle2)
993
599
  ].filter(Boolean);
994
600
  };
995
601
 
996
- // packages/ui/react-ui-editor/src/components/TextEditor/extensions/mention.ts
997
- import { autocompletion as autocompletion2 } from "@codemirror/autocomplete";
998
- var mention = ({ onSearch }) => {
999
- return autocompletion2({
1000
- closeOnBlur: false,
1001
- override: [
1002
- (context) => {
1003
- const match = context.matchBefore(/@(\w+)?/);
1004
- if (!match || match.from === match.to && !context.explicit) {
1005
- return null;
1006
- }
1007
- console.log(match);
1008
- return {
1009
- from: match.from,
1010
- options: onSearch(match.text.slice(1).toLowerCase()).map((value) => ({
1011
- label: `@${value}`
1012
- }))
1013
- };
1014
- }
1015
- ]
1016
- });
1017
- };
1018
-
1019
- // packages/ui/react-ui-editor/src/components/TextEditor/extensions/table.ts
1020
- import { syntaxTree as syntaxTree3 } from "@codemirror/language";
1021
- import { RangeSetBuilder as RangeSetBuilder3, StateField as StateField5 } from "@codemirror/state";
1022
- import { Decoration as Decoration4, EditorView as EditorView7, WidgetType as WidgetType4 } from "@codemirror/view";
1023
- var table = (options = {}) => {
1024
- return StateField5.define({
1025
- create: (state) => update3(state, options),
1026
- update: (_, tr) => update3(tr.state, options),
1027
- provide: (field) => EditorView7.decorations.from(field)
1028
- });
1029
- };
1030
- var update3 = (state, options) => {
1031
- const builder = new RangeSetBuilder3();
1032
- if (state.readOnly) {
1033
- const tables = [];
1034
- const getTable = () => tables[tables.length - 1];
1035
- const getRow = () => {
1036
- const table2 = getTable();
1037
- return table2.rows?.[table2.rows.length - 1];
1038
- };
1039
- syntaxTree3(state).iterate({
1040
- enter: (node) => {
1041
- switch (node.name) {
1042
- case "Table": {
1043
- tables.push({
1044
- from: node.from
1045
- });
1046
- break;
1047
- }
1048
- case "TableHeader": {
1049
- getTable().header = [];
1050
- break;
1051
- }
1052
- case "TableRow": {
1053
- (getTable().rows ??= []).push([]);
1054
- break;
1055
- }
1056
- case "TableCell": {
1057
- const row = getRow();
1058
- if (row) {
1059
- row.push(state.sliceDoc(node.from, node.to));
1060
- } else {
1061
- getTable().header?.push(state.sliceDoc(node.from, node.to));
1062
- }
1063
- break;
1064
- }
1065
- case "TableDelimiter": {
1066
- getTable().to = node.to;
1067
- break;
1068
- }
1069
- }
1070
- }
1071
- });
1072
- tables.forEach((table2) => builder.add(table2.from, table2.to, Decoration4.replace({
1073
- widget: new TableWidget(table2)
1074
- })));
1075
- }
1076
- return builder.finish();
1077
- };
1078
- var TableWidget = class extends WidgetType4 {
1079
- constructor(_table) {
1080
- super();
1081
- this._table = _table;
1082
- }
1083
- eq(other) {
1084
- return this._table.from === other?._table?.from;
1085
- }
1086
- toDOM(view) {
1087
- const table2 = document.createElement("table");
1088
- {
1089
- const header = table2.appendChild(document.createElement("thead"));
1090
- const row = header.appendChild(document.createElement("tr"));
1091
- this._table.header?.forEach((cell) => {
1092
- const th = document.createElement("th");
1093
- th.setAttribute("class", "cm-table-head");
1094
- row.appendChild(th).textContent = cell;
1095
- });
1096
- }
1097
- {
1098
- const body = table2.appendChild(document.createElement("tbody"));
1099
- this._table.rows?.forEach((row) => {
1100
- const tr = body.appendChild(document.createElement("tr"));
1101
- row.forEach((cell) => {
1102
- const td = document.createElement("td");
1103
- td.setAttribute("class", "cm-table-cell");
1104
- tr.appendChild(td).textContent = cell;
1105
- });
1106
- });
1107
- }
1108
- return table2;
1109
- }
1110
- };
1111
-
1112
602
  // packages/ui/react-ui-editor/src/components/TextEditor/extensions/tasklist.ts
1113
- import { EditorView as EditorView8, Decoration as Decoration5, WidgetType as WidgetType5, MatchDecorator as MatchDecorator2, ViewPlugin as ViewPlugin2 } from "@codemirror/view";
1114
- var CheckboxWidget = class extends WidgetType5 {
603
+ import { EditorView as EditorView5, Decoration as Decoration3, WidgetType as WidgetType3, MatchDecorator as MatchDecorator2, ViewPlugin as ViewPlugin2 } from "@codemirror/view";
604
+ var CheckboxWidget = class extends WidgetType3 {
1115
605
  constructor(_pos, _checked, _indent, _onCheck) {
1116
606
  super();
1117
607
  this._pos = _pos;
@@ -1130,35 +620,30 @@ var CheckboxWidget = class extends WidgetType5 {
1130
620
  const input = wrap.appendChild(document.createElement("input"));
1131
621
  input.type = "checkbox";
1132
622
  input.checked = this._checked;
1133
- if (!this._onCheck) {
1134
- input.setAttribute("disabled", "true");
1135
- }
1136
- if (this._onCheck) {
1137
- input.onchange = (event) => {
1138
- this._onCheck?.(event.target.checked);
1139
- return true;
1140
- };
1141
- }
623
+ input.onchange = (event) => {
624
+ this._onCheck(event.target.checked);
625
+ return true;
626
+ };
1142
627
  return wrap;
1143
628
  }
1144
629
  ignoreEvent() {
1145
630
  return false;
1146
631
  }
1147
632
  };
1148
- var styles2 = EditorView8.baseTheme({
633
+ var styles2 = EditorView5.baseTheme({
1149
634
  "& .cm-task-item": {
1150
635
  paddingLeft: "4px",
1151
636
  paddingRight: "8px"
1152
637
  }
1153
638
  });
1154
- var tasklist = (options = {}) => {
639
+ var tasklist = () => {
1155
640
  const taskMatcher = new MatchDecorator2({
1156
641
  regexp: /^(\s*)- \[([ xX])\]\s/g,
1157
642
  decoration: (match, view, pos) => {
1158
643
  const indent = Math.floor(match[1].length / 2);
1159
644
  const checked = match[2] === "x" || match[2] === "X";
1160
- return Decoration5.replace({
1161
- widget: new CheckboxWidget(pos, checked, indent, view.state.readOnly ? void 0 : (checked2) => {
645
+ return Decoration3.replace({
646
+ widget: new CheckboxWidget(pos, checked, indent, (checked2) => {
1162
647
  const idx = pos + match[0].indexOf("[") + 1;
1163
648
  view.dispatch({
1164
649
  changes: {
@@ -1179,13 +664,13 @@ var tasklist = (options = {}) => {
1179
664
  constructor(view) {
1180
665
  this.tasks = taskMatcher.createDeco(view);
1181
666
  }
1182
- update(update4) {
1183
- this.tasks = taskMatcher.updateDeco(update4, this.tasks);
667
+ update(update2) {
668
+ this.tasks = taskMatcher.updateDeco(update2, this.tasks);
1184
669
  }
1185
670
  }, {
1186
671
  decorations: (instance) => instance.tasks,
1187
- provide: (plugin) => EditorView8.atomicRanges.of((view) => {
1188
- return view.plugin(plugin)?.tasks || Decoration5.none;
672
+ provide: (plugin) => EditorView5.atomicRanges.of((view) => {
673
+ return view.plugin(plugin)?.tasks || Decoration3.none;
1189
674
  })
1190
675
  });
1191
676
  return [
@@ -1352,51 +837,8 @@ var defaultTheme = {
1352
837
  "& .cm-tooltip": {
1353
838
  border: "none"
1354
839
  },
1355
- "& .cm-tooltip-below": {},
1356
- //
1357
- // autocomplete
1358
- //
1359
- "& .cm-tooltip-autocomplete": {
1360
- marginTop: "4px",
1361
- marginLeft: "-3px"
1362
- },
1363
- "& .cm-tooltip-autocomplete ul li": {},
1364
- "& .cm-tooltip-autocomplete ul li[aria-selected]": {},
1365
- "& .cm-completionIcon": {
1366
- display: "none"
1367
- },
1368
- "& .cm-completionLabel": {
1369
- fontFamily: get2(tokens, "fontFamily.body", []).join(",")
1370
- },
1371
- "& .cm-completionMatchedText": {
1372
- textDecoration: "none"
1373
- },
1374
- //
1375
- // widgets
1376
- //
1377
- "& .cm-widgetBuffer": {
1378
- display: "none",
1379
- height: 0
1380
- },
1381
- //
1382
- // table
1383
- //
1384
- "& .cm-table-head": {
1385
- padding: "2px 16px 2px 0px",
1386
- borderBottom: `1px solid ${get2(tokens, "extend.colors.neutral.500")}`,
1387
- fontWeight: 100,
1388
- textAlign: "left",
1389
- color: get2(tokens, "extend.colors.neutral.500")
1390
- },
1391
- "& .cm-table-cell": {
1392
- padding: "2px 16px 2px 0px"
1393
- },
1394
- //
1395
- // image
1396
- //
1397
- "& .cm-image": {
1398
- margin: "0.5rem 0"
1399
- },
840
+ // '& .cm-tooltip-below': {},
841
+ // '& .cm-tooltip-autocomplete': {},
1400
842
  //
1401
843
  // font size
1402
844
  // TODO(thure): This appears to be the best or only way to set selection caret heights, but it's far more verbose than it needs to be.
@@ -1446,19 +888,19 @@ var codeTheme = {
1446
888
 
1447
889
  // packages/ui/react-ui-editor/src/components/TextEditor/TextEditor.tsx
1448
890
  import { EditorState as EditorState2 } from "@codemirror/state";
1449
- import { EditorView as EditorView9 } from "@codemirror/view";
891
+ import { EditorView as EditorView6 } from "@codemirror/view";
1450
892
  import { useFocusableGroup } from "@fluentui/react-tabster";
1451
893
  import { vim } from "@replit/codemirror-vim";
1452
- import defaultsDeep2 from "lodash.defaultsdeep";
894
+ import defaultsDeep from "lodash.defaultsdeep";
1453
895
  import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useState } from "react";
1454
896
  import { generateName } from "@dxos/display-name";
1455
897
  import { useThemeContext } from "@dxos/react-ui";
1456
- import { getColorForValue, inputSurface, mx as mx3 } from "@dxos/react-ui-theme";
898
+ import { getColorForValue, inputSurface, mx as mx2 } from "@dxos/react-ui-theme";
1457
899
  var EditorModes = [
1458
900
  "default",
1459
901
  "vim"
1460
902
  ];
1461
- var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, readonly, editorMode, extensions = [], slots = defaultSlots }, forwardedRef) => {
903
+ var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, extensions = [], slots = defaultSlots, editorMode }, forwardedRef) => {
1462
904
  const { themeMode } = useThemeContext();
1463
905
  const tabsterDOMAttribute = useFocusableGroup({
1464
906
  tabBehavior: "limited"
@@ -1503,14 +945,13 @@ var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, readonly, editorMode,
1503
945
  const state2 = EditorState2.create({
1504
946
  doc: model.text(),
1505
947
  extensions: [
1506
- readonly && EditorState2.readOnly.of(readonly),
1507
948
  // TODO(burdon): Factor out VIM mode?
1508
949
  editorMode === "vim" && vim(),
1509
950
  // Theme.
1510
- EditorView9.baseTheme(defaultTheme),
1511
- EditorView9.theme(slots?.editor?.theme ?? {}),
951
+ EditorView6.baseTheme(defaultTheme),
952
+ EditorView6.theme(slots?.editor?.theme ?? {}),
1512
953
  // TODO(burdon): themeMode doesn't change in storybooks.
1513
- EditorView9.darkTheme.of(themeMode === "dark"),
954
+ EditorView6.darkTheme.of(themeMode === "dark"),
1514
955
  // Storage and replication.
1515
956
  model.extension,
1516
957
  // Custom.
@@ -1518,7 +959,7 @@ var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, readonly, editorMode,
1518
959
  ].filter(Boolean)
1519
960
  });
1520
961
  view?.destroy();
1521
- setView(new EditorView9({
962
+ setView(new EditorView6({
1522
963
  state: state2,
1523
964
  parent: root
1524
965
  }));
@@ -1532,7 +973,6 @@ var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, readonly, editorMode,
1532
973
  root,
1533
974
  model,
1534
975
  themeMode,
1535
- readonly,
1536
976
  editorMode
1537
977
  ]);
1538
978
  const handleKeyUp = useCallback((event) => {
@@ -1569,15 +1009,13 @@ var maybeDebug = () => {
1569
1009
  }
1570
1010
  return [];
1571
1011
  };
1572
- var TextEditor = /* @__PURE__ */ forwardRef(({ readonly, extensions = [], slots: _slots, ...props }, forwardedRef) => {
1012
+ var TextEditor = /* @__PURE__ */ forwardRef(({ extensions = [], slots: _slots, ...props }, forwardedRef) => {
1573
1013
  const { themeMode } = useThemeContext();
1574
- const slots = defaultsDeep2({}, _slots, defaultTextSlots);
1014
+ const slots = defaultsDeep({}, _slots, defaultTextSlots);
1575
1015
  return /* @__PURE__ */ React.createElement(BaseTextEditor, {
1576
1016
  ref: forwardedRef,
1577
- readonly,
1578
1017
  extensions: [
1579
1018
  basicBundle({
1580
- readonly,
1581
1019
  themeMode,
1582
1020
  placeholder: slots?.editor?.placeholder
1583
1021
  }),
@@ -1588,15 +1026,13 @@ var TextEditor = /* @__PURE__ */ forwardRef(({ readonly, extensions = [], slots:
1588
1026
  ...props
1589
1027
  });
1590
1028
  });
1591
- var MarkdownEditor = /* @__PURE__ */ forwardRef(({ readonly, extensions = [], slots: _slots, ...props }, forwardedRef) => {
1029
+ var MarkdownEditor = /* @__PURE__ */ forwardRef(({ extensions = [], slots: _slots, ...props }, forwardedRef) => {
1592
1030
  const { themeMode } = useThemeContext();
1593
- const slots = defaultsDeep2({}, _slots, defaultMarkdownSlots);
1031
+ const slots = defaultsDeep({}, _slots, defaultMarkdownSlots);
1594
1032
  return /* @__PURE__ */ React.createElement(BaseTextEditor, {
1595
1033
  ref: forwardedRef,
1596
- readonly,
1597
1034
  extensions: [
1598
1035
  markdownBundle({
1599
- readonly,
1600
1036
  themeMode,
1601
1037
  placeholder: slots?.editor?.placeholder
1602
1038
  }),
@@ -1609,7 +1045,7 @@ var MarkdownEditor = /* @__PURE__ */ forwardRef(({ readonly, extensions = [], sl
1609
1045
  });
1610
1046
  var defaultSlots = {
1611
1047
  root: {
1612
- className: mx3("p-2", inputSurface)
1048
+ className: mx2("p-2", inputSurface)
1613
1049
  }
1614
1050
  };
1615
1051
  var defaultTextSlots = {
@@ -1629,11 +1065,11 @@ var defaultMarkdownSlots = {
1629
1065
  import get3 from "lodash.get";
1630
1066
  import { useEffect as useEffect2, useState as useState2 } from "react";
1631
1067
  import { yCollab } from "y-codemirror.next";
1632
- import { invariant as invariant3 } from "@dxos/invariant";
1068
+ import { invariant as invariant2 } from "@dxos/invariant";
1633
1069
  import { getRawDoc, isActualAutomergeObject } from "@dxos/react-client/echo";
1634
1070
 
1635
1071
  // packages/ui/react-ui-editor/src/hooks/automerge/plugin.ts
1636
- import { Annotation, Facet, StateEffect, StateField as StateField6 } from "@codemirror/state";
1072
+ import { Annotation, Facet, StateEffect, StateField as StateField3 } from "@codemirror/state";
1637
1073
  import { ViewPlugin as ViewPlugin3 } from "@codemirror/view";
1638
1074
  import * as automerge2 from "@dxos/automerge/automerge";
1639
1075
 
@@ -1822,7 +1258,7 @@ var semaphoreFacet = Facet.define({
1822
1258
  combine: (values) => values.at(-1)
1823
1259
  });
1824
1260
  var automergePlugin = (handle, path) => {
1825
- const stateField = StateField6.define({
1261
+ const stateField = StateField3.define({
1826
1262
  create: () => ({
1827
1263
  lastHeads: automerge2.getHeads(handle.docSync()),
1828
1264
  unreconciledTransactions: [],
@@ -1860,8 +1296,8 @@ var automergePlugin = (handle, path) => {
1860
1296
  this._view = view;
1861
1297
  handle.addListener("change", this._handleChange);
1862
1298
  }
1863
- update(update4) {
1864
- if (update4.transactions.length > 0 && update4.transactions.some((t) => !isReconcileTx(t))) {
1299
+ update(update2) {
1300
+ if (update2.transactions.length > 0 && update2.transactions.some((t) => !isReconcileTx(t))) {
1865
1301
  queueMicrotask(() => {
1866
1302
  this._view.state.facet(semaphoreFacet).reconcile(handle, this._view);
1867
1303
  });
@@ -1883,7 +1319,7 @@ var reconcileAnnotationType = Annotation.define();
1883
1319
  var isReconcileTx = (tr) => !!tr.annotation(reconcileAnnotationType);
1884
1320
 
1885
1321
  // packages/ui/react-ui-editor/src/hooks/yjs/cursors.ts
1886
- import * as random2 from "lib0/random";
1322
+ import * as random from "lib0/random";
1887
1323
  var cursorColors = [
1888
1324
  {
1889
1325
  color: "#30bced",
@@ -1918,7 +1354,7 @@ var cursorColors = [
1918
1354
  light: "#1be7ff33"
1919
1355
  }
1920
1356
  ];
1921
- var cursorColor = cursorColors[random2.uint32() % cursorColors.length];
1357
+ var cursorColor = cursorColors[random.uint32() % cursorColors.length];
1922
1358
 
1923
1359
  // packages/ui/react-ui-editor/src/hooks/yjs/space-provider.ts
1924
1360
  import * as decoding from "lib0/decoding";
@@ -1926,7 +1362,7 @@ import * as encoding from "lib0/encoding";
1926
1362
  import { Observable } from "lib0/observable";
1927
1363
  import * as awarenessProtocol from "y-protocols/awareness";
1928
1364
  import { log } from "@dxos/log";
1929
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/yjs/space-provider.ts";
1365
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/yjs/space-provider.ts";
1930
1366
  var messageAwareness = 1;
1931
1367
  var messageQueryAwareness = 3;
1932
1368
  var SpaceAwarenessProvider = class extends Observable {
@@ -1963,7 +1399,7 @@ var SpaceAwarenessProvider = class extends Observable {
1963
1399
  removed,
1964
1400
  origin
1965
1401
  }, {
1966
- F: __dxlog_file3,
1402
+ F: __dxlog_file2,
1967
1403
  L: 67,
1968
1404
  S: this,
1969
1405
  C: (f, a) => f(...a)
@@ -1976,7 +1412,7 @@ var SpaceAwarenessProvider = class extends Observable {
1976
1412
  }
1977
1413
  _handleSpaceMessage({ payload }) {
1978
1414
  log("space message", payload, {
1979
- F: __dxlog_file3,
1415
+ F: __dxlog_file2,
1980
1416
  L: 79,
1981
1417
  S: this,
1982
1418
  C: (f, a) => f(...a)
@@ -2021,7 +1457,7 @@ var SpaceAwarenessProvider = class extends Observable {
2021
1457
  };
2022
1458
 
2023
1459
  // packages/ui/react-ui-editor/src/hooks/useTextModel.ts
2024
- var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextModel.ts";
1460
+ var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextModel.ts";
2025
1461
  var useTextModel = ({ identity, space, text }) => {
2026
1462
  const [model, setModel] = useState2(() => createModel({
2027
1463
  identity,
@@ -2053,8 +1489,8 @@ var createModel = (options) => {
2053
1489
  }
2054
1490
  };
2055
1491
  var createYjsModel = ({ identity, space, text }) => {
2056
- invariant3(text?.doc && text?.content, void 0, {
2057
- F: __dxlog_file4,
1492
+ invariant2(text?.doc && text?.content, void 0, {
1493
+ F: __dxlog_file3,
2058
1494
  L: 74,
2059
1495
  S: void 0,
2060
1496
  A: [
@@ -2107,17 +1543,14 @@ export {
2107
1543
  YXmlFragment,
2108
1544
  autocomplete,
2109
1545
  basicBundle,
2110
- blast,
2111
1546
  codeTheme,
2112
1547
  comments,
2113
1548
  cursorColor,
2114
1549
  defaultMarkdownSlots,
2115
- defaultOptions,
2116
1550
  defaultSlots,
2117
1551
  defaultTextSlots,
2118
1552
  defaultTheme,
2119
1553
  demo,
2120
- image,
2121
1554
  link,
2122
1555
  listener,
2123
1556
  markdownBundle,
@@ -2125,8 +1558,6 @@ export {
2125
1558
  markdownTags,
2126
1559
  markdownTagsExtension,
2127
1560
  markdownTheme,
2128
- mention,
2129
- table,
2130
1561
  tags2 as tags,
2131
1562
  tasklist,
2132
1563
  textTheme,