@dxos/react-ui-editor 0.8.3-main.7f5a14c → 0.8.3-staging.0fa589b

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 (76) hide show
  1. package/dist/lib/browser/index.mjs +371 -375
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node/index.cjs +502 -511
  5. package/dist/lib/node/index.cjs.map +4 -4
  6. package/dist/lib/node/meta.json +1 -1
  7. package/dist/lib/node-esm/index.mjs +371 -375
  8. package/dist/lib/node-esm/index.mjs.map +4 -4
  9. package/dist/lib/node-esm/meta.json +1 -1
  10. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  11. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +1 -1
  12. package/dist/types/src/components/Popover/RefPopover.d.ts.map +1 -1
  13. package/dist/types/src/defaults.d.ts +0 -1
  14. package/dist/types/src/defaults.d.ts.map +1 -1
  15. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  16. package/dist/types/src/extensions/command/action.d.ts.map +1 -1
  17. package/dist/types/src/extensions/command/command-menu.d.ts +20 -0
  18. package/dist/types/src/extensions/command/command-menu.d.ts.map +1 -0
  19. package/dist/types/src/extensions/command/command.d.ts.map +1 -1
  20. package/dist/types/src/extensions/command/floating-menu.d.ts +7 -0
  21. package/dist/types/src/extensions/command/floating-menu.d.ts.map +1 -0
  22. package/dist/types/src/extensions/command/hint.d.ts +5 -2
  23. package/dist/types/src/extensions/command/hint.d.ts.map +1 -1
  24. package/dist/types/src/extensions/command/index.d.ts +3 -1
  25. package/dist/types/src/extensions/command/index.d.ts.map +1 -1
  26. package/dist/types/src/extensions/command/placeholder.d.ts +10 -0
  27. package/dist/types/src/extensions/command/placeholder.d.ts.map +1 -0
  28. package/dist/types/src/extensions/command/state.d.ts +1 -1
  29. package/dist/types/src/extensions/command/state.d.ts.map +1 -1
  30. package/dist/types/src/extensions/command/useCommandMenu.d.ts +26 -0
  31. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +1 -0
  32. package/dist/types/src/extensions/index.d.ts +0 -1
  33. package/dist/types/src/extensions/index.d.ts.map +1 -1
  34. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  35. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
  36. package/dist/types/src/extensions/preview/preview.d.ts +12 -19
  37. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  38. package/dist/types/src/stories/CommandMenu.stories.d.ts +5 -4
  39. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +1 -1
  40. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  41. package/dist/types/src/util/dom.d.ts +5 -0
  42. package/dist/types/src/util/dom.d.ts.map +1 -1
  43. package/dist/types/src/util/react.d.ts +2 -4
  44. package/dist/types/src/util/react.d.ts.map +1 -1
  45. package/package.json +31 -31
  46. package/src/components/EditorToolbar/EditorToolbar.tsx +5 -9
  47. package/src/components/Popover/RefDropdownMenu.tsx +5 -3
  48. package/src/components/Popover/RefPopover.tsx +5 -3
  49. package/src/defaults.ts +0 -6
  50. package/src/extensions/automerge/automerge.stories.tsx +5 -5
  51. package/src/extensions/command/action.ts +9 -2
  52. package/src/extensions/command/command-menu.ts +210 -0
  53. package/src/extensions/command/command.ts +8 -8
  54. package/src/extensions/command/floating-menu.ts +133 -0
  55. package/src/extensions/command/hint.ts +29 -9
  56. package/src/extensions/command/index.ts +3 -1
  57. package/src/extensions/command/placeholder.ts +113 -0
  58. package/src/extensions/command/state.ts +1 -2
  59. package/src/extensions/command/useCommandMenu.ts +118 -0
  60. package/src/extensions/index.ts +0 -1
  61. package/src/extensions/markdown/bundle.ts +0 -2
  62. package/src/extensions/outliner/tree.test.ts +13 -10
  63. package/src/extensions/outliner/tree.ts +5 -3
  64. package/src/extensions/preview/preview.ts +11 -86
  65. package/src/stories/Command.stories.tsx +1 -1
  66. package/src/stories/CommandMenu.stories.tsx +35 -19
  67. package/src/stories/Preview.stories.tsx +134 -57
  68. package/src/stories/components/util.tsx +2 -2
  69. package/src/util/dom.ts +20 -0
  70. package/src/util/react.tsx +3 -20
  71. package/dist/types/src/extensions/command/menu.d.ts +0 -47
  72. package/dist/types/src/extensions/command/menu.d.ts.map +0 -1
  73. package/dist/types/src/extensions/placeholder.d.ts +0 -4
  74. package/dist/types/src/extensions/placeholder.d.ts.map +0 -1
  75. package/src/extensions/command/menu.ts +0 -439
  76. package/src/extensions/placeholder.ts +0 -82
@@ -109,6 +109,7 @@ __export(node_exports, {
109
109
  formattingKeymap: () => formattingKeymap,
110
110
  getFormatting: () => getFormatting,
111
111
  getItem: () => getItem,
112
+ getLinkRef: () => getLinkRef,
112
113
  getListItemContent: () => getListItemContent,
113
114
  getNextItem: () => getNextItem,
114
115
  getPreviousItem: () => getPreviousItem,
@@ -134,7 +135,6 @@ __export(node_exports, {
134
135
  mention: () => mention,
135
136
  moveItemDown: () => moveItemDown,
136
137
  moveItemUp: () => moveItemUp,
137
- multilinePlaceholder: () => multilinePlaceholder,
138
138
  openCommand: () => openCommand,
139
139
  openEffect: () => openEffect,
140
140
  outliner: () => outliner,
@@ -158,7 +158,6 @@ __export(node_exports, {
158
158
  setStyle: () => setStyle,
159
159
  singleValueFacet: () => singleValueFacet,
160
160
  stackItemContentEditorClassNames: () => stackItemContentEditorClassNames,
161
- stackItemContentToolbarClassNames: () => stackItemContentToolbarClassNames,
162
161
  staticCompletion: () => staticCompletion,
163
162
  table: () => table,
164
163
  tags: () => import_highlight.tags,
@@ -197,7 +196,6 @@ var import_react = __toESM(require("react"));
197
196
  var import_app_graph = require("@dxos/app-graph");
198
197
  var import_react_ui = require("@dxos/react-ui");
199
198
  var import_react_ui_menu = require("@dxos/react-ui-menu");
200
- var import_react_ui_theme = require("@dxos/react-ui-theme");
201
199
  var import_react2 = require("react");
202
200
  var import_live_object = require("@dxos/live-object");
203
201
  var import_react_ui_menu2 = require("@dxos/react-ui-menu");
@@ -220,7 +218,7 @@ var import_log2 = require("@dxos/log");
220
218
  var import_react3 = __toESM(require("react"));
221
219
  var import_client = require("react-dom/client");
222
220
  var import_react_ui2 = require("@dxos/react-ui");
223
- var import_react_ui_theme2 = require("@dxos/react-ui-theme");
221
+ var import_react_ui_theme = require("@dxos/react-ui-theme");
224
222
  var import_state7 = require("@codemirror/state");
225
223
  var import_view5 = require("@codemirror/view");
226
224
  var import_async = require("@dxos/async");
@@ -235,124 +233,126 @@ var import_invariant2 = require("@dxos/invariant");
235
233
  var import_state8 = require("@codemirror/state");
236
234
  var import_state9 = require("@codemirror/state");
237
235
  var import_view7 = require("@codemirror/view");
238
- var import_view8 = require("@codemirror/view");
239
236
  var import_state10 = require("@codemirror/state");
240
- var import_view9 = require("@codemirror/view");
237
+ var import_view8 = require("@codemirror/view");
238
+ var import_util = require("@dxos/util");
241
239
  var import_state11 = require("@codemirror/state");
240
+ var import_view9 = require("@codemirror/view");
241
+ var import_state12 = require("@codemirror/state");
242
242
  var import_view10 = require("@codemirror/view");
243
- var import_react4 = require("react");
244
- var import_async3 = require("@dxos/async");
245
243
  var import_view11 = require("@codemirror/view");
246
- var import_state12 = require("@codemirror/state");
247
244
  var import_view12 = require("@codemirror/view");
248
- var import_commands = require("@codemirror/commands");
245
+ var import_async3 = require("@dxos/async");
246
+ var import_react4 = require("react");
249
247
  var import_state13 = require("@codemirror/state");
250
248
  var import_view13 = require("@codemirror/view");
249
+ var import_commands = require("@codemirror/commands");
250
+ var import_state14 = require("@codemirror/state");
251
+ var import_view14 = require("@codemirror/view");
251
252
  var import_lodash2 = __toESM(require("lodash.sortby"));
252
253
  var import_react5 = require("react");
253
254
  var import_async4 = require("@dxos/async");
254
255
  var import_log4 = require("@dxos/log");
255
- var import_util = require("@dxos/util");
256
- var import_state14 = require("@codemirror/state");
257
- var import_view14 = require("@codemirror/view");
258
- var import_async5 = require("@dxos/async");
259
- var import_invariant3 = require("@dxos/invariant");
260
256
  var import_util2 = require("@dxos/util");
261
- var import_language = require("@codemirror/language");
262
257
  var import_state15 = require("@codemirror/state");
263
258
  var import_view15 = require("@codemirror/view");
259
+ var import_async5 = require("@dxos/async");
260
+ var import_invariant3 = require("@dxos/invariant");
261
+ var import_util3 = require("@dxos/util");
262
+ var import_language = require("@codemirror/language");
263
+ var import_state16 = require("@codemirror/state");
264
+ var import_view16 = require("@codemirror/view");
264
265
  var import_autocomplete2 = require("@codemirror/autocomplete");
265
266
  var import_commands2 = require("@codemirror/commands");
266
267
  var import_language2 = require("@codemirror/language");
267
268
  var import_search = require("@codemirror/search");
268
- var import_state16 = require("@codemirror/state");
269
+ var import_state17 = require("@codemirror/state");
269
270
  var import_theme_one_dark = require("@codemirror/theme-one-dark");
270
- var import_view16 = require("@codemirror/view");
271
+ var import_view17 = require("@codemirror/view");
271
272
  var import_lodash3 = __toESM(require("lodash.defaultsdeep"));
272
273
  var import_lodash4 = __toESM(require("lodash.merge"));
273
274
  var import_display_name = require("@dxos/display-name");
274
275
  var import_log5 = require("@dxos/log");
275
- var import_util3 = require("@dxos/util");
276
- var import_state17 = require("@codemirror/state");
277
- var import_view17 = require("@codemirror/view");
276
+ var import_util4 = require("@dxos/util");
277
+ var import_state18 = require("@codemirror/state");
278
278
  var import_view18 = require("@codemirror/view");
279
+ var import_view19 = require("@codemirror/view");
280
+ var import_react_ui_theme2 = require("@dxos/react-ui-theme");
279
281
  var import_react_ui_theme3 = require("@dxos/react-ui-theme");
280
282
  var import_react_ui_theme4 = require("@dxos/react-ui-theme");
281
- var import_react_ui_theme5 = require("@dxos/react-ui-theme");
282
- var import_util4 = require("@dxos/util");
283
+ var import_util5 = require("@dxos/util");
283
284
  var import_language3 = require("@codemirror/language");
284
- var import_view19 = require("@codemirror/view");
285
+ var import_view20 = require("@codemirror/view");
285
286
  var import_react6 = __toESM(require("react"));
286
287
  var import_react_ui3 = require("@dxos/react-ui");
287
- var import_view20 = require("@codemirror/view");
288
- var import_react_ui_theme6 = require("@dxos/react-ui-theme");
288
+ var import_view21 = require("@codemirror/view");
289
+ var import_react_ui_theme5 = require("@dxos/react-ui-theme");
289
290
  var import_lang_json = require("@codemirror/lang-json");
290
291
  var import_lint = require("@codemirror/lint");
291
292
  var import_ajv = __toESM(require("ajv"));
292
- var import_view21 = require("@codemirror/view");
293
+ var import_view22 = require("@codemirror/view");
293
294
  var import_autocomplete3 = require("@codemirror/autocomplete");
294
295
  var import_language4 = require("@codemirror/language");
295
- var import_state18 = require("@codemirror/state");
296
- var import_view22 = require("@codemirror/view");
296
+ var import_state19 = require("@codemirror/state");
297
+ var import_view23 = require("@codemirror/view");
297
298
  var import_react7 = require("react");
298
299
  var import_autocomplete4 = require("@codemirror/autocomplete");
299
300
  var import_commands3 = require("@codemirror/commands");
300
301
  var import_lang_markdown2 = require("@codemirror/lang-markdown");
301
302
  var import_language5 = require("@codemirror/language");
302
303
  var import_language_data = require("@codemirror/language-data");
303
- var import_lint2 = require("@codemirror/lint");
304
- var import_view23 = require("@codemirror/view");
305
- var import_util5 = require("@dxos/util");
304
+ var import_view24 = require("@codemirror/view");
305
+ var import_util6 = require("@dxos/util");
306
306
  var import_lang_markdown3 = require("@codemirror/lang-markdown");
307
307
  var import_language6 = require("@codemirror/language");
308
308
  var import_highlight2 = require("@lezer/highlight");
309
309
  var import_markdown = require("@lezer/markdown");
310
310
  var import_language7 = require("@codemirror/language");
311
- var import_state19 = require("@codemirror/state");
312
- var import_language8 = require("@codemirror/language");
313
311
  var import_state20 = require("@codemirror/state");
314
- var import_view24 = require("@codemirror/view");
315
- var import_invariant4 = require("@dxos/invariant");
316
- var import_react_ui_theme7 = require("@dxos/react-ui-theme");
317
- var import_language9 = require("@codemirror/language");
312
+ var import_language8 = require("@codemirror/language");
318
313
  var import_state21 = require("@codemirror/state");
319
314
  var import_view25 = require("@codemirror/view");
320
- var import_language10 = require("@codemirror/language");
315
+ var import_invariant4 = require("@dxos/invariant");
316
+ var import_react_ui_theme6 = require("@dxos/react-ui-theme");
317
+ var import_language9 = require("@codemirror/language");
321
318
  var import_state22 = require("@codemirror/state");
322
319
  var import_view26 = require("@codemirror/view");
323
- var import_view27 = require("@codemirror/view");
324
- var import_language11 = require("@codemirror/language");
320
+ var import_language10 = require("@codemirror/language");
325
321
  var import_state23 = require("@codemirror/state");
322
+ var import_view27 = require("@codemirror/view");
326
323
  var import_view28 = require("@codemirror/view");
327
- var import_language12 = require("@codemirror/language");
324
+ var import_language11 = require("@codemirror/language");
325
+ var import_state24 = require("@codemirror/state");
328
326
  var import_view29 = require("@codemirror/view");
329
- var import_react_ui_theme8 = require("@dxos/react-ui-theme");
327
+ var import_language12 = require("@codemirror/language");
328
+ var import_view30 = require("@codemirror/view");
329
+ var import_react_ui_theme7 = require("@dxos/react-ui-theme");
330
330
  var import_autocomplete5 = require("@codemirror/autocomplete");
331
331
  var import_log6 = require("@dxos/log");
332
- var import_view30 = require("@codemirror/view");
332
+ var import_view31 = require("@codemirror/view");
333
333
  var import_codemirror_vim = require("@replit/codemirror-vim");
334
334
  var import_codemirror_vscode_keymap = require("@replit/codemirror-vscode-keymap");
335
335
  var import_effect = require("effect");
336
336
  var import_commands4 = require("@codemirror/commands");
337
337
  var import_language13 = require("@codemirror/language");
338
- var import_state24 = require("@codemirror/state");
339
- var import_view31 = require("@codemirror/view");
340
338
  var import_state25 = require("@codemirror/state");
341
- var import_language14 = require("@codemirror/language");
339
+ var import_view32 = require("@codemirror/view");
342
340
  var import_state26 = require("@codemirror/state");
341
+ var import_language14 = require("@codemirror/language");
343
342
  var import_state27 = require("@codemirror/state");
344
- var import_invariant5 = require("@dxos/invariant");
345
343
  var import_state28 = require("@codemirror/state");
346
- var import_view32 = require("@codemirror/view");
347
- var import_react_ui_theme9 = require("@dxos/react-ui-theme");
344
+ var import_invariant5 = require("@dxos/invariant");
348
345
  var import_state29 = require("@codemirror/state");
349
346
  var import_view33 = require("@codemirror/view");
347
+ var import_react_ui_theme8 = require("@dxos/react-ui-theme");
348
+ var import_state30 = require("@codemirror/state");
349
+ var import_view34 = require("@codemirror/view");
350
350
  var import_log7 = require("@dxos/log");
351
351
  var import_dx_ref_tag = require("@dxos/lit-ui/dx-ref-tag.pcss");
352
352
  var import_language15 = require("@codemirror/language");
353
- var import_state30 = require("@codemirror/state");
354
- var import_view34 = require("@codemirror/view");
353
+ var import_state31 = require("@codemirror/state");
355
354
  var import_view35 = require("@codemirror/view");
355
+ var import_view36 = require("@codemirror/view");
356
356
  var import_search2 = require("@codemirror/search");
357
357
  var import_tracking2 = require("@preact-signals/safe-react/tracking");
358
358
  var import_react8 = __toESM(require("react"));
@@ -367,12 +367,12 @@ var import_react_context2 = require("@radix-ui/react-context");
367
367
  var import_react10 = __toESM(require("react"));
368
368
  var import_async7 = require("@dxos/async");
369
369
  var import_react_ui6 = require("@dxos/react-ui");
370
- var import_state31 = require("@codemirror/state");
371
- var import_view36 = require("@codemirror/view");
370
+ var import_state32 = require("@codemirror/state");
371
+ var import_view37 = require("@codemirror/view");
372
372
  var import_react_tabster = require("@fluentui/react-tabster");
373
373
  var import_react11 = require("react");
374
374
  var import_log8 = require("@dxos/log");
375
- var import_util6 = require("@dxos/util");
375
+ var import_util7 = require("@dxos/util");
376
376
  var translationKey = "react-ui-editor";
377
377
  var translations_default = [
378
378
  {
@@ -834,6 +834,9 @@ var createElement = (tag, options, children) => {
834
834
  if (options?.className) {
835
835
  el.className = options.className;
836
836
  }
837
+ if (options?.text) {
838
+ el.textContent = options.text;
839
+ }
837
840
  if (children) {
838
841
  el.append(...Array.isArray(children) ? children : [
839
842
  children
@@ -843,13 +846,13 @@ var createElement = (tag, options, children) => {
843
846
  };
844
847
  var renderRoot = (root, node) => {
845
848
  (0, import_client.createRoot)(root).render(/* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ThemeProvider, {
846
- tx: import_react_ui_theme2.defaultTx
849
+ tx: import_react_ui_theme.defaultTx
847
850
  }, node));
848
851
  return root;
849
852
  };
850
853
  var createRenderer = (Component) => (el, props) => {
851
854
  renderRoot(el, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ThemeProvider, {
852
- tx: import_react_ui_theme2.defaultTx
855
+ tx: import_react_ui_theme.defaultTx
853
856
  }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Tooltip.Provider, null, /* @__PURE__ */ import_react3.default.createElement(Component, props))));
854
857
  };
855
858
  var automerge = (accessor) => {
@@ -1636,6 +1639,7 @@ var closeCommand = (view) => {
1636
1639
  var commandKeyBindings = [
1637
1640
  {
1638
1641
  key: "/",
1642
+ preventDefault: true,
1639
1643
  run: openCommand
1640
1644
  },
1641
1645
  {
@@ -1643,32 +1647,48 @@ var commandKeyBindings = [
1643
1647
  run: closeCommand
1644
1648
  }
1645
1649
  ];
1646
- var hintViewPlugin = ({ onHint }) => import_view9.ViewPlugin.fromClass(class {
1647
- constructor() {
1648
- this.decorations = import_view9.Decoration.none;
1649
- }
1650
- update(update2) {
1651
- const builder = new import_state10.RangeSetBuilder();
1652
- const cState = update2.view.state.field(commandState, false);
1653
- if (!cState?.tooltip) {
1654
- const selection = update2.view.state.selection.main;
1655
- const line = update2.view.state.doc.lineAt(selection.from);
1656
- if (selection.from === selection.to && line.from === line.to) {
1657
- const hint = onHint();
1658
- if (hint) {
1659
- builder.add(selection.from, selection.to, import_view9.Decoration.widget({
1660
- widget: new Hint(hint)
1661
- }));
1650
+ var hint = ({ delay = 3e3, onHint }) => {
1651
+ return import_view9.ViewPlugin.fromClass(class {
1652
+ constructor() {
1653
+ this.decorations = import_view9.Decoration.none;
1654
+ }
1655
+ update(update2) {
1656
+ if (this.timeout) {
1657
+ clearTimeout(this.timeout);
1658
+ this.timeout = void 0;
1659
+ }
1660
+ const builder = new import_state11.RangeSetBuilder();
1661
+ const cState = update2.view.state.field(commandState, false);
1662
+ if (!cState?.tooltip) {
1663
+ const selection = update2.view.state.selection.main;
1664
+ const line = update2.view.state.doc.lineAt(selection.from);
1665
+ if (selection.from === selection.to && line.from === line.to) {
1666
+ this.timeout = setTimeout(() => {
1667
+ const hint2 = onHint?.();
1668
+ if (hint2) {
1669
+ const builder2 = new import_state11.RangeSetBuilder();
1670
+ builder2.add(selection.from, selection.to, import_view9.Decoration.widget({
1671
+ widget: new Hint(hint2)
1672
+ }));
1673
+ this.decorations = builder2.finish();
1674
+ update2.view.update([]);
1675
+ }
1676
+ }, delay);
1662
1677
  }
1663
1678
  }
1679
+ this.decorations = builder.finish();
1680
+ }
1681
+ destroy() {
1682
+ if (this.timeout) {
1683
+ clearTimeout(this.timeout);
1684
+ }
1664
1685
  }
1665
- this.decorations = builder.finish();
1666
- }
1667
- }, {
1668
- provide: (plugin) => [
1669
- import_view9.EditorView.decorations.of((view) => view.plugin(plugin)?.decorations ?? import_view9.Decoration.none)
1670
- ]
1671
- });
1686
+ }, {
1687
+ provide: (plugin) => [
1688
+ import_view9.EditorView.decorations.of((view) => view.plugin(plugin)?.decorations ?? import_view9.Decoration.none)
1689
+ ]
1690
+ });
1691
+ };
1672
1692
  var Hint = class extends import_view9.WidgetType {
1673
1693
  constructor(content) {
1674
1694
  super(), this.content = content;
@@ -1709,21 +1729,62 @@ var Hint = class extends import_view9.WidgetType {
1709
1729
  };
1710
1730
  var command = (options = {}) => {
1711
1731
  return [
1712
- import_view8.keymap.of(commandKeyBindings),
1732
+ import_state10.Prec.highest(import_view8.keymap.of(commandKeyBindings)),
1713
1733
  commandConfig.of(options),
1714
1734
  commandState,
1715
- options.onHint ? hintViewPlugin({
1716
- onHint: options.onHint
1717
- }) : [],
1718
- import_view8.EditorView.focusChangeEffect.of((_, focusing) => {
1719
- return focusing ? closeEffect.of(null) : null;
1720
- }),
1735
+ options.onHint && hint(options),
1736
+ import_view8.EditorView.focusChangeEffect.of((_, focusing) => focusing ? closeEffect.of(null) : null),
1721
1737
  import_view8.EditorView.theme({
1722
1738
  ".cm-tooltip": {
1723
1739
  background: "transparent"
1724
1740
  }
1725
1741
  })
1726
- ];
1742
+ ].filter(import_util.isNonNullable);
1743
+ };
1744
+ var placeholder = ({ delay = 3e3, content }) => {
1745
+ const plugin = import_view11.ViewPlugin.fromClass(class {
1746
+ constructor() {
1747
+ this.decorations = import_view11.Decoration.none;
1748
+ }
1749
+ update(update2) {
1750
+ if (this.timeout) {
1751
+ window.clearTimeout(this.timeout);
1752
+ this.timeout = void 0;
1753
+ }
1754
+ const activeLine = update2.view.state.doc.lineAt(update2.view.state.selection.main.head);
1755
+ const isEmpty = activeLine.text.trim() === "";
1756
+ if (isEmpty) {
1757
+ const lineStart = activeLine.from;
1758
+ this.timeout = setTimeout(() => {
1759
+ this.decorations = import_view11.Decoration.set([
1760
+ import_view11.Decoration.widget({
1761
+ widget: new Placeholder(content),
1762
+ side: 1
1763
+ }).range(lineStart)
1764
+ ]);
1765
+ update2.view.update([]);
1766
+ }, delay);
1767
+ }
1768
+ this.decorations = import_view11.Decoration.none;
1769
+ }
1770
+ destroy() {
1771
+ if (this.timeout) {
1772
+ clearTimeout(this.timeout);
1773
+ }
1774
+ }
1775
+ }, {
1776
+ provide: (plugin2) => {
1777
+ return [
1778
+ import_view11.EditorView.decorations.of((view) => view.plugin(plugin2)?.decorations ?? import_view11.Decoration.none)
1779
+ ];
1780
+ }
1781
+ });
1782
+ return typeof content === "string" ? [
1783
+ plugin,
1784
+ import_view11.EditorView.contentAttributes.of({
1785
+ "aria-placeholder": content
1786
+ })
1787
+ ] : plugin;
1727
1788
  };
1728
1789
  var Placeholder = class extends import_view11.WidgetType {
1729
1790
  constructor(content) {
@@ -1759,133 +1820,6 @@ var Placeholder = class extends import_view11.WidgetType {
1759
1820
  return false;
1760
1821
  }
1761
1822
  };
1762
- function multilinePlaceholder(content) {
1763
- const plugin = import_view11.ViewPlugin.fromClass(class {
1764
- constructor(view) {
1765
- this.view = view;
1766
- }
1767
- get decorations() {
1768
- const activeLine = this.view.state.doc.lineAt(this.view.state.selection.main.head);
1769
- const isEmpty = activeLine.text.trim() === "";
1770
- if (!isEmpty || !content) {
1771
- return import_view11.Decoration.none;
1772
- }
1773
- const lineStart = activeLine.from;
1774
- return import_view11.Decoration.set([
1775
- import_view11.Decoration.widget({
1776
- widget: new Placeholder(content),
1777
- side: 1
1778
- }).range(lineStart)
1779
- ]);
1780
- }
1781
- }, {
1782
- decorations: (v) => v.decorations
1783
- });
1784
- return typeof content === "string" ? [
1785
- plugin,
1786
- import_view11.EditorView.contentAttributes.of({
1787
- "aria-placeholder": content
1788
- })
1789
- ] : plugin;
1790
- }
1791
- var floatingMenu = (options = {}) => [
1792
- import_view10.ViewPlugin.fromClass(class {
1793
- constructor(view) {
1794
- this.view = view;
1795
- const container = view.scrollDOM;
1796
- if (getComputedStyle(container).position === "static") {
1797
- container.style.position = "relative";
1798
- }
1799
- {
1800
- const icon = document.createElement("dx-icon");
1801
- icon.setAttribute("icon", options.icon ?? "ph--dots-three-vertical--regular");
1802
- const button = document.createElement("button");
1803
- button.appendChild(icon);
1804
- this.tag = document.createElement("dx-ref-tag");
1805
- this.tag.classList.add("cm-ref-tag");
1806
- this.tag.appendChild(button);
1807
- }
1808
- container.appendChild(this.tag);
1809
- const handler = () => this.scheduleUpdate();
1810
- this.cleanup = (0, import_async3.addEventListener)(container, "scroll", handler);
1811
- this.scheduleUpdate();
1812
- }
1813
- destroy() {
1814
- this.cleanup?.();
1815
- this.tag.remove();
1816
- if (this.rafId != null) {
1817
- cancelAnimationFrame(this.rafId);
1818
- }
1819
- }
1820
- update(update2) {
1821
- this.tag.dataset.focused = update2.view.hasFocus ? "true" : "false";
1822
- if (!update2.view.hasFocus) {
1823
- return;
1824
- }
1825
- if (update2.transactions.some((tr) => tr.effects.some((effect) => effect.is(openEffect)))) {
1826
- this.tag.style.display = "none";
1827
- this.tag.classList.add("opacity-10");
1828
- } else if (update2.transactions.some((tr) => tr.effects.some((effect) => effect.is(closeEffect)))) {
1829
- this.tag.style.display = "block";
1830
- } else if (update2.docChanged || update2.focusChanged || update2.geometryChanged || update2.selectionSet || update2.viewportChanged) {
1831
- this.scheduleUpdate();
1832
- }
1833
- }
1834
- updateButtonPosition() {
1835
- const { x, width } = this.view.contentDOM.getBoundingClientRect();
1836
- const pos = this.view.state.selection.main.head;
1837
- const line = this.view.lineBlockAt(pos);
1838
- const coords = this.view.coordsAtPos(line.from);
1839
- if (!coords) {
1840
- return;
1841
- }
1842
- const lineHeight = coords.bottom - coords.top;
1843
- const dy = (lineHeight - (options.height ?? 32)) / 2;
1844
- const offsetTop = coords.top + dy;
1845
- const offsetLeft = x + width + (options.padding ?? 8);
1846
- this.tag.style.top = `${offsetTop}px`;
1847
- this.tag.style.left = `${offsetLeft}px`;
1848
- this.tag.style.display = "block";
1849
- }
1850
- scheduleUpdate() {
1851
- if (this.rafId != null) {
1852
- cancelAnimationFrame(this.rafId);
1853
- }
1854
- this.rafId = requestAnimationFrame(this.updateButtonPosition.bind(this));
1855
- }
1856
- }),
1857
- import_view10.EditorView.theme({
1858
- ".cm-ref-tag": {
1859
- position: "fixed",
1860
- padding: "0",
1861
- border: "none",
1862
- opacity: "0"
1863
- },
1864
- "[data-has-focus] & .cm-ref-tag": {
1865
- opacity: "1"
1866
- },
1867
- ".cm-ref-tag button": {
1868
- display: "grid",
1869
- alignItems: "center",
1870
- justifyContent: "center",
1871
- width: "2rem",
1872
- height: "2rem"
1873
- }
1874
- })
1875
- ];
1876
- var commandRangeEffect = import_state11.StateEffect.define();
1877
- var commandMenuState = import_state11.StateField.define({
1878
- create: () => null,
1879
- update: (value, tr) => {
1880
- let newValue = value;
1881
- for (const effect of tr.effects) {
1882
- if (effect.is(commandRangeEffect)) {
1883
- newValue = effect.value;
1884
- }
1885
- }
1886
- return newValue;
1887
- }
1888
- });
1889
1823
  var commandMenu = (options) => {
1890
1824
  const commandMenuPlugin = import_view10.ViewPlugin.fromClass(class {
1891
1825
  constructor(view) {
@@ -1894,7 +1828,7 @@ var commandMenu = (options) => {
1894
1828
  }
1895
1829
  // TODO(wittjosiah): The decorations are repainted on every update, this occasionally causes menu to flicker.
1896
1830
  update(update2) {
1897
- const builder = new import_state11.RangeSetBuilder();
1831
+ const builder = new import_state12.RangeSetBuilder();
1898
1832
  const selection = update2.view.state.selection.main;
1899
1833
  const { range: activeRange, trigger } = update2.view.state.field(commandMenuState) ?? {};
1900
1834
  const shouldShowWidget = activeRange && selection.head >= activeRange.from && selection.head <= activeRange.to;
@@ -1924,11 +1858,11 @@ var commandMenu = (options) => {
1924
1858
  const commandKeymap = import_view10.keymap.of([
1925
1859
  ...triggers.map((trigger) => ({
1926
1860
  key: trigger,
1861
+ preventDefault: true,
1927
1862
  run: (view) => {
1928
1863
  const selection = view.state.selection.main;
1929
1864
  const line = view.state.doc.lineAt(selection.head);
1930
- const shouldTrigger = line.text.trim() === "" || selection.head === line.from || selection.head > line.from && line.text[selection.head - line.from - 1] === " ";
1931
- if (shouldTrigger) {
1865
+ if (line.text.trim() === "" || selection.head === line.from || selection.head > line.from && line.text[selection.head - line.from - 1] === " ") {
1932
1866
  view.dispatch({
1933
1867
  changes: {
1934
1868
  from: selection.head,
@@ -2015,27 +1949,127 @@ var commandMenu = (options) => {
2015
1949
  });
2016
1950
  }
2017
1951
  if (shouldRemove) {
2018
- options.onDeactivate?.();
1952
+ options.onClose?.();
2019
1953
  }
2020
1954
  });
2021
1955
  return [
2022
- multilinePlaceholder(options.placeholder ?? `Press '${Array.isArray(options.trigger) ? options.trigger[0] : options.trigger}' for commands`),
2023
- import_state11.Prec.highest(commandKeymap),
1956
+ import_state12.Prec.highest(commandKeymap),
1957
+ placeholder(Object.assign({
1958
+ content: `Press '${Array.isArray(options.trigger) ? options.trigger[0] : options.trigger}' for commands`
1959
+ }, options.placeholder)),
2024
1960
  updateListener,
2025
1961
  commandMenuState,
2026
1962
  commandMenuPlugin
2027
1963
  ];
2028
1964
  };
2029
- var useCommandMenu = ({ viewRef, trigger, placeholder: placeholder2, getGroups }) => {
1965
+ var commandRangeEffect = import_state12.StateEffect.define();
1966
+ var commandMenuState = import_state12.StateField.define({
1967
+ create: () => null,
1968
+ update: (value, tr) => {
1969
+ let newValue = value;
1970
+ for (const effect of tr.effects) {
1971
+ if (effect.is(commandRangeEffect)) {
1972
+ newValue = effect.value;
1973
+ }
1974
+ }
1975
+ return newValue;
1976
+ }
1977
+ });
1978
+ var floatingMenu = (options = {}) => [
1979
+ import_view12.ViewPlugin.fromClass(class {
1980
+ constructor(view) {
1981
+ this.view = view;
1982
+ const container = view.scrollDOM;
1983
+ if (getComputedStyle(container).position === "static") {
1984
+ container.style.position = "relative";
1985
+ }
1986
+ {
1987
+ const icon = document.createElement("dx-icon");
1988
+ icon.setAttribute("icon", options.icon ?? "ph--dots-three-vertical--regular");
1989
+ const button = document.createElement("button");
1990
+ button.appendChild(icon);
1991
+ this.tag = document.createElement("dx-ref-tag");
1992
+ this.tag.classList.add("cm-ref-tag");
1993
+ this.tag.appendChild(button);
1994
+ }
1995
+ container.appendChild(this.tag);
1996
+ const handler = () => this.scheduleUpdate();
1997
+ this.cleanup = (0, import_async3.addEventListener)(container, "scroll", handler);
1998
+ this.scheduleUpdate();
1999
+ }
2000
+ destroy() {
2001
+ this.cleanup?.();
2002
+ this.tag.remove();
2003
+ if (this.rafId != null) {
2004
+ cancelAnimationFrame(this.rafId);
2005
+ }
2006
+ }
2007
+ update(update2) {
2008
+ this.tag.dataset.focused = update2.view.hasFocus ? "true" : "false";
2009
+ if (!update2.view.hasFocus) {
2010
+ return;
2011
+ }
2012
+ if (update2.transactions.some((tr) => tr.effects.some((effect) => effect.is(openEffect)))) {
2013
+ this.tag.style.display = "none";
2014
+ this.tag.classList.add("opacity-10");
2015
+ } else if (update2.transactions.some((tr) => tr.effects.some((effect) => effect.is(closeEffect)))) {
2016
+ this.tag.style.display = "block";
2017
+ } else if (update2.docChanged || update2.focusChanged || update2.geometryChanged || update2.selectionSet || update2.viewportChanged) {
2018
+ this.scheduleUpdate();
2019
+ }
2020
+ }
2021
+ updateButtonPosition() {
2022
+ const { x, width } = this.view.contentDOM.getBoundingClientRect();
2023
+ const pos = this.view.state.selection.main.head;
2024
+ const line = this.view.lineBlockAt(pos);
2025
+ const coords = this.view.coordsAtPos(line.from);
2026
+ if (!coords) {
2027
+ return;
2028
+ }
2029
+ const lineHeight = coords.bottom - coords.top;
2030
+ const dy = (lineHeight - (options.height ?? 32)) / 2;
2031
+ const offsetTop = coords.top + dy;
2032
+ const offsetLeft = x + width + (options.padding ?? 8);
2033
+ this.tag.style.top = `${offsetTop}px`;
2034
+ this.tag.style.left = `${offsetLeft}px`;
2035
+ this.tag.style.display = "block";
2036
+ }
2037
+ scheduleUpdate() {
2038
+ if (this.rafId != null) {
2039
+ cancelAnimationFrame(this.rafId);
2040
+ }
2041
+ this.rafId = requestAnimationFrame(this.updateButtonPosition.bind(this));
2042
+ }
2043
+ }),
2044
+ import_view12.EditorView.theme({
2045
+ ".cm-ref-tag": {
2046
+ position: "fixed",
2047
+ padding: "0",
2048
+ border: "none",
2049
+ opacity: "0"
2050
+ },
2051
+ "[data-has-focus] & .cm-ref-tag": {
2052
+ opacity: "1"
2053
+ },
2054
+ ".cm-ref-tag button": {
2055
+ display: "grid",
2056
+ alignItems: "center",
2057
+ justifyContent: "center",
2058
+ width: "2rem",
2059
+ height: "2rem"
2060
+ }
2061
+ })
2062
+ ];
2063
+ var useCommandMenu = ({ viewRef, trigger, placeholder: placeholder3, getMenu }) => {
2030
2064
  const triggerRef = (0, import_react4.useRef)(null);
2031
2065
  const currentRef = (0, import_react4.useRef)(null);
2032
2066
  const groupsRef = (0, import_react4.useRef)([]);
2033
2067
  const [currentItem, setCurrentItem] = (0, import_react4.useState)();
2034
2068
  const [open, setOpen] = (0, import_react4.useState)(false);
2035
- const [_, update2] = (0, import_react4.useState)({});
2069
+ const [_, refresh] = (0, import_react4.useState)({});
2036
2070
  const handleOpenChange = (0, import_react4.useCallback)(async (open2, trigger2) => {
2037
2071
  if (open2 && trigger2) {
2038
- groupsRef.current = await getGroups(trigger2);
2072
+ groupsRef.current = await getMenu(trigger2);
2039
2073
  }
2040
2074
  setOpen(open2);
2041
2075
  if (!open2) {
@@ -2048,7 +2082,7 @@ var useCommandMenu = ({ viewRef, trigger, placeholder: placeholder2, getGroups }
2048
2082
  });
2049
2083
  }
2050
2084
  }, [
2051
- getGroups
2085
+ getMenu
2052
2086
  ]);
2053
2087
  const handleActivate = (0, import_react4.useCallback)(async (event) => {
2054
2088
  const item = getItem(groupsRef.current, currentItem);
@@ -2073,43 +2107,45 @@ var useCommandMenu = ({ viewRef, trigger, placeholder: placeholder2, getGroups }
2073
2107
  void item.onSelect?.(view, selection.head);
2074
2108
  }, []);
2075
2109
  const serializedTrigger = Array.isArray(trigger) ? trigger.join(",") : trigger;
2076
- const _commandMenu = (0, import_react4.useMemo)(() => commandMenu({
2077
- trigger,
2078
- placeholder: placeholder2,
2079
- onArrowDown: () => {
2080
- setCurrentItem((currentItem2) => {
2081
- const next = getNextItem(groupsRef.current, currentItem2);
2082
- currentRef.current = next;
2083
- return next.id;
2084
- });
2085
- },
2086
- onArrowUp: () => {
2087
- setCurrentItem((currentItem2) => {
2088
- const previous = getPreviousItem(groupsRef.current, currentItem2);
2089
- currentRef.current = previous;
2090
- return previous.id;
2091
- });
2092
- },
2093
- onDeactivate: () => handleOpenChange(false),
2094
- onEnter: () => {
2095
- if (currentRef.current) {
2096
- handleSelect(currentRef.current);
2097
- }
2098
- },
2099
- onTextChange: async (trigger2, text) => {
2100
- groupsRef.current = await getGroups(trigger2, text);
2101
- const firstItem = groupsRef.current.filter((group) => group.items.length > 0)[0]?.items[0];
2102
- if (firstItem) {
2103
- setCurrentItem(firstItem.id);
2104
- currentRef.current = firstItem;
2110
+ const _commandMenu = (0, import_react4.useMemo)(() => {
2111
+ return commandMenu({
2112
+ trigger,
2113
+ placeholder: placeholder3,
2114
+ onClose: () => handleOpenChange(false),
2115
+ onArrowDown: () => {
2116
+ setCurrentItem((currentItem2) => {
2117
+ const next = getNextItem(groupsRef.current, currentItem2);
2118
+ currentRef.current = next;
2119
+ return next.id;
2120
+ });
2121
+ },
2122
+ onArrowUp: () => {
2123
+ setCurrentItem((currentItem2) => {
2124
+ const previous = getPreviousItem(groupsRef.current, currentItem2);
2125
+ currentRef.current = previous;
2126
+ return previous.id;
2127
+ });
2128
+ },
2129
+ onEnter: () => {
2130
+ if (currentRef.current) {
2131
+ handleSelect(currentRef.current);
2132
+ }
2133
+ },
2134
+ onTextChange: async (trigger2, text) => {
2135
+ groupsRef.current = await getMenu(trigger2, text);
2136
+ const firstItem = groupsRef.current.filter((group) => group.items.length > 0)[0]?.items[0];
2137
+ if (firstItem) {
2138
+ setCurrentItem(firstItem.id);
2139
+ currentRef.current = firstItem;
2140
+ }
2141
+ refresh({});
2105
2142
  }
2106
- update2({});
2107
- }
2108
- }), [
2143
+ });
2144
+ }, [
2109
2145
  handleOpenChange,
2110
- getGroups,
2146
+ getMenu,
2111
2147
  serializedTrigger,
2112
- placeholder2
2148
+ placeholder3
2113
2149
  ]);
2114
2150
  return {
2115
2151
  commandMenu: _commandMenu,
@@ -2123,9 +2159,9 @@ var useCommandMenu = ({ viewRef, trigger, placeholder: placeholder2, getGroups }
2123
2159
  };
2124
2160
  };
2125
2161
  var typeahead = ({ onComplete } = {}) => {
2126
- let hint;
2162
+ let hint2;
2127
2163
  const complete = (view) => {
2128
- if (!hint) {
2164
+ if (!hint2) {
2129
2165
  return false;
2130
2166
  }
2131
2167
  const selection = view.state.selection.main;
@@ -2134,30 +2170,30 @@ var typeahead = ({ onComplete } = {}) => {
2134
2170
  {
2135
2171
  from: selection.from,
2136
2172
  to: selection.to,
2137
- insert: hint
2173
+ insert: hint2
2138
2174
  }
2139
2175
  ],
2140
- selection: import_state12.EditorSelection.cursor(selection.from + hint.length)
2176
+ selection: import_state13.EditorSelection.cursor(selection.from + hint2.length)
2141
2177
  });
2142
2178
  return true;
2143
2179
  };
2144
2180
  return [
2145
- import_view12.ViewPlugin.fromClass(class {
2181
+ import_view13.ViewPlugin.fromClass(class {
2146
2182
  constructor() {
2147
- this.decorations = import_view12.Decoration.none;
2183
+ this.decorations = import_view13.Decoration.none;
2148
2184
  }
2149
2185
  update(update2) {
2150
- const builder = new import_state12.RangeSetBuilder();
2186
+ const builder = new import_state13.RangeSetBuilder();
2151
2187
  const selection = update2.view.state.selection.main;
2152
2188
  const line = update2.view.state.doc.lineAt(selection.from);
2153
2189
  if (selection.from === selection.to && selection.from === line.to) {
2154
2190
  const str = update2.state.sliceDoc(line.from, selection.from);
2155
- hint = onComplete?.({
2191
+ hint2 = onComplete?.({
2156
2192
  line: str
2157
2193
  });
2158
- if (hint) {
2159
- builder.add(selection.from, selection.to, import_view12.Decoration.widget({
2160
- widget: new Hint(hint)
2194
+ if (hint2) {
2195
+ builder.add(selection.from, selection.to, import_view13.Decoration.widget({
2196
+ widget: new Hint(hint2)
2161
2197
  }));
2162
2198
  }
2163
2199
  }
@@ -2167,7 +2203,7 @@ var typeahead = ({ onComplete } = {}) => {
2167
2203
  decorations: (v) => v.decorations
2168
2204
  }),
2169
2205
  // Keys.
2170
- import_state12.Prec.highest(import_view12.keymap.of([
2206
+ import_state13.Prec.highest(import_view13.keymap.of([
2171
2207
  {
2172
2208
  key: "Tab",
2173
2209
  preventDefault: true,
@@ -2208,10 +2244,10 @@ var createEditorStateTransaction = ({ scrollTo, selection }) => {
2208
2244
  return {
2209
2245
  selection,
2210
2246
  scrollIntoView: !scrollTo,
2211
- effects: scrollTo ? import_view14.EditorView.scrollIntoView(scrollTo, {
2247
+ effects: scrollTo ? import_view15.EditorView.scrollIntoView(scrollTo, {
2212
2248
  yMargin: 96
2213
2249
  }) : void 0,
2214
- annotations: import_state14.Transaction.userEvent.of(stateRestoreAnnotation)
2250
+ annotations: import_state15.Transaction.userEvent.of(stateRestoreAnnotation)
2215
2251
  };
2216
2252
  };
2217
2253
  var createEditorStateStore = (keyPrefix) => ({
@@ -2250,7 +2286,7 @@ var selectionState = ({ getState, setState } = {}) => {
2250
2286
  // setStateDebounced(id, {});
2251
2287
  // },
2252
2288
  // }),
2253
- import_view14.EditorView.updateListener.of(({ view, transactions }) => {
2289
+ import_view15.EditorView.updateListener.of(({ view, transactions }) => {
2254
2290
  const id = view.state.facet(documentId);
2255
2291
  if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
2256
2292
  return;
@@ -2273,7 +2309,7 @@ var selectionState = ({ getState, setState } = {}) => {
2273
2309
  }
2274
2310
  }
2275
2311
  }),
2276
- getState && import_view14.keymap.of([
2312
+ getState && import_view15.keymap.of([
2277
2313
  {
2278
2314
  key: "ctrl-r",
2279
2315
  run: (view) => {
@@ -2285,13 +2321,13 @@ var selectionState = ({ getState, setState } = {}) => {
2285
2321
  }
2286
2322
  }
2287
2323
  ])
2288
- ].filter(import_util2.isNotFalsy);
2324
+ ].filter(import_util3.isNotFalsy);
2289
2325
  };
2290
2326
  var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
2291
- var setComments = import_state13.StateEffect.define();
2292
- var setSelection = import_state13.StateEffect.define();
2293
- var setCommentState = import_state13.StateEffect.define();
2294
- var commentsState = import_state13.StateField.define({
2327
+ var setComments = import_state14.StateEffect.define();
2328
+ var setSelection = import_state14.StateEffect.define();
2329
+ var setCommentState = import_state14.StateEffect.define();
2330
+ var commentsState = import_state14.StateField.define({
2295
2331
  create: (state) => ({
2296
2332
  id: state.facet(documentId),
2297
2333
  comments: [],
@@ -2316,7 +2352,7 @@ var commentsState = import_state13.StateField.define({
2316
2352
  comment,
2317
2353
  range
2318
2354
  };
2319
- }).filter(import_util.isNonNullable);
2355
+ }).filter(import_util2.isNonNullable);
2320
2356
  return {
2321
2357
  ...value,
2322
2358
  comments: commentStates
@@ -2329,7 +2365,7 @@ var commentsState = import_state13.StateField.define({
2329
2365
  return value;
2330
2366
  }
2331
2367
  });
2332
- var styles2 = import_view13.EditorView.theme({
2368
+ var styles2 = import_view14.EditorView.theme({
2333
2369
  ".cm-comment, .cm-comment-current": {
2334
2370
  margin: "0 -3px",
2335
2371
  padding: "3px",
@@ -2342,14 +2378,14 @@ var styles2 = import_view13.EditorView.theme({
2342
2378
  textDecoration: "underline"
2343
2379
  }
2344
2380
  });
2345
- var createCommentMark = (id, isCurrent) => import_view13.Decoration.mark({
2381
+ var createCommentMark = (id, isCurrent) => import_view14.Decoration.mark({
2346
2382
  class: isCurrent ? "cm-comment-current" : "cm-comment",
2347
2383
  attributes: {
2348
2384
  "data-testid": "cm-comment",
2349
2385
  "data-comment-id": id
2350
2386
  }
2351
2387
  });
2352
- var commentsDecorations = import_view13.EditorView.decorations.compute([
2388
+ var commentsDecorations = import_view14.EditorView.decorations.compute([
2353
2389
  commentsState
2354
2390
  ], (state) => {
2355
2391
  const { selection: { current }, comments: comments2 } = state.field(commentsState);
@@ -2368,11 +2404,11 @@ var commentsDecorations = import_view13.EditorView.decorations.compute([
2368
2404
  }
2369
2405
  const mark = createCommentMark(comment.comment.id, comment.comment.id === current);
2370
2406
  return mark.range(range.from, range.to);
2371
- }).filter(import_util.isNonNullable);
2372
- return import_view13.Decoration.set(decorations2);
2407
+ }).filter(import_util2.isNonNullable);
2408
+ return import_view14.Decoration.set(decorations2);
2373
2409
  });
2374
- var commentClickedEffect = import_state13.StateEffect.define();
2375
- var handleCommentClick = import_view13.EditorView.domEventHandlers({
2410
+ var commentClickedEffect = import_state14.StateEffect.define();
2411
+ var handleCommentClick = import_view14.EditorView.domEventHandlers({
2376
2412
  click: (event, view) => {
2377
2413
  let target = event.target;
2378
2414
  const editorRoot = view.dom;
@@ -2411,7 +2447,7 @@ var trackPastedComments = (onUpdate) => {
2411
2447
  }
2412
2448
  };
2413
2449
  return [
2414
- import_view13.EditorView.domEventHandlers({
2450
+ import_view14.EditorView.domEventHandlers({
2415
2451
  cut: handleTrack,
2416
2452
  copy: handleTrack
2417
2453
  }),
@@ -2433,7 +2469,7 @@ var trackPastedComments = (onUpdate) => {
2433
2469
  return effects;
2434
2470
  }),
2435
2471
  // Handle paste or the undo of comment deletion.
2436
- import_view13.EditorView.updateListener.of((update2) => {
2472
+ import_view14.EditorView.updateListener.of((update2) => {
2437
2473
  const restore = [];
2438
2474
  for (let i = 0; i < update2.transactions.length; i++) {
2439
2475
  const tr = update2.transactions[i];
@@ -2489,7 +2525,7 @@ var mapTrackedComment = (comment, changes) => ({
2489
2525
  from: changes.mapPos(comment.from, 1),
2490
2526
  to: changes.mapPos(comment.to, 1)
2491
2527
  });
2492
- var restoreCommentEffect = import_state13.StateEffect.define({
2528
+ var restoreCommentEffect = import_state14.StateEffect.define({
2493
2529
  map: mapTrackedComment
2494
2530
  });
2495
2531
  var createComment = (view) => {
@@ -2534,7 +2570,7 @@ var comments = (options = {}) => {
2534
2570
  //
2535
2571
  // Keymap.
2536
2572
  //
2537
- options.onCreate && import_view13.keymap.of([
2573
+ options.onCreate && import_view14.keymap.of([
2538
2574
  {
2539
2575
  key: shortcut,
2540
2576
  run: callbackWrapper(createComment)
@@ -2544,7 +2580,7 @@ var comments = (options = {}) => {
2544
2580
  // Hover tooltip (for key shortcut hints, etc.)
2545
2581
  // TODO(burdon): Factor out to generic hints extension for current selection/line.
2546
2582
  //
2547
- options.renderTooltip && (0, import_view13.hoverTooltip)((view, pos) => {
2583
+ options.renderTooltip && (0, import_view14.hoverTooltip)((view, pos) => {
2548
2584
  const selection = view.state.selection.main;
2549
2585
  if (selection && pos >= selection.from && pos <= selection.to) {
2550
2586
  return {
@@ -2575,7 +2611,7 @@ var comments = (options = {}) => {
2575
2611
  //
2576
2612
  // Track deleted ranges and update ranges for decorations.
2577
2613
  //
2578
- import_view13.EditorView.updateListener.of(({ view, state, changes }) => {
2614
+ import_view14.EditorView.updateListener.of(({ view, state, changes }) => {
2579
2615
  let mod = false;
2580
2616
  const { comments: comments2, ...value } = state.field(commentsState);
2581
2617
  changes.iterChanges((from, to, from2, to2) => {
@@ -2607,7 +2643,7 @@ var comments = (options = {}) => {
2607
2643
  //
2608
2644
  // Track selection/proximity.
2609
2645
  //
2610
- import_view13.EditorView.updateListener.of(({ view, state }) => {
2646
+ import_view14.EditorView.updateListener.of(({ view, state }) => {
2611
2647
  let min = Infinity;
2612
2648
  const { selection: { current, closest }, comments: comments2 } = state.field(commentsState);
2613
2649
  const { head } = state.selection.main;
@@ -2641,7 +2677,7 @@ var comments = (options = {}) => {
2641
2677
  }
2642
2678
  }),
2643
2679
  options.onUpdate && trackPastedComments(options.onUpdate)
2644
- ].filter(import_util.isNonNullable);
2680
+ ].filter(import_util2.isNonNullable);
2645
2681
  };
2646
2682
  var scrollThreadIntoView = (view, id, center = true) => {
2647
2683
  const comment = view.state.field(commentsState).comments.find((range2) => range2.comment.id === id);
@@ -2661,7 +2697,7 @@ var scrollThreadIntoView = (view, id, center = true) => {
2661
2697
  anchor: range.from
2662
2698
  } : void 0,
2663
2699
  effects: [
2664
- needsScroll ? import_view13.EditorView.scrollIntoView(range.from, center ? {
2700
+ needsScroll ? import_view14.EditorView.scrollIntoView(range.from, center ? {
2665
2701
  y: "center"
2666
2702
  } : void 0) : [],
2667
2703
  needsSelectionUpdate ? setSelection.of({
@@ -2691,7 +2727,7 @@ var ExternalCommentSync = class {
2691
2727
  this.unsubscribe = subscribe(updateComments);
2692
2728
  }
2693
2729
  };
2694
- var createExternalCommentSync = (id, subscribe, getComments) => import_view13.ViewPlugin.fromClass(class {
2730
+ var createExternalCommentSync = (id, subscribe, getComments) => import_view14.ViewPlugin.fromClass(class {
2695
2731
  constructor(view) {
2696
2732
  return new ExternalCommentSync(view, id, subscribe, getComments);
2697
2733
  }
@@ -2714,12 +2750,12 @@ var debugNodeLogger = (log9 = console.log) => {
2714
2750
  const logTokens = (state) => (0, import_language.syntaxTree)(state).iterate({
2715
2751
  enter: (node) => log9(node.type)
2716
2752
  });
2717
- return import_state15.StateField.define({
2753
+ return import_state16.StateField.define({
2718
2754
  create: (state) => logTokens(state),
2719
2755
  update: (_, tr) => logTokens(tr.state)
2720
2756
  });
2721
2757
  };
2722
- var styles3 = import_view15.EditorView.theme({
2758
+ var styles3 = import_view16.EditorView.theme({
2723
2759
  ".cm-dropCursor": {
2724
2760
  borderLeft: "2px solid var(--dx-accentText)",
2725
2761
  color: "var(--dx-accentText)",
@@ -2732,8 +2768,8 @@ var styles3 = import_view15.EditorView.theme({
2732
2768
  var dropFile = (options = {}) => {
2733
2769
  return [
2734
2770
  styles3,
2735
- (0, import_view15.dropCursor)(),
2736
- import_view15.EditorView.domEventHandlers({
2771
+ (0, import_view16.dropCursor)(),
2772
+ import_view16.EditorView.domEventHandlers({
2737
2773
  drop: (event, view) => {
2738
2774
  event.preventDefault();
2739
2775
  const files = event.dataTransfer?.files;
@@ -2752,8 +2788,8 @@ var dropFile = (options = {}) => {
2752
2788
  })
2753
2789
  ];
2754
2790
  };
2755
- var focusEffect = import_state17.StateEffect.define();
2756
- var focusField = import_state17.StateField.define({
2791
+ var focusEffect = import_state18.StateEffect.define();
2792
+ var focusField = import_state18.StateField.define({
2757
2793
  create: () => false,
2758
2794
  update: (value, tr) => {
2759
2795
  for (const effect of tr.effects) {
@@ -2766,7 +2802,7 @@ var focusField = import_state17.StateField.define({
2766
2802
  });
2767
2803
  var focus = [
2768
2804
  focusField,
2769
- import_view17.EditorView.domEventHandlers({
2805
+ import_view18.EditorView.domEventHandlers({
2770
2806
  focus: (event, view) => {
2771
2807
  setTimeout(() => view.dispatch({
2772
2808
  effects: focusEffect.of(true)
@@ -2792,11 +2828,11 @@ var theme = {
2792
2828
  codeMark: "font-mono text-primary-500",
2793
2829
  mark: "opacity-50",
2794
2830
  heading: (level) => {
2795
- return (0, import_react_ui_theme4.mx)(headings[level], "dark:text-primary-400");
2831
+ return (0, import_react_ui_theme3.mx)(headings[level], "dark:text-primary-400");
2796
2832
  }
2797
2833
  };
2798
2834
  var getToken = (path, defaultValue) => {
2799
- const value = (0, import_util4.get)(import_react_ui_theme5.tokens, path, defaultValue);
2835
+ const value = (0, import_util5.get)(import_react_ui_theme4.tokens, path, defaultValue);
2800
2836
  return value?.toString() ?? "";
2801
2837
  };
2802
2838
  var fontBody = getToken("fontFamily.body");
@@ -3020,22 +3056,21 @@ var editorSlots = {
3020
3056
  className: editorWidth
3021
3057
  }
3022
3058
  };
3023
- var editorGutter = import_view18.EditorView.theme({
3059
+ var editorGutter = import_view19.EditorView.theme({
3024
3060
  ".cm-gutters": {
3025
3061
  background: "var(--dx-baseSurface)",
3026
3062
  paddingRight: "1rem"
3027
3063
  }
3028
3064
  });
3029
- var editorMonospace = import_view18.EditorView.theme({
3065
+ var editorMonospace = import_view19.EditorView.theme({
3030
3066
  ".cm-content": {
3031
3067
  fontFamily: fontMono
3032
3068
  }
3033
3069
  });
3034
3070
  var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden";
3035
- var stackItemContentEditorClassNames = (role) => (0, import_react_ui_theme3.mx)("attention-surface dx-focus-ring-inset data-[toolbar=disabled]:pbs-2", role === "section" ? "[&_.cm-scroller]:overflow-hidden [&_.cm-scroller]:min-bs-24" : "min-bs-0");
3036
- var stackItemContentToolbarClassNames = (role) => (0, import_react_ui_theme3.mx)("relative z-[1] flex is-full bg-toolbarSurface border-be border-subduedSeparator", role === "section" && "sticky block-start-0 -mbe-px min-is-0");
3071
+ var stackItemContentEditorClassNames = (role) => (0, import_react_ui_theme2.mx)("attention-surface dx-focus-ring-inset data-[toolbar=disabled]:pbs-2", role === "section" ? "[&_.cm-scroller]:overflow-hidden [&_.cm-scroller]:min-bs-24" : "min-bs-0");
3037
3072
  var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
3038
- var preventNewline = import_state16.EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
3073
+ var preventNewline = import_state17.EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
3039
3074
  var defaultBasicOptions = {
3040
3075
  allowMultipleSelections: true,
3041
3076
  bracketMatching: true,
@@ -3057,7 +3092,7 @@ var createBasicExtensions = (_props) => {
3057
3092
  const props = (0, import_lodash3.default)({}, _props, defaultBasicOptions);
3058
3093
  return [
3059
3094
  // NOTE: Doesn't catch errors in keymap functions.
3060
- import_view16.EditorView.exceptionSink.of((err) => {
3095
+ import_view17.EditorView.exceptionSink.of((err) => {
3061
3096
  import_log5.log.catch(err, void 0, {
3062
3097
  F: __dxlog_file8,
3063
3098
  L: 100,
@@ -3065,29 +3100,29 @@ var createBasicExtensions = (_props) => {
3065
3100
  C: (f, a) => f(...a)
3066
3101
  });
3067
3102
  }),
3068
- props.allowMultipleSelections && import_state16.EditorState.allowMultipleSelections.of(true),
3103
+ props.allowMultipleSelections && import_state17.EditorState.allowMultipleSelections.of(true),
3069
3104
  props.bracketMatching && (0, import_language2.bracketMatching)(),
3070
3105
  props.closeBrackets && (0, import_autocomplete2.closeBrackets)(),
3071
- props.dropCursor && (0, import_view16.dropCursor)(),
3072
- props.drawSelection && (0, import_view16.drawSelection)({
3106
+ props.dropCursor && (0, import_view17.dropCursor)(),
3107
+ props.drawSelection && (0, import_view17.drawSelection)({
3073
3108
  cursorBlinkRate: 1200
3074
3109
  }),
3075
- props.editable !== void 0 && import_view16.EditorView.editable.of(props.editable),
3110
+ props.editable !== void 0 && import_view17.EditorView.editable.of(props.editable),
3076
3111
  props.focus && focus,
3077
- props.highlightActiveLine && (0, import_view16.highlightActiveLine)(),
3112
+ props.highlightActiveLine && (0, import_view17.highlightActiveLine)(),
3078
3113
  props.history && (0, import_commands2.history)(),
3079
3114
  props.lineNumbers && [
3080
- (0, import_view16.lineNumbers)(),
3115
+ (0, import_view17.lineNumbers)(),
3081
3116
  editorGutter
3082
3117
  ],
3083
- props.lineWrapping && import_view16.EditorView.lineWrapping,
3118
+ props.lineWrapping && import_view17.EditorView.lineWrapping,
3084
3119
  props.monospace && editorMonospace,
3085
- props.placeholder && (0, import_view16.placeholder)(props.placeholder),
3086
- props.readOnly !== void 0 && import_state16.EditorState.readOnly.of(props.readOnly),
3087
- props.scrollPastEnd && (0, import_view16.scrollPastEnd)(),
3088
- props.tabSize && import_state16.EditorState.tabSize.of(props.tabSize),
3120
+ props.placeholder && (0, import_view17.placeholder)(props.placeholder),
3121
+ props.readOnly !== void 0 && import_state17.EditorState.readOnly.of(props.readOnly),
3122
+ props.scrollPastEnd && (0, import_view17.scrollPastEnd)(),
3123
+ props.tabSize && import_state17.EditorState.tabSize.of(props.tabSize),
3089
3124
  // https://codemirror.net/docs/ref/#view.KeyBinding
3090
- import_view16.keymap.of([
3125
+ import_view17.keymap.of([
3091
3126
  ...(props.keymap && keymaps[props.keymap]) ?? [],
3092
3127
  // NOTE: Tabs are also configured by markdown extension.
3093
3128
  // https://codemirror.net/docs/ref/#commands.indentWithTab
@@ -3107,8 +3142,8 @@ var createBasicExtensions = (_props) => {
3107
3142
  preventDefault: true,
3108
3143
  run: () => true
3109
3144
  }
3110
- ].filter(import_util3.isNotFalsy))
3111
- ].filter(import_util3.isNotFalsy);
3145
+ ].filter(import_util4.isNotFalsy))
3146
+ ].filter(import_util4.isNotFalsy);
3112
3147
  };
3113
3148
  var defaultThemeSlots = {
3114
3149
  editor: {
@@ -3118,22 +3153,22 @@ var defaultThemeSlots = {
3118
3153
  var createThemeExtensions = ({ themeMode, styles: styles4, syntaxHighlighting: _syntaxHighlighting, slots: _slots } = {}) => {
3119
3154
  const slots = (0, import_lodash3.default)({}, _slots, defaultThemeSlots);
3120
3155
  return [
3121
- import_view16.EditorView.darkTheme.of(themeMode === "dark"),
3122
- import_view16.EditorView.baseTheme(styles4 ? (0, import_lodash4.default)({}, defaultTheme, styles4) : defaultTheme),
3156
+ import_view17.EditorView.darkTheme.of(themeMode === "dark"),
3157
+ import_view17.EditorView.baseTheme(styles4 ? (0, import_lodash4.default)({}, defaultTheme, styles4) : defaultTheme),
3123
3158
  // https://github.com/codemirror/theme-one-dark
3124
3159
  _syntaxHighlighting && (themeMode === "dark" ? (0, import_language2.syntaxHighlighting)(import_theme_one_dark.oneDarkHighlightStyle) : (0, import_language2.syntaxHighlighting)(import_language2.defaultHighlightStyle)),
3125
- slots.editor?.className && import_view16.EditorView.editorAttributes.of({
3160
+ slots.editor?.className && import_view17.EditorView.editorAttributes.of({
3126
3161
  class: slots.editor.className
3127
3162
  }),
3128
- slots.content?.className && import_view16.EditorView.contentAttributes.of({
3163
+ slots.content?.className && import_view17.EditorView.contentAttributes.of({
3129
3164
  class: slots.content.className
3130
3165
  }),
3131
- slots.scroll?.className && import_view16.ViewPlugin.fromClass(class {
3166
+ slots.scroll?.className && import_view17.ViewPlugin.fromClass(class {
3132
3167
  constructor(view) {
3133
3168
  view.scrollDOM.classList.add(slots.scroll.className);
3134
3169
  }
3135
3170
  })
3136
- ].filter(import_util3.isNotFalsy);
3171
+ ].filter(import_util4.isNotFalsy);
3137
3172
  };
3138
3173
  var createDataExtensions = ({ id, text, space, identity }) => {
3139
3174
  const extensions = [];
@@ -3142,7 +3177,7 @@ var createDataExtensions = ({ id, text, space, identity }) => {
3142
3177
  }
3143
3178
  if (space && identity) {
3144
3179
  const peerId = identity?.identityKey.toHex();
3145
- const hue = identity?.profile?.data?.hue ?? (0, import_util3.hexToHue)(peerId ?? "0");
3180
+ const hue = identity?.profile?.data?.hue ?? (0, import_util4.hexToHue)(peerId ?? "0");
3146
3181
  extensions.push(awareness(new SpaceAwarenessProvider({
3147
3182
  space,
3148
3183
  channel: `awareness.${id}`,
@@ -3177,7 +3212,7 @@ var folding = (_props = {}) => [
3177
3212
  }));
3178
3213
  }
3179
3214
  }),
3180
- import_view19.EditorView.theme({
3215
+ import_view20.EditorView.theme({
3181
3216
  ".cm-foldGutter": {
3182
3217
  opacity: 0.3,
3183
3218
  transition: "opacity 0.3s",
@@ -3188,25 +3223,25 @@ var folding = (_props = {}) => [
3188
3223
  }
3189
3224
  })
3190
3225
  ];
3191
- var TagWidget = class extends import_view20.WidgetType {
3226
+ var TagWidget = class extends import_view21.WidgetType {
3192
3227
  constructor(_text) {
3193
3228
  super(), this._text = _text;
3194
3229
  }
3195
3230
  toDOM() {
3196
3231
  const span = document.createElement("span");
3197
- span.className = (0, import_react_ui_theme6.mx)("cm-tag", (0, import_react_ui_theme6.getHashColor)(this._text).tag);
3232
+ span.className = (0, import_react_ui_theme5.mx)("cm-tag", (0, import_react_ui_theme5.getHashColor)(this._text).tag);
3198
3233
  span.textContent = this._text;
3199
3234
  return span;
3200
3235
  }
3201
3236
  };
3202
- var tagMatcher = new import_view20.MatchDecorator({
3237
+ var tagMatcher = new import_view21.MatchDecorator({
3203
3238
  regexp: /#(\w+)\W/g,
3204
- decoration: (match) => import_view20.Decoration.replace({
3239
+ decoration: (match) => import_view21.Decoration.replace({
3205
3240
  widget: new TagWidget(match[1])
3206
3241
  })
3207
3242
  });
3208
3243
  var hashtag = () => [
3209
- import_view20.ViewPlugin.fromClass(class {
3244
+ import_view21.ViewPlugin.fromClass(class {
3210
3245
  constructor(view) {
3211
3246
  this.tags = tagMatcher.createDeco(view);
3212
3247
  }
@@ -3215,11 +3250,11 @@ var hashtag = () => [
3215
3250
  }
3216
3251
  }, {
3217
3252
  decorations: (instance) => instance.tags,
3218
- provide: (plugin) => import_view20.EditorView.atomicRanges.of((view) => {
3219
- return view.plugin(plugin)?.tags || import_view20.Decoration.none;
3253
+ provide: (plugin) => import_view21.EditorView.atomicRanges.of((view) => {
3254
+ return view.plugin(plugin)?.tags || import_view21.Decoration.none;
3220
3255
  })
3221
3256
  }),
3222
- import_view20.EditorView.theme({
3257
+ import_view21.EditorView.theme({
3223
3258
  ".cm-tag": {
3224
3259
  borderRadius: "4px",
3225
3260
  marginRight: "6px",
@@ -3269,11 +3304,11 @@ var schemaLinter = (validate) => (view) => {
3269
3304
  };
3270
3305
  var listener = ({ onFocus, onChange }) => {
3271
3306
  const extensions = [];
3272
- onFocus && extensions.push(import_view21.EditorView.focusChangeEffect.of((_, focusing) => {
3307
+ onFocus && extensions.push(import_view22.EditorView.focusChangeEffect.of((_, focusing) => {
3273
3308
  onFocus(focusing);
3274
3309
  return null;
3275
3310
  }));
3276
- onChange && extensions.push(import_view21.EditorView.updateListener.of((update2) => {
3311
+ onChange && extensions.push(import_view22.EditorView.updateListener.of((update2) => {
3277
3312
  onChange(update2.state.doc.toString(), update2.state.facet(documentId));
3278
3313
  }));
3279
3314
  return extensions;
@@ -3396,7 +3431,7 @@ var setStyle = (type, enable) => {
3396
3431
  to: range.head + found + marker.length
3397
3432
  }
3398
3433
  ],
3399
- range: import_state18.EditorSelection.cursor(range.from - marker.length)
3434
+ range: import_state19.EditorSelection.cursor(range.from - marker.length)
3400
3435
  };
3401
3436
  }
3402
3437
  }
@@ -3524,13 +3559,13 @@ var setStyle = (type, enable) => {
3524
3559
  from: range.head,
3525
3560
  insert: marker + marker
3526
3561
  },
3527
- range: import_state18.EditorSelection.cursor(range.head + marker.length)
3562
+ range: import_state19.EditorSelection.cursor(range.head + marker.length)
3528
3563
  };
3529
3564
  }
3530
3565
  const changeSet = state.changes(changes2.concat(changesAtEnd));
3531
3566
  return {
3532
3567
  changes: changeSet,
3533
- range: range.empty && !changeSet.empty ? import_state18.EditorSelection.cursor(range.head + marker.length) : import_state18.EditorSelection.range(changeSet.mapPos(range.from, 1), changeSet.mapPos(range.to, -1))
3568
+ range: range.empty && !changeSet.empty ? import_state19.EditorSelection.cursor(range.head + marker.length) : import_state19.EditorSelection.range(changeSet.mapPos(range.from, 1), changeSet.mapPos(range.to, -1))
3534
3569
  };
3535
3570
  });
3536
3571
  dispatch(state.update(changes, {
@@ -3730,7 +3765,7 @@ var addLink = ({ url, image: image2 } = {}) => {
3730
3765
  const changeSet = state.changes(changes2.concat(changesAfter));
3731
3766
  return {
3732
3767
  changes: changeSet,
3733
- range: import_state18.EditorSelection.cursor(changeSet.mapPos(to, 1) - cursorOffset - (url ? url.length + 2 : 0))
3768
+ range: import_state19.EditorSelection.cursor(changeSet.mapPos(to, 1) - cursorOffset - (url ? url.length + 2 : 0))
3734
3769
  };
3735
3770
  });
3736
3771
  if (changes.changes.empty) {
@@ -4164,7 +4199,7 @@ var toggleCodeblock = (target) => {
4164
4199
  };
4165
4200
  var formattingKeymap = (_options = {}) => {
4166
4201
  return [
4167
- import_view22.keymap.of([
4202
+ import_view23.keymap.of([
4168
4203
  {
4169
4204
  key: "meta-b",
4170
4205
  run: toggleStrong
@@ -4365,7 +4400,7 @@ var getFormatting = (state) => {
4365
4400
  };
4366
4401
  };
4367
4402
  var useFormattingState = (state) => {
4368
- return (0, import_react7.useMemo)(() => import_view22.EditorView.updateListener.of((update2) => {
4403
+ return (0, import_react7.useMemo)(() => import_view23.EditorView.updateListener.of((update2) => {
4369
4404
  if (update2.docChanged || update2.selectionSet) {
4370
4405
  Object.entries(getFormatting(update2.state)).forEach(([key, active]) => {
4371
4406
  state[key] = active;
@@ -4617,17 +4652,16 @@ var createMarkdownExtensions = (options = {}) => {
4617
4652
  }),
4618
4653
  // Custom styles.
4619
4654
  (0, import_language5.syntaxHighlighting)(markdownHighlightStyle()),
4620
- import_view23.keymap.of([
4655
+ import_view24.keymap.of([
4621
4656
  // https://codemirror.net/docs/ref/#commands.indentWithTab
4622
4657
  options.indentWithTab !== false && import_commands3.indentWithTab,
4623
4658
  // https://codemirror.net/docs/ref/#commands.defaultKeymap
4624
4659
  ...import_commands3.defaultKeymap,
4625
- ...import_autocomplete4.completionKeymap,
4626
- ...import_lint2.lintKeymap
4627
- ].filter(import_util5.isNotFalsy))
4660
+ ...import_autocomplete4.completionKeymap
4661
+ ].filter(import_util6.isNotFalsy))
4628
4662
  ];
4629
4663
  };
4630
- var debugTree = (cb) => import_state19.StateField.define({
4664
+ var debugTree = (cb) => import_state20.StateField.define({
4631
4665
  create: (state) => cb(convertTreeToJson(state)),
4632
4666
  update: (value, tr) => cb(convertTreeToJson(tr.state))
4633
4667
  });
@@ -4651,12 +4685,12 @@ var convertTreeToJson = (state) => {
4651
4685
  return treeToJson((0, import_language7.syntaxTree)(state).cursor());
4652
4686
  };
4653
4687
  var adjustChanges = () => {
4654
- return import_view25.ViewPlugin.fromClass(class {
4688
+ return import_view26.ViewPlugin.fromClass(class {
4655
4689
  update(update2) {
4656
4690
  const tree = (0, import_language9.syntaxTree)(update2.state);
4657
4691
  const adjustments = [];
4658
4692
  for (const tr of update2.transactions) {
4659
- const event = tr.annotation(import_state21.Transaction.userEvent);
4693
+ const event = tr.annotation(import_state22.Transaction.userEvent);
4660
4694
  switch (event) {
4661
4695
  //
4662
4696
  // Enter
@@ -4791,9 +4825,9 @@ var getValidUrl = (str) => {
4791
4825
  };
4792
4826
  var image = (_options = {}) => {
4793
4827
  return [
4794
- import_state22.StateField.define({
4828
+ import_state23.StateField.define({
4795
4829
  create: (state) => {
4796
- return import_view26.Decoration.set(buildDecorations(0, state.doc.length, state));
4830
+ return import_view27.Decoration.set(buildDecorations(0, state.doc.length, state));
4797
4831
  },
4798
4832
  update: (value, tr) => {
4799
4833
  if (!tr.docChanged && !tr.selection) {
@@ -4816,7 +4850,7 @@ var image = (_options = {}) => {
4816
4850
  add: buildDecorations(from, to, tr.state)
4817
4851
  });
4818
4852
  },
4819
- provide: (field) => import_view26.EditorView.decorations.from(field)
4853
+ provide: (field) => import_view27.EditorView.decorations.from(field)
4820
4854
  })
4821
4855
  ];
4822
4856
  };
@@ -4834,7 +4868,7 @@ var buildDecorations = (from, to, state) => {
4834
4868
  return;
4835
4869
  }
4836
4870
  preloadImage(url);
4837
- decorations2.push(import_view26.Decoration.replace({
4871
+ decorations2.push(import_view27.Decoration.replace({
4838
4872
  block: true,
4839
4873
  widget: new ImageWidget(url)
4840
4874
  }).range(hide2 ? node.from : node.to, node.to));
@@ -4854,7 +4888,7 @@ var preloadImage = (url) => {
4854
4888
  preloaded.add(url);
4855
4889
  }
4856
4890
  };
4857
- var ImageWidget = class extends import_view26.WidgetType {
4891
+ var ImageWidget = class extends import_view27.WidgetType {
4858
4892
  constructor(_url) {
4859
4893
  super(), this._url = _url;
4860
4894
  }
@@ -4875,7 +4909,7 @@ var ImageWidget = class extends import_view26.WidgetType {
4875
4909
  };
4876
4910
  var bulletListIndentationWidth = 24;
4877
4911
  var orderedListIndentationWidth = 36;
4878
- var formattingStyles = import_view27.EditorView.theme({
4912
+ var formattingStyles = import_view28.EditorView.theme({
4879
4913
  /**
4880
4914
  * Horizontal rule.
4881
4915
  */
@@ -4994,14 +5028,14 @@ var formattingStyles = import_view27.EditorView.theme({
4994
5028
  }
4995
5029
  });
4996
5030
  var table = (options = {}) => {
4997
- return import_state23.StateField.define({
5031
+ return import_state24.StateField.define({
4998
5032
  create: (state) => update(state, options),
4999
5033
  update: (_, tr) => update(tr.state, options),
5000
- provide: (field) => import_view28.EditorView.decorations.from(field)
5034
+ provide: (field) => import_view29.EditorView.decorations.from(field)
5001
5035
  });
5002
5036
  };
5003
5037
  var update = (state, _options) => {
5004
- const builder = new import_state23.RangeSetBuilder();
5038
+ const builder = new import_state24.RangeSetBuilder();
5005
5039
  const cursor = state.selection.main.head;
5006
5040
  const tables = [];
5007
5041
  const getTable = () => tables[tables.length - 1];
@@ -5042,19 +5076,19 @@ var update = (state, _options) => {
5042
5076
  tables.forEach((table2) => {
5043
5077
  const replace = state.readOnly || cursor < table2.from || cursor > table2.to;
5044
5078
  if (replace) {
5045
- builder.add(table2.from, table2.to, import_view28.Decoration.replace({
5079
+ builder.add(table2.from, table2.to, import_view29.Decoration.replace({
5046
5080
  block: true,
5047
5081
  widget: new TableWidget(table2)
5048
5082
  }));
5049
5083
  } else {
5050
- builder.add(table2.from, table2.to, import_view28.Decoration.mark({
5084
+ builder.add(table2.from, table2.to, import_view29.Decoration.mark({
5051
5085
  class: "cm-table"
5052
5086
  }));
5053
5087
  }
5054
5088
  });
5055
5089
  return builder.finish();
5056
5090
  };
5057
- var TableWidget = class extends import_view28.WidgetType {
5091
+ var TableWidget = class extends import_view29.WidgetType {
5058
5092
  constructor(_table) {
5059
5093
  super(), this._table = _table;
5060
5094
  }
@@ -5093,14 +5127,14 @@ var Unicode = {
5093
5127
  bulletSmall: "\u2219",
5094
5128
  bulletSquare: "\u2B1D"
5095
5129
  };
5096
- var HorizontalRuleWidget = class extends import_view24.WidgetType {
5130
+ var HorizontalRuleWidget = class extends import_view25.WidgetType {
5097
5131
  toDOM() {
5098
5132
  const el = document.createElement("span");
5099
5133
  el.className = "cm-hr";
5100
5134
  return el;
5101
5135
  }
5102
5136
  };
5103
- var LinkButton = class extends import_view24.WidgetType {
5137
+ var LinkButton = class extends import_view25.WidgetType {
5104
5138
  constructor(url, render) {
5105
5139
  super(), this.url = url, this.render = render;
5106
5140
  }
@@ -5116,7 +5150,7 @@ var LinkButton = class extends import_view24.WidgetType {
5116
5150
  return el;
5117
5151
  }
5118
5152
  };
5119
- var CheckboxWidget = class extends import_view24.WidgetType {
5153
+ var CheckboxWidget = class extends import_view25.WidgetType {
5120
5154
  constructor(_checked) {
5121
5155
  super(), this._checked = _checked;
5122
5156
  }
@@ -5160,7 +5194,7 @@ var CheckboxWidget = class extends import_view24.WidgetType {
5160
5194
  return false;
5161
5195
  }
5162
5196
  };
5163
- var TextWidget = class extends import_view24.WidgetType {
5197
+ var TextWidget = class extends import_view25.WidgetType {
5164
5198
  constructor(text, className) {
5165
5199
  super(), this.text = text, this.className = className;
5166
5200
  }
@@ -5173,29 +5207,29 @@ var TextWidget = class extends import_view24.WidgetType {
5173
5207
  return el;
5174
5208
  }
5175
5209
  };
5176
- var hide = import_view24.Decoration.replace({});
5177
- var blockQuote = import_view24.Decoration.line({
5210
+ var hide = import_view25.Decoration.replace({});
5211
+ var blockQuote = import_view25.Decoration.line({
5178
5212
  class: "cm-blockquote"
5179
5213
  });
5180
- var fencedCodeLine = import_view24.Decoration.line({
5214
+ var fencedCodeLine = import_view25.Decoration.line({
5181
5215
  class: "cm-code cm-codeblock-line"
5182
5216
  });
5183
- var fencedCodeLineFirst = import_view24.Decoration.line({
5184
- class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line", "cm-codeblock-start")
5217
+ var fencedCodeLineFirst = import_view25.Decoration.line({
5218
+ class: (0, import_react_ui_theme6.mx)("cm-code cm-codeblock-line", "cm-codeblock-start")
5185
5219
  });
5186
- var fencedCodeLineLast = import_view24.Decoration.line({
5187
- class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line", "cm-codeblock-end")
5220
+ var fencedCodeLineLast = import_view25.Decoration.line({
5221
+ class: (0, import_react_ui_theme6.mx)("cm-code cm-codeblock-line", "cm-codeblock-end")
5188
5222
  });
5189
5223
  var commentBlockLine = fencedCodeLine;
5190
5224
  var commentBlockLineFirst = fencedCodeLineFirst;
5191
5225
  var commentBlockLineLast = fencedCodeLineLast;
5192
- var horizontalRule = import_view24.Decoration.replace({
5226
+ var horizontalRule = import_view25.Decoration.replace({
5193
5227
  widget: new HorizontalRuleWidget()
5194
5228
  });
5195
- var checkedTask = import_view24.Decoration.replace({
5229
+ var checkedTask = import_view25.Decoration.replace({
5196
5230
  widget: new CheckboxWidget(true)
5197
5231
  });
5198
- var uncheckedTask = import_view24.Decoration.replace({
5232
+ var uncheckedTask = import_view25.Decoration.replace({
5199
5233
  widget: new CheckboxWidget(false)
5200
5234
  });
5201
5235
  var editingRange = (state, range, focus2) => {
@@ -5211,8 +5245,8 @@ var autoHideTags = /* @__PURE__ */ new Set([
5211
5245
  "SuperscriptMark"
5212
5246
  ]);
5213
5247
  var buildDecorations2 = (view, options, focus2) => {
5214
- const deco = new import_state20.RangeSetBuilder();
5215
- const atomicDeco = new import_state20.RangeSetBuilder();
5248
+ const deco = new import_state21.RangeSetBuilder();
5249
+ const atomicDeco = new import_state21.RangeSetBuilder();
5216
5250
  const { state } = view;
5217
5251
  const headerLevels = [];
5218
5252
  const getHeaderLevels = (node, level) => {
@@ -5299,7 +5333,7 @@ var buildDecorations2 = (view, options, focus2) => {
5299
5333
  } else {
5300
5334
  const num = headers.slice(from - 1).map((level2) => level2?.number ?? 0).join(".") + " ";
5301
5335
  if (num.length) {
5302
- atomicDeco.add(mark.from, mark.from + len, import_view24.Decoration.replace({
5336
+ atomicDeco.add(mark.from, mark.from + len, import_view25.Decoration.replace({
5303
5337
  widget: new TextWidget(num, theme.heading(level))
5304
5338
  }));
5305
5339
  }
@@ -5324,7 +5358,7 @@ var buildDecorations2 = (view, options, focus2) => {
5324
5358
  if (node.from === line.to - 1) {
5325
5359
  return false;
5326
5360
  }
5327
- deco.add(line.from, line.from, import_view24.Decoration.line({
5361
+ deco.add(line.from, line.from, import_view25.Decoration.line({
5328
5362
  class: "cm-list-item",
5329
5363
  attributes: {
5330
5364
  style: `padding-left: ${offset}px; text-indent: -${width}px;`
@@ -5341,7 +5375,7 @@ var buildDecorations2 = (view, options, focus2) => {
5341
5375
  const label = list.type === "OrderedList" ? `${++list.number}.` : Unicode.bulletSmall;
5342
5376
  const line = state.doc.lineAt(node.from);
5343
5377
  const to = state.doc.sliceString(node.to, node.to + 1) === " " ? node.to + 1 : node.to;
5344
- atomicDeco.add(line.from, to, import_view24.Decoration.replace({
5378
+ atomicDeco.add(line.from, to, import_view25.Decoration.replace({
5345
5379
  widget: new TextWidget(label, list.type === "OrderedList" ? "cm-list-mark cm-list-mark-ordered" : "cm-list-mark cm-list-mark-bullet")
5346
5380
  }));
5347
5381
  break;
@@ -5428,7 +5462,7 @@ var buildDecorations2 = (view, options, focus2) => {
5428
5462
  if (!editing) {
5429
5463
  atomicDeco.add(node.from, marks[0].to, hide);
5430
5464
  }
5431
- deco.add(marks[0].to, marks[1].from, import_view24.Decoration.mark({
5465
+ deco.add(marks[0].to, marks[1].from, import_view25.Decoration.mark({
5432
5466
  tagName: "a",
5433
5467
  attributes: {
5434
5468
  class: "cm-link",
@@ -5438,7 +5472,7 @@ var buildDecorations2 = (view, options, focus2) => {
5438
5472
  }
5439
5473
  }));
5440
5474
  if (!editing) {
5441
- atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view24.Decoration.replace({
5475
+ atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view25.Decoration.replace({
5442
5476
  widget: new LinkButton(url, options.renderLinkButton)
5443
5477
  }) : hide);
5444
5478
  }
@@ -5493,10 +5527,10 @@ var buildDecorations2 = (view, options, focus2) => {
5493
5527
  atomicDeco: atomicDeco.finish()
5494
5528
  };
5495
5529
  };
5496
- var forceUpdate = import_state20.StateEffect.define();
5530
+ var forceUpdate = import_state21.StateEffect.define();
5497
5531
  var decorateMarkdown = (options = {}) => {
5498
5532
  return [
5499
- import_view24.ViewPlugin.fromClass(class {
5533
+ import_view25.ViewPlugin.fromClass(class {
5500
5534
  constructor(view) {
5501
5535
  ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations2(view, options, view.hasFocus));
5502
5536
  }
@@ -5528,9 +5562,9 @@ var decorateMarkdown = (options = {}) => {
5528
5562
  }
5529
5563
  }, {
5530
5564
  provide: (plugin) => [
5531
- import_view24.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view24.Decoration.none),
5532
- import_view24.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view24.Decoration.none),
5533
- import_view24.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view24.Decoration.none)
5565
+ import_view25.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view25.Decoration.none),
5566
+ import_view25.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view25.Decoration.none),
5567
+ import_view25.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view25.Decoration.none)
5534
5568
  ]
5535
5569
  }),
5536
5570
  image(),
@@ -5540,7 +5574,7 @@ var decorateMarkdown = (options = {}) => {
5540
5574
  ];
5541
5575
  };
5542
5576
  var linkTooltip = (renderTooltip) => {
5543
- return (0, import_view29.hoverTooltip)((view, pos, side) => {
5577
+ return (0, import_view30.hoverTooltip)((view, pos, side) => {
5544
5578
  const syntax = (0, import_language12.syntaxTree)(view.state).resolveInner(pos, side);
5545
5579
  let link = null;
5546
5580
  for (let i = 0, node = syntax; !link && node && i < 5; node = node.parent, i++) {
@@ -5558,7 +5592,7 @@ var linkTooltip = (renderTooltip) => {
5558
5592
  // above: true,
5559
5593
  create: () => {
5560
5594
  const el = document.createElement("div");
5561
- el.className = (0, import_react_ui_theme8.tooltipContent)({});
5595
+ el.className = (0, import_react_ui_theme7.tooltipContent)({});
5562
5596
  renderTooltip(el, {
5563
5597
  url: urlText
5564
5598
  }, view);
@@ -5630,7 +5664,7 @@ var InputModeExtensions = {
5630
5664
  editorInputMode.of({
5631
5665
  type: "vscode"
5632
5666
  }),
5633
- import_view30.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5667
+ import_view31.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5634
5668
  ],
5635
5669
  vim: [
5636
5670
  // https://github.com/replit/codemirror-vim
@@ -5639,7 +5673,7 @@ var InputModeExtensions = {
5639
5673
  type: "vim",
5640
5674
  noTabster: true
5641
5675
  }),
5642
- import_view30.keymap.of([
5676
+ import_view31.keymap.of([
5643
5677
  {
5644
5678
  key: "Alt-Escape",
5645
5679
  run: (view) => {
@@ -5745,6 +5779,7 @@ var traverse = (root, cb) => {
5745
5779
  return value;
5746
5780
  }
5747
5781
  }
5782
+ return void 0;
5748
5783
  };
5749
5784
  return t(root, root.type === "root" ? -1 : 0);
5750
5785
  };
@@ -5779,7 +5814,7 @@ var format = (value) => JSON.stringify(value, (key, value2) => {
5779
5814
  }
5780
5815
  return value2;
5781
5816
  }).replaceAll('"', "");
5782
- var treeFacet = import_state27.Facet.define({
5817
+ var treeFacet = import_state28.Facet.define({
5783
5818
  combine: (values) => values[0]
5784
5819
  });
5785
5820
  var outlinerTree = (options = {}) => {
@@ -5802,7 +5837,7 @@ var outlinerTree = (options = {}) => {
5802
5837
  case "BulletList": {
5803
5838
  (0, import_invariant5.invariant)(current, void 0, {
5804
5839
  F: __dxlog_file11,
5805
- L: 217,
5840
+ L: 219,
5806
5841
  S: void 0,
5807
5842
  A: [
5808
5843
  "current",
@@ -5819,7 +5854,7 @@ var outlinerTree = (options = {}) => {
5819
5854
  case "ListItem": {
5820
5855
  (0, import_invariant5.invariant)(parent, void 0, {
5821
5856
  F: __dxlog_file11,
5822
- L: 226,
5857
+ L: 228,
5823
5858
  S: void 0,
5824
5859
  A: [
5825
5860
  "parent",
@@ -5861,7 +5896,7 @@ var outlinerTree = (options = {}) => {
5861
5896
  case "ListMark": {
5862
5897
  (0, import_invariant5.invariant)(current, void 0, {
5863
5898
  F: __dxlog_file11,
5864
- L: 270,
5899
+ L: 272,
5865
5900
  S: void 0,
5866
5901
  A: [
5867
5902
  "current",
@@ -5875,7 +5910,7 @@ var outlinerTree = (options = {}) => {
5875
5910
  case "Task": {
5876
5911
  (0, import_invariant5.invariant)(current, void 0, {
5877
5912
  F: __dxlog_file11,
5878
- L: 276,
5913
+ L: 278,
5879
5914
  S: void 0,
5880
5915
  A: [
5881
5916
  "current",
@@ -5888,7 +5923,7 @@ var outlinerTree = (options = {}) => {
5888
5923
  case "TaskMarker": {
5889
5924
  (0, import_invariant5.invariant)(current, void 0, {
5890
5925
  F: __dxlog_file11,
5891
- L: 281,
5926
+ L: 283,
5892
5927
  S: void 0,
5893
5928
  A: [
5894
5929
  "current",
@@ -5904,7 +5939,7 @@ var outlinerTree = (options = {}) => {
5904
5939
  if (node.name === "BulletList") {
5905
5940
  (0, import_invariant5.invariant)(parent, void 0, {
5906
5941
  F: __dxlog_file11,
5907
- L: 289,
5942
+ L: 291,
5908
5943
  S: void 0,
5909
5944
  A: [
5910
5945
  "parent",
@@ -5918,7 +5953,7 @@ var outlinerTree = (options = {}) => {
5918
5953
  });
5919
5954
  (0, import_invariant5.invariant)(tree, void 0, {
5920
5955
  F: __dxlog_file11,
5921
- L: 296,
5956
+ L: 298,
5922
5957
  S: void 0,
5923
5958
  A: [
5924
5959
  "tree",
@@ -5928,7 +5963,7 @@ var outlinerTree = (options = {}) => {
5928
5963
  return tree;
5929
5964
  };
5930
5965
  return [
5931
- import_state26.StateField.define({
5966
+ import_state27.StateField.define({
5932
5967
  create: (state) => {
5933
5968
  return buildTree(state);
5934
5969
  },
@@ -5944,10 +5979,10 @@ var outlinerTree = (options = {}) => {
5944
5979
  };
5945
5980
  var getSelection = (state) => state.selection.main;
5946
5981
  var selectionEquals = (a, b) => a.length === b.length && a.every((i) => b.includes(i));
5947
- var selectionFacet = import_state25.Facet.define({
5982
+ var selectionFacet = import_state26.Facet.define({
5948
5983
  combine: (values) => values[0]
5949
5984
  });
5950
- var selectionCompartment = new import_state25.Compartment();
5985
+ var selectionCompartment = new import_state26.Compartment();
5951
5986
  var selectNone = (view) => {
5952
5987
  view.dispatch({
5953
5988
  effects: selectionCompartment.reconfigure(selectionFacet.of([]))
@@ -6028,7 +6063,7 @@ var moveItemDown = (view) => {
6028
6063
  ];
6029
6064
  view.dispatch({
6030
6065
  changes,
6031
- selection: import_state24.EditorSelection.cursor(pos + nextContent.length + 1),
6066
+ selection: import_state25.EditorSelection.cursor(pos + nextContent.length + 1),
6032
6067
  scrollIntoView: true
6033
6068
  });
6034
6069
  }
@@ -6056,7 +6091,7 @@ var moveItemUp = (view) => {
6056
6091
  ];
6057
6092
  view.dispatch({
6058
6093
  changes,
6059
- selection: import_state24.EditorSelection.cursor(pos - prevContent.length - 1),
6094
+ selection: import_state25.EditorSelection.cursor(pos - prevContent.length - 1),
6060
6095
  scrollIntoView: true
6061
6096
  });
6062
6097
  }
@@ -6068,7 +6103,7 @@ var deleteItem = (view) => {
6068
6103
  const current = tree.find(pos);
6069
6104
  if (current) {
6070
6105
  view.dispatch({
6071
- selection: import_state24.EditorSelection.cursor(current.lineRange.from),
6106
+ selection: import_state25.EditorSelection.cursor(current.lineRange.from),
6072
6107
  changes: [
6073
6108
  {
6074
6109
  from: current.lineRange.from,
@@ -6098,7 +6133,7 @@ var toggleTask = (view) => {
6098
6133
  }
6099
6134
  return true;
6100
6135
  };
6101
- var commands = () => import_view31.keymap.of([
6136
+ var commands = () => import_view32.keymap.of([
6102
6137
  //
6103
6138
  // Indentation.
6104
6139
  //
@@ -6124,7 +6159,7 @@ var commands = () => import_view31.keymap.of([
6124
6159
  insert
6125
6160
  }
6126
6161
  ],
6127
- selection: import_state24.EditorSelection.cursor(pos + insert.length)
6162
+ selection: import_state25.EditorSelection.cursor(pos + insert.length)
6128
6163
  });
6129
6164
  return true;
6130
6165
  }
@@ -6142,7 +6177,7 @@ var commands = () => import_view31.keymap.of([
6142
6177
  const next = tree.next(item);
6143
6178
  if (next) {
6144
6179
  view.dispatch({
6145
- selection: import_state24.EditorSelection.cursor(next.contentRange.from)
6180
+ selection: import_state25.EditorSelection.cursor(next.contentRange.from)
6146
6181
  });
6147
6182
  return true;
6148
6183
  }
@@ -6205,7 +6240,7 @@ var commands = () => import_view31.keymap.of([
6205
6240
  var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/outliner/editor.ts";
6206
6241
  var LIST_ITEM_REGEX = /^\s*- (\[ \]|\[x\])? /;
6207
6242
  var initialize = () => {
6208
- return import_view33.ViewPlugin.fromClass(class {
6243
+ return import_view34.ViewPlugin.fromClass(class {
6209
6244
  constructor(view) {
6210
6245
  const first = view.state.doc.lineAt(0);
6211
6246
  const text = view.state.sliceDoc(first.from, first.to);
@@ -6221,7 +6256,7 @@ var initialize = () => {
6221
6256
  insert
6222
6257
  }
6223
6258
  ],
6224
- selection: import_state29.EditorSelection.cursor(insert.length)
6259
+ selection: import_state30.EditorSelection.cursor(insert.length)
6225
6260
  });
6226
6261
  });
6227
6262
  }
@@ -6230,7 +6265,7 @@ var initialize = () => {
6230
6265
  };
6231
6266
  var editor = () => [
6232
6267
  initialize(),
6233
- import_state29.EditorState.transactionFilter.of((tr) => {
6268
+ import_state30.EditorState.transactionFilter.of((tr) => {
6234
6269
  const tree = tr.state.facet(treeFacet);
6235
6270
  if (!tr.docChanged) {
6236
6271
  const current = getSelection(tr.state).from;
@@ -6245,20 +6280,20 @@ var editor = () => [
6245
6280
  if (!prevItem) {
6246
6281
  return [
6247
6282
  {
6248
- selection: import_state29.EditorSelection.cursor(currentItem.contentRange.from)
6283
+ selection: import_state30.EditorSelection.cursor(currentItem.contentRange.from)
6249
6284
  }
6250
6285
  ];
6251
6286
  } else {
6252
6287
  if (currentItem.index < prevItem.index) {
6253
6288
  return [
6254
6289
  {
6255
- selection: import_state29.EditorSelection.cursor(currentItem.contentRange.to)
6290
+ selection: import_state30.EditorSelection.cursor(currentItem.contentRange.to)
6256
6291
  }
6257
6292
  ];
6258
6293
  } else if (currentItem.index > prevItem.index) {
6259
6294
  return [
6260
6295
  {
6261
- selection: import_state29.EditorSelection.cursor(currentItem.contentRange.from)
6296
+ selection: import_state30.EditorSelection.cursor(currentItem.contentRange.from)
6262
6297
  }
6263
6298
  ];
6264
6299
  } else {
@@ -6268,14 +6303,14 @@ var editor = () => [
6268
6303
  } else {
6269
6304
  return [
6270
6305
  {
6271
- selection: import_state29.EditorSelection.cursor(currentItem.lineRange.from - 1)
6306
+ selection: import_state30.EditorSelection.cursor(currentItem.lineRange.from - 1)
6272
6307
  }
6273
6308
  ];
6274
6309
  }
6275
6310
  } else {
6276
6311
  return [
6277
6312
  {
6278
- selection: import_state29.EditorSelection.cursor(currentItem.contentRange.to)
6313
+ selection: import_state30.EditorSelection.cursor(currentItem.contentRange.to)
6279
6314
  }
6280
6315
  ];
6281
6316
  }
@@ -6388,7 +6423,7 @@ var editor = () => [
6388
6423
  ];
6389
6424
  var outliner = (options = {}) => [
6390
6425
  // Commands.
6391
- import_state28.Prec.highest(commands()),
6426
+ import_state29.Prec.highest(commands()),
6392
6427
  // Selection.
6393
6428
  selectionCompartment.of(selectionFacet.of([])),
6394
6429
  // State.
@@ -6404,14 +6439,14 @@ var outliner = (options = {}) => [
6404
6439
  listPaddingLeft: 8
6405
6440
  }),
6406
6441
  // Researve space for menu.
6407
- import_view32.EditorView.contentAttributes.of({
6442
+ import_view33.EditorView.contentAttributes.of({
6408
6443
  class: "is-full !mr-[3rem]"
6409
6444
  })
6410
6445
  ];
6411
6446
  var decorations = () => [
6412
- import_view32.ViewPlugin.fromClass(class {
6447
+ import_view33.ViewPlugin.fromClass(class {
6413
6448
  constructor(view) {
6414
- this.decorations = import_view32.Decoration.none;
6449
+ this.decorations = import_view33.Decoration.none;
6415
6450
  this.updateDecorations(view.state, view);
6416
6451
  }
6417
6452
  update(update2) {
@@ -6433,18 +6468,18 @@ var decorations = () => [
6433
6468
  const lineFrom = doc.lineAt(item.contentRange.from);
6434
6469
  const lineTo = doc.lineAt(item.contentRange.to);
6435
6470
  const isSelected = selection.includes(item.index) || item === current;
6436
- decorations2.push(import_view32.Decoration.line({
6437
- class: (0, import_react_ui_theme9.mx)("cm-list-item", lineFrom.number === line.number && "cm-list-item-start", lineTo.number === line.number && "cm-list-item-end", isSelected && (hasFocus ? "cm-list-item-focused" : "cm-list-item-selected"))
6471
+ decorations2.push(import_view33.Decoration.line({
6472
+ class: (0, import_react_ui_theme8.mx)("cm-list-item", lineFrom.number === line.number && "cm-list-item-start", lineTo.number === line.number && "cm-list-item-end", isSelected && (hasFocus ? "cm-list-item-focused" : "cm-list-item-selected"))
6438
6473
  }).range(line.from, line.from));
6439
6474
  }
6440
6475
  }
6441
- this.decorations = import_view32.Decoration.set(decorations2);
6476
+ this.decorations = import_view33.Decoration.set(decorations2);
6442
6477
  }
6443
6478
  }, {
6444
6479
  decorations: (v) => v.decorations
6445
6480
  }),
6446
6481
  // Theme.
6447
- import_view32.EditorView.theme(Object.assign({
6482
+ import_view33.EditorView.theme(Object.assign({
6448
6483
  ".cm-list-item": {
6449
6484
  borderLeftWidth: "1px",
6450
6485
  borderRightWidth: "1px",
@@ -6480,20 +6515,13 @@ var preview = (options = {}) => {
6480
6515
  return [
6481
6516
  // NOTE: Atomic block decorations must be created from a state field, now a widget, otherwise it results in the following error:
6482
6517
  // "Block decorations may not be specified via plugins"
6483
- import_state30.StateField.define({
6518
+ import_state31.StateField.define({
6484
6519
  create: (state) => buildDecorations3(state, options),
6485
6520
  update: (_, tr) => buildDecorations3(tr.state, options),
6486
6521
  provide: (field) => [
6487
- import_view34.EditorView.decorations.from(field),
6488
- import_view34.EditorView.atomicRanges.of((view) => view.state.field(field))
6522
+ import_view35.EditorView.decorations.from(field),
6523
+ import_view35.EditorView.atomicRanges.of((view) => view.state.field(field))
6489
6524
  ]
6490
- }),
6491
- import_view34.EditorView.theme({
6492
- ".cm-preview-block": {
6493
- "--dx-card-spacing-inline": "var(--dx-trimMd)",
6494
- "--dx-card-spacing-block": "var(--dx-trimMd)",
6495
- marginInline: "calc(-1*var(--dx-trimMd))"
6496
- }
6497
6525
  })
6498
6526
  ];
6499
6527
  };
@@ -6511,7 +6539,7 @@ var getLinkRef = (state, node) => {
6511
6539
  }
6512
6540
  };
6513
6541
  var buildDecorations3 = (state, options) => {
6514
- const builder = new import_state30.RangeSetBuilder();
6542
+ const builder = new import_state31.RangeSetBuilder();
6515
6543
  (0, import_language15.syntaxTree)(state).iterate({
6516
6544
  enter: (node) => {
6517
6545
  switch (node.name) {
@@ -6522,7 +6550,7 @@ var buildDecorations3 = (state, options) => {
6522
6550
  case "Link": {
6523
6551
  const link = getLinkRef(state, node.node);
6524
6552
  if (link) {
6525
- builder.add(node.from, node.to, import_view34.Decoration.replace({
6553
+ builder.add(node.from, node.to, import_view35.Decoration.replace({
6526
6554
  widget: new PreviewInlineWidget(options, link)
6527
6555
  }));
6528
6556
  }
@@ -6534,8 +6562,8 @@ var buildDecorations3 = (state, options) => {
6534
6562
  //
6535
6563
  case "Image": {
6536
6564
  const link = getLinkRef(state, node.node);
6537
- if (options.renderBlock && link) {
6538
- builder.add(node.from, node.to, import_view34.Decoration.replace({
6565
+ if (options.addBlockContainer && options.removeBlockContainer && link) {
6566
+ builder.add(node.from, node.to, import_view35.Decoration.replace({
6539
6567
  block: true,
6540
6568
  // atomic: true,
6541
6569
  widget: new PreviewBlockWidget(options, link)
@@ -6548,7 +6576,7 @@ var buildDecorations3 = (state, options) => {
6548
6576
  });
6549
6577
  return builder.finish();
6550
6578
  };
6551
- var PreviewInlineWidget = class extends import_view34.WidgetType {
6579
+ var PreviewInlineWidget = class extends import_view35.WidgetType {
6552
6580
  constructor(_options, _link) {
6553
6581
  super(), this._options = _options, this._link = _link;
6554
6582
  }
@@ -6565,7 +6593,7 @@ var PreviewInlineWidget = class extends import_view34.WidgetType {
6565
6593
  return root;
6566
6594
  }
6567
6595
  };
6568
- var PreviewBlockWidget = class extends import_view34.WidgetType {
6596
+ var PreviewBlockWidget = class extends import_view35.WidgetType {
6569
6597
  constructor(_options, _link) {
6570
6598
  super(), this._options = _options, this._link = _link;
6571
6599
  }
@@ -6577,50 +6605,13 @@ var PreviewBlockWidget = class extends import_view34.WidgetType {
6577
6605
  }
6578
6606
  toDOM(view) {
6579
6607
  const root = document.createElement("div");
6580
- root.classList.add("cm-preview-block");
6581
- const handleAction = (action) => {
6582
- const pos = view.posAtDOM(root);
6583
- const node = (0, import_language15.syntaxTree)(view.state).resolve(pos + 1).node.parent;
6584
- if (!node) {
6585
- return;
6586
- }
6587
- const link = getLinkRef(view.state, node);
6588
- if (link?.ref !== action.link.ref) {
6589
- return;
6590
- }
6591
- switch (action.type) {
6592
- // TODO(burdon): Should we dispatch to the view or mutate the document? (i.e., handle externally?)
6593
- // Insert ref text.
6594
- case "insert": {
6595
- view.dispatch({
6596
- changes: {
6597
- from: node.from,
6598
- to: node.to,
6599
- insert: action.target.text
6600
- }
6601
- });
6602
- break;
6603
- }
6604
- // Remove ref.
6605
- case "delete": {
6606
- view.dispatch({
6607
- changes: {
6608
- from: node.from,
6609
- to: node.to
6610
- }
6611
- });
6612
- break;
6613
- }
6614
- }
6615
- };
6616
- this._options.renderBlock(root, {
6617
- readonly: view.state.readOnly,
6618
- link: this._link,
6619
- onAction: handleAction,
6620
- onLookup: this._options.onLookup
6621
- }, view);
6608
+ root.classList.add("cm-preview-block", "density-coarse");
6609
+ this._options.addBlockContainer?.(this._link, root);
6622
6610
  return root;
6623
6611
  }
6612
+ destroy() {
6613
+ this._options.removeBlockContainer?.(this._link);
6614
+ }
6624
6615
  };
6625
6616
  var defaultItems = [
6626
6617
  "hello world!",
@@ -6631,7 +6622,7 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
6631
6622
  let t;
6632
6623
  let idx = 0;
6633
6624
  return [
6634
- import_view35.keymap.of([
6625
+ import_view36.keymap.of([
6635
6626
  {
6636
6627
  // Reset.
6637
6628
  key: "alt-meta-'",
@@ -7041,20 +7032,15 @@ var EditorToolbar = /* @__PURE__ */ (0, import_react.memo)(({ classNames, attend
7041
7032
  var _effect = (0, import_tracking.useSignals)();
7042
7033
  try {
7043
7034
  const menuProps = useEditorToolbarActionGraph(props);
7044
- return /* @__PURE__ */ import_react.default.createElement("div", {
7045
- role: "none",
7046
- className: stackItemContentToolbarClassNames(role)
7047
- }, /* @__PURE__ */ import_react.default.createElement(import_react_ui.ElevationProvider, {
7035
+ return /* @__PURE__ */ import_react.default.createElement(import_react_ui.ElevationProvider, {
7048
7036
  elevation: role === "section" ? "positioned" : "base"
7049
7037
  }, /* @__PURE__ */ import_react.default.createElement(import_react_ui_menu.MenuProvider, {
7050
7038
  ...menuProps,
7051
7039
  attendableId
7052
7040
  }, /* @__PURE__ */ import_react.default.createElement(import_react_ui_menu.ToolbarMenu, {
7053
- classNames: [
7054
- import_react_ui_theme.textBlockWidth,
7055
- classNames
7056
- ]
7057
- }))));
7041
+ classNames,
7042
+ textBlockWidth: true
7043
+ })));
7058
7044
  } finally {
7059
7045
  _effect.f();
7060
7046
  }
@@ -7328,7 +7314,10 @@ var RefPopover = /* @__PURE__ */ (0, import_react9.forwardRef)(({ children, open
7328
7314
  try {
7329
7315
  const [rootRef, setRootRef] = (0, import_react9.useState)(null);
7330
7316
  (0, import_react9.useEffect)(() => {
7331
- return rootRef && onActivate ? (0, import_async6.addEventListener)(rootRef, "dx-ref-tag-activate", onActivate, customEventOptions) : void 0;
7317
+ if (!rootRef || !onActivate) {
7318
+ return;
7319
+ }
7320
+ return (0, import_async6.addEventListener)(rootRef, "dx-ref-tag-activate", onActivate, customEventOptions);
7332
7321
  }, [
7333
7322
  rootRef,
7334
7323
  onActivate
@@ -7430,7 +7419,10 @@ var RefDropdownMenuProvider = ({ children, onLookup }) => {
7430
7419
  onLookup
7431
7420
  ]);
7432
7421
  (0, import_react10.useEffect)(() => {
7433
- return rootRef ? (0, import_async7.addEventListener)(rootRef, "dx-ref-tag-activate", handleDxRefTagActivate, customEventOptions2) : void 0;
7422
+ if (!rootRef) {
7423
+ return;
7424
+ }
7425
+ return (0, import_async7.addEventListener)(rootRef, "dx-ref-tag-activate", handleDxRefTagActivate, customEventOptions2);
7434
7426
  }, [
7435
7427
  rootRef
7436
7428
  ]);
@@ -7458,7 +7450,7 @@ var RefDropdownMenu = {
7458
7450
  var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
7459
7451
  var instanceCount = 0;
7460
7452
  var useTextEditor = (props = {}, deps = []) => {
7461
- const { id, doc, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0, import_react11.useMemo)(() => (0, import_util6.getProviderValue)(props), deps ?? []);
7453
+ const { id, doc, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0, import_react11.useMemo)(() => (0, import_util7.getProviderValue)(props), deps ?? []);
7462
7454
  const [instanceId] = (0, import_react11.useState)(() => `text-editor-${++instanceCount}`);
7463
7455
  const [view, setView] = (0, import_react11.useState)();
7464
7456
  const parentRef = (0, import_react11.useRef)(null);
@@ -7487,14 +7479,14 @@ var useTextEditor = (props = {}, deps = []) => {
7487
7479
  anchor
7488
7480
  };
7489
7481
  }
7490
- const state = import_state31.EditorState.create({
7482
+ const state = import_state32.EditorState.create({
7491
7483
  doc: doc ?? initialValue,
7492
7484
  // selection: initialSelection,
7493
7485
  extensions: [
7494
7486
  id && documentId.of(id),
7495
7487
  extensions,
7496
7488
  // NOTE: This doesn't catch errors in keymap functions.
7497
- import_view36.EditorView.exceptionSink.of((err) => {
7489
+ import_view37.EditorView.exceptionSink.of((err) => {
7498
7490
  import_log8.log.catch(err, void 0, {
7499
7491
  F: __dxlog_file13,
7500
7492
  L: 97,
@@ -7502,12 +7494,12 @@ var useTextEditor = (props = {}, deps = []) => {
7502
7494
  C: (f, a) => f(...a)
7503
7495
  });
7504
7496
  })
7505
- ].filter(import_util6.isNotFalsy)
7497
+ ].filter(import_util7.isNotFalsy)
7506
7498
  });
7507
- view2 = new import_view36.EditorView({
7499
+ view2 = new import_view37.EditorView({
7508
7500
  parent: parentRef.current,
7509
7501
  state,
7510
- scrollTo: scrollTo ? import_view36.EditorView.scrollIntoView(scrollTo, {
7502
+ scrollTo: scrollTo ? import_view37.EditorView.scrollIntoView(scrollTo, {
7511
7503
  yMargin: 96
7512
7504
  }) : void 0,
7513
7505
  dispatchTransactions: debug ? debugDispatcher : void 0
@@ -7683,6 +7675,7 @@ var useTextEditor = (props = {}, deps = []) => {
7683
7675
  formattingKeymap,
7684
7676
  getFormatting,
7685
7677
  getItem,
7678
+ getLinkRef,
7686
7679
  getListItemContent,
7687
7680
  getNextItem,
7688
7681
  getPreviousItem,
@@ -7708,7 +7701,6 @@ var useTextEditor = (props = {}, deps = []) => {
7708
7701
  mention,
7709
7702
  moveItemDown,
7710
7703
  moveItemUp,
7711
- multilinePlaceholder,
7712
7704
  openCommand,
7713
7705
  openEffect,
7714
7706
  outliner,
@@ -7732,7 +7724,6 @@ var useTextEditor = (props = {}, deps = []) => {
7732
7724
  setStyle,
7733
7725
  singleValueFacet,
7734
7726
  stackItemContentEditorClassNames,
7735
- stackItemContentToolbarClassNames,
7736
7727
  staticCompletion,
7737
7728
  table,
7738
7729
  tags,