@dxos/react-ui-editor 0.8.3-main.672df60 → 0.8.3-main.7f5a14c

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 (45) hide show
  1. package/dist/lib/browser/index.mjs +868 -260
  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 +911 -297
  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 +868 -260
  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/util.d.ts +2 -2
  11. package/dist/types/src/components/Popover/CommandMenu.d.ts +34 -0
  12. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +1 -0
  13. package/dist/types/src/components/Popover/RefPopover.d.ts +19 -6
  14. package/dist/types/src/components/Popover/RefPopover.d.ts.map +1 -1
  15. package/dist/types/src/components/Popover/index.d.ts +1 -0
  16. package/dist/types/src/components/Popover/index.d.ts.map +1 -1
  17. package/dist/types/src/defaults.d.ts.map +1 -1
  18. package/dist/types/src/extensions/command/menu.d.ts +40 -0
  19. package/dist/types/src/extensions/command/menu.d.ts.map +1 -1
  20. package/dist/types/src/extensions/factories.d.ts +1 -0
  21. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  22. package/dist/types/src/extensions/index.d.ts +1 -0
  23. package/dist/types/src/extensions/index.d.ts.map +1 -1
  24. package/dist/types/src/extensions/placeholder.d.ts +4 -0
  25. package/dist/types/src/extensions/placeholder.d.ts.map +1 -0
  26. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  27. package/dist/types/src/hooks/useTextEditor.d.ts +8 -9
  28. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  29. package/dist/types/src/stories/CommandMenu.stories.d.ts +12 -0
  30. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +1 -0
  31. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  32. package/package.json +31 -28
  33. package/src/components/Popover/CommandMenu.tsx +279 -0
  34. package/src/components/Popover/RefPopover.tsx +44 -22
  35. package/src/components/Popover/index.ts +1 -0
  36. package/src/defaults.ts +1 -0
  37. package/src/extensions/command/menu.ts +306 -4
  38. package/src/extensions/factories.ts +4 -1
  39. package/src/extensions/index.ts +1 -0
  40. package/src/extensions/outliner/outliner.ts +0 -3
  41. package/src/extensions/placeholder.ts +82 -0
  42. package/src/extensions/preview/preview.ts +3 -6
  43. package/src/hooks/useTextEditor.ts +11 -12
  44. package/src/stories/CommandMenu.stories.tsx +143 -0
  45. package/src/stories/Preview.stories.tsx +32 -30
@@ -28,6 +28,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
  var node_exports = {};
30
30
  __export(node_exports, {
31
+ CommandMenu: () => CommandMenu,
31
32
  Cursor: () => Cursor,
32
33
  EditorInputMode: () => EditorInputMode,
33
34
  EditorInputModes: () => EditorInputModes,
@@ -39,6 +40,7 @@ __export(node_exports, {
39
40
  Inline: () => Inline,
40
41
  InputModeExtensions: () => InputModeExtensions,
41
42
  List: () => List,
43
+ PreviewProvider: () => PreviewProvider,
42
44
  RefDropdownMenu: () => RefDropdownMenu,
43
45
  RefPopover: () => RefPopover,
44
46
  RemoteSelectionsDecorator: () => RemoteSelectionsDecorator,
@@ -62,11 +64,14 @@ __export(node_exports, {
62
64
  closeEffect: () => closeEffect,
63
65
  command: () => command,
64
66
  commandKeyBindings: () => commandKeyBindings,
67
+ commandMenu: () => commandMenu,
68
+ commandRangeEffect: () => commandRangeEffect,
65
69
  commands: () => commands,
66
70
  commentClickedEffect: () => commentClickedEffect,
67
71
  comments: () => comments,
68
72
  commentsState: () => commentsState,
69
73
  convertTreeToJson: () => convertTreeToJson,
74
+ coreSlashCommands: () => coreSlashCommands,
70
75
  createBasicExtensions: () => createBasicExtensions,
71
76
  createComment: () => createComment,
72
77
  createDataExtensions: () => createDataExtensions,
@@ -94,6 +99,7 @@ __export(node_exports, {
94
99
  editorSlots: () => editorSlots,
95
100
  editorWidth: () => editorWidth,
96
101
  editorWithToolbarLayout: () => editorWithToolbarLayout,
102
+ filterItems: () => filterItems,
97
103
  flattenRect: () => flattenRect,
98
104
  floatingMenu: () => floatingMenu,
99
105
  focus: () => focus,
@@ -102,15 +108,21 @@ __export(node_exports, {
102
108
  formattingEquals: () => formattingEquals,
103
109
  formattingKeymap: () => formattingKeymap,
104
110
  getFormatting: () => getFormatting,
111
+ getItem: () => getItem,
105
112
  getListItemContent: () => getListItemContent,
113
+ getNextItem: () => getNextItem,
114
+ getPreviousItem: () => getPreviousItem,
106
115
  getRange: () => getRange,
107
116
  hashtag: () => hashtag,
108
117
  image: () => image,
109
118
  indentItemLess: () => indentItemLess,
110
119
  indentItemMore: () => indentItemMore,
120
+ insertAtCursor: () => insertAtCursor,
121
+ insertAtLineStart: () => insertAtLineStart,
111
122
  insertTable: () => insertTable,
112
123
  itemToJSON: () => itemToJSON,
113
124
  keymap: () => import_view.keymap,
125
+ linkSlashCommands: () => linkSlashCommands,
114
126
  linkTooltip: () => linkTooltip,
115
127
  listItemToString: () => listItemToString,
116
128
  listener: () => listener,
@@ -122,6 +134,7 @@ __export(node_exports, {
122
134
  mention: () => mention,
123
135
  moveItemDown: () => moveItemDown,
124
136
  moveItemUp: () => moveItemUp,
137
+ multilinePlaceholder: () => multilinePlaceholder,
125
138
  openCommand: () => openCommand,
126
139
  openEffect: () => openEffect,
127
140
  outliner: () => outliner,
@@ -164,6 +177,7 @@ __export(node_exports, {
164
177
  treeFacet: () => treeFacet,
165
178
  typeahead: () => typeahead,
166
179
  typewriter: () => typewriter,
180
+ useCommandMenu: () => useCommandMenu,
167
181
  useComments: () => useComments,
168
182
  useEditorToolbarState: () => useEditorToolbarState,
169
183
  useFormattingState: () => useFormattingState,
@@ -224,133 +238,139 @@ var import_view7 = require("@codemirror/view");
224
238
  var import_view8 = require("@codemirror/view");
225
239
  var import_state10 = require("@codemirror/state");
226
240
  var import_view9 = require("@codemirror/view");
241
+ var import_state11 = require("@codemirror/state");
227
242
  var import_view10 = require("@codemirror/view");
243
+ var import_react4 = require("react");
228
244
  var import_async3 = require("@dxos/async");
229
- var import_state11 = require("@codemirror/state");
230
245
  var import_view11 = require("@codemirror/view");
231
- var import_commands = require("@codemirror/commands");
232
246
  var import_state12 = require("@codemirror/state");
233
247
  var import_view12 = require("@codemirror/view");
248
+ var import_commands = require("@codemirror/commands");
249
+ var import_state13 = require("@codemirror/state");
250
+ var import_view13 = require("@codemirror/view");
234
251
  var import_lodash2 = __toESM(require("lodash.sortby"));
235
- var import_react4 = require("react");
252
+ var import_react5 = require("react");
236
253
  var import_async4 = require("@dxos/async");
237
254
  var import_log4 = require("@dxos/log");
238
255
  var import_util = require("@dxos/util");
239
- var import_state13 = require("@codemirror/state");
240
- var import_view13 = require("@codemirror/view");
256
+ var import_state14 = require("@codemirror/state");
257
+ var import_view14 = require("@codemirror/view");
241
258
  var import_async5 = require("@dxos/async");
242
259
  var import_invariant3 = require("@dxos/invariant");
243
260
  var import_util2 = require("@dxos/util");
244
261
  var import_language = require("@codemirror/language");
245
- var import_state14 = require("@codemirror/state");
246
- var import_view14 = require("@codemirror/view");
262
+ var import_state15 = require("@codemirror/state");
263
+ var import_view15 = require("@codemirror/view");
247
264
  var import_autocomplete2 = require("@codemirror/autocomplete");
248
265
  var import_commands2 = require("@codemirror/commands");
249
266
  var import_language2 = require("@codemirror/language");
250
267
  var import_search = require("@codemirror/search");
251
- var import_state15 = require("@codemirror/state");
268
+ var import_state16 = require("@codemirror/state");
252
269
  var import_theme_one_dark = require("@codemirror/theme-one-dark");
253
- var import_view15 = require("@codemirror/view");
270
+ var import_view16 = require("@codemirror/view");
254
271
  var import_lodash3 = __toESM(require("lodash.defaultsdeep"));
255
272
  var import_lodash4 = __toESM(require("lodash.merge"));
256
273
  var import_display_name = require("@dxos/display-name");
257
274
  var import_log5 = require("@dxos/log");
258
275
  var import_util3 = require("@dxos/util");
259
- var import_state16 = require("@codemirror/state");
260
- var import_view16 = require("@codemirror/view");
276
+ var import_state17 = require("@codemirror/state");
277
+ var import_view17 = require("@codemirror/view");
278
+ var import_view18 = require("@codemirror/view");
261
279
  var import_react_ui_theme3 = require("@dxos/react-ui-theme");
262
280
  var import_react_ui_theme4 = require("@dxos/react-ui-theme");
281
+ var import_react_ui_theme5 = require("@dxos/react-ui-theme");
263
282
  var import_util4 = require("@dxos/util");
264
283
  var import_language3 = require("@codemirror/language");
265
- var import_view17 = require("@codemirror/view");
266
- var import_react5 = __toESM(require("react"));
284
+ var import_view19 = require("@codemirror/view");
285
+ var import_react6 = __toESM(require("react"));
267
286
  var import_react_ui3 = require("@dxos/react-ui");
268
- var import_view18 = require("@codemirror/view");
269
- var import_react_ui_theme5 = require("@dxos/react-ui-theme");
287
+ var import_view20 = require("@codemirror/view");
288
+ var import_react_ui_theme6 = require("@dxos/react-ui-theme");
270
289
  var import_lang_json = require("@codemirror/lang-json");
271
290
  var import_lint = require("@codemirror/lint");
272
291
  var import_ajv = __toESM(require("ajv"));
273
- var import_view19 = require("@codemirror/view");
292
+ var import_view21 = require("@codemirror/view");
274
293
  var import_autocomplete3 = require("@codemirror/autocomplete");
275
294
  var import_language4 = require("@codemirror/language");
276
- var import_state17 = require("@codemirror/state");
277
- var import_view20 = require("@codemirror/view");
278
- var import_react6 = require("react");
295
+ var import_state18 = require("@codemirror/state");
296
+ var import_view22 = require("@codemirror/view");
297
+ var import_react7 = require("react");
279
298
  var import_autocomplete4 = require("@codemirror/autocomplete");
280
299
  var import_commands3 = require("@codemirror/commands");
281
300
  var import_lang_markdown2 = require("@codemirror/lang-markdown");
282
301
  var import_language5 = require("@codemirror/language");
283
302
  var import_language_data = require("@codemirror/language-data");
284
303
  var import_lint2 = require("@codemirror/lint");
285
- var import_view21 = require("@codemirror/view");
304
+ var import_view23 = require("@codemirror/view");
286
305
  var import_util5 = require("@dxos/util");
287
306
  var import_lang_markdown3 = require("@codemirror/lang-markdown");
288
307
  var import_language6 = require("@codemirror/language");
289
308
  var import_highlight2 = require("@lezer/highlight");
290
309
  var import_markdown = require("@lezer/markdown");
291
310
  var import_language7 = require("@codemirror/language");
292
- var import_state18 = require("@codemirror/state");
293
- var import_language8 = require("@codemirror/language");
294
311
  var import_state19 = require("@codemirror/state");
295
- var import_view22 = require("@codemirror/view");
312
+ var import_language8 = require("@codemirror/language");
313
+ var import_state20 = require("@codemirror/state");
314
+ var import_view24 = require("@codemirror/view");
296
315
  var import_invariant4 = require("@dxos/invariant");
297
- var import_react_ui_theme6 = require("@dxos/react-ui-theme");
316
+ var import_react_ui_theme7 = require("@dxos/react-ui-theme");
298
317
  var import_language9 = require("@codemirror/language");
299
- var import_state20 = require("@codemirror/state");
300
- var import_view23 = require("@codemirror/view");
301
- var import_language10 = require("@codemirror/language");
302
318
  var import_state21 = require("@codemirror/state");
303
- var import_view24 = require("@codemirror/view");
304
319
  var import_view25 = require("@codemirror/view");
305
- var import_language11 = require("@codemirror/language");
320
+ var import_language10 = require("@codemirror/language");
306
321
  var import_state22 = require("@codemirror/state");
307
322
  var import_view26 = require("@codemirror/view");
308
- var import_language12 = require("@codemirror/language");
309
323
  var import_view27 = require("@codemirror/view");
310
- var import_react_ui_theme7 = require("@dxos/react-ui-theme");
324
+ var import_language11 = require("@codemirror/language");
325
+ var import_state23 = require("@codemirror/state");
326
+ var import_view28 = require("@codemirror/view");
327
+ var import_language12 = require("@codemirror/language");
328
+ var import_view29 = require("@codemirror/view");
329
+ var import_react_ui_theme8 = require("@dxos/react-ui-theme");
311
330
  var import_autocomplete5 = require("@codemirror/autocomplete");
312
331
  var import_log6 = require("@dxos/log");
313
- var import_view28 = require("@codemirror/view");
332
+ var import_view30 = require("@codemirror/view");
314
333
  var import_codemirror_vim = require("@replit/codemirror-vim");
315
334
  var import_codemirror_vscode_keymap = require("@replit/codemirror-vscode-keymap");
316
335
  var import_effect = require("effect");
317
336
  var import_commands4 = require("@codemirror/commands");
318
337
  var import_language13 = require("@codemirror/language");
319
- var import_state23 = require("@codemirror/state");
320
- var import_view29 = require("@codemirror/view");
321
338
  var import_state24 = require("@codemirror/state");
322
- var import_language14 = require("@codemirror/language");
339
+ var import_view31 = require("@codemirror/view");
323
340
  var import_state25 = require("@codemirror/state");
341
+ var import_language14 = require("@codemirror/language");
324
342
  var import_state26 = require("@codemirror/state");
325
- var import_invariant5 = require("@dxos/invariant");
326
343
  var import_state27 = require("@codemirror/state");
327
- var import_view30 = require("@codemirror/view");
328
- var import_react_ui_theme8 = require("@dxos/react-ui-theme");
344
+ var import_invariant5 = require("@dxos/invariant");
329
345
  var import_state28 = require("@codemirror/state");
330
- var import_view31 = require("@codemirror/view");
346
+ var import_view32 = require("@codemirror/view");
347
+ var import_react_ui_theme9 = require("@dxos/react-ui-theme");
348
+ var import_state29 = require("@codemirror/state");
349
+ var import_view33 = require("@codemirror/view");
331
350
  var import_log7 = require("@dxos/log");
332
351
  var import_dx_ref_tag = require("@dxos/lit-ui/dx-ref-tag.pcss");
333
352
  var import_language15 = require("@codemirror/language");
334
- var import_state29 = require("@codemirror/state");
335
- var import_view32 = require("@codemirror/view");
336
- var import_view33 = require("@codemirror/view");
337
- var import_search2 = require("@codemirror/search");
353
+ var import_state30 = require("@codemirror/state");
338
354
  var import_view34 = require("@codemirror/view");
339
- var import_react_ui_theme9 = require("@dxos/react-ui-theme");
355
+ var import_view35 = require("@codemirror/view");
356
+ var import_search2 = require("@codemirror/search");
340
357
  var import_tracking2 = require("@preact-signals/safe-react/tracking");
341
- var import_react_context = require("@radix-ui/react-context");
342
- var import_react7 = __toESM(require("react"));
343
- var import_async6 = require("@dxos/async");
358
+ var import_react8 = __toESM(require("react"));
344
359
  var import_react_ui4 = require("@dxos/react-ui");
345
360
  var import_tracking3 = require("@preact-signals/safe-react/tracking");
361
+ var import_react_context = require("@radix-ui/react-context");
362
+ var import_react9 = __toESM(require("react"));
363
+ var import_async6 = require("@dxos/async");
364
+ var import_react_ui5 = require("@dxos/react-ui");
365
+ var import_tracking4 = require("@preact-signals/safe-react/tracking");
346
366
  var import_react_context2 = require("@radix-ui/react-context");
347
- var import_react8 = __toESM(require("react"));
367
+ var import_react10 = __toESM(require("react"));
348
368
  var import_async7 = require("@dxos/async");
349
- var import_react_ui5 = require("@dxos/react-ui");
350
- var import_state30 = require("@codemirror/state");
351
- var import_view35 = require("@codemirror/view");
369
+ var import_react_ui6 = require("@dxos/react-ui");
370
+ var import_state31 = require("@codemirror/state");
371
+ var import_view36 = require("@codemirror/view");
352
372
  var import_react_tabster = require("@fluentui/react-tabster");
353
- var import_react9 = require("react");
373
+ var import_react11 = require("react");
354
374
  var import_log8 = require("@dxos/log");
355
375
  var import_util6 = require("@dxos/util");
356
376
  var translationKey = "react-ui-editor";
@@ -1705,6 +1725,69 @@ var command = (options = {}) => {
1705
1725
  })
1706
1726
  ];
1707
1727
  };
1728
+ var Placeholder = class extends import_view11.WidgetType {
1729
+ constructor(content) {
1730
+ super(), this.content = content;
1731
+ }
1732
+ toDOM(view) {
1733
+ const wrap = document.createElement("span");
1734
+ wrap.className = "cm-placeholder";
1735
+ wrap.style.pointerEvents = "none";
1736
+ wrap.appendChild(typeof this.content === "string" ? document.createTextNode(this.content) : typeof this.content === "function" ? this.content(view) : this.content.cloneNode(true));
1737
+ wrap.setAttribute("aria-hidden", "true");
1738
+ return wrap;
1739
+ }
1740
+ coordsAt(dom) {
1741
+ const rects = dom.firstChild ? clientRectsFor(dom.firstChild) : [];
1742
+ if (!rects.length) {
1743
+ return null;
1744
+ }
1745
+ const style = window.getComputedStyle(dom.parentNode);
1746
+ const rect = flattenRect(rects[0], style.direction !== "rtl");
1747
+ const lineHeight = parseInt(style.lineHeight);
1748
+ if (rect.bottom - rect.top > lineHeight * 1.5) {
1749
+ return {
1750
+ left: rect.left,
1751
+ right: rect.right,
1752
+ top: rect.top,
1753
+ bottom: rect.top + lineHeight
1754
+ };
1755
+ }
1756
+ return rect;
1757
+ }
1758
+ ignoreEvent() {
1759
+ return false;
1760
+ }
1761
+ };
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
+ }
1708
1791
  var floatingMenu = (options = {}) => [
1709
1792
  import_view10.ViewPlugin.fromClass(class {
1710
1793
  constructor(view) {
@@ -1781,9 +1864,6 @@ var floatingMenu = (options = {}) => [
1781
1864
  "[data-has-focus] & .cm-ref-tag": {
1782
1865
  opacity: "1"
1783
1866
  },
1784
- "[data-is-attention-source] & .cm-ref-tag": {
1785
- opacity: "1"
1786
- },
1787
1867
  ".cm-ref-tag button": {
1788
1868
  display: "grid",
1789
1869
  alignItems: "center",
@@ -1793,6 +1873,255 @@ var floatingMenu = (options = {}) => [
1793
1873
  }
1794
1874
  })
1795
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
+ var commandMenu = (options) => {
1890
+ const commandMenuPlugin = import_view10.ViewPlugin.fromClass(class {
1891
+ constructor(view) {
1892
+ this.view = view;
1893
+ this.decorations = import_view10.Decoration.none;
1894
+ }
1895
+ // TODO(wittjosiah): The decorations are repainted on every update, this occasionally causes menu to flicker.
1896
+ update(update2) {
1897
+ const builder = new import_state11.RangeSetBuilder();
1898
+ const selection = update2.view.state.selection.main;
1899
+ const { range: activeRange, trigger } = update2.view.state.field(commandMenuState) ?? {};
1900
+ const shouldShowWidget = activeRange && selection.head >= activeRange.from && selection.head <= activeRange.to;
1901
+ if (shouldShowWidget) {
1902
+ builder.add(activeRange.from, activeRange.to, import_view10.Decoration.mark({
1903
+ tagName: "dx-ref-tag",
1904
+ class: "cm-ref-tag",
1905
+ attributes: {
1906
+ "data-auto-trigger": "true",
1907
+ "data-trigger": trigger
1908
+ }
1909
+ }));
1910
+ }
1911
+ const activeRangeChanged = update2.transactions.some((tr) => tr.effects.some((effect) => effect.is(commandRangeEffect)));
1912
+ if (activeRange && activeRangeChanged && trigger) {
1913
+ const content = update2.view.state.sliceDoc(activeRange.from + 1, activeRange.to);
1914
+ options.onTextChange?.(trigger, content);
1915
+ }
1916
+ this.decorations = builder.finish();
1917
+ }
1918
+ }, {
1919
+ decorations: (v) => v.decorations
1920
+ });
1921
+ const triggers = Array.isArray(options.trigger) ? options.trigger : [
1922
+ options.trigger
1923
+ ];
1924
+ const commandKeymap = import_view10.keymap.of([
1925
+ ...triggers.map((trigger) => ({
1926
+ key: trigger,
1927
+ run: (view) => {
1928
+ const selection = view.state.selection.main;
1929
+ 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) {
1932
+ view.dispatch({
1933
+ changes: {
1934
+ from: selection.head,
1935
+ insert: trigger
1936
+ },
1937
+ selection: {
1938
+ anchor: selection.head + 1,
1939
+ head: selection.head + 1
1940
+ },
1941
+ effects: commandRangeEffect.of({
1942
+ trigger,
1943
+ range: {
1944
+ from: selection.head,
1945
+ to: selection.head + 1
1946
+ }
1947
+ })
1948
+ });
1949
+ return true;
1950
+ }
1951
+ return false;
1952
+ }
1953
+ })),
1954
+ {
1955
+ key: "Enter",
1956
+ run: (view) => {
1957
+ const activeRange = view.state.field(commandMenuState)?.range;
1958
+ if (activeRange) {
1959
+ view.dispatch({
1960
+ changes: {
1961
+ from: activeRange.from,
1962
+ to: activeRange.to,
1963
+ insert: ""
1964
+ }
1965
+ });
1966
+ options.onEnter?.();
1967
+ return true;
1968
+ }
1969
+ return false;
1970
+ }
1971
+ },
1972
+ {
1973
+ key: "ArrowDown",
1974
+ run: (view) => {
1975
+ const activeRange = view.state.field(commandMenuState)?.range;
1976
+ if (activeRange) {
1977
+ options.onArrowDown?.();
1978
+ return true;
1979
+ }
1980
+ return false;
1981
+ }
1982
+ },
1983
+ {
1984
+ key: "ArrowUp",
1985
+ run: (view) => {
1986
+ const activeRange = view.state.field(commandMenuState)?.range;
1987
+ if (activeRange) {
1988
+ options.onArrowUp?.();
1989
+ return true;
1990
+ }
1991
+ return false;
1992
+ }
1993
+ }
1994
+ ]);
1995
+ const updateListener = import_view10.EditorView.updateListener.of((update2) => {
1996
+ const { trigger, range: activeRange } = update2.view.state.field(commandMenuState) ?? {};
1997
+ if (!activeRange || !trigger) {
1998
+ return;
1999
+ }
2000
+ const selection = update2.view.state.selection.main;
2001
+ const firstChar = update2.view.state.doc.sliceString(activeRange.from, activeRange.from + 1);
2002
+ const shouldRemove = firstChar !== trigger || // Trigger deleted.
2003
+ selection.head < activeRange.from || // Cursor moved before the range.
2004
+ selection.head > activeRange.to + 1;
2005
+ const nextRange = shouldRemove ? null : update2.docChanged ? {
2006
+ from: activeRange.from,
2007
+ to: selection.head
2008
+ } : activeRange;
2009
+ if (nextRange !== activeRange) {
2010
+ update2.view.dispatch({
2011
+ effects: commandRangeEffect.of(nextRange ? {
2012
+ trigger,
2013
+ range: nextRange
2014
+ } : null)
2015
+ });
2016
+ }
2017
+ if (shouldRemove) {
2018
+ options.onDeactivate?.();
2019
+ }
2020
+ });
2021
+ return [
2022
+ multilinePlaceholder(options.placeholder ?? `Press '${Array.isArray(options.trigger) ? options.trigger[0] : options.trigger}' for commands`),
2023
+ import_state11.Prec.highest(commandKeymap),
2024
+ updateListener,
2025
+ commandMenuState,
2026
+ commandMenuPlugin
2027
+ ];
2028
+ };
2029
+ var useCommandMenu = ({ viewRef, trigger, placeholder: placeholder2, getGroups }) => {
2030
+ const triggerRef = (0, import_react4.useRef)(null);
2031
+ const currentRef = (0, import_react4.useRef)(null);
2032
+ const groupsRef = (0, import_react4.useRef)([]);
2033
+ const [currentItem, setCurrentItem] = (0, import_react4.useState)();
2034
+ const [open, setOpen] = (0, import_react4.useState)(false);
2035
+ const [_, update2] = (0, import_react4.useState)({});
2036
+ const handleOpenChange = (0, import_react4.useCallback)(async (open2, trigger2) => {
2037
+ if (open2 && trigger2) {
2038
+ groupsRef.current = await getGroups(trigger2);
2039
+ }
2040
+ setOpen(open2);
2041
+ if (!open2) {
2042
+ triggerRef.current = null;
2043
+ setCurrentItem(void 0);
2044
+ viewRef.current?.dispatch({
2045
+ effects: [
2046
+ commandRangeEffect.of(null)
2047
+ ]
2048
+ });
2049
+ }
2050
+ }, [
2051
+ getGroups
2052
+ ]);
2053
+ const handleActivate = (0, import_react4.useCallback)(async (event) => {
2054
+ const item = getItem(groupsRef.current, currentItem);
2055
+ if (item) {
2056
+ currentRef.current = item;
2057
+ }
2058
+ triggerRef.current = event.trigger;
2059
+ const triggerKey = event.trigger.getAttribute("data-trigger");
2060
+ if (!open && triggerKey) {
2061
+ await handleOpenChange(true, triggerKey);
2062
+ }
2063
+ }, [
2064
+ open,
2065
+ handleOpenChange
2066
+ ]);
2067
+ const handleSelect = (0, import_react4.useCallback)((item) => {
2068
+ const view = viewRef.current;
2069
+ if (!view) {
2070
+ return;
2071
+ }
2072
+ const selection = view.state.selection.main;
2073
+ void item.onSelect?.(view, selection.head);
2074
+ }, []);
2075
+ 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;
2105
+ }
2106
+ update2({});
2107
+ }
2108
+ }), [
2109
+ handleOpenChange,
2110
+ getGroups,
2111
+ serializedTrigger,
2112
+ placeholder2
2113
+ ]);
2114
+ return {
2115
+ commandMenu: _commandMenu,
2116
+ currentItem,
2117
+ groupsRef,
2118
+ ref: triggerRef,
2119
+ open,
2120
+ onActivate: handleActivate,
2121
+ onOpenChange: setOpen,
2122
+ onSelect: handleSelect
2123
+ };
2124
+ };
1796
2125
  var typeahead = ({ onComplete } = {}) => {
1797
2126
  let hint;
1798
2127
  const complete = (view) => {
@@ -1808,17 +2137,17 @@ var typeahead = ({ onComplete } = {}) => {
1808
2137
  insert: hint
1809
2138
  }
1810
2139
  ],
1811
- selection: import_state11.EditorSelection.cursor(selection.from + hint.length)
2140
+ selection: import_state12.EditorSelection.cursor(selection.from + hint.length)
1812
2141
  });
1813
2142
  return true;
1814
2143
  };
1815
2144
  return [
1816
- import_view11.ViewPlugin.fromClass(class {
2145
+ import_view12.ViewPlugin.fromClass(class {
1817
2146
  constructor() {
1818
- this.decorations = import_view11.Decoration.none;
2147
+ this.decorations = import_view12.Decoration.none;
1819
2148
  }
1820
2149
  update(update2) {
1821
- const builder = new import_state11.RangeSetBuilder();
2150
+ const builder = new import_state12.RangeSetBuilder();
1822
2151
  const selection = update2.view.state.selection.main;
1823
2152
  const line = update2.view.state.doc.lineAt(selection.from);
1824
2153
  if (selection.from === selection.to && selection.from === line.to) {
@@ -1827,7 +2156,7 @@ var typeahead = ({ onComplete } = {}) => {
1827
2156
  line: str
1828
2157
  });
1829
2158
  if (hint) {
1830
- builder.add(selection.from, selection.to, import_view11.Decoration.widget({
2159
+ builder.add(selection.from, selection.to, import_view12.Decoration.widget({
1831
2160
  widget: new Hint(hint)
1832
2161
  }));
1833
2162
  }
@@ -1838,7 +2167,7 @@ var typeahead = ({ onComplete } = {}) => {
1838
2167
  decorations: (v) => v.decorations
1839
2168
  }),
1840
2169
  // Keys.
1841
- import_state11.Prec.highest(import_view11.keymap.of([
2170
+ import_state12.Prec.highest(import_view12.keymap.of([
1842
2171
  {
1843
2172
  key: "Tab",
1844
2173
  preventDefault: true,
@@ -1879,10 +2208,10 @@ var createEditorStateTransaction = ({ scrollTo, selection }) => {
1879
2208
  return {
1880
2209
  selection,
1881
2210
  scrollIntoView: !scrollTo,
1882
- effects: scrollTo ? import_view13.EditorView.scrollIntoView(scrollTo, {
2211
+ effects: scrollTo ? import_view14.EditorView.scrollIntoView(scrollTo, {
1883
2212
  yMargin: 96
1884
2213
  }) : void 0,
1885
- annotations: import_state13.Transaction.userEvent.of(stateRestoreAnnotation)
2214
+ annotations: import_state14.Transaction.userEvent.of(stateRestoreAnnotation)
1886
2215
  };
1887
2216
  };
1888
2217
  var createEditorStateStore = (keyPrefix) => ({
@@ -1921,7 +2250,7 @@ var selectionState = ({ getState, setState } = {}) => {
1921
2250
  // setStateDebounced(id, {});
1922
2251
  // },
1923
2252
  // }),
1924
- import_view13.EditorView.updateListener.of(({ view, transactions }) => {
2253
+ import_view14.EditorView.updateListener.of(({ view, transactions }) => {
1925
2254
  const id = view.state.facet(documentId);
1926
2255
  if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
1927
2256
  return;
@@ -1944,7 +2273,7 @@ var selectionState = ({ getState, setState } = {}) => {
1944
2273
  }
1945
2274
  }
1946
2275
  }),
1947
- getState && import_view13.keymap.of([
2276
+ getState && import_view14.keymap.of([
1948
2277
  {
1949
2278
  key: "ctrl-r",
1950
2279
  run: (view) => {
@@ -1959,10 +2288,10 @@ var selectionState = ({ getState, setState } = {}) => {
1959
2288
  ].filter(import_util2.isNotFalsy);
1960
2289
  };
1961
2290
  var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
1962
- var setComments = import_state12.StateEffect.define();
1963
- var setSelection = import_state12.StateEffect.define();
1964
- var setCommentState = import_state12.StateEffect.define();
1965
- var commentsState = import_state12.StateField.define({
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({
1966
2295
  create: (state) => ({
1967
2296
  id: state.facet(documentId),
1968
2297
  comments: [],
@@ -2000,7 +2329,7 @@ var commentsState = import_state12.StateField.define({
2000
2329
  return value;
2001
2330
  }
2002
2331
  });
2003
- var styles2 = import_view12.EditorView.theme({
2332
+ var styles2 = import_view13.EditorView.theme({
2004
2333
  ".cm-comment, .cm-comment-current": {
2005
2334
  margin: "0 -3px",
2006
2335
  padding: "3px",
@@ -2013,14 +2342,14 @@ var styles2 = import_view12.EditorView.theme({
2013
2342
  textDecoration: "underline"
2014
2343
  }
2015
2344
  });
2016
- var createCommentMark = (id, isCurrent) => import_view12.Decoration.mark({
2345
+ var createCommentMark = (id, isCurrent) => import_view13.Decoration.mark({
2017
2346
  class: isCurrent ? "cm-comment-current" : "cm-comment",
2018
2347
  attributes: {
2019
2348
  "data-testid": "cm-comment",
2020
2349
  "data-comment-id": id
2021
2350
  }
2022
2351
  });
2023
- var commentsDecorations = import_view12.EditorView.decorations.compute([
2352
+ var commentsDecorations = import_view13.EditorView.decorations.compute([
2024
2353
  commentsState
2025
2354
  ], (state) => {
2026
2355
  const { selection: { current }, comments: comments2 } = state.field(commentsState);
@@ -2040,10 +2369,10 @@ var commentsDecorations = import_view12.EditorView.decorations.compute([
2040
2369
  const mark = createCommentMark(comment.comment.id, comment.comment.id === current);
2041
2370
  return mark.range(range.from, range.to);
2042
2371
  }).filter(import_util.isNonNullable);
2043
- return import_view12.Decoration.set(decorations2);
2372
+ return import_view13.Decoration.set(decorations2);
2044
2373
  });
2045
- var commentClickedEffect = import_state12.StateEffect.define();
2046
- var handleCommentClick = import_view12.EditorView.domEventHandlers({
2374
+ var commentClickedEffect = import_state13.StateEffect.define();
2375
+ var handleCommentClick = import_view13.EditorView.domEventHandlers({
2047
2376
  click: (event, view) => {
2048
2377
  let target = event.target;
2049
2378
  const editorRoot = view.dom;
@@ -2082,7 +2411,7 @@ var trackPastedComments = (onUpdate) => {
2082
2411
  }
2083
2412
  };
2084
2413
  return [
2085
- import_view12.EditorView.domEventHandlers({
2414
+ import_view13.EditorView.domEventHandlers({
2086
2415
  cut: handleTrack,
2087
2416
  copy: handleTrack
2088
2417
  }),
@@ -2104,7 +2433,7 @@ var trackPastedComments = (onUpdate) => {
2104
2433
  return effects;
2105
2434
  }),
2106
2435
  // Handle paste or the undo of comment deletion.
2107
- import_view12.EditorView.updateListener.of((update2) => {
2436
+ import_view13.EditorView.updateListener.of((update2) => {
2108
2437
  const restore = [];
2109
2438
  for (let i = 0; i < update2.transactions.length; i++) {
2110
2439
  const tr = update2.transactions[i];
@@ -2160,7 +2489,7 @@ var mapTrackedComment = (comment, changes) => ({
2160
2489
  from: changes.mapPos(comment.from, 1),
2161
2490
  to: changes.mapPos(comment.to, 1)
2162
2491
  });
2163
- var restoreCommentEffect = import_state12.StateEffect.define({
2492
+ var restoreCommentEffect = import_state13.StateEffect.define({
2164
2493
  map: mapTrackedComment
2165
2494
  });
2166
2495
  var createComment = (view) => {
@@ -2205,7 +2534,7 @@ var comments = (options = {}) => {
2205
2534
  //
2206
2535
  // Keymap.
2207
2536
  //
2208
- options.onCreate && import_view12.keymap.of([
2537
+ options.onCreate && import_view13.keymap.of([
2209
2538
  {
2210
2539
  key: shortcut,
2211
2540
  run: callbackWrapper(createComment)
@@ -2215,7 +2544,7 @@ var comments = (options = {}) => {
2215
2544
  // Hover tooltip (for key shortcut hints, etc.)
2216
2545
  // TODO(burdon): Factor out to generic hints extension for current selection/line.
2217
2546
  //
2218
- options.renderTooltip && (0, import_view12.hoverTooltip)((view, pos) => {
2547
+ options.renderTooltip && (0, import_view13.hoverTooltip)((view, pos) => {
2219
2548
  const selection = view.state.selection.main;
2220
2549
  if (selection && pos >= selection.from && pos <= selection.to) {
2221
2550
  return {
@@ -2246,7 +2575,7 @@ var comments = (options = {}) => {
2246
2575
  //
2247
2576
  // Track deleted ranges and update ranges for decorations.
2248
2577
  //
2249
- import_view12.EditorView.updateListener.of(({ view, state, changes }) => {
2578
+ import_view13.EditorView.updateListener.of(({ view, state, changes }) => {
2250
2579
  let mod = false;
2251
2580
  const { comments: comments2, ...value } = state.field(commentsState);
2252
2581
  changes.iterChanges((from, to, from2, to2) => {
@@ -2278,7 +2607,7 @@ var comments = (options = {}) => {
2278
2607
  //
2279
2608
  // Track selection/proximity.
2280
2609
  //
2281
- import_view12.EditorView.updateListener.of(({ view, state }) => {
2610
+ import_view13.EditorView.updateListener.of(({ view, state }) => {
2282
2611
  let min = Infinity;
2283
2612
  const { selection: { current, closest }, comments: comments2 } = state.field(commentsState);
2284
2613
  const { head } = state.selection.main;
@@ -2332,7 +2661,7 @@ var scrollThreadIntoView = (view, id, center = true) => {
2332
2661
  anchor: range.from
2333
2662
  } : void 0,
2334
2663
  effects: [
2335
- needsScroll ? import_view12.EditorView.scrollIntoView(range.from, center ? {
2664
+ needsScroll ? import_view13.EditorView.scrollIntoView(range.from, center ? {
2336
2665
  y: "center"
2337
2666
  } : void 0) : [],
2338
2667
  needsSelectionUpdate ? setSelection.of({
@@ -2362,13 +2691,13 @@ var ExternalCommentSync = class {
2362
2691
  this.unsubscribe = subscribe(updateComments);
2363
2692
  }
2364
2693
  };
2365
- var createExternalCommentSync = (id, subscribe, getComments) => import_view12.ViewPlugin.fromClass(class {
2694
+ var createExternalCommentSync = (id, subscribe, getComments) => import_view13.ViewPlugin.fromClass(class {
2366
2695
  constructor(view) {
2367
2696
  return new ExternalCommentSync(view, id, subscribe, getComments);
2368
2697
  }
2369
2698
  });
2370
2699
  var useComments = (view, id, comments2) => {
2371
- (0, import_react4.useEffect)(() => {
2700
+ (0, import_react5.useEffect)(() => {
2372
2701
  if (view) {
2373
2702
  if (id === view.state.facet(documentId)) {
2374
2703
  view.dispatch({
@@ -2385,12 +2714,12 @@ var debugNodeLogger = (log9 = console.log) => {
2385
2714
  const logTokens = (state) => (0, import_language.syntaxTree)(state).iterate({
2386
2715
  enter: (node) => log9(node.type)
2387
2716
  });
2388
- return import_state14.StateField.define({
2717
+ return import_state15.StateField.define({
2389
2718
  create: (state) => logTokens(state),
2390
2719
  update: (_, tr) => logTokens(tr.state)
2391
2720
  });
2392
2721
  };
2393
- var styles3 = import_view14.EditorView.theme({
2722
+ var styles3 = import_view15.EditorView.theme({
2394
2723
  ".cm-dropCursor": {
2395
2724
  borderLeft: "2px solid var(--dx-accentText)",
2396
2725
  color: "var(--dx-accentText)",
@@ -2403,8 +2732,8 @@ var styles3 = import_view14.EditorView.theme({
2403
2732
  var dropFile = (options = {}) => {
2404
2733
  return [
2405
2734
  styles3,
2406
- (0, import_view14.dropCursor)(),
2407
- import_view14.EditorView.domEventHandlers({
2735
+ (0, import_view15.dropCursor)(),
2736
+ import_view15.EditorView.domEventHandlers({
2408
2737
  drop: (event, view) => {
2409
2738
  event.preventDefault();
2410
2739
  const files = event.dataTransfer?.files;
@@ -2423,8 +2752,8 @@ var dropFile = (options = {}) => {
2423
2752
  })
2424
2753
  ];
2425
2754
  };
2426
- var focusEffect = import_state16.StateEffect.define();
2427
- var focusField = import_state16.StateField.define({
2755
+ var focusEffect = import_state17.StateEffect.define();
2756
+ var focusField = import_state17.StateField.define({
2428
2757
  create: () => false,
2429
2758
  update: (value, tr) => {
2430
2759
  for (const effect of tr.effects) {
@@ -2437,7 +2766,7 @@ var focusField = import_state16.StateField.define({
2437
2766
  });
2438
2767
  var focus = [
2439
2768
  focusField,
2440
- import_view16.EditorView.domEventHandlers({
2769
+ import_view17.EditorView.domEventHandlers({
2441
2770
  focus: (event, view) => {
2442
2771
  setTimeout(() => view.dispatch({
2443
2772
  effects: focusEffect.of(true)
@@ -2463,11 +2792,11 @@ var theme = {
2463
2792
  codeMark: "font-mono text-primary-500",
2464
2793
  mark: "opacity-50",
2465
2794
  heading: (level) => {
2466
- return (0, import_react_ui_theme3.mx)(headings[level], "dark:text-primary-400");
2795
+ return (0, import_react_ui_theme4.mx)(headings[level], "dark:text-primary-400");
2467
2796
  }
2468
2797
  };
2469
2798
  var getToken = (path, defaultValue) => {
2470
- const value = (0, import_util4.get)(import_react_ui_theme4.tokens, path, defaultValue);
2799
+ const value = (0, import_util4.get)(import_react_ui_theme5.tokens, path, defaultValue);
2471
2800
  return value?.toString() ?? "";
2472
2801
  };
2473
2802
  var fontBody = getToken("fontFamily.body");
@@ -2682,8 +3011,31 @@ var defaultTheme = {
2682
3011
  borderTop: "1px solid var(--dx-separator)"
2683
3012
  }
2684
3013
  };
3014
+ var editorWidth = "!mli-auto is-full max-is-[min(50rem,100%-4rem)]";
3015
+ var editorSlots = {
3016
+ scroll: {
3017
+ className: "pbs-2"
3018
+ },
3019
+ content: {
3020
+ className: editorWidth
3021
+ }
3022
+ };
3023
+ var editorGutter = import_view18.EditorView.theme({
3024
+ ".cm-gutters": {
3025
+ background: "var(--dx-baseSurface)",
3026
+ paddingRight: "1rem"
3027
+ }
3028
+ });
3029
+ var editorMonospace = import_view18.EditorView.theme({
3030
+ ".cm-content": {
3031
+ fontFamily: fontMono
3032
+ }
3033
+ });
3034
+ 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");
2685
3037
  var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
2686
- var preventNewline = import_state15.EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
3038
+ var preventNewline = import_state16.EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
2687
3039
  var defaultBasicOptions = {
2688
3040
  allowMultipleSelections: true,
2689
3041
  bracketMatching: true,
@@ -2705,33 +3057,37 @@ var createBasicExtensions = (_props) => {
2705
3057
  const props = (0, import_lodash3.default)({}, _props, defaultBasicOptions);
2706
3058
  return [
2707
3059
  // NOTE: Doesn't catch errors in keymap functions.
2708
- import_view15.EditorView.exceptionSink.of((err) => {
3060
+ import_view16.EditorView.exceptionSink.of((err) => {
2709
3061
  import_log5.log.catch(err, void 0, {
2710
3062
  F: __dxlog_file8,
2711
- L: 98,
3063
+ L: 100,
2712
3064
  S: void 0,
2713
3065
  C: (f, a) => f(...a)
2714
3066
  });
2715
3067
  }),
2716
- props.allowMultipleSelections && import_state15.EditorState.allowMultipleSelections.of(true),
3068
+ props.allowMultipleSelections && import_state16.EditorState.allowMultipleSelections.of(true),
2717
3069
  props.bracketMatching && (0, import_language2.bracketMatching)(),
2718
3070
  props.closeBrackets && (0, import_autocomplete2.closeBrackets)(),
2719
- props.dropCursor && (0, import_view15.dropCursor)(),
2720
- props.drawSelection && (0, import_view15.drawSelection)({
3071
+ props.dropCursor && (0, import_view16.dropCursor)(),
3072
+ props.drawSelection && (0, import_view16.drawSelection)({
2721
3073
  cursorBlinkRate: 1200
2722
3074
  }),
2723
- props.editable !== void 0 && import_view15.EditorView.editable.of(props.editable),
3075
+ props.editable !== void 0 && import_view16.EditorView.editable.of(props.editable),
2724
3076
  props.focus && focus,
2725
- props.highlightActiveLine && (0, import_view15.highlightActiveLine)(),
3077
+ props.highlightActiveLine && (0, import_view16.highlightActiveLine)(),
2726
3078
  props.history && (0, import_commands2.history)(),
2727
- props.lineNumbers && (0, import_view15.lineNumbers)(),
2728
- props.lineWrapping && import_view15.EditorView.lineWrapping,
2729
- props.placeholder && (0, import_view15.placeholder)(props.placeholder),
2730
- props.readOnly !== void 0 && import_state15.EditorState.readOnly.of(props.readOnly),
2731
- props.scrollPastEnd && (0, import_view15.scrollPastEnd)(),
2732
- props.tabSize && import_state15.EditorState.tabSize.of(props.tabSize),
3079
+ props.lineNumbers && [
3080
+ (0, import_view16.lineNumbers)(),
3081
+ editorGutter
3082
+ ],
3083
+ props.lineWrapping && import_view16.EditorView.lineWrapping,
3084
+ 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),
2733
3089
  // https://codemirror.net/docs/ref/#view.KeyBinding
2734
- import_view15.keymap.of([
3090
+ import_view16.keymap.of([
2735
3091
  ...(props.keymap && keymaps[props.keymap]) ?? [],
2736
3092
  // NOTE: Tabs are also configured by markdown extension.
2737
3093
  // https://codemirror.net/docs/ref/#commands.indentWithTab
@@ -2762,17 +3118,17 @@ var defaultThemeSlots = {
2762
3118
  var createThemeExtensions = ({ themeMode, styles: styles4, syntaxHighlighting: _syntaxHighlighting, slots: _slots } = {}) => {
2763
3119
  const slots = (0, import_lodash3.default)({}, _slots, defaultThemeSlots);
2764
3120
  return [
2765
- import_view15.EditorView.darkTheme.of(themeMode === "dark"),
2766
- import_view15.EditorView.baseTheme(styles4 ? (0, import_lodash4.default)({}, defaultTheme, styles4) : defaultTheme),
3121
+ import_view16.EditorView.darkTheme.of(themeMode === "dark"),
3122
+ import_view16.EditorView.baseTheme(styles4 ? (0, import_lodash4.default)({}, defaultTheme, styles4) : defaultTheme),
2767
3123
  // https://github.com/codemirror/theme-one-dark
2768
3124
  _syntaxHighlighting && (themeMode === "dark" ? (0, import_language2.syntaxHighlighting)(import_theme_one_dark.oneDarkHighlightStyle) : (0, import_language2.syntaxHighlighting)(import_language2.defaultHighlightStyle)),
2769
- slots.editor?.className && import_view15.EditorView.editorAttributes.of({
3125
+ slots.editor?.className && import_view16.EditorView.editorAttributes.of({
2770
3126
  class: slots.editor.className
2771
3127
  }),
2772
- slots.content?.className && import_view15.EditorView.contentAttributes.of({
3128
+ slots.content?.className && import_view16.EditorView.contentAttributes.of({
2773
3129
  class: slots.content.className
2774
3130
  }),
2775
- slots.scroll?.className && import_view15.ViewPlugin.fromClass(class {
3131
+ slots.scroll?.className && import_view16.ViewPlugin.fromClass(class {
2776
3132
  constructor(view) {
2777
3133
  view.scrollDOM.classList.add(slots.scroll.className);
2778
3134
  }
@@ -2811,7 +3167,7 @@ var folding = (_props = {}) => [
2811
3167
  const el = createElement("div", {
2812
3168
  className: "flex h-full items-center"
2813
3169
  });
2814
- return renderRoot(el, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Icon, {
3170
+ return renderRoot(el, /* @__PURE__ */ import_react6.default.createElement(import_react_ui3.Icon, {
2815
3171
  icon: "ph--caret-right--bold",
2816
3172
  size: 3,
2817
3173
  classNames: [
@@ -2821,7 +3177,7 @@ var folding = (_props = {}) => [
2821
3177
  }));
2822
3178
  }
2823
3179
  }),
2824
- import_view17.EditorView.theme({
3180
+ import_view19.EditorView.theme({
2825
3181
  ".cm-foldGutter": {
2826
3182
  opacity: 0.3,
2827
3183
  transition: "opacity 0.3s",
@@ -2832,25 +3188,25 @@ var folding = (_props = {}) => [
2832
3188
  }
2833
3189
  })
2834
3190
  ];
2835
- var TagWidget = class extends import_view18.WidgetType {
3191
+ var TagWidget = class extends import_view20.WidgetType {
2836
3192
  constructor(_text) {
2837
3193
  super(), this._text = _text;
2838
3194
  }
2839
3195
  toDOM() {
2840
3196
  const span = document.createElement("span");
2841
- span.className = (0, import_react_ui_theme5.mx)("cm-tag", (0, import_react_ui_theme5.getHashColor)(this._text).tag);
3197
+ span.className = (0, import_react_ui_theme6.mx)("cm-tag", (0, import_react_ui_theme6.getHashColor)(this._text).tag);
2842
3198
  span.textContent = this._text;
2843
3199
  return span;
2844
3200
  }
2845
3201
  };
2846
- var tagMatcher = new import_view18.MatchDecorator({
3202
+ var tagMatcher = new import_view20.MatchDecorator({
2847
3203
  regexp: /#(\w+)\W/g,
2848
- decoration: (match) => import_view18.Decoration.replace({
3204
+ decoration: (match) => import_view20.Decoration.replace({
2849
3205
  widget: new TagWidget(match[1])
2850
3206
  })
2851
3207
  });
2852
3208
  var hashtag = () => [
2853
- import_view18.ViewPlugin.fromClass(class {
3209
+ import_view20.ViewPlugin.fromClass(class {
2854
3210
  constructor(view) {
2855
3211
  this.tags = tagMatcher.createDeco(view);
2856
3212
  }
@@ -2859,11 +3215,11 @@ var hashtag = () => [
2859
3215
  }
2860
3216
  }, {
2861
3217
  decorations: (instance) => instance.tags,
2862
- provide: (plugin) => import_view18.EditorView.atomicRanges.of((view) => {
2863
- return view.plugin(plugin)?.tags || import_view18.Decoration.none;
3218
+ provide: (plugin) => import_view20.EditorView.atomicRanges.of((view) => {
3219
+ return view.plugin(plugin)?.tags || import_view20.Decoration.none;
2864
3220
  })
2865
3221
  }),
2866
- import_view18.EditorView.theme({
3222
+ import_view20.EditorView.theme({
2867
3223
  ".cm-tag": {
2868
3224
  borderRadius: "4px",
2869
3225
  marginRight: "6px",
@@ -2913,11 +3269,11 @@ var schemaLinter = (validate) => (view) => {
2913
3269
  };
2914
3270
  var listener = ({ onFocus, onChange }) => {
2915
3271
  const extensions = [];
2916
- onFocus && extensions.push(import_view19.EditorView.focusChangeEffect.of((_, focusing) => {
3272
+ onFocus && extensions.push(import_view21.EditorView.focusChangeEffect.of((_, focusing) => {
2917
3273
  onFocus(focusing);
2918
3274
  return null;
2919
3275
  }));
2920
- onChange && extensions.push(import_view19.EditorView.updateListener.of((update2) => {
3276
+ onChange && extensions.push(import_view21.EditorView.updateListener.of((update2) => {
2921
3277
  onChange(update2.state.doc.toString(), update2.state.facet(documentId));
2922
3278
  }));
2923
3279
  return extensions;
@@ -3040,7 +3396,7 @@ var setStyle = (type, enable) => {
3040
3396
  to: range.head + found + marker.length
3041
3397
  }
3042
3398
  ],
3043
- range: import_state17.EditorSelection.cursor(range.from - marker.length)
3399
+ range: import_state18.EditorSelection.cursor(range.from - marker.length)
3044
3400
  };
3045
3401
  }
3046
3402
  }
@@ -3168,13 +3524,13 @@ var setStyle = (type, enable) => {
3168
3524
  from: range.head,
3169
3525
  insert: marker + marker
3170
3526
  },
3171
- range: import_state17.EditorSelection.cursor(range.head + marker.length)
3527
+ range: import_state18.EditorSelection.cursor(range.head + marker.length)
3172
3528
  };
3173
3529
  }
3174
3530
  const changeSet = state.changes(changes2.concat(changesAtEnd));
3175
3531
  return {
3176
3532
  changes: changeSet,
3177
- range: range.empty && !changeSet.empty ? import_state17.EditorSelection.cursor(range.head + marker.length) : import_state17.EditorSelection.range(changeSet.mapPos(range.from, 1), changeSet.mapPos(range.to, -1))
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))
3178
3534
  };
3179
3535
  });
3180
3536
  dispatch(state.update(changes, {
@@ -3374,7 +3730,7 @@ var addLink = ({ url, image: image2 } = {}) => {
3374
3730
  const changeSet = state.changes(changes2.concat(changesAfter));
3375
3731
  return {
3376
3732
  changes: changeSet,
3377
- range: import_state17.EditorSelection.cursor(changeSet.mapPos(to, 1) - cursorOffset - (url ? url.length + 2 : 0))
3733
+ range: import_state18.EditorSelection.cursor(changeSet.mapPos(to, 1) - cursorOffset - (url ? url.length + 2 : 0))
3378
3734
  };
3379
3735
  });
3380
3736
  if (changes.changes.empty) {
@@ -3808,7 +4164,7 @@ var toggleCodeblock = (target) => {
3808
4164
  };
3809
4165
  var formattingKeymap = (_options = {}) => {
3810
4166
  return [
3811
- import_view20.keymap.of([
4167
+ import_view22.keymap.of([
3812
4168
  {
3813
4169
  key: "meta-b",
3814
4170
  run: toggleStrong
@@ -4009,7 +4365,7 @@ var getFormatting = (state) => {
4009
4365
  };
4010
4366
  };
4011
4367
  var useFormattingState = (state) => {
4012
- return (0, import_react6.useMemo)(() => import_view20.EditorView.updateListener.of((update2) => {
4368
+ return (0, import_react7.useMemo)(() => import_view22.EditorView.updateListener.of((update2) => {
4013
4369
  if (update2.docChanged || update2.selectionSet) {
4014
4370
  Object.entries(getFormatting(update2.state)).forEach(([key, active]) => {
4015
4371
  state[key] = active;
@@ -4261,7 +4617,7 @@ var createMarkdownExtensions = (options = {}) => {
4261
4617
  }),
4262
4618
  // Custom styles.
4263
4619
  (0, import_language5.syntaxHighlighting)(markdownHighlightStyle()),
4264
- import_view21.keymap.of([
4620
+ import_view23.keymap.of([
4265
4621
  // https://codemirror.net/docs/ref/#commands.indentWithTab
4266
4622
  options.indentWithTab !== false && import_commands3.indentWithTab,
4267
4623
  // https://codemirror.net/docs/ref/#commands.defaultKeymap
@@ -4271,7 +4627,7 @@ var createMarkdownExtensions = (options = {}) => {
4271
4627
  ].filter(import_util5.isNotFalsy))
4272
4628
  ];
4273
4629
  };
4274
- var debugTree = (cb) => import_state18.StateField.define({
4630
+ var debugTree = (cb) => import_state19.StateField.define({
4275
4631
  create: (state) => cb(convertTreeToJson(state)),
4276
4632
  update: (value, tr) => cb(convertTreeToJson(tr.state))
4277
4633
  });
@@ -4295,12 +4651,12 @@ var convertTreeToJson = (state) => {
4295
4651
  return treeToJson((0, import_language7.syntaxTree)(state).cursor());
4296
4652
  };
4297
4653
  var adjustChanges = () => {
4298
- return import_view23.ViewPlugin.fromClass(class {
4654
+ return import_view25.ViewPlugin.fromClass(class {
4299
4655
  update(update2) {
4300
4656
  const tree = (0, import_language9.syntaxTree)(update2.state);
4301
4657
  const adjustments = [];
4302
4658
  for (const tr of update2.transactions) {
4303
- const event = tr.annotation(import_state20.Transaction.userEvent);
4659
+ const event = tr.annotation(import_state21.Transaction.userEvent);
4304
4660
  switch (event) {
4305
4661
  //
4306
4662
  // Enter
@@ -4435,9 +4791,9 @@ var getValidUrl = (str) => {
4435
4791
  };
4436
4792
  var image = (_options = {}) => {
4437
4793
  return [
4438
- import_state21.StateField.define({
4794
+ import_state22.StateField.define({
4439
4795
  create: (state) => {
4440
- return import_view24.Decoration.set(buildDecorations(0, state.doc.length, state));
4796
+ return import_view26.Decoration.set(buildDecorations(0, state.doc.length, state));
4441
4797
  },
4442
4798
  update: (value, tr) => {
4443
4799
  if (!tr.docChanged && !tr.selection) {
@@ -4460,7 +4816,7 @@ var image = (_options = {}) => {
4460
4816
  add: buildDecorations(from, to, tr.state)
4461
4817
  });
4462
4818
  },
4463
- provide: (field) => import_view24.EditorView.decorations.from(field)
4819
+ provide: (field) => import_view26.EditorView.decorations.from(field)
4464
4820
  })
4465
4821
  ];
4466
4822
  };
@@ -4478,7 +4834,7 @@ var buildDecorations = (from, to, state) => {
4478
4834
  return;
4479
4835
  }
4480
4836
  preloadImage(url);
4481
- decorations2.push(import_view24.Decoration.replace({
4837
+ decorations2.push(import_view26.Decoration.replace({
4482
4838
  block: true,
4483
4839
  widget: new ImageWidget(url)
4484
4840
  }).range(hide2 ? node.from : node.to, node.to));
@@ -4498,7 +4854,7 @@ var preloadImage = (url) => {
4498
4854
  preloaded.add(url);
4499
4855
  }
4500
4856
  };
4501
- var ImageWidget = class extends import_view24.WidgetType {
4857
+ var ImageWidget = class extends import_view26.WidgetType {
4502
4858
  constructor(_url) {
4503
4859
  super(), this._url = _url;
4504
4860
  }
@@ -4519,7 +4875,7 @@ var ImageWidget = class extends import_view24.WidgetType {
4519
4875
  };
4520
4876
  var bulletListIndentationWidth = 24;
4521
4877
  var orderedListIndentationWidth = 36;
4522
- var formattingStyles = import_view25.EditorView.theme({
4878
+ var formattingStyles = import_view27.EditorView.theme({
4523
4879
  /**
4524
4880
  * Horizontal rule.
4525
4881
  */
@@ -4638,14 +4994,14 @@ var formattingStyles = import_view25.EditorView.theme({
4638
4994
  }
4639
4995
  });
4640
4996
  var table = (options = {}) => {
4641
- return import_state22.StateField.define({
4997
+ return import_state23.StateField.define({
4642
4998
  create: (state) => update(state, options),
4643
4999
  update: (_, tr) => update(tr.state, options),
4644
- provide: (field) => import_view26.EditorView.decorations.from(field)
5000
+ provide: (field) => import_view28.EditorView.decorations.from(field)
4645
5001
  });
4646
5002
  };
4647
5003
  var update = (state, _options) => {
4648
- const builder = new import_state22.RangeSetBuilder();
5004
+ const builder = new import_state23.RangeSetBuilder();
4649
5005
  const cursor = state.selection.main.head;
4650
5006
  const tables = [];
4651
5007
  const getTable = () => tables[tables.length - 1];
@@ -4686,19 +5042,19 @@ var update = (state, _options) => {
4686
5042
  tables.forEach((table2) => {
4687
5043
  const replace = state.readOnly || cursor < table2.from || cursor > table2.to;
4688
5044
  if (replace) {
4689
- builder.add(table2.from, table2.to, import_view26.Decoration.replace({
5045
+ builder.add(table2.from, table2.to, import_view28.Decoration.replace({
4690
5046
  block: true,
4691
5047
  widget: new TableWidget(table2)
4692
5048
  }));
4693
5049
  } else {
4694
- builder.add(table2.from, table2.to, import_view26.Decoration.mark({
5050
+ builder.add(table2.from, table2.to, import_view28.Decoration.mark({
4695
5051
  class: "cm-table"
4696
5052
  }));
4697
5053
  }
4698
5054
  });
4699
5055
  return builder.finish();
4700
5056
  };
4701
- var TableWidget = class extends import_view26.WidgetType {
5057
+ var TableWidget = class extends import_view28.WidgetType {
4702
5058
  constructor(_table) {
4703
5059
  super(), this._table = _table;
4704
5060
  }
@@ -4737,14 +5093,14 @@ var Unicode = {
4737
5093
  bulletSmall: "\u2219",
4738
5094
  bulletSquare: "\u2B1D"
4739
5095
  };
4740
- var HorizontalRuleWidget = class extends import_view22.WidgetType {
5096
+ var HorizontalRuleWidget = class extends import_view24.WidgetType {
4741
5097
  toDOM() {
4742
5098
  const el = document.createElement("span");
4743
5099
  el.className = "cm-hr";
4744
5100
  return el;
4745
5101
  }
4746
5102
  };
4747
- var LinkButton = class extends import_view22.WidgetType {
5103
+ var LinkButton = class extends import_view24.WidgetType {
4748
5104
  constructor(url, render) {
4749
5105
  super(), this.url = url, this.render = render;
4750
5106
  }
@@ -4760,7 +5116,7 @@ var LinkButton = class extends import_view22.WidgetType {
4760
5116
  return el;
4761
5117
  }
4762
5118
  };
4763
- var CheckboxWidget = class extends import_view22.WidgetType {
5119
+ var CheckboxWidget = class extends import_view24.WidgetType {
4764
5120
  constructor(_checked) {
4765
5121
  super(), this._checked = _checked;
4766
5122
  }
@@ -4804,7 +5160,7 @@ var CheckboxWidget = class extends import_view22.WidgetType {
4804
5160
  return false;
4805
5161
  }
4806
5162
  };
4807
- var TextWidget = class extends import_view22.WidgetType {
5163
+ var TextWidget = class extends import_view24.WidgetType {
4808
5164
  constructor(text, className) {
4809
5165
  super(), this.text = text, this.className = className;
4810
5166
  }
@@ -4817,29 +5173,29 @@ var TextWidget = class extends import_view22.WidgetType {
4817
5173
  return el;
4818
5174
  }
4819
5175
  };
4820
- var hide = import_view22.Decoration.replace({});
4821
- var blockQuote = import_view22.Decoration.line({
5176
+ var hide = import_view24.Decoration.replace({});
5177
+ var blockQuote = import_view24.Decoration.line({
4822
5178
  class: "cm-blockquote"
4823
5179
  });
4824
- var fencedCodeLine = import_view22.Decoration.line({
5180
+ var fencedCodeLine = import_view24.Decoration.line({
4825
5181
  class: "cm-code cm-codeblock-line"
4826
5182
  });
4827
- var fencedCodeLineFirst = import_view22.Decoration.line({
4828
- class: (0, import_react_ui_theme6.mx)("cm-code cm-codeblock-line", "cm-codeblock-start")
5183
+ var fencedCodeLineFirst = import_view24.Decoration.line({
5184
+ class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line", "cm-codeblock-start")
4829
5185
  });
4830
- var fencedCodeLineLast = import_view22.Decoration.line({
4831
- class: (0, import_react_ui_theme6.mx)("cm-code cm-codeblock-line", "cm-codeblock-end")
5186
+ var fencedCodeLineLast = import_view24.Decoration.line({
5187
+ class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line", "cm-codeblock-end")
4832
5188
  });
4833
5189
  var commentBlockLine = fencedCodeLine;
4834
5190
  var commentBlockLineFirst = fencedCodeLineFirst;
4835
5191
  var commentBlockLineLast = fencedCodeLineLast;
4836
- var horizontalRule = import_view22.Decoration.replace({
5192
+ var horizontalRule = import_view24.Decoration.replace({
4837
5193
  widget: new HorizontalRuleWidget()
4838
5194
  });
4839
- var checkedTask = import_view22.Decoration.replace({
5195
+ var checkedTask = import_view24.Decoration.replace({
4840
5196
  widget: new CheckboxWidget(true)
4841
5197
  });
4842
- var uncheckedTask = import_view22.Decoration.replace({
5198
+ var uncheckedTask = import_view24.Decoration.replace({
4843
5199
  widget: new CheckboxWidget(false)
4844
5200
  });
4845
5201
  var editingRange = (state, range, focus2) => {
@@ -4855,8 +5211,8 @@ var autoHideTags = /* @__PURE__ */ new Set([
4855
5211
  "SuperscriptMark"
4856
5212
  ]);
4857
5213
  var buildDecorations2 = (view, options, focus2) => {
4858
- const deco = new import_state19.RangeSetBuilder();
4859
- const atomicDeco = new import_state19.RangeSetBuilder();
5214
+ const deco = new import_state20.RangeSetBuilder();
5215
+ const atomicDeco = new import_state20.RangeSetBuilder();
4860
5216
  const { state } = view;
4861
5217
  const headerLevels = [];
4862
5218
  const getHeaderLevels = (node, level) => {
@@ -4943,7 +5299,7 @@ var buildDecorations2 = (view, options, focus2) => {
4943
5299
  } else {
4944
5300
  const num = headers.slice(from - 1).map((level2) => level2?.number ?? 0).join(".") + " ";
4945
5301
  if (num.length) {
4946
- atomicDeco.add(mark.from, mark.from + len, import_view22.Decoration.replace({
5302
+ atomicDeco.add(mark.from, mark.from + len, import_view24.Decoration.replace({
4947
5303
  widget: new TextWidget(num, theme.heading(level))
4948
5304
  }));
4949
5305
  }
@@ -4968,7 +5324,7 @@ var buildDecorations2 = (view, options, focus2) => {
4968
5324
  if (node.from === line.to - 1) {
4969
5325
  return false;
4970
5326
  }
4971
- deco.add(line.from, line.from, import_view22.Decoration.line({
5327
+ deco.add(line.from, line.from, import_view24.Decoration.line({
4972
5328
  class: "cm-list-item",
4973
5329
  attributes: {
4974
5330
  style: `padding-left: ${offset}px; text-indent: -${width}px;`
@@ -4985,7 +5341,7 @@ var buildDecorations2 = (view, options, focus2) => {
4985
5341
  const label = list.type === "OrderedList" ? `${++list.number}.` : Unicode.bulletSmall;
4986
5342
  const line = state.doc.lineAt(node.from);
4987
5343
  const to = state.doc.sliceString(node.to, node.to + 1) === " " ? node.to + 1 : node.to;
4988
- atomicDeco.add(line.from, to, import_view22.Decoration.replace({
5344
+ atomicDeco.add(line.from, to, import_view24.Decoration.replace({
4989
5345
  widget: new TextWidget(label, list.type === "OrderedList" ? "cm-list-mark cm-list-mark-ordered" : "cm-list-mark cm-list-mark-bullet")
4990
5346
  }));
4991
5347
  break;
@@ -5072,7 +5428,7 @@ var buildDecorations2 = (view, options, focus2) => {
5072
5428
  if (!editing) {
5073
5429
  atomicDeco.add(node.from, marks[0].to, hide);
5074
5430
  }
5075
- deco.add(marks[0].to, marks[1].from, import_view22.Decoration.mark({
5431
+ deco.add(marks[0].to, marks[1].from, import_view24.Decoration.mark({
5076
5432
  tagName: "a",
5077
5433
  attributes: {
5078
5434
  class: "cm-link",
@@ -5082,7 +5438,7 @@ var buildDecorations2 = (view, options, focus2) => {
5082
5438
  }
5083
5439
  }));
5084
5440
  if (!editing) {
5085
- atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view22.Decoration.replace({
5441
+ atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view24.Decoration.replace({
5086
5442
  widget: new LinkButton(url, options.renderLinkButton)
5087
5443
  }) : hide);
5088
5444
  }
@@ -5137,10 +5493,10 @@ var buildDecorations2 = (view, options, focus2) => {
5137
5493
  atomicDeco: atomicDeco.finish()
5138
5494
  };
5139
5495
  };
5140
- var forceUpdate = import_state19.StateEffect.define();
5496
+ var forceUpdate = import_state20.StateEffect.define();
5141
5497
  var decorateMarkdown = (options = {}) => {
5142
5498
  return [
5143
- import_view22.ViewPlugin.fromClass(class {
5499
+ import_view24.ViewPlugin.fromClass(class {
5144
5500
  constructor(view) {
5145
5501
  ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations2(view, options, view.hasFocus));
5146
5502
  }
@@ -5172,9 +5528,9 @@ var decorateMarkdown = (options = {}) => {
5172
5528
  }
5173
5529
  }, {
5174
5530
  provide: (plugin) => [
5175
- import_view22.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view22.Decoration.none),
5176
- import_view22.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view22.Decoration.none),
5177
- import_view22.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view22.Decoration.none)
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)
5178
5534
  ]
5179
5535
  }),
5180
5536
  image(),
@@ -5184,7 +5540,7 @@ var decorateMarkdown = (options = {}) => {
5184
5540
  ];
5185
5541
  };
5186
5542
  var linkTooltip = (renderTooltip) => {
5187
- return (0, import_view27.hoverTooltip)((view, pos, side) => {
5543
+ return (0, import_view29.hoverTooltip)((view, pos, side) => {
5188
5544
  const syntax = (0, import_language12.syntaxTree)(view.state).resolveInner(pos, side);
5189
5545
  let link = null;
5190
5546
  for (let i = 0, node = syntax; !link && node && i < 5; node = node.parent, i++) {
@@ -5202,7 +5558,7 @@ var linkTooltip = (renderTooltip) => {
5202
5558
  // above: true,
5203
5559
  create: () => {
5204
5560
  const el = document.createElement("div");
5205
- el.className = (0, import_react_ui_theme7.tooltipContent)({});
5561
+ el.className = (0, import_react_ui_theme8.tooltipContent)({});
5206
5562
  renderTooltip(el, {
5207
5563
  url: urlText
5208
5564
  }, view);
@@ -5274,7 +5630,7 @@ var InputModeExtensions = {
5274
5630
  editorInputMode.of({
5275
5631
  type: "vscode"
5276
5632
  }),
5277
- import_view28.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5633
+ import_view30.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5278
5634
  ],
5279
5635
  vim: [
5280
5636
  // https://github.com/replit/codemirror-vim
@@ -5283,7 +5639,7 @@ var InputModeExtensions = {
5283
5639
  type: "vim",
5284
5640
  noTabster: true
5285
5641
  }),
5286
- import_view28.keymap.of([
5642
+ import_view30.keymap.of([
5287
5643
  {
5288
5644
  key: "Alt-Escape",
5289
5645
  run: (view) => {
@@ -5423,7 +5779,7 @@ var format = (value) => JSON.stringify(value, (key, value2) => {
5423
5779
  }
5424
5780
  return value2;
5425
5781
  }).replaceAll('"', "");
5426
- var treeFacet = import_state26.Facet.define({
5782
+ var treeFacet = import_state27.Facet.define({
5427
5783
  combine: (values) => values[0]
5428
5784
  });
5429
5785
  var outlinerTree = (options = {}) => {
@@ -5572,7 +5928,7 @@ var outlinerTree = (options = {}) => {
5572
5928
  return tree;
5573
5929
  };
5574
5930
  return [
5575
- import_state25.StateField.define({
5931
+ import_state26.StateField.define({
5576
5932
  create: (state) => {
5577
5933
  return buildTree(state);
5578
5934
  },
@@ -5588,10 +5944,10 @@ var outlinerTree = (options = {}) => {
5588
5944
  };
5589
5945
  var getSelection = (state) => state.selection.main;
5590
5946
  var selectionEquals = (a, b) => a.length === b.length && a.every((i) => b.includes(i));
5591
- var selectionFacet = import_state24.Facet.define({
5947
+ var selectionFacet = import_state25.Facet.define({
5592
5948
  combine: (values) => values[0]
5593
5949
  });
5594
- var selectionCompartment = new import_state24.Compartment();
5950
+ var selectionCompartment = new import_state25.Compartment();
5595
5951
  var selectNone = (view) => {
5596
5952
  view.dispatch({
5597
5953
  effects: selectionCompartment.reconfigure(selectionFacet.of([]))
@@ -5672,7 +6028,7 @@ var moveItemDown = (view) => {
5672
6028
  ];
5673
6029
  view.dispatch({
5674
6030
  changes,
5675
- selection: import_state23.EditorSelection.cursor(pos + nextContent.length + 1),
6031
+ selection: import_state24.EditorSelection.cursor(pos + nextContent.length + 1),
5676
6032
  scrollIntoView: true
5677
6033
  });
5678
6034
  }
@@ -5700,7 +6056,7 @@ var moveItemUp = (view) => {
5700
6056
  ];
5701
6057
  view.dispatch({
5702
6058
  changes,
5703
- selection: import_state23.EditorSelection.cursor(pos - prevContent.length - 1),
6059
+ selection: import_state24.EditorSelection.cursor(pos - prevContent.length - 1),
5704
6060
  scrollIntoView: true
5705
6061
  });
5706
6062
  }
@@ -5712,7 +6068,7 @@ var deleteItem = (view) => {
5712
6068
  const current = tree.find(pos);
5713
6069
  if (current) {
5714
6070
  view.dispatch({
5715
- selection: import_state23.EditorSelection.cursor(current.lineRange.from),
6071
+ selection: import_state24.EditorSelection.cursor(current.lineRange.from),
5716
6072
  changes: [
5717
6073
  {
5718
6074
  from: current.lineRange.from,
@@ -5742,7 +6098,7 @@ var toggleTask = (view) => {
5742
6098
  }
5743
6099
  return true;
5744
6100
  };
5745
- var commands = () => import_view29.keymap.of([
6101
+ var commands = () => import_view31.keymap.of([
5746
6102
  //
5747
6103
  // Indentation.
5748
6104
  //
@@ -5768,7 +6124,7 @@ var commands = () => import_view29.keymap.of([
5768
6124
  insert
5769
6125
  }
5770
6126
  ],
5771
- selection: import_state23.EditorSelection.cursor(pos + insert.length)
6127
+ selection: import_state24.EditorSelection.cursor(pos + insert.length)
5772
6128
  });
5773
6129
  return true;
5774
6130
  }
@@ -5786,7 +6142,7 @@ var commands = () => import_view29.keymap.of([
5786
6142
  const next = tree.next(item);
5787
6143
  if (next) {
5788
6144
  view.dispatch({
5789
- selection: import_state23.EditorSelection.cursor(next.contentRange.from)
6145
+ selection: import_state24.EditorSelection.cursor(next.contentRange.from)
5790
6146
  });
5791
6147
  return true;
5792
6148
  }
@@ -5849,7 +6205,7 @@ var commands = () => import_view29.keymap.of([
5849
6205
  var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/outliner/editor.ts";
5850
6206
  var LIST_ITEM_REGEX = /^\s*- (\[ \]|\[x\])? /;
5851
6207
  var initialize = () => {
5852
- return import_view31.ViewPlugin.fromClass(class {
6208
+ return import_view33.ViewPlugin.fromClass(class {
5853
6209
  constructor(view) {
5854
6210
  const first = view.state.doc.lineAt(0);
5855
6211
  const text = view.state.sliceDoc(first.from, first.to);
@@ -5865,7 +6221,7 @@ var initialize = () => {
5865
6221
  insert
5866
6222
  }
5867
6223
  ],
5868
- selection: import_state28.EditorSelection.cursor(insert.length)
6224
+ selection: import_state29.EditorSelection.cursor(insert.length)
5869
6225
  });
5870
6226
  });
5871
6227
  }
@@ -5874,7 +6230,7 @@ var initialize = () => {
5874
6230
  };
5875
6231
  var editor = () => [
5876
6232
  initialize(),
5877
- import_state28.EditorState.transactionFilter.of((tr) => {
6233
+ import_state29.EditorState.transactionFilter.of((tr) => {
5878
6234
  const tree = tr.state.facet(treeFacet);
5879
6235
  if (!tr.docChanged) {
5880
6236
  const current = getSelection(tr.state).from;
@@ -5889,20 +6245,20 @@ var editor = () => [
5889
6245
  if (!prevItem) {
5890
6246
  return [
5891
6247
  {
5892
- selection: import_state28.EditorSelection.cursor(currentItem.contentRange.from)
6248
+ selection: import_state29.EditorSelection.cursor(currentItem.contentRange.from)
5893
6249
  }
5894
6250
  ];
5895
6251
  } else {
5896
6252
  if (currentItem.index < prevItem.index) {
5897
6253
  return [
5898
6254
  {
5899
- selection: import_state28.EditorSelection.cursor(currentItem.contentRange.to)
6255
+ selection: import_state29.EditorSelection.cursor(currentItem.contentRange.to)
5900
6256
  }
5901
6257
  ];
5902
6258
  } else if (currentItem.index > prevItem.index) {
5903
6259
  return [
5904
6260
  {
5905
- selection: import_state28.EditorSelection.cursor(currentItem.contentRange.from)
6261
+ selection: import_state29.EditorSelection.cursor(currentItem.contentRange.from)
5906
6262
  }
5907
6263
  ];
5908
6264
  } else {
@@ -5912,14 +6268,14 @@ var editor = () => [
5912
6268
  } else {
5913
6269
  return [
5914
6270
  {
5915
- selection: import_state28.EditorSelection.cursor(currentItem.lineRange.from - 1)
6271
+ selection: import_state29.EditorSelection.cursor(currentItem.lineRange.from - 1)
5916
6272
  }
5917
6273
  ];
5918
6274
  }
5919
6275
  } else {
5920
6276
  return [
5921
6277
  {
5922
- selection: import_state28.EditorSelection.cursor(currentItem.contentRange.to)
6278
+ selection: import_state29.EditorSelection.cursor(currentItem.contentRange.to)
5923
6279
  }
5924
6280
  ];
5925
6281
  }
@@ -6032,7 +6388,7 @@ var editor = () => [
6032
6388
  ];
6033
6389
  var outliner = (options = {}) => [
6034
6390
  // Commands.
6035
- import_state27.Prec.highest(commands()),
6391
+ import_state28.Prec.highest(commands()),
6036
6392
  // Selection.
6037
6393
  selectionCompartment.of(selectionFacet.of([])),
6038
6394
  // State.
@@ -6048,14 +6404,14 @@ var outliner = (options = {}) => [
6048
6404
  listPaddingLeft: 8
6049
6405
  }),
6050
6406
  // Researve space for menu.
6051
- import_view30.EditorView.contentAttributes.of({
6407
+ import_view32.EditorView.contentAttributes.of({
6052
6408
  class: "is-full !mr-[3rem]"
6053
6409
  })
6054
6410
  ];
6055
6411
  var decorations = () => [
6056
- import_view30.ViewPlugin.fromClass(class {
6412
+ import_view32.ViewPlugin.fromClass(class {
6057
6413
  constructor(view) {
6058
- this.decorations = import_view30.Decoration.none;
6414
+ this.decorations = import_view32.Decoration.none;
6059
6415
  this.updateDecorations(view.state, view);
6060
6416
  }
6061
6417
  update(update2) {
@@ -6077,18 +6433,18 @@ var decorations = () => [
6077
6433
  const lineFrom = doc.lineAt(item.contentRange.from);
6078
6434
  const lineTo = doc.lineAt(item.contentRange.to);
6079
6435
  const isSelected = selection.includes(item.index) || item === current;
6080
- decorations2.push(import_view30.Decoration.line({
6081
- 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"))
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"))
6082
6438
  }).range(line.from, line.from));
6083
6439
  }
6084
6440
  }
6085
- this.decorations = import_view30.Decoration.set(decorations2);
6441
+ this.decorations = import_view32.Decoration.set(decorations2);
6086
6442
  }
6087
6443
  }, {
6088
6444
  decorations: (v) => v.decorations
6089
6445
  }),
6090
6446
  // Theme.
6091
- import_view30.EditorView.theme(Object.assign({
6447
+ import_view32.EditorView.theme(Object.assign({
6092
6448
  ".cm-list-item": {
6093
6449
  borderLeftWidth: "1px",
6094
6450
  borderRightWidth: "1px",
@@ -6117,9 +6473,6 @@ var decorations = () => [
6117
6473
  },
6118
6474
  "[data-has-focus] & .cm-list-item-selected": {
6119
6475
  borderColor: "var(--dx-separator)"
6120
- },
6121
- "[data-is-attention-source] & .cm-list-item-selected": {
6122
- borderColor: "var(--dx-separator)"
6123
6476
  }
6124
6477
  }))
6125
6478
  ];
@@ -6127,22 +6480,19 @@ var preview = (options = {}) => {
6127
6480
  return [
6128
6481
  // NOTE: Atomic block decorations must be created from a state field, now a widget, otherwise it results in the following error:
6129
6482
  // "Block decorations may not be specified via plugins"
6130
- import_state29.StateField.define({
6483
+ import_state30.StateField.define({
6131
6484
  create: (state) => buildDecorations3(state, options),
6132
6485
  update: (_, tr) => buildDecorations3(tr.state, options),
6133
6486
  provide: (field) => [
6134
- import_view32.EditorView.decorations.from(field),
6135
- import_view32.EditorView.atomicRanges.of((view) => view.state.field(field))
6487
+ import_view34.EditorView.decorations.from(field),
6488
+ import_view34.EditorView.atomicRanges.of((view) => view.state.field(field))
6136
6489
  ]
6137
6490
  }),
6138
- import_view32.EditorView.theme({
6491
+ import_view34.EditorView.theme({
6139
6492
  ".cm-preview-block": {
6140
- marginLeft: "-1rem",
6141
- marginRight: "-1rem",
6142
- padding: "1rem",
6143
- borderRadius: "0.5rem",
6144
- background: "var(--dx-modalSurface)",
6145
- border: "1px solid var(--dx-separator)"
6493
+ "--dx-card-spacing-inline": "var(--dx-trimMd)",
6494
+ "--dx-card-spacing-block": "var(--dx-trimMd)",
6495
+ marginInline: "calc(-1*var(--dx-trimMd))"
6146
6496
  }
6147
6497
  })
6148
6498
  ];
@@ -6161,7 +6511,7 @@ var getLinkRef = (state, node) => {
6161
6511
  }
6162
6512
  };
6163
6513
  var buildDecorations3 = (state, options) => {
6164
- const builder = new import_state29.RangeSetBuilder();
6514
+ const builder = new import_state30.RangeSetBuilder();
6165
6515
  (0, import_language15.syntaxTree)(state).iterate({
6166
6516
  enter: (node) => {
6167
6517
  switch (node.name) {
@@ -6172,7 +6522,7 @@ var buildDecorations3 = (state, options) => {
6172
6522
  case "Link": {
6173
6523
  const link = getLinkRef(state, node.node);
6174
6524
  if (link) {
6175
- builder.add(node.from, node.to, import_view32.Decoration.replace({
6525
+ builder.add(node.from, node.to, import_view34.Decoration.replace({
6176
6526
  widget: new PreviewInlineWidget(options, link)
6177
6527
  }));
6178
6528
  }
@@ -6185,7 +6535,7 @@ var buildDecorations3 = (state, options) => {
6185
6535
  case "Image": {
6186
6536
  const link = getLinkRef(state, node.node);
6187
6537
  if (options.renderBlock && link) {
6188
- builder.add(node.from, node.to, import_view32.Decoration.replace({
6538
+ builder.add(node.from, node.to, import_view34.Decoration.replace({
6189
6539
  block: true,
6190
6540
  // atomic: true,
6191
6541
  widget: new PreviewBlockWidget(options, link)
@@ -6198,7 +6548,7 @@ var buildDecorations3 = (state, options) => {
6198
6548
  });
6199
6549
  return builder.finish();
6200
6550
  };
6201
- var PreviewInlineWidget = class extends import_view32.WidgetType {
6551
+ var PreviewInlineWidget = class extends import_view34.WidgetType {
6202
6552
  constructor(_options, _link) {
6203
6553
  super(), this._options = _options, this._link = _link;
6204
6554
  }
@@ -6215,7 +6565,7 @@ var PreviewInlineWidget = class extends import_view32.WidgetType {
6215
6565
  return root;
6216
6566
  }
6217
6567
  };
6218
- var PreviewBlockWidget = class extends import_view32.WidgetType {
6568
+ var PreviewBlockWidget = class extends import_view34.WidgetType {
6219
6569
  constructor(_options, _link) {
6220
6570
  super(), this._options = _options, this._link = _link;
6221
6571
  }
@@ -6281,7 +6631,7 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
6281
6631
  let t;
6282
6632
  let idx = 0;
6283
6633
  return [
6284
- import_view33.keymap.of([
6634
+ import_view35.keymap.of([
6285
6635
  {
6286
6636
  // Reset.
6287
6637
  key: "alt-meta-'",
@@ -6608,28 +6958,6 @@ var createViewMode = (state, onViewModeChange) => {
6608
6958
  ]
6609
6959
  };
6610
6960
  };
6611
- var editorWidth = "!mli-auto is-full max-is-[min(50rem,100%-4rem)]";
6612
- var editorSlots = {
6613
- scroll: {
6614
- className: "pbs-2"
6615
- },
6616
- content: {
6617
- className: editorWidth
6618
- }
6619
- };
6620
- var editorGutter = import_view34.EditorView.theme({
6621
- ".cm-gutters": {
6622
- paddingRight: "1rem"
6623
- }
6624
- });
6625
- var editorMonospace = import_view34.EditorView.theme({
6626
- ".cm-content": {
6627
- fontFamily: fontMono
6628
- }
6629
- });
6630
- var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden";
6631
- var stackItemContentEditorClassNames = (role) => (0, import_react_ui_theme9.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");
6632
- var stackItemContentToolbarClassNames = (role) => (0, import_react_ui_theme9.mx)("relative z-[1] flex is-full bg-toolbarSurface border-be border-subduedSeparator", role === "section" && "sticky block-start-0 -mbe-px min-is-0");
6633
6961
  var createToolbar = ({ getView, state, customActions, ...features }) => {
6634
6962
  return import_rx_react.Rx.make((get2) => {
6635
6963
  const nodes = [];
@@ -6731,20 +7059,304 @@ var EditorToolbar = /* @__PURE__ */ (0, import_react.memo)(({ classNames, attend
6731
7059
  _effect.f();
6732
7060
  }
6733
7061
  });
7062
+ var CommandMenu = ({ groups, currentItem, onSelect }) => {
7063
+ var _effect = (0, import_tracking2.useSignals)();
7064
+ try {
7065
+ const { tx } = (0, import_react_ui4.useThemeContext)();
7066
+ const groupsWithItems = groups.filter((group) => group.items.length > 0);
7067
+ return /* @__PURE__ */ import_react8.default.createElement(import_react_ui4.Popover.Portal, null, /* @__PURE__ */ import_react8.default.createElement(import_react_ui4.Popover.Content, {
7068
+ align: "start",
7069
+ onOpenAutoFocus: (event) => event.preventDefault(),
7070
+ classNames: tx("menu.content", "menu--exotic-unfocusable", {
7071
+ elevation: "positioned"
7072
+ }, [
7073
+ "max-h-[300px] overflow-y-auto"
7074
+ ])
7075
+ }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui4.Popover.Viewport, {
7076
+ classNames: tx("menu.viewport", "menu__viewport--exotic-unfocusable", {})
7077
+ }, /* @__PURE__ */ import_react8.default.createElement("ul", null, groupsWithItems.map((group, index) => /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, {
7078
+ key: group.id
7079
+ }, /* @__PURE__ */ import_react8.default.createElement(CommandGroup, {
7080
+ group,
7081
+ currentItem,
7082
+ onSelect
7083
+ }), index < groupsWithItems.length - 1 && /* @__PURE__ */ import_react8.default.createElement("div", {
7084
+ className: tx("menu.separator", "menu__item", {})
7085
+ })))))));
7086
+ } finally {
7087
+ _effect.f();
7088
+ }
7089
+ };
7090
+ var CommandGroup = ({ group, currentItem, onSelect }) => {
7091
+ var _effect = (0, import_tracking2.useSignals)();
7092
+ try {
7093
+ const { tx } = (0, import_react_ui4.useThemeContext)();
7094
+ const { t } = (0, import_react_ui4.useTranslation)();
7095
+ return /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, group.label && /* @__PURE__ */ import_react8.default.createElement("div", {
7096
+ className: tx("menu.groupLabel", "menu__group__label", {})
7097
+ }, /* @__PURE__ */ import_react8.default.createElement("span", null, (0, import_react_ui4.toLocalizedString)(group.label, t))), group.items.map((item) => /* @__PURE__ */ import_react8.default.createElement(CommandItem, {
7098
+ key: item.id,
7099
+ item,
7100
+ current: currentItem === item.id,
7101
+ onSelect
7102
+ })));
7103
+ } finally {
7104
+ _effect.f();
7105
+ }
7106
+ };
7107
+ var CommandItem = ({ item, current, onSelect }) => {
7108
+ var _effect = (0, import_tracking2.useSignals)();
7109
+ try {
7110
+ const ref = (0, import_react8.useRef)(null);
7111
+ const { tx } = (0, import_react_ui4.useThemeContext)();
7112
+ const { t } = (0, import_react_ui4.useTranslation)();
7113
+ const handleSelect = (0, import_react8.useCallback)(() => onSelect(item), [
7114
+ item,
7115
+ onSelect
7116
+ ]);
7117
+ (0, import_react8.useEffect)(() => {
7118
+ if (current && ref.current) {
7119
+ ref.current.scrollIntoView({
7120
+ behavior: "smooth",
7121
+ block: "nearest"
7122
+ });
7123
+ }
7124
+ }, [
7125
+ current
7126
+ ]);
7127
+ return /* @__PURE__ */ import_react8.default.createElement("li", {
7128
+ ref,
7129
+ className: tx("menu.item", "menu__item--exotic-unfocusable", {}, [
7130
+ current && "bg-hoverSurface"
7131
+ ]),
7132
+ onClick: handleSelect
7133
+ }, item.icon && /* @__PURE__ */ import_react8.default.createElement(import_react_ui4.Icon, {
7134
+ icon: item.icon,
7135
+ size: 5
7136
+ }), /* @__PURE__ */ import_react8.default.createElement("span", {
7137
+ className: "grow truncate"
7138
+ }, (0, import_react_ui4.toLocalizedString)(item.label, t)));
7139
+ } finally {
7140
+ _effect.f();
7141
+ }
7142
+ };
7143
+ var getItem = (groups, id) => {
7144
+ return groups.flatMap((group) => group.items).find((item) => item.id === id);
7145
+ };
7146
+ var getNextItem = (groups, id) => {
7147
+ const items = groups.flatMap((group) => group.items);
7148
+ const index = items.findIndex((item) => item.id === id);
7149
+ return items[(index + 1) % items.length];
7150
+ };
7151
+ var getPreviousItem = (groups, id) => {
7152
+ const items = groups.flatMap((group) => group.items);
7153
+ const index = items.findIndex((item) => item.id === id);
7154
+ return items[(index - 1 + items.length) % items.length];
7155
+ };
7156
+ var filterItems = (groups, filter) => {
7157
+ return groups.map((group) => ({
7158
+ ...group,
7159
+ items: group.items.filter(filter)
7160
+ }));
7161
+ };
7162
+ var insertAtCursor = (view, head, insert) => {
7163
+ view.dispatch({
7164
+ changes: {
7165
+ from: head,
7166
+ to: head,
7167
+ insert
7168
+ },
7169
+ selection: {
7170
+ anchor: head + insert.length,
7171
+ head: head + insert.length
7172
+ }
7173
+ });
7174
+ };
7175
+ var insertAtLineStart = (view, head, insert) => {
7176
+ const line = view.state.doc.lineAt(head);
7177
+ if (line.from === head) {
7178
+ insertAtCursor(view, head, insert);
7179
+ } else {
7180
+ insert = "\n" + insert;
7181
+ view.dispatch({
7182
+ changes: {
7183
+ from: line.to,
7184
+ to: line.to,
7185
+ insert
7186
+ },
7187
+ selection: {
7188
+ anchor: line.to + insert.length,
7189
+ head: line.to + insert.length
7190
+ }
7191
+ });
7192
+ }
7193
+ };
7194
+ var coreSlashCommands = {
7195
+ id: "markdown",
7196
+ label: "Markdown",
7197
+ items: [
7198
+ {
7199
+ id: "heading-1",
7200
+ label: "Heading 1",
7201
+ icon: "ph--text-h-one--regular",
7202
+ onSelect: (view, head) => insertAtLineStart(view, head, "# ")
7203
+ },
7204
+ {
7205
+ id: "heading-2",
7206
+ label: "Heading 2",
7207
+ icon: "ph--text-h-two--regular",
7208
+ onSelect: (view, head) => insertAtLineStart(view, head, "## ")
7209
+ },
7210
+ {
7211
+ id: "heading-3",
7212
+ label: "Heading 3",
7213
+ icon: "ph--text-h-three--regular",
7214
+ onSelect: (view, head) => insertAtLineStart(view, head, "### ")
7215
+ },
7216
+ {
7217
+ id: "heading-4",
7218
+ label: "Heading 4",
7219
+ icon: "ph--text-h-four--regular",
7220
+ onSelect: (view, head) => insertAtLineStart(view, head, "#### ")
7221
+ },
7222
+ {
7223
+ id: "heading-5",
7224
+ label: "Heading 5",
7225
+ icon: "ph--text-h-five--regular",
7226
+ onSelect: (view, head) => insertAtLineStart(view, head, "##### ")
7227
+ },
7228
+ {
7229
+ id: "heading-6",
7230
+ label: "Heading 6",
7231
+ icon: "ph--text-h-six--regular",
7232
+ onSelect: (view, head) => insertAtLineStart(view, head, "###### ")
7233
+ },
7234
+ {
7235
+ id: "bullet-list",
7236
+ label: "Bullet List",
7237
+ icon: "ph--list-bullets--regular",
7238
+ onSelect: (view, head) => insertAtLineStart(view, head, "- ")
7239
+ },
7240
+ {
7241
+ id: "numbered-list",
7242
+ label: "Numbered List",
7243
+ icon: "ph--list-numbers--regular",
7244
+ onSelect: (view, head) => insertAtLineStart(view, head, "1. ")
7245
+ },
7246
+ {
7247
+ id: "task-list",
7248
+ label: "Task List",
7249
+ icon: "ph--list-checks--regular",
7250
+ onSelect: (view, head) => insertAtLineStart(view, head, "- [ ] ")
7251
+ },
7252
+ {
7253
+ id: "quote",
7254
+ label: "Quote",
7255
+ icon: "ph--quotes--regular",
7256
+ onSelect: (view, head) => insertAtLineStart(view, head, "> ")
7257
+ },
7258
+ {
7259
+ id: "code-block",
7260
+ label: "Code Block",
7261
+ icon: "ph--code-block--regular",
7262
+ onSelect: (view, head) => insertAtLineStart(view, head, "```\n\n```")
7263
+ },
7264
+ {
7265
+ id: "table",
7266
+ label: "Table",
7267
+ icon: "ph--table--regular",
7268
+ onSelect: (view, head) => insertAtLineStart(view, head, "| | | |\n|---|---|---|\n| | | |")
7269
+ }
7270
+ ]
7271
+ };
7272
+ var linkSlashCommands = {
7273
+ id: "link",
7274
+ label: "Link",
7275
+ items: [
7276
+ {
7277
+ id: "inline-link",
7278
+ label: "Inline link",
7279
+ icon: "ph--link--regular",
7280
+ onSelect: (view, head) => view.dispatch({
7281
+ changes: {
7282
+ from: head,
7283
+ insert: "@"
7284
+ },
7285
+ selection: {
7286
+ anchor: head + 1,
7287
+ head: head + 1
7288
+ },
7289
+ effects: commandRangeEffect.of({
7290
+ trigger: "@",
7291
+ range: {
7292
+ from: head,
7293
+ to: head + 1
7294
+ }
7295
+ })
7296
+ })
7297
+ },
7298
+ {
7299
+ id: "block-embed",
7300
+ label: "Block embed",
7301
+ icon: "ph--lego--regular",
7302
+ onSelect: (view, head) => view.dispatch({
7303
+ changes: {
7304
+ from: head,
7305
+ insert: "@@"
7306
+ },
7307
+ selection: {
7308
+ anchor: head + 2,
7309
+ head: head + 2
7310
+ },
7311
+ effects: commandRangeEffect.of({
7312
+ trigger: "@",
7313
+ range: {
7314
+ from: head,
7315
+ to: head + 2
7316
+ }
7317
+ })
7318
+ })
7319
+ }
7320
+ ]
7321
+ };
6734
7322
  var customEventOptions = {
6735
7323
  capture: true,
6736
7324
  passive: false
6737
7325
  };
7326
+ var RefPopover = /* @__PURE__ */ (0, import_react9.forwardRef)(({ children, open, onOpenChange, modal, onActivate }, ref) => {
7327
+ var _effect = (0, import_tracking3.useSignals)();
7328
+ try {
7329
+ const [rootRef, setRootRef] = (0, import_react9.useState)(null);
7330
+ (0, import_react9.useEffect)(() => {
7331
+ return rootRef && onActivate ? (0, import_async6.addEventListener)(rootRef, "dx-ref-tag-activate", onActivate, customEventOptions) : void 0;
7332
+ }, [
7333
+ rootRef,
7334
+ onActivate
7335
+ ]);
7336
+ return /* @__PURE__ */ import_react9.default.createElement(import_react_ui5.Popover.Root, {
7337
+ open,
7338
+ onOpenChange,
7339
+ modal
7340
+ }, /* @__PURE__ */ import_react9.default.createElement(import_react_ui5.Popover.VirtualTrigger, {
7341
+ virtualRef: ref
7342
+ }), /* @__PURE__ */ import_react9.default.createElement("div", {
7343
+ role: "none",
7344
+ className: "contents",
7345
+ ref: setRootRef
7346
+ }, children));
7347
+ } finally {
7348
+ _effect.f();
7349
+ }
7350
+ });
6738
7351
  var REF_POPOVER = "RefPopover";
6739
7352
  var [RefPopoverContextProvider, useRefPopover] = (0, import_react_context.createContext)(REF_POPOVER, {});
6740
- var RefPopoverProvider = ({ children, onLookup }) => {
6741
- var _effect = (0, import_tracking2.useSignals)();
7353
+ var PreviewProvider = ({ children, onLookup }) => {
7354
+ var _effect = (0, import_tracking3.useSignals)();
6742
7355
  try {
6743
- const trigger = (0, import_react7.useRef)(null);
6744
- const [value, setValue] = (0, import_react7.useState)({});
6745
- const [rootRef, setRootRef] = (0, import_react7.useState)(null);
6746
- const [open, setOpen] = (0, import_react7.useState)(false);
6747
- const handleDxRefTagActivate = (0, import_react7.useCallback)((event) => {
7356
+ const trigger = (0, import_react9.useRef)(null);
7357
+ const [value, setValue] = (0, import_react9.useState)({});
7358
+ const [open, setOpen] = (0, import_react9.useState)(false);
7359
+ const handleDxRefTagActivate = (0, import_react9.useCallback)((event) => {
6748
7360
  const { refId, label, trigger: dxTrigger } = event;
6749
7361
  setValue((value2) => ({
6750
7362
  ...value2,
@@ -6767,32 +7379,20 @@ var RefPopoverProvider = ({ children, onLookup }) => {
6767
7379
  }, [
6768
7380
  onLookup
6769
7381
  ]);
6770
- (0, import_react7.useEffect)(() => {
6771
- return rootRef ? (0, import_async6.addEventListener)(rootRef, "dx-ref-tag-activate", handleDxRefTagActivate, customEventOptions) : void 0;
6772
- }, [
6773
- rootRef
6774
- ]);
6775
- return /* @__PURE__ */ import_react7.default.createElement(RefPopoverContextProvider, {
7382
+ return /* @__PURE__ */ import_react9.default.createElement(RefPopoverContextProvider, {
6776
7383
  pending: value.pending,
6777
7384
  link: value.link,
6778
7385
  target: value.target
6779
- }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui4.Popover.Root, {
7386
+ }, /* @__PURE__ */ import_react9.default.createElement(RefPopover, {
7387
+ ref: trigger,
6780
7388
  open,
6781
- onOpenChange: setOpen
6782
- }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui4.Popover.VirtualTrigger, {
6783
- virtualRef: trigger
6784
- }), /* @__PURE__ */ import_react7.default.createElement("div", {
6785
- role: "none",
6786
- className: "contents",
6787
- ref: setRootRef
6788
- }, children)));
7389
+ onOpenChange: setOpen,
7390
+ onActivate: handleDxRefTagActivate
7391
+ }, children));
6789
7392
  } finally {
6790
7393
  _effect.f();
6791
7394
  }
6792
7395
  };
6793
- var RefPopover = {
6794
- Provider: RefPopoverProvider
6795
- };
6796
7396
  var customEventOptions2 = {
6797
7397
  capture: true,
6798
7398
  passive: false
@@ -6800,13 +7400,13 @@ var customEventOptions2 = {
6800
7400
  var REF_DROPDOWN_MENU = "RefDropdownMenu";
6801
7401
  var [RefDropdownMenuContextProvider, useRefDropdownMenu] = (0, import_react_context2.createContext)(REF_DROPDOWN_MENU, {});
6802
7402
  var RefDropdownMenuProvider = ({ children, onLookup }) => {
6803
- var _effect = (0, import_tracking3.useSignals)();
7403
+ var _effect = (0, import_tracking4.useSignals)();
6804
7404
  try {
6805
- const trigger = (0, import_react8.useRef)(null);
6806
- const [value, setValue] = (0, import_react8.useState)({});
6807
- const [rootRef, setRootRef] = (0, import_react8.useState)(null);
6808
- const [open, setOpen] = (0, import_react8.useState)(false);
6809
- const handleDxRefTagActivate = (0, import_react8.useCallback)((event) => {
7405
+ const trigger = (0, import_react10.useRef)(null);
7406
+ const [value, setValue] = (0, import_react10.useState)({});
7407
+ const [rootRef, setRootRef] = (0, import_react10.useState)(null);
7408
+ const [open, setOpen] = (0, import_react10.useState)(false);
7409
+ const handleDxRefTagActivate = (0, import_react10.useCallback)((event) => {
6810
7410
  const { refId, label, trigger: dxTrigger } = event;
6811
7411
  setValue((value2) => ({
6812
7412
  ...value2,
@@ -6829,21 +7429,21 @@ var RefDropdownMenuProvider = ({ children, onLookup }) => {
6829
7429
  }, [
6830
7430
  onLookup
6831
7431
  ]);
6832
- (0, import_react8.useEffect)(() => {
7432
+ (0, import_react10.useEffect)(() => {
6833
7433
  return rootRef ? (0, import_async7.addEventListener)(rootRef, "dx-ref-tag-activate", handleDxRefTagActivate, customEventOptions2) : void 0;
6834
7434
  }, [
6835
7435
  rootRef
6836
7436
  ]);
6837
- return /* @__PURE__ */ import_react8.default.createElement(RefDropdownMenuContextProvider, {
7437
+ return /* @__PURE__ */ import_react10.default.createElement(RefDropdownMenuContextProvider, {
6838
7438
  pending: value.pending,
6839
7439
  link: value.link,
6840
7440
  target: value.target
6841
- }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui5.DropdownMenu.Root, {
7441
+ }, /* @__PURE__ */ import_react10.default.createElement(import_react_ui6.DropdownMenu.Root, {
6842
7442
  open,
6843
7443
  onOpenChange: setOpen
6844
- }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui5.DropdownMenu.VirtualTrigger, {
7444
+ }, /* @__PURE__ */ import_react10.default.createElement(import_react_ui6.DropdownMenu.VirtualTrigger, {
6845
7445
  virtualRef: trigger
6846
- }), /* @__PURE__ */ import_react8.default.createElement("div", {
7446
+ }), /* @__PURE__ */ import_react10.default.createElement("div", {
6847
7447
  role: "none",
6848
7448
  className: "contents",
6849
7449
  ref: setRootRef
@@ -6858,11 +7458,11 @@ var RefDropdownMenu = {
6858
7458
  var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
6859
7459
  var instanceCount = 0;
6860
7460
  var useTextEditor = (props = {}, deps = []) => {
6861
- const { id, doc, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0, import_react9.useMemo)(() => (0, import_util6.getProviderValue)(props), deps ?? []);
6862
- const [instanceId] = (0, import_react9.useState)(() => `text-editor-${++instanceCount}`);
6863
- const [view, setView] = (0, import_react9.useState)();
6864
- const parentRef = (0, import_react9.useRef)(null);
6865
- (0, import_react9.useEffect)(() => {
7461
+ const { id, doc, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0, import_react11.useMemo)(() => (0, import_util6.getProviderValue)(props), deps ?? []);
7462
+ const [instanceId] = (0, import_react11.useState)(() => `text-editor-${++instanceCount}`);
7463
+ const [view, setView] = (0, import_react11.useState)();
7464
+ const parentRef = (0, import_react11.useRef)(null);
7465
+ (0, import_react11.useEffect)(() => {
6866
7466
  let view2;
6867
7467
  if (parentRef.current) {
6868
7468
  (0, import_log8.log)("create", {
@@ -6871,7 +7471,7 @@ var useTextEditor = (props = {}, deps = []) => {
6871
7471
  doc: initialValue?.length ?? 0
6872
7472
  }, {
6873
7473
  F: __dxlog_file13,
6874
- L: 76,
7474
+ L: 75,
6875
7475
  S: void 0,
6876
7476
  C: (f, a) => f(...a)
6877
7477
  });
@@ -6887,27 +7487,27 @@ var useTextEditor = (props = {}, deps = []) => {
6887
7487
  anchor
6888
7488
  };
6889
7489
  }
6890
- const state = import_state30.EditorState.create({
7490
+ const state = import_state31.EditorState.create({
6891
7491
  doc: doc ?? initialValue,
6892
7492
  // selection: initialSelection,
6893
7493
  extensions: [
6894
7494
  id && documentId.of(id),
6895
7495
  extensions,
6896
7496
  // NOTE: This doesn't catch errors in keymap functions.
6897
- import_view35.EditorView.exceptionSink.of((err) => {
7497
+ import_view36.EditorView.exceptionSink.of((err) => {
6898
7498
  import_log8.log.catch(err, void 0, {
6899
7499
  F: __dxlog_file13,
6900
- L: 98,
7500
+ L: 97,
6901
7501
  S: void 0,
6902
7502
  C: (f, a) => f(...a)
6903
7503
  });
6904
7504
  })
6905
7505
  ].filter(import_util6.isNotFalsy)
6906
7506
  });
6907
- view2 = new import_view35.EditorView({
7507
+ view2 = new import_view36.EditorView({
6908
7508
  parent: parentRef.current,
6909
7509
  state,
6910
- scrollTo: scrollTo ? import_view35.EditorView.scrollIntoView(scrollTo, {
7510
+ scrollTo: scrollTo ? import_view36.EditorView.scrollIntoView(scrollTo, {
6911
7511
  yMargin: 96
6912
7512
  }) : void 0,
6913
7513
  dispatchTransactions: debug ? debugDispatcher : void 0
@@ -6929,14 +7529,14 @@ var useTextEditor = (props = {}, deps = []) => {
6929
7529
  id
6930
7530
  }, {
6931
7531
  F: __dxlog_file13,
6932
- L: 135,
7532
+ L: 134,
6933
7533
  S: void 0,
6934
7534
  C: (f, a) => f(...a)
6935
7535
  });
6936
7536
  view2?.destroy();
6937
7537
  };
6938
7538
  }, deps);
6939
- (0, import_react9.useEffect)(() => {
7539
+ (0, import_react11.useEffect)(() => {
6940
7540
  if (view) {
6941
7541
  if (scrollTo || selection) {
6942
7542
  if (selection && selection.anchor > view.state.doc.length) {
@@ -6946,7 +7546,7 @@ var useTextEditor = (props = {}, deps = []) => {
6946
7546
  selection
6947
7547
  }, {
6948
7548
  F: __dxlog_file13,
6949
- L: 144,
7549
+ L: 143,
6950
7550
  S: void 0,
6951
7551
  C: (f, a) => f(...a)
6952
7552
  });
@@ -6963,7 +7563,7 @@ var useTextEditor = (props = {}, deps = []) => {
6963
7563
  scrollTo,
6964
7564
  selection
6965
7565
  ]);
6966
- (0, import_react9.useEffect)(() => {
7566
+ (0, import_react11.useEffect)(() => {
6967
7567
  if (view && autoFocus) {
6968
7568
  view.focus();
6969
7569
  }
@@ -6977,7 +7577,7 @@ var useTextEditor = (props = {}, deps = []) => {
6977
7577
  Escape: view?.state.facet(editorInputMode).noTabster
6978
7578
  }
6979
7579
  });
6980
- const handleKeyUp = (0, import_react9.useCallback)((event) => {
7580
+ const handleKeyUp = (0, import_react11.useCallback)((event) => {
6981
7581
  const { key, target, currentTarget } = event;
6982
7582
  if (target === currentTarget) {
6983
7583
  switch (key) {
@@ -7002,6 +7602,7 @@ var useTextEditor = (props = {}, deps = []) => {
7002
7602
  };
7003
7603
  // Annotate the CommonJS export names for ESM import in node:
7004
7604
  0 && (module.exports = {
7605
+ CommandMenu,
7005
7606
  Cursor,
7006
7607
  EditorInputMode,
7007
7608
  EditorInputModes,
@@ -7013,6 +7614,7 @@ var useTextEditor = (props = {}, deps = []) => {
7013
7614
  Inline,
7014
7615
  InputModeExtensions,
7015
7616
  List,
7617
+ PreviewProvider,
7016
7618
  RefDropdownMenu,
7017
7619
  RefPopover,
7018
7620
  RemoteSelectionsDecorator,
@@ -7036,11 +7638,14 @@ var useTextEditor = (props = {}, deps = []) => {
7036
7638
  closeEffect,
7037
7639
  command,
7038
7640
  commandKeyBindings,
7641
+ commandMenu,
7642
+ commandRangeEffect,
7039
7643
  commands,
7040
7644
  commentClickedEffect,
7041
7645
  comments,
7042
7646
  commentsState,
7043
7647
  convertTreeToJson,
7648
+ coreSlashCommands,
7044
7649
  createBasicExtensions,
7045
7650
  createComment,
7046
7651
  createDataExtensions,
@@ -7068,6 +7673,7 @@ var useTextEditor = (props = {}, deps = []) => {
7068
7673
  editorSlots,
7069
7674
  editorWidth,
7070
7675
  editorWithToolbarLayout,
7676
+ filterItems,
7071
7677
  flattenRect,
7072
7678
  floatingMenu,
7073
7679
  focus,
@@ -7076,15 +7682,21 @@ var useTextEditor = (props = {}, deps = []) => {
7076
7682
  formattingEquals,
7077
7683
  formattingKeymap,
7078
7684
  getFormatting,
7685
+ getItem,
7079
7686
  getListItemContent,
7687
+ getNextItem,
7688
+ getPreviousItem,
7080
7689
  getRange,
7081
7690
  hashtag,
7082
7691
  image,
7083
7692
  indentItemLess,
7084
7693
  indentItemMore,
7694
+ insertAtCursor,
7695
+ insertAtLineStart,
7085
7696
  insertTable,
7086
7697
  itemToJSON,
7087
7698
  keymap,
7699
+ linkSlashCommands,
7088
7700
  linkTooltip,
7089
7701
  listItemToString,
7090
7702
  listener,
@@ -7096,6 +7708,7 @@ var useTextEditor = (props = {}, deps = []) => {
7096
7708
  mention,
7097
7709
  moveItemDown,
7098
7710
  moveItemUp,
7711
+ multilinePlaceholder,
7099
7712
  openCommand,
7100
7713
  openEffect,
7101
7714
  outliner,
@@ -7138,6 +7751,7 @@ var useTextEditor = (props = {}, deps = []) => {
7138
7751
  treeFacet,
7139
7752
  typeahead,
7140
7753
  typewriter,
7754
+ useCommandMenu,
7141
7755
  useComments,
7142
7756
  useEditorToolbarState,
7143
7757
  useFormattingState,