@dxos/react-ui-editor 0.8.2 → 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 (83) hide show
  1. package/dist/lib/browser/index.mjs +936 -274
  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 +981 -314
  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 +936 -274
  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/hashtag.d.ts +3 -0
  23. package/dist/types/src/extensions/hashtag.d.ts.map +1 -0
  24. package/dist/types/src/extensions/index.d.ts +2 -0
  25. package/dist/types/src/extensions/index.d.ts.map +1 -1
  26. package/dist/types/src/extensions/json.d.ts.map +1 -1
  27. package/dist/types/src/extensions/markdown/debug.d.ts +2 -2
  28. package/dist/types/src/extensions/markdown/debug.d.ts.map +1 -1
  29. package/dist/types/src/extensions/outliner/outliner.d.ts +1 -3
  30. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
  31. package/dist/types/src/extensions/placeholder.d.ts +4 -0
  32. package/dist/types/src/extensions/placeholder.d.ts.map +1 -0
  33. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  34. package/dist/types/src/hooks/useTextEditor.d.ts +8 -9
  35. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  36. package/dist/types/src/stories/Command.stories.d.ts +1 -1
  37. package/dist/types/src/stories/Command.stories.d.ts.map +1 -1
  38. package/dist/types/src/stories/CommandMenu.stories.d.ts +12 -0
  39. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +1 -0
  40. package/dist/types/src/stories/Comments.stories.d.ts +1 -1
  41. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  42. package/dist/types/src/stories/Experimental.stories.d.ts +1 -1
  43. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  44. package/dist/types/src/stories/Markdown.stories.d.ts +1 -1
  45. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  46. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  47. package/dist/types/src/stories/Preview.stories.d.ts +1 -1
  48. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  49. package/dist/types/src/stories/TextEditor.stories.d.ts +1 -1
  50. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  51. package/dist/types/src/stories/components/EditorStory.d.ts +43 -0
  52. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -0
  53. package/dist/types/src/stories/components/index.d.ts +3 -0
  54. package/dist/types/src/stories/components/index.d.ts.map +1 -0
  55. package/dist/types/src/stories/{util.d.ts → components/util.d.ts} +3 -18
  56. package/dist/types/src/stories/components/util.d.ts.map +1 -0
  57. package/package.json +31 -27
  58. package/src/components/Popover/CommandMenu.tsx +279 -0
  59. package/src/components/Popover/RefPopover.tsx +44 -22
  60. package/src/components/Popover/index.ts +1 -0
  61. package/src/defaults.ts +1 -0
  62. package/src/extensions/command/menu.ts +334 -23
  63. package/src/extensions/factories.ts +4 -1
  64. package/src/extensions/hashtag.tsx +68 -0
  65. package/src/extensions/index.ts +2 -0
  66. package/src/extensions/json.ts +2 -1
  67. package/src/extensions/markdown/debug.ts +2 -2
  68. package/src/extensions/outliner/outliner.ts +6 -8
  69. package/src/extensions/placeholder.ts +82 -0
  70. package/src/extensions/preview/preview.ts +3 -6
  71. package/src/hooks/useTextEditor.ts +11 -12
  72. package/src/stories/Command.stories.tsx +1 -1
  73. package/src/stories/CommandMenu.stories.tsx +143 -0
  74. package/src/stories/Comments.stories.tsx +2 -2
  75. package/src/stories/Experimental.stories.tsx +2 -2
  76. package/src/stories/Markdown.stories.tsx +2 -2
  77. package/src/stories/Outliner.stories.tsx +19 -7
  78. package/src/stories/Preview.stories.tsx +34 -32
  79. package/src/stories/TextEditor.stories.tsx +3 -3
  80. package/src/stories/components/EditorStory.tsx +135 -0
  81. package/src/stories/components/index.ts +6 -0
  82. package/src/stories/{util.tsx → components/util.tsx} +5 -100
  83. package/dist/types/src/stories/util.d.ts.map +0 -1
@@ -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,14 +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,
116
+ hashtag: () => hashtag,
107
117
  image: () => image,
108
118
  indentItemLess: () => indentItemLess,
109
119
  indentItemMore: () => indentItemMore,
120
+ insertAtCursor: () => insertAtCursor,
121
+ insertAtLineStart: () => insertAtLineStart,
110
122
  insertTable: () => insertTable,
111
123
  itemToJSON: () => itemToJSON,
112
124
  keymap: () => import_view.keymap,
125
+ linkSlashCommands: () => linkSlashCommands,
113
126
  linkTooltip: () => linkTooltip,
114
127
  listItemToString: () => listItemToString,
115
128
  listener: () => listener,
@@ -121,6 +134,7 @@ __export(node_exports, {
121
134
  mention: () => mention,
122
135
  moveItemDown: () => moveItemDown,
123
136
  moveItemUp: () => moveItemUp,
137
+ multilinePlaceholder: () => multilinePlaceholder,
124
138
  openCommand: () => openCommand,
125
139
  openEffect: () => openEffect,
126
140
  outliner: () => outliner,
@@ -163,6 +177,7 @@ __export(node_exports, {
163
177
  treeFacet: () => treeFacet,
164
178
  typeahead: () => typeahead,
165
179
  typewriter: () => typewriter,
180
+ useCommandMenu: () => useCommandMenu,
166
181
  useComments: () => useComments,
167
182
  useEditorToolbarState: () => useEditorToolbarState,
168
183
  useFormattingState: () => useFormattingState,
@@ -223,130 +238,139 @@ var import_view7 = require("@codemirror/view");
223
238
  var import_view8 = require("@codemirror/view");
224
239
  var import_state10 = require("@codemirror/state");
225
240
  var import_view9 = require("@codemirror/view");
226
- var import_view10 = require("@codemirror/view");
227
241
  var import_state11 = require("@codemirror/state");
242
+ var import_view10 = require("@codemirror/view");
243
+ var import_react4 = require("react");
244
+ var import_async3 = require("@dxos/async");
228
245
  var import_view11 = require("@codemirror/view");
229
- var import_commands = require("@codemirror/commands");
230
246
  var import_state12 = require("@codemirror/state");
231
247
  var import_view12 = require("@codemirror/view");
232
- var import_lodash2 = __toESM(require("lodash.sortby"));
233
- var import_react4 = require("react");
234
- var import_async3 = require("@dxos/async");
235
- var import_log4 = require("@dxos/log");
236
- var import_util = require("@dxos/util");
248
+ var import_commands = require("@codemirror/commands");
237
249
  var import_state13 = require("@codemirror/state");
238
250
  var import_view13 = require("@codemirror/view");
251
+ var import_lodash2 = __toESM(require("lodash.sortby"));
252
+ var import_react5 = require("react");
239
253
  var import_async4 = require("@dxos/async");
254
+ var import_log4 = require("@dxos/log");
255
+ var import_util = require("@dxos/util");
256
+ var import_state14 = require("@codemirror/state");
257
+ var import_view14 = require("@codemirror/view");
258
+ var import_async5 = require("@dxos/async");
240
259
  var import_invariant3 = require("@dxos/invariant");
241
260
  var import_util2 = require("@dxos/util");
242
261
  var import_language = require("@codemirror/language");
243
- var import_state14 = require("@codemirror/state");
244
- var import_view14 = require("@codemirror/view");
262
+ var import_state15 = require("@codemirror/state");
263
+ var import_view15 = require("@codemirror/view");
245
264
  var import_autocomplete2 = require("@codemirror/autocomplete");
246
265
  var import_commands2 = require("@codemirror/commands");
247
266
  var import_language2 = require("@codemirror/language");
248
267
  var import_search = require("@codemirror/search");
249
- var import_state15 = require("@codemirror/state");
268
+ var import_state16 = require("@codemirror/state");
250
269
  var import_theme_one_dark = require("@codemirror/theme-one-dark");
251
- var import_view15 = require("@codemirror/view");
270
+ var import_view16 = require("@codemirror/view");
252
271
  var import_lodash3 = __toESM(require("lodash.defaultsdeep"));
253
272
  var import_lodash4 = __toESM(require("lodash.merge"));
254
273
  var import_display_name = require("@dxos/display-name");
255
274
  var import_log5 = require("@dxos/log");
256
275
  var import_util3 = require("@dxos/util");
257
- var import_state16 = require("@codemirror/state");
258
- 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");
259
279
  var import_react_ui_theme3 = require("@dxos/react-ui-theme");
260
280
  var import_react_ui_theme4 = require("@dxos/react-ui-theme");
281
+ var import_react_ui_theme5 = require("@dxos/react-ui-theme");
261
282
  var import_util4 = require("@dxos/util");
262
283
  var import_language3 = require("@codemirror/language");
263
- var import_view17 = require("@codemirror/view");
264
- var import_react5 = __toESM(require("react"));
284
+ var import_view19 = require("@codemirror/view");
285
+ var import_react6 = __toESM(require("react"));
265
286
  var import_react_ui3 = require("@dxos/react-ui");
287
+ var import_view20 = require("@codemirror/view");
288
+ var import_react_ui_theme6 = require("@dxos/react-ui-theme");
266
289
  var import_lang_json = require("@codemirror/lang-json");
267
290
  var import_lint = require("@codemirror/lint");
268
291
  var import_ajv = __toESM(require("ajv"));
269
- var import_view18 = require("@codemirror/view");
292
+ var import_view21 = require("@codemirror/view");
270
293
  var import_autocomplete3 = require("@codemirror/autocomplete");
271
294
  var import_language4 = require("@codemirror/language");
272
- var import_state17 = require("@codemirror/state");
273
- var import_view19 = require("@codemirror/view");
274
- 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");
275
298
  var import_autocomplete4 = require("@codemirror/autocomplete");
276
299
  var import_commands3 = require("@codemirror/commands");
277
300
  var import_lang_markdown2 = require("@codemirror/lang-markdown");
278
301
  var import_language5 = require("@codemirror/language");
279
302
  var import_language_data = require("@codemirror/language-data");
280
303
  var import_lint2 = require("@codemirror/lint");
281
- var import_view20 = require("@codemirror/view");
304
+ var import_view23 = require("@codemirror/view");
282
305
  var import_util5 = require("@dxos/util");
283
306
  var import_lang_markdown3 = require("@codemirror/lang-markdown");
284
307
  var import_language6 = require("@codemirror/language");
285
308
  var import_highlight2 = require("@lezer/highlight");
286
309
  var import_markdown = require("@lezer/markdown");
287
310
  var import_language7 = require("@codemirror/language");
288
- var import_state18 = require("@codemirror/state");
289
- var import_language8 = require("@codemirror/language");
290
311
  var import_state19 = require("@codemirror/state");
291
- var import_view21 = require("@codemirror/view");
312
+ var import_language8 = require("@codemirror/language");
313
+ var import_state20 = require("@codemirror/state");
314
+ var import_view24 = require("@codemirror/view");
292
315
  var import_invariant4 = require("@dxos/invariant");
293
- var import_react_ui_theme5 = require("@dxos/react-ui-theme");
316
+ var import_react_ui_theme7 = require("@dxos/react-ui-theme");
294
317
  var import_language9 = require("@codemirror/language");
295
- var import_state20 = require("@codemirror/state");
296
- var import_view22 = require("@codemirror/view");
297
- var import_language10 = require("@codemirror/language");
298
318
  var import_state21 = require("@codemirror/state");
299
- var import_view23 = require("@codemirror/view");
300
- var import_view24 = require("@codemirror/view");
301
- var import_language11 = require("@codemirror/language");
302
- var import_state22 = require("@codemirror/state");
303
319
  var import_view25 = require("@codemirror/view");
304
- var import_language12 = require("@codemirror/language");
320
+ var import_language10 = require("@codemirror/language");
321
+ var import_state22 = require("@codemirror/state");
305
322
  var import_view26 = require("@codemirror/view");
306
- var import_react_ui_theme6 = require("@dxos/react-ui-theme");
323
+ var import_view27 = require("@codemirror/view");
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");
307
330
  var import_autocomplete5 = require("@codemirror/autocomplete");
308
331
  var import_log6 = require("@dxos/log");
309
- var import_view27 = require("@codemirror/view");
332
+ var import_view30 = require("@codemirror/view");
310
333
  var import_codemirror_vim = require("@replit/codemirror-vim");
311
334
  var import_codemirror_vscode_keymap = require("@replit/codemirror-vscode-keymap");
312
335
  var import_effect = require("effect");
313
336
  var import_commands4 = require("@codemirror/commands");
314
337
  var import_language13 = require("@codemirror/language");
315
- var import_state23 = require("@codemirror/state");
316
- var import_view28 = require("@codemirror/view");
317
338
  var import_state24 = require("@codemirror/state");
318
- var import_language14 = require("@codemirror/language");
339
+ var import_view31 = require("@codemirror/view");
319
340
  var import_state25 = require("@codemirror/state");
341
+ var import_language14 = require("@codemirror/language");
320
342
  var import_state26 = require("@codemirror/state");
321
- var import_invariant5 = require("@dxos/invariant");
322
343
  var import_state27 = require("@codemirror/state");
323
- var import_view29 = require("@codemirror/view");
324
- var import_react_ui_theme7 = require("@dxos/react-ui-theme");
344
+ var import_invariant5 = require("@dxos/invariant");
325
345
  var import_state28 = require("@codemirror/state");
326
- var import_view30 = 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");
327
350
  var import_log7 = require("@dxos/log");
328
351
  var import_dx_ref_tag = require("@dxos/lit-ui/dx-ref-tag.pcss");
329
352
  var import_language15 = require("@codemirror/language");
330
- var import_state29 = require("@codemirror/state");
331
- var import_view31 = require("@codemirror/view");
332
- var import_view32 = require("@codemirror/view");
353
+ var import_state30 = require("@codemirror/state");
354
+ var import_view34 = require("@codemirror/view");
355
+ var import_view35 = require("@codemirror/view");
333
356
  var import_search2 = require("@codemirror/search");
334
- var import_view33 = require("@codemirror/view");
335
- var import_react_ui_theme8 = require("@dxos/react-ui-theme");
336
357
  var import_tracking2 = require("@preact-signals/safe-react/tracking");
337
- var import_react_context = require("@radix-ui/react-context");
338
- var import_react7 = __toESM(require("react"));
339
- var import_async5 = require("@dxos/async");
358
+ var import_react8 = __toESM(require("react"));
340
359
  var import_react_ui4 = require("@dxos/react-ui");
341
360
  var import_tracking3 = require("@preact-signals/safe-react/tracking");
342
- var import_react_context2 = require("@radix-ui/react-context");
343
- var import_react8 = __toESM(require("react"));
361
+ var import_react_context = require("@radix-ui/react-context");
362
+ var import_react9 = __toESM(require("react"));
344
363
  var import_async6 = require("@dxos/async");
345
364
  var import_react_ui5 = require("@dxos/react-ui");
346
- var import_state30 = require("@codemirror/state");
347
- var import_view34 = require("@codemirror/view");
365
+ var import_tracking4 = require("@preact-signals/safe-react/tracking");
366
+ var import_react_context2 = require("@radix-ui/react-context");
367
+ var import_react10 = __toESM(require("react"));
368
+ var import_async7 = require("@dxos/async");
369
+ var import_react_ui6 = require("@dxos/react-ui");
370
+ var import_state31 = require("@codemirror/state");
371
+ var import_view36 = require("@codemirror/view");
348
372
  var import_react_tabster = require("@fluentui/react-tabster");
349
- var import_react9 = require("react");
373
+ var import_react11 = require("react");
350
374
  var import_log8 = require("@dxos/log");
351
375
  var import_util6 = require("@dxos/util");
352
376
  var translationKey = "react-ui-editor";
@@ -1701,26 +1725,98 @@ var command = (options = {}) => {
1701
1725
  })
1702
1726
  ];
1703
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
+ }
1704
1791
  var floatingMenu = (options = {}) => [
1705
1792
  import_view10.ViewPlugin.fromClass(class {
1706
1793
  constructor(view) {
1707
- this.rafId = null;
1708
1794
  this.view = view;
1709
1795
  const container = view.scrollDOM;
1710
1796
  if (getComputedStyle(container).position === "static") {
1711
1797
  container.style.position = "relative";
1712
1798
  }
1713
- const icon = document.createElement("dx-icon");
1714
- icon.setAttribute("icon", options.icon ?? "ph--dots-three-outline--regular");
1715
- const button = document.createElement("button");
1716
- button.appendChild(icon);
1717
- this.tag = document.createElement("dx-ref-tag");
1718
- this.tag.classList.add("cm-ref-tag");
1719
- this.tag.appendChild(button);
1799
+ {
1800
+ const icon = document.createElement("dx-icon");
1801
+ icon.setAttribute("icon", options.icon ?? "ph--dots-three-vertical--regular");
1802
+ const button = document.createElement("button");
1803
+ button.appendChild(icon);
1804
+ this.tag = document.createElement("dx-ref-tag");
1805
+ this.tag.classList.add("cm-ref-tag");
1806
+ this.tag.appendChild(button);
1807
+ }
1720
1808
  container.appendChild(this.tag);
1721
- container.addEventListener("scroll", this.scheduleUpdate.bind(this));
1809
+ const handler = () => this.scheduleUpdate();
1810
+ this.cleanup = (0, import_async3.addEventListener)(container, "scroll", handler);
1722
1811
  this.scheduleUpdate();
1723
1812
  }
1813
+ destroy() {
1814
+ this.cleanup?.();
1815
+ this.tag.remove();
1816
+ if (this.rafId != null) {
1817
+ cancelAnimationFrame(this.rafId);
1818
+ }
1819
+ }
1724
1820
  update(update2) {
1725
1821
  this.tag.dataset.focused = update2.view.hasFocus ? "true" : "false";
1726
1822
  if (!update2.view.hasFocus) {
@@ -1757,20 +1853,16 @@ var floatingMenu = (options = {}) => [
1757
1853
  }
1758
1854
  this.rafId = requestAnimationFrame(this.updateButtonPosition.bind(this));
1759
1855
  }
1760
- destroy() {
1761
- this.tag.remove();
1762
- if (this.rafId != null) {
1763
- cancelAnimationFrame(this.rafId);
1764
- }
1765
- }
1766
1856
  }),
1767
1857
  import_view10.EditorView.theme({
1768
1858
  ".cm-ref-tag": {
1769
1859
  position: "fixed",
1770
1860
  padding: "0",
1771
1861
  border: "none",
1772
- transition: "opacity 0.3s ease-in-out",
1773
- opacity: 0.1
1862
+ opacity: "0"
1863
+ },
1864
+ "[data-has-focus] & .cm-ref-tag": {
1865
+ opacity: "1"
1774
1866
  },
1775
1867
  ".cm-ref-tag button": {
1776
1868
  display: "grid",
@@ -1778,12 +1870,258 @@ var floatingMenu = (options = {}) => [
1778
1870
  justifyContent: "center",
1779
1871
  width: "2rem",
1780
1872
  height: "2rem"
1781
- },
1782
- '.cm-ref-tag[data-focused="true"]': {
1783
- opacity: 1
1784
1873
  }
1785
1874
  })
1786
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
+ };
1787
2125
  var typeahead = ({ onComplete } = {}) => {
1788
2126
  let hint;
1789
2127
  const complete = (view) => {
@@ -1799,17 +2137,17 @@ var typeahead = ({ onComplete } = {}) => {
1799
2137
  insert: hint
1800
2138
  }
1801
2139
  ],
1802
- selection: import_state11.EditorSelection.cursor(selection.from + hint.length)
2140
+ selection: import_state12.EditorSelection.cursor(selection.from + hint.length)
1803
2141
  });
1804
2142
  return true;
1805
2143
  };
1806
2144
  return [
1807
- import_view11.ViewPlugin.fromClass(class {
2145
+ import_view12.ViewPlugin.fromClass(class {
1808
2146
  constructor() {
1809
- this.decorations = import_view11.Decoration.none;
2147
+ this.decorations = import_view12.Decoration.none;
1810
2148
  }
1811
2149
  update(update2) {
1812
- const builder = new import_state11.RangeSetBuilder();
2150
+ const builder = new import_state12.RangeSetBuilder();
1813
2151
  const selection = update2.view.state.selection.main;
1814
2152
  const line = update2.view.state.doc.lineAt(selection.from);
1815
2153
  if (selection.from === selection.to && selection.from === line.to) {
@@ -1818,7 +2156,7 @@ var typeahead = ({ onComplete } = {}) => {
1818
2156
  line: str
1819
2157
  });
1820
2158
  if (hint) {
1821
- builder.add(selection.from, selection.to, import_view11.Decoration.widget({
2159
+ builder.add(selection.from, selection.to, import_view12.Decoration.widget({
1822
2160
  widget: new Hint(hint)
1823
2161
  }));
1824
2162
  }
@@ -1829,7 +2167,7 @@ var typeahead = ({ onComplete } = {}) => {
1829
2167
  decorations: (v) => v.decorations
1830
2168
  }),
1831
2169
  // Keys.
1832
- import_state11.Prec.highest(import_view11.keymap.of([
2170
+ import_state12.Prec.highest(import_view12.keymap.of([
1833
2171
  {
1834
2172
  key: "Tab",
1835
2173
  preventDefault: true,
@@ -1870,10 +2208,10 @@ var createEditorStateTransaction = ({ scrollTo, selection }) => {
1870
2208
  return {
1871
2209
  selection,
1872
2210
  scrollIntoView: !scrollTo,
1873
- effects: scrollTo ? import_view13.EditorView.scrollIntoView(scrollTo, {
2211
+ effects: scrollTo ? import_view14.EditorView.scrollIntoView(scrollTo, {
1874
2212
  yMargin: 96
1875
2213
  }) : void 0,
1876
- annotations: import_state13.Transaction.userEvent.of(stateRestoreAnnotation)
2214
+ annotations: import_state14.Transaction.userEvent.of(stateRestoreAnnotation)
1877
2215
  };
1878
2216
  };
1879
2217
  var createEditorStateStore = (keyPrefix) => ({
@@ -1904,7 +2242,7 @@ var createEditorStateStore = (keyPrefix) => ({
1904
2242
  }
1905
2243
  });
1906
2244
  var selectionState = ({ getState, setState } = {}) => {
1907
- const setStateDebounced = (0, import_async4.debounce)(setState, 1e3);
2245
+ const setStateDebounced = (0, import_async5.debounce)(setState, 1e3);
1908
2246
  return [
1909
2247
  // TODO(burdon): Track scrolling (currently only updates when cursor moves).
1910
2248
  // EditorView.domEventHandlers({
@@ -1912,7 +2250,7 @@ var selectionState = ({ getState, setState } = {}) => {
1912
2250
  // setStateDebounced(id, {});
1913
2251
  // },
1914
2252
  // }),
1915
- import_view13.EditorView.updateListener.of(({ view, transactions }) => {
2253
+ import_view14.EditorView.updateListener.of(({ view, transactions }) => {
1916
2254
  const id = view.state.facet(documentId);
1917
2255
  if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
1918
2256
  return;
@@ -1935,7 +2273,7 @@ var selectionState = ({ getState, setState } = {}) => {
1935
2273
  }
1936
2274
  }
1937
2275
  }),
1938
- getState && import_view13.keymap.of([
2276
+ getState && import_view14.keymap.of([
1939
2277
  {
1940
2278
  key: "ctrl-r",
1941
2279
  run: (view) => {
@@ -1950,10 +2288,10 @@ var selectionState = ({ getState, setState } = {}) => {
1950
2288
  ].filter(import_util2.isNotFalsy);
1951
2289
  };
1952
2290
  var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
1953
- var setComments = import_state12.StateEffect.define();
1954
- var setSelection = import_state12.StateEffect.define();
1955
- var setCommentState = import_state12.StateEffect.define();
1956
- 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({
1957
2295
  create: (state) => ({
1958
2296
  id: state.facet(documentId),
1959
2297
  comments: [],
@@ -1991,7 +2329,7 @@ var commentsState = import_state12.StateField.define({
1991
2329
  return value;
1992
2330
  }
1993
2331
  });
1994
- var styles2 = import_view12.EditorView.theme({
2332
+ var styles2 = import_view13.EditorView.theme({
1995
2333
  ".cm-comment, .cm-comment-current": {
1996
2334
  margin: "0 -3px",
1997
2335
  padding: "3px",
@@ -2004,14 +2342,14 @@ var styles2 = import_view12.EditorView.theme({
2004
2342
  textDecoration: "underline"
2005
2343
  }
2006
2344
  });
2007
- var createCommentMark = (id, isCurrent) => import_view12.Decoration.mark({
2345
+ var createCommentMark = (id, isCurrent) => import_view13.Decoration.mark({
2008
2346
  class: isCurrent ? "cm-comment-current" : "cm-comment",
2009
2347
  attributes: {
2010
2348
  "data-testid": "cm-comment",
2011
2349
  "data-comment-id": id
2012
2350
  }
2013
2351
  });
2014
- var commentsDecorations = import_view12.EditorView.decorations.compute([
2352
+ var commentsDecorations = import_view13.EditorView.decorations.compute([
2015
2353
  commentsState
2016
2354
  ], (state) => {
2017
2355
  const { selection: { current }, comments: comments2 } = state.field(commentsState);
@@ -2031,10 +2369,10 @@ var commentsDecorations = import_view12.EditorView.decorations.compute([
2031
2369
  const mark = createCommentMark(comment.comment.id, comment.comment.id === current);
2032
2370
  return mark.range(range.from, range.to);
2033
2371
  }).filter(import_util.isNonNullable);
2034
- return import_view12.Decoration.set(decorations2);
2372
+ return import_view13.Decoration.set(decorations2);
2035
2373
  });
2036
- var commentClickedEffect = import_state12.StateEffect.define();
2037
- var handleCommentClick = import_view12.EditorView.domEventHandlers({
2374
+ var commentClickedEffect = import_state13.StateEffect.define();
2375
+ var handleCommentClick = import_view13.EditorView.domEventHandlers({
2038
2376
  click: (event, view) => {
2039
2377
  let target = event.target;
2040
2378
  const editorRoot = view.dom;
@@ -2073,7 +2411,7 @@ var trackPastedComments = (onUpdate) => {
2073
2411
  }
2074
2412
  };
2075
2413
  return [
2076
- import_view12.EditorView.domEventHandlers({
2414
+ import_view13.EditorView.domEventHandlers({
2077
2415
  cut: handleTrack,
2078
2416
  copy: handleTrack
2079
2417
  }),
@@ -2095,7 +2433,7 @@ var trackPastedComments = (onUpdate) => {
2095
2433
  return effects;
2096
2434
  }),
2097
2435
  // Handle paste or the undo of comment deletion.
2098
- import_view12.EditorView.updateListener.of((update2) => {
2436
+ import_view13.EditorView.updateListener.of((update2) => {
2099
2437
  const restore = [];
2100
2438
  for (let i = 0; i < update2.transactions.length; i++) {
2101
2439
  const tr = update2.transactions[i];
@@ -2151,7 +2489,7 @@ var mapTrackedComment = (comment, changes) => ({
2151
2489
  from: changes.mapPos(comment.from, 1),
2152
2490
  to: changes.mapPos(comment.to, 1)
2153
2491
  });
2154
- var restoreCommentEffect = import_state12.StateEffect.define({
2492
+ var restoreCommentEffect = import_state13.StateEffect.define({
2155
2493
  map: mapTrackedComment
2156
2494
  });
2157
2495
  var createComment = (view) => {
@@ -2185,7 +2523,7 @@ var createComment = (view) => {
2185
2523
  var optionsFacet = singleValueFacet();
2186
2524
  var comments = (options = {}) => {
2187
2525
  const { key: shortcut = "meta-'" } = options;
2188
- const handleSelect = (0, import_async3.debounce)((state) => options.onSelect?.(state), 200);
2526
+ const handleSelect = (0, import_async4.debounce)((state) => options.onSelect?.(state), 200);
2189
2527
  return [
2190
2528
  optionsFacet.of(options),
2191
2529
  options.id ? documentId.of(options.id) : void 0,
@@ -2196,7 +2534,7 @@ var comments = (options = {}) => {
2196
2534
  //
2197
2535
  // Keymap.
2198
2536
  //
2199
- options.onCreate && import_view12.keymap.of([
2537
+ options.onCreate && import_view13.keymap.of([
2200
2538
  {
2201
2539
  key: shortcut,
2202
2540
  run: callbackWrapper(createComment)
@@ -2206,7 +2544,7 @@ var comments = (options = {}) => {
2206
2544
  // Hover tooltip (for key shortcut hints, etc.)
2207
2545
  // TODO(burdon): Factor out to generic hints extension for current selection/line.
2208
2546
  //
2209
- options.renderTooltip && (0, import_view12.hoverTooltip)((view, pos) => {
2547
+ options.renderTooltip && (0, import_view13.hoverTooltip)((view, pos) => {
2210
2548
  const selection = view.state.selection.main;
2211
2549
  if (selection && pos >= selection.from && pos <= selection.to) {
2212
2550
  return {
@@ -2237,7 +2575,7 @@ var comments = (options = {}) => {
2237
2575
  //
2238
2576
  // Track deleted ranges and update ranges for decorations.
2239
2577
  //
2240
- import_view12.EditorView.updateListener.of(({ view, state, changes }) => {
2578
+ import_view13.EditorView.updateListener.of(({ view, state, changes }) => {
2241
2579
  let mod = false;
2242
2580
  const { comments: comments2, ...value } = state.field(commentsState);
2243
2581
  changes.iterChanges((from, to, from2, to2) => {
@@ -2269,7 +2607,7 @@ var comments = (options = {}) => {
2269
2607
  //
2270
2608
  // Track selection/proximity.
2271
2609
  //
2272
- import_view12.EditorView.updateListener.of(({ view, state }) => {
2610
+ import_view13.EditorView.updateListener.of(({ view, state }) => {
2273
2611
  let min = Infinity;
2274
2612
  const { selection: { current, closest }, comments: comments2 } = state.field(commentsState);
2275
2613
  const { head } = state.selection.main;
@@ -2323,7 +2661,7 @@ var scrollThreadIntoView = (view, id, center = true) => {
2323
2661
  anchor: range.from
2324
2662
  } : void 0,
2325
2663
  effects: [
2326
- needsScroll ? import_view12.EditorView.scrollIntoView(range.from, center ? {
2664
+ needsScroll ? import_view13.EditorView.scrollIntoView(range.from, center ? {
2327
2665
  y: "center"
2328
2666
  } : void 0) : [],
2329
2667
  needsSelectionUpdate ? setSelection.of({
@@ -2353,13 +2691,13 @@ var ExternalCommentSync = class {
2353
2691
  this.unsubscribe = subscribe(updateComments);
2354
2692
  }
2355
2693
  };
2356
- var createExternalCommentSync = (id, subscribe, getComments) => import_view12.ViewPlugin.fromClass(class {
2694
+ var createExternalCommentSync = (id, subscribe, getComments) => import_view13.ViewPlugin.fromClass(class {
2357
2695
  constructor(view) {
2358
2696
  return new ExternalCommentSync(view, id, subscribe, getComments);
2359
2697
  }
2360
2698
  });
2361
2699
  var useComments = (view, id, comments2) => {
2362
- (0, import_react4.useEffect)(() => {
2700
+ (0, import_react5.useEffect)(() => {
2363
2701
  if (view) {
2364
2702
  if (id === view.state.facet(documentId)) {
2365
2703
  view.dispatch({
@@ -2376,12 +2714,12 @@ var debugNodeLogger = (log9 = console.log) => {
2376
2714
  const logTokens = (state) => (0, import_language.syntaxTree)(state).iterate({
2377
2715
  enter: (node) => log9(node.type)
2378
2716
  });
2379
- return import_state14.StateField.define({
2717
+ return import_state15.StateField.define({
2380
2718
  create: (state) => logTokens(state),
2381
2719
  update: (_, tr) => logTokens(tr.state)
2382
2720
  });
2383
2721
  };
2384
- var styles3 = import_view14.EditorView.theme({
2722
+ var styles3 = import_view15.EditorView.theme({
2385
2723
  ".cm-dropCursor": {
2386
2724
  borderLeft: "2px solid var(--dx-accentText)",
2387
2725
  color: "var(--dx-accentText)",
@@ -2394,8 +2732,8 @@ var styles3 = import_view14.EditorView.theme({
2394
2732
  var dropFile = (options = {}) => {
2395
2733
  return [
2396
2734
  styles3,
2397
- (0, import_view14.dropCursor)(),
2398
- import_view14.EditorView.domEventHandlers({
2735
+ (0, import_view15.dropCursor)(),
2736
+ import_view15.EditorView.domEventHandlers({
2399
2737
  drop: (event, view) => {
2400
2738
  event.preventDefault();
2401
2739
  const files = event.dataTransfer?.files;
@@ -2414,8 +2752,8 @@ var dropFile = (options = {}) => {
2414
2752
  })
2415
2753
  ];
2416
2754
  };
2417
- var focusEffect = import_state16.StateEffect.define();
2418
- var focusField = import_state16.StateField.define({
2755
+ var focusEffect = import_state17.StateEffect.define();
2756
+ var focusField = import_state17.StateField.define({
2419
2757
  create: () => false,
2420
2758
  update: (value, tr) => {
2421
2759
  for (const effect of tr.effects) {
@@ -2428,7 +2766,7 @@ var focusField = import_state16.StateField.define({
2428
2766
  });
2429
2767
  var focus = [
2430
2768
  focusField,
2431
- import_view16.EditorView.domEventHandlers({
2769
+ import_view17.EditorView.domEventHandlers({
2432
2770
  focus: (event, view) => {
2433
2771
  setTimeout(() => view.dispatch({
2434
2772
  effects: focusEffect.of(true)
@@ -2454,11 +2792,11 @@ var theme = {
2454
2792
  codeMark: "font-mono text-primary-500",
2455
2793
  mark: "opacity-50",
2456
2794
  heading: (level) => {
2457
- 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");
2458
2796
  }
2459
2797
  };
2460
2798
  var getToken = (path, defaultValue) => {
2461
- 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);
2462
2800
  return value?.toString() ?? "";
2463
2801
  };
2464
2802
  var fontBody = getToken("fontFamily.body");
@@ -2673,8 +3011,31 @@ var defaultTheme = {
2673
3011
  borderTop: "1px solid var(--dx-separator)"
2674
3012
  }
2675
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");
2676
3037
  var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
2677
- 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);
2678
3039
  var defaultBasicOptions = {
2679
3040
  allowMultipleSelections: true,
2680
3041
  bracketMatching: true,
@@ -2696,33 +3057,37 @@ var createBasicExtensions = (_props) => {
2696
3057
  const props = (0, import_lodash3.default)({}, _props, defaultBasicOptions);
2697
3058
  return [
2698
3059
  // NOTE: Doesn't catch errors in keymap functions.
2699
- import_view15.EditorView.exceptionSink.of((err) => {
3060
+ import_view16.EditorView.exceptionSink.of((err) => {
2700
3061
  import_log5.log.catch(err, void 0, {
2701
3062
  F: __dxlog_file8,
2702
- L: 98,
3063
+ L: 100,
2703
3064
  S: void 0,
2704
3065
  C: (f, a) => f(...a)
2705
3066
  });
2706
3067
  }),
2707
- props.allowMultipleSelections && import_state15.EditorState.allowMultipleSelections.of(true),
3068
+ props.allowMultipleSelections && import_state16.EditorState.allowMultipleSelections.of(true),
2708
3069
  props.bracketMatching && (0, import_language2.bracketMatching)(),
2709
3070
  props.closeBrackets && (0, import_autocomplete2.closeBrackets)(),
2710
- props.dropCursor && (0, import_view15.dropCursor)(),
2711
- props.drawSelection && (0, import_view15.drawSelection)({
3071
+ props.dropCursor && (0, import_view16.dropCursor)(),
3072
+ props.drawSelection && (0, import_view16.drawSelection)({
2712
3073
  cursorBlinkRate: 1200
2713
3074
  }),
2714
- props.editable !== void 0 && import_view15.EditorView.editable.of(props.editable),
3075
+ props.editable !== void 0 && import_view16.EditorView.editable.of(props.editable),
2715
3076
  props.focus && focus,
2716
- props.highlightActiveLine && (0, import_view15.highlightActiveLine)(),
3077
+ props.highlightActiveLine && (0, import_view16.highlightActiveLine)(),
2717
3078
  props.history && (0, import_commands2.history)(),
2718
- props.lineNumbers && (0, import_view15.lineNumbers)(),
2719
- props.lineWrapping && import_view15.EditorView.lineWrapping,
2720
- props.placeholder && (0, import_view15.placeholder)(props.placeholder),
2721
- props.readOnly !== void 0 && import_state15.EditorState.readOnly.of(props.readOnly),
2722
- props.scrollPastEnd && (0, import_view15.scrollPastEnd)(),
2723
- 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),
2724
3089
  // https://codemirror.net/docs/ref/#view.KeyBinding
2725
- import_view15.keymap.of([
3090
+ import_view16.keymap.of([
2726
3091
  ...(props.keymap && keymaps[props.keymap]) ?? [],
2727
3092
  // NOTE: Tabs are also configured by markdown extension.
2728
3093
  // https://codemirror.net/docs/ref/#commands.indentWithTab
@@ -2753,17 +3118,17 @@ var defaultThemeSlots = {
2753
3118
  var createThemeExtensions = ({ themeMode, styles: styles4, syntaxHighlighting: _syntaxHighlighting, slots: _slots } = {}) => {
2754
3119
  const slots = (0, import_lodash3.default)({}, _slots, defaultThemeSlots);
2755
3120
  return [
2756
- import_view15.EditorView.darkTheme.of(themeMode === "dark"),
2757
- 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),
2758
3123
  // https://github.com/codemirror/theme-one-dark
2759
3124
  _syntaxHighlighting && (themeMode === "dark" ? (0, import_language2.syntaxHighlighting)(import_theme_one_dark.oneDarkHighlightStyle) : (0, import_language2.syntaxHighlighting)(import_language2.defaultHighlightStyle)),
2760
- slots.editor?.className && import_view15.EditorView.editorAttributes.of({
3125
+ slots.editor?.className && import_view16.EditorView.editorAttributes.of({
2761
3126
  class: slots.editor.className
2762
3127
  }),
2763
- slots.content?.className && import_view15.EditorView.contentAttributes.of({
3128
+ slots.content?.className && import_view16.EditorView.contentAttributes.of({
2764
3129
  class: slots.content.className
2765
3130
  }),
2766
- slots.scroll?.className && import_view15.ViewPlugin.fromClass(class {
3131
+ slots.scroll?.className && import_view16.ViewPlugin.fromClass(class {
2767
3132
  constructor(view) {
2768
3133
  view.scrollDOM.classList.add(slots.scroll.className);
2769
3134
  }
@@ -2802,7 +3167,7 @@ var folding = (_props = {}) => [
2802
3167
  const el = createElement("div", {
2803
3168
  className: "flex h-full items-center"
2804
3169
  });
2805
- 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, {
2806
3171
  icon: "ph--caret-right--bold",
2807
3172
  size: 3,
2808
3173
  classNames: [
@@ -2812,7 +3177,7 @@ var folding = (_props = {}) => [
2812
3177
  }));
2813
3178
  }
2814
3179
  }),
2815
- import_view17.EditorView.theme({
3180
+ import_view19.EditorView.theme({
2816
3181
  ".cm-foldGutter": {
2817
3182
  opacity: 0.3,
2818
3183
  transition: "opacity 0.3s",
@@ -2823,11 +3188,51 @@ var folding = (_props = {}) => [
2823
3188
  }
2824
3189
  })
2825
3190
  ];
3191
+ var TagWidget = class extends import_view20.WidgetType {
3192
+ constructor(_text) {
3193
+ super(), this._text = _text;
3194
+ }
3195
+ toDOM() {
3196
+ const span = document.createElement("span");
3197
+ span.className = (0, import_react_ui_theme6.mx)("cm-tag", (0, import_react_ui_theme6.getHashColor)(this._text).tag);
3198
+ span.textContent = this._text;
3199
+ return span;
3200
+ }
3201
+ };
3202
+ var tagMatcher = new import_view20.MatchDecorator({
3203
+ regexp: /#(\w+)\W/g,
3204
+ decoration: (match) => import_view20.Decoration.replace({
3205
+ widget: new TagWidget(match[1])
3206
+ })
3207
+ });
3208
+ var hashtag = () => [
3209
+ import_view20.ViewPlugin.fromClass(class {
3210
+ constructor(view) {
3211
+ this.tags = tagMatcher.createDeco(view);
3212
+ }
3213
+ update(update2) {
3214
+ this.tags = tagMatcher.updateDeco(update2, this.tags);
3215
+ }
3216
+ }, {
3217
+ decorations: (instance) => instance.tags,
3218
+ provide: (plugin) => import_view20.EditorView.atomicRanges.of((view) => {
3219
+ return view.plugin(plugin)?.tags || import_view20.Decoration.none;
3220
+ })
3221
+ }),
3222
+ import_view20.EditorView.theme({
3223
+ ".cm-tag": {
3224
+ borderRadius: "4px",
3225
+ marginRight: "6px",
3226
+ padding: "2px 6px"
3227
+ }
3228
+ })
3229
+ ];
2826
3230
  var createJsonExtensions = ({ schema } = {}) => {
2827
3231
  let lintSource = (0, import_lang_json.jsonParseLinter)();
2828
3232
  if (schema) {
2829
3233
  const ajv = new import_ajv.default({
2830
- allErrors: false
3234
+ allErrors: false,
3235
+ strict: false
2831
3236
  });
2832
3237
  const validate = ajv.compile(schema);
2833
3238
  lintSource = schemaLinter(validate);
@@ -2864,11 +3269,11 @@ var schemaLinter = (validate) => (view) => {
2864
3269
  };
2865
3270
  var listener = ({ onFocus, onChange }) => {
2866
3271
  const extensions = [];
2867
- onFocus && extensions.push(import_view18.EditorView.focusChangeEffect.of((_, focusing) => {
3272
+ onFocus && extensions.push(import_view21.EditorView.focusChangeEffect.of((_, focusing) => {
2868
3273
  onFocus(focusing);
2869
3274
  return null;
2870
3275
  }));
2871
- onChange && extensions.push(import_view18.EditorView.updateListener.of((update2) => {
3276
+ onChange && extensions.push(import_view21.EditorView.updateListener.of((update2) => {
2872
3277
  onChange(update2.state.doc.toString(), update2.state.facet(documentId));
2873
3278
  }));
2874
3279
  return extensions;
@@ -2991,7 +3396,7 @@ var setStyle = (type, enable) => {
2991
3396
  to: range.head + found + marker.length
2992
3397
  }
2993
3398
  ],
2994
- range: import_state17.EditorSelection.cursor(range.from - marker.length)
3399
+ range: import_state18.EditorSelection.cursor(range.from - marker.length)
2995
3400
  };
2996
3401
  }
2997
3402
  }
@@ -3119,13 +3524,13 @@ var setStyle = (type, enable) => {
3119
3524
  from: range.head,
3120
3525
  insert: marker + marker
3121
3526
  },
3122
- range: import_state17.EditorSelection.cursor(range.head + marker.length)
3527
+ range: import_state18.EditorSelection.cursor(range.head + marker.length)
3123
3528
  };
3124
3529
  }
3125
3530
  const changeSet = state.changes(changes2.concat(changesAtEnd));
3126
3531
  return {
3127
3532
  changes: changeSet,
3128
- 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))
3129
3534
  };
3130
3535
  });
3131
3536
  dispatch(state.update(changes, {
@@ -3325,7 +3730,7 @@ var addLink = ({ url, image: image2 } = {}) => {
3325
3730
  const changeSet = state.changes(changes2.concat(changesAfter));
3326
3731
  return {
3327
3732
  changes: changeSet,
3328
- 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))
3329
3734
  };
3330
3735
  });
3331
3736
  if (changes.changes.empty) {
@@ -3759,7 +4164,7 @@ var toggleCodeblock = (target) => {
3759
4164
  };
3760
4165
  var formattingKeymap = (_options = {}) => {
3761
4166
  return [
3762
- import_view19.keymap.of([
4167
+ import_view22.keymap.of([
3763
4168
  {
3764
4169
  key: "meta-b",
3765
4170
  run: toggleStrong
@@ -3960,7 +4365,7 @@ var getFormatting = (state) => {
3960
4365
  };
3961
4366
  };
3962
4367
  var useFormattingState = (state) => {
3963
- return (0, import_react6.useMemo)(() => import_view19.EditorView.updateListener.of((update2) => {
4368
+ return (0, import_react7.useMemo)(() => import_view22.EditorView.updateListener.of((update2) => {
3964
4369
  if (update2.docChanged || update2.selectionSet) {
3965
4370
  Object.entries(getFormatting(update2.state)).forEach(([key, active]) => {
3966
4371
  state[key] = active;
@@ -4212,7 +4617,7 @@ var createMarkdownExtensions = (options = {}) => {
4212
4617
  }),
4213
4618
  // Custom styles.
4214
4619
  (0, import_language5.syntaxHighlighting)(markdownHighlightStyle()),
4215
- import_view20.keymap.of([
4620
+ import_view23.keymap.of([
4216
4621
  // https://codemirror.net/docs/ref/#commands.indentWithTab
4217
4622
  options.indentWithTab !== false && import_commands3.indentWithTab,
4218
4623
  // https://codemirror.net/docs/ref/#commands.defaultKeymap
@@ -4222,7 +4627,7 @@ var createMarkdownExtensions = (options = {}) => {
4222
4627
  ].filter(import_util5.isNotFalsy))
4223
4628
  ];
4224
4629
  };
4225
- var debugTree = (cb) => import_state18.StateField.define({
4630
+ var debugTree = (cb) => import_state19.StateField.define({
4226
4631
  create: (state) => cb(convertTreeToJson(state)),
4227
4632
  update: (value, tr) => cb(convertTreeToJson(tr.state))
4228
4633
  });
@@ -4246,12 +4651,12 @@ var convertTreeToJson = (state) => {
4246
4651
  return treeToJson((0, import_language7.syntaxTree)(state).cursor());
4247
4652
  };
4248
4653
  var adjustChanges = () => {
4249
- return import_view22.ViewPlugin.fromClass(class {
4654
+ return import_view25.ViewPlugin.fromClass(class {
4250
4655
  update(update2) {
4251
4656
  const tree = (0, import_language9.syntaxTree)(update2.state);
4252
4657
  const adjustments = [];
4253
4658
  for (const tr of update2.transactions) {
4254
- const event = tr.annotation(import_state20.Transaction.userEvent);
4659
+ const event = tr.annotation(import_state21.Transaction.userEvent);
4255
4660
  switch (event) {
4256
4661
  //
4257
4662
  // Enter
@@ -4386,9 +4791,9 @@ var getValidUrl = (str) => {
4386
4791
  };
4387
4792
  var image = (_options = {}) => {
4388
4793
  return [
4389
- import_state21.StateField.define({
4794
+ import_state22.StateField.define({
4390
4795
  create: (state) => {
4391
- return import_view23.Decoration.set(buildDecorations(0, state.doc.length, state));
4796
+ return import_view26.Decoration.set(buildDecorations(0, state.doc.length, state));
4392
4797
  },
4393
4798
  update: (value, tr) => {
4394
4799
  if (!tr.docChanged && !tr.selection) {
@@ -4411,7 +4816,7 @@ var image = (_options = {}) => {
4411
4816
  add: buildDecorations(from, to, tr.state)
4412
4817
  });
4413
4818
  },
4414
- provide: (field) => import_view23.EditorView.decorations.from(field)
4819
+ provide: (field) => import_view26.EditorView.decorations.from(field)
4415
4820
  })
4416
4821
  ];
4417
4822
  };
@@ -4429,7 +4834,7 @@ var buildDecorations = (from, to, state) => {
4429
4834
  return;
4430
4835
  }
4431
4836
  preloadImage(url);
4432
- decorations2.push(import_view23.Decoration.replace({
4837
+ decorations2.push(import_view26.Decoration.replace({
4433
4838
  block: true,
4434
4839
  widget: new ImageWidget(url)
4435
4840
  }).range(hide2 ? node.from : node.to, node.to));
@@ -4449,7 +4854,7 @@ var preloadImage = (url) => {
4449
4854
  preloaded.add(url);
4450
4855
  }
4451
4856
  };
4452
- var ImageWidget = class extends import_view23.WidgetType {
4857
+ var ImageWidget = class extends import_view26.WidgetType {
4453
4858
  constructor(_url) {
4454
4859
  super(), this._url = _url;
4455
4860
  }
@@ -4470,7 +4875,7 @@ var ImageWidget = class extends import_view23.WidgetType {
4470
4875
  };
4471
4876
  var bulletListIndentationWidth = 24;
4472
4877
  var orderedListIndentationWidth = 36;
4473
- var formattingStyles = import_view24.EditorView.theme({
4878
+ var formattingStyles = import_view27.EditorView.theme({
4474
4879
  /**
4475
4880
  * Horizontal rule.
4476
4881
  */
@@ -4589,14 +4994,14 @@ var formattingStyles = import_view24.EditorView.theme({
4589
4994
  }
4590
4995
  });
4591
4996
  var table = (options = {}) => {
4592
- return import_state22.StateField.define({
4997
+ return import_state23.StateField.define({
4593
4998
  create: (state) => update(state, options),
4594
4999
  update: (_, tr) => update(tr.state, options),
4595
- provide: (field) => import_view25.EditorView.decorations.from(field)
5000
+ provide: (field) => import_view28.EditorView.decorations.from(field)
4596
5001
  });
4597
5002
  };
4598
5003
  var update = (state, _options) => {
4599
- const builder = new import_state22.RangeSetBuilder();
5004
+ const builder = new import_state23.RangeSetBuilder();
4600
5005
  const cursor = state.selection.main.head;
4601
5006
  const tables = [];
4602
5007
  const getTable = () => tables[tables.length - 1];
@@ -4637,19 +5042,19 @@ var update = (state, _options) => {
4637
5042
  tables.forEach((table2) => {
4638
5043
  const replace = state.readOnly || cursor < table2.from || cursor > table2.to;
4639
5044
  if (replace) {
4640
- builder.add(table2.from, table2.to, import_view25.Decoration.replace({
5045
+ builder.add(table2.from, table2.to, import_view28.Decoration.replace({
4641
5046
  block: true,
4642
5047
  widget: new TableWidget(table2)
4643
5048
  }));
4644
5049
  } else {
4645
- builder.add(table2.from, table2.to, import_view25.Decoration.mark({
5050
+ builder.add(table2.from, table2.to, import_view28.Decoration.mark({
4646
5051
  class: "cm-table"
4647
5052
  }));
4648
5053
  }
4649
5054
  });
4650
5055
  return builder.finish();
4651
5056
  };
4652
- var TableWidget = class extends import_view25.WidgetType {
5057
+ var TableWidget = class extends import_view28.WidgetType {
4653
5058
  constructor(_table) {
4654
5059
  super(), this._table = _table;
4655
5060
  }
@@ -4688,14 +5093,14 @@ var Unicode = {
4688
5093
  bulletSmall: "\u2219",
4689
5094
  bulletSquare: "\u2B1D"
4690
5095
  };
4691
- var HorizontalRuleWidget = class extends import_view21.WidgetType {
5096
+ var HorizontalRuleWidget = class extends import_view24.WidgetType {
4692
5097
  toDOM() {
4693
5098
  const el = document.createElement("span");
4694
5099
  el.className = "cm-hr";
4695
5100
  return el;
4696
5101
  }
4697
5102
  };
4698
- var LinkButton = class extends import_view21.WidgetType {
5103
+ var LinkButton = class extends import_view24.WidgetType {
4699
5104
  constructor(url, render) {
4700
5105
  super(), this.url = url, this.render = render;
4701
5106
  }
@@ -4711,7 +5116,7 @@ var LinkButton = class extends import_view21.WidgetType {
4711
5116
  return el;
4712
5117
  }
4713
5118
  };
4714
- var CheckboxWidget = class extends import_view21.WidgetType {
5119
+ var CheckboxWidget = class extends import_view24.WidgetType {
4715
5120
  constructor(_checked) {
4716
5121
  super(), this._checked = _checked;
4717
5122
  }
@@ -4755,7 +5160,7 @@ var CheckboxWidget = class extends import_view21.WidgetType {
4755
5160
  return false;
4756
5161
  }
4757
5162
  };
4758
- var TextWidget = class extends import_view21.WidgetType {
5163
+ var TextWidget = class extends import_view24.WidgetType {
4759
5164
  constructor(text, className) {
4760
5165
  super(), this.text = text, this.className = className;
4761
5166
  }
@@ -4768,29 +5173,29 @@ var TextWidget = class extends import_view21.WidgetType {
4768
5173
  return el;
4769
5174
  }
4770
5175
  };
4771
- var hide = import_view21.Decoration.replace({});
4772
- var blockQuote = import_view21.Decoration.line({
5176
+ var hide = import_view24.Decoration.replace({});
5177
+ var blockQuote = import_view24.Decoration.line({
4773
5178
  class: "cm-blockquote"
4774
5179
  });
4775
- var fencedCodeLine = import_view21.Decoration.line({
5180
+ var fencedCodeLine = import_view24.Decoration.line({
4776
5181
  class: "cm-code cm-codeblock-line"
4777
5182
  });
4778
- var fencedCodeLineFirst = import_view21.Decoration.line({
4779
- class: (0, import_react_ui_theme5.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")
4780
5185
  });
4781
- var fencedCodeLineLast = import_view21.Decoration.line({
4782
- class: (0, import_react_ui_theme5.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")
4783
5188
  });
4784
5189
  var commentBlockLine = fencedCodeLine;
4785
5190
  var commentBlockLineFirst = fencedCodeLineFirst;
4786
5191
  var commentBlockLineLast = fencedCodeLineLast;
4787
- var horizontalRule = import_view21.Decoration.replace({
5192
+ var horizontalRule = import_view24.Decoration.replace({
4788
5193
  widget: new HorizontalRuleWidget()
4789
5194
  });
4790
- var checkedTask = import_view21.Decoration.replace({
5195
+ var checkedTask = import_view24.Decoration.replace({
4791
5196
  widget: new CheckboxWidget(true)
4792
5197
  });
4793
- var uncheckedTask = import_view21.Decoration.replace({
5198
+ var uncheckedTask = import_view24.Decoration.replace({
4794
5199
  widget: new CheckboxWidget(false)
4795
5200
  });
4796
5201
  var editingRange = (state, range, focus2) => {
@@ -4806,8 +5211,8 @@ var autoHideTags = /* @__PURE__ */ new Set([
4806
5211
  "SuperscriptMark"
4807
5212
  ]);
4808
5213
  var buildDecorations2 = (view, options, focus2) => {
4809
- const deco = new import_state19.RangeSetBuilder();
4810
- const atomicDeco = new import_state19.RangeSetBuilder();
5214
+ const deco = new import_state20.RangeSetBuilder();
5215
+ const atomicDeco = new import_state20.RangeSetBuilder();
4811
5216
  const { state } = view;
4812
5217
  const headerLevels = [];
4813
5218
  const getHeaderLevels = (node, level) => {
@@ -4894,7 +5299,7 @@ var buildDecorations2 = (view, options, focus2) => {
4894
5299
  } else {
4895
5300
  const num = headers.slice(from - 1).map((level2) => level2?.number ?? 0).join(".") + " ";
4896
5301
  if (num.length) {
4897
- atomicDeco.add(mark.from, mark.from + len, import_view21.Decoration.replace({
5302
+ atomicDeco.add(mark.from, mark.from + len, import_view24.Decoration.replace({
4898
5303
  widget: new TextWidget(num, theme.heading(level))
4899
5304
  }));
4900
5305
  }
@@ -4919,7 +5324,7 @@ var buildDecorations2 = (view, options, focus2) => {
4919
5324
  if (node.from === line.to - 1) {
4920
5325
  return false;
4921
5326
  }
4922
- deco.add(line.from, line.from, import_view21.Decoration.line({
5327
+ deco.add(line.from, line.from, import_view24.Decoration.line({
4923
5328
  class: "cm-list-item",
4924
5329
  attributes: {
4925
5330
  style: `padding-left: ${offset}px; text-indent: -${width}px;`
@@ -4936,7 +5341,7 @@ var buildDecorations2 = (view, options, focus2) => {
4936
5341
  const label = list.type === "OrderedList" ? `${++list.number}.` : Unicode.bulletSmall;
4937
5342
  const line = state.doc.lineAt(node.from);
4938
5343
  const to = state.doc.sliceString(node.to, node.to + 1) === " " ? node.to + 1 : node.to;
4939
- atomicDeco.add(line.from, to, import_view21.Decoration.replace({
5344
+ atomicDeco.add(line.from, to, import_view24.Decoration.replace({
4940
5345
  widget: new TextWidget(label, list.type === "OrderedList" ? "cm-list-mark cm-list-mark-ordered" : "cm-list-mark cm-list-mark-bullet")
4941
5346
  }));
4942
5347
  break;
@@ -5023,7 +5428,7 @@ var buildDecorations2 = (view, options, focus2) => {
5023
5428
  if (!editing) {
5024
5429
  atomicDeco.add(node.from, marks[0].to, hide);
5025
5430
  }
5026
- deco.add(marks[0].to, marks[1].from, import_view21.Decoration.mark({
5431
+ deco.add(marks[0].to, marks[1].from, import_view24.Decoration.mark({
5027
5432
  tagName: "a",
5028
5433
  attributes: {
5029
5434
  class: "cm-link",
@@ -5033,7 +5438,7 @@ var buildDecorations2 = (view, options, focus2) => {
5033
5438
  }
5034
5439
  }));
5035
5440
  if (!editing) {
5036
- atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view21.Decoration.replace({
5441
+ atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view24.Decoration.replace({
5037
5442
  widget: new LinkButton(url, options.renderLinkButton)
5038
5443
  }) : hide);
5039
5444
  }
@@ -5088,10 +5493,10 @@ var buildDecorations2 = (view, options, focus2) => {
5088
5493
  atomicDeco: atomicDeco.finish()
5089
5494
  };
5090
5495
  };
5091
- var forceUpdate = import_state19.StateEffect.define();
5496
+ var forceUpdate = import_state20.StateEffect.define();
5092
5497
  var decorateMarkdown = (options = {}) => {
5093
5498
  return [
5094
- import_view21.ViewPlugin.fromClass(class {
5499
+ import_view24.ViewPlugin.fromClass(class {
5095
5500
  constructor(view) {
5096
5501
  ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations2(view, options, view.hasFocus));
5097
5502
  }
@@ -5123,9 +5528,9 @@ var decorateMarkdown = (options = {}) => {
5123
5528
  }
5124
5529
  }, {
5125
5530
  provide: (plugin) => [
5126
- import_view21.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view21.Decoration.none),
5127
- import_view21.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view21.Decoration.none),
5128
- import_view21.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view21.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)
5129
5534
  ]
5130
5535
  }),
5131
5536
  image(),
@@ -5135,7 +5540,7 @@ var decorateMarkdown = (options = {}) => {
5135
5540
  ];
5136
5541
  };
5137
5542
  var linkTooltip = (renderTooltip) => {
5138
- return (0, import_view26.hoverTooltip)((view, pos, side) => {
5543
+ return (0, import_view29.hoverTooltip)((view, pos, side) => {
5139
5544
  const syntax = (0, import_language12.syntaxTree)(view.state).resolveInner(pos, side);
5140
5545
  let link = null;
5141
5546
  for (let i = 0, node = syntax; !link && node && i < 5; node = node.parent, i++) {
@@ -5153,7 +5558,7 @@ var linkTooltip = (renderTooltip) => {
5153
5558
  // above: true,
5154
5559
  create: () => {
5155
5560
  const el = document.createElement("div");
5156
- el.className = (0, import_react_ui_theme6.tooltipContent)({});
5561
+ el.className = (0, import_react_ui_theme8.tooltipContent)({});
5157
5562
  renderTooltip(el, {
5158
5563
  url: urlText
5159
5564
  }, view);
@@ -5225,7 +5630,7 @@ var InputModeExtensions = {
5225
5630
  editorInputMode.of({
5226
5631
  type: "vscode"
5227
5632
  }),
5228
- import_view27.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5633
+ import_view30.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5229
5634
  ],
5230
5635
  vim: [
5231
5636
  // https://github.com/replit/codemirror-vim
@@ -5234,7 +5639,7 @@ var InputModeExtensions = {
5234
5639
  type: "vim",
5235
5640
  noTabster: true
5236
5641
  }),
5237
- import_view27.keymap.of([
5642
+ import_view30.keymap.of([
5238
5643
  {
5239
5644
  key: "Alt-Escape",
5240
5645
  run: (view) => {
@@ -5374,7 +5779,7 @@ var format = (value) => JSON.stringify(value, (key, value2) => {
5374
5779
  }
5375
5780
  return value2;
5376
5781
  }).replaceAll('"', "");
5377
- var treeFacet = import_state26.Facet.define({
5782
+ var treeFacet = import_state27.Facet.define({
5378
5783
  combine: (values) => values[0]
5379
5784
  });
5380
5785
  var outlinerTree = (options = {}) => {
@@ -5523,7 +5928,7 @@ var outlinerTree = (options = {}) => {
5523
5928
  return tree;
5524
5929
  };
5525
5930
  return [
5526
- import_state25.StateField.define({
5931
+ import_state26.StateField.define({
5527
5932
  create: (state) => {
5528
5933
  return buildTree(state);
5529
5934
  },
@@ -5539,10 +5944,10 @@ var outlinerTree = (options = {}) => {
5539
5944
  };
5540
5945
  var getSelection = (state) => state.selection.main;
5541
5946
  var selectionEquals = (a, b) => a.length === b.length && a.every((i) => b.includes(i));
5542
- var selectionFacet = import_state24.Facet.define({
5947
+ var selectionFacet = import_state25.Facet.define({
5543
5948
  combine: (values) => values[0]
5544
5949
  });
5545
- var selectionCompartment = new import_state24.Compartment();
5950
+ var selectionCompartment = new import_state25.Compartment();
5546
5951
  var selectNone = (view) => {
5547
5952
  view.dispatch({
5548
5953
  effects: selectionCompartment.reconfigure(selectionFacet.of([]))
@@ -5623,7 +6028,7 @@ var moveItemDown = (view) => {
5623
6028
  ];
5624
6029
  view.dispatch({
5625
6030
  changes,
5626
- selection: import_state23.EditorSelection.cursor(pos + nextContent.length + 1),
6031
+ selection: import_state24.EditorSelection.cursor(pos + nextContent.length + 1),
5627
6032
  scrollIntoView: true
5628
6033
  });
5629
6034
  }
@@ -5651,7 +6056,7 @@ var moveItemUp = (view) => {
5651
6056
  ];
5652
6057
  view.dispatch({
5653
6058
  changes,
5654
- selection: import_state23.EditorSelection.cursor(pos - prevContent.length - 1),
6059
+ selection: import_state24.EditorSelection.cursor(pos - prevContent.length - 1),
5655
6060
  scrollIntoView: true
5656
6061
  });
5657
6062
  }
@@ -5663,7 +6068,7 @@ var deleteItem = (view) => {
5663
6068
  const current = tree.find(pos);
5664
6069
  if (current) {
5665
6070
  view.dispatch({
5666
- selection: import_state23.EditorSelection.cursor(current.lineRange.from),
6071
+ selection: import_state24.EditorSelection.cursor(current.lineRange.from),
5667
6072
  changes: [
5668
6073
  {
5669
6074
  from: current.lineRange.from,
@@ -5693,7 +6098,7 @@ var toggleTask = (view) => {
5693
6098
  }
5694
6099
  return true;
5695
6100
  };
5696
- var commands = () => import_view28.keymap.of([
6101
+ var commands = () => import_view31.keymap.of([
5697
6102
  //
5698
6103
  // Indentation.
5699
6104
  //
@@ -5719,7 +6124,7 @@ var commands = () => import_view28.keymap.of([
5719
6124
  insert
5720
6125
  }
5721
6126
  ],
5722
- selection: import_state23.EditorSelection.cursor(pos + insert.length)
6127
+ selection: import_state24.EditorSelection.cursor(pos + insert.length)
5723
6128
  });
5724
6129
  return true;
5725
6130
  }
@@ -5737,7 +6142,7 @@ var commands = () => import_view28.keymap.of([
5737
6142
  const next = tree.next(item);
5738
6143
  if (next) {
5739
6144
  view.dispatch({
5740
- selection: import_state23.EditorSelection.cursor(next.contentRange.from)
6145
+ selection: import_state24.EditorSelection.cursor(next.contentRange.from)
5741
6146
  });
5742
6147
  return true;
5743
6148
  }
@@ -5800,7 +6205,7 @@ var commands = () => import_view28.keymap.of([
5800
6205
  var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/outliner/editor.ts";
5801
6206
  var LIST_ITEM_REGEX = /^\s*- (\[ \]|\[x\])? /;
5802
6207
  var initialize = () => {
5803
- return import_view30.ViewPlugin.fromClass(class {
6208
+ return import_view33.ViewPlugin.fromClass(class {
5804
6209
  constructor(view) {
5805
6210
  const first = view.state.doc.lineAt(0);
5806
6211
  const text = view.state.sliceDoc(first.from, first.to);
@@ -5816,7 +6221,7 @@ var initialize = () => {
5816
6221
  insert
5817
6222
  }
5818
6223
  ],
5819
- selection: import_state28.EditorSelection.cursor(insert.length)
6224
+ selection: import_state29.EditorSelection.cursor(insert.length)
5820
6225
  });
5821
6226
  });
5822
6227
  }
@@ -5825,7 +6230,7 @@ var initialize = () => {
5825
6230
  };
5826
6231
  var editor = () => [
5827
6232
  initialize(),
5828
- import_state28.EditorState.transactionFilter.of((tr) => {
6233
+ import_state29.EditorState.transactionFilter.of((tr) => {
5829
6234
  const tree = tr.state.facet(treeFacet);
5830
6235
  if (!tr.docChanged) {
5831
6236
  const current = getSelection(tr.state).from;
@@ -5840,20 +6245,20 @@ var editor = () => [
5840
6245
  if (!prevItem) {
5841
6246
  return [
5842
6247
  {
5843
- selection: import_state28.EditorSelection.cursor(currentItem.contentRange.from)
6248
+ selection: import_state29.EditorSelection.cursor(currentItem.contentRange.from)
5844
6249
  }
5845
6250
  ];
5846
6251
  } else {
5847
6252
  if (currentItem.index < prevItem.index) {
5848
6253
  return [
5849
6254
  {
5850
- selection: import_state28.EditorSelection.cursor(currentItem.contentRange.to)
6255
+ selection: import_state29.EditorSelection.cursor(currentItem.contentRange.to)
5851
6256
  }
5852
6257
  ];
5853
6258
  } else if (currentItem.index > prevItem.index) {
5854
6259
  return [
5855
6260
  {
5856
- selection: import_state28.EditorSelection.cursor(currentItem.contentRange.from)
6261
+ selection: import_state29.EditorSelection.cursor(currentItem.contentRange.from)
5857
6262
  }
5858
6263
  ];
5859
6264
  } else {
@@ -5863,14 +6268,14 @@ var editor = () => [
5863
6268
  } else {
5864
6269
  return [
5865
6270
  {
5866
- selection: import_state28.EditorSelection.cursor(currentItem.lineRange.from - 1)
6271
+ selection: import_state29.EditorSelection.cursor(currentItem.lineRange.from - 1)
5867
6272
  }
5868
6273
  ];
5869
6274
  }
5870
6275
  } else {
5871
6276
  return [
5872
6277
  {
5873
- selection: import_state28.EditorSelection.cursor(currentItem.contentRange.to)
6278
+ selection: import_state29.EditorSelection.cursor(currentItem.contentRange.to)
5874
6279
  }
5875
6280
  ];
5876
6281
  }
@@ -5983,7 +6388,7 @@ var editor = () => [
5983
6388
  ];
5984
6389
  var outliner = (options = {}) => [
5985
6390
  // Commands.
5986
- import_state27.Prec.highest(commands()),
6391
+ import_state28.Prec.highest(commands()),
5987
6392
  // Selection.
5988
6393
  selectionCompartment.of(selectionFacet.of([])),
5989
6394
  // State.
@@ -5993,20 +6398,20 @@ var outliner = (options = {}) => [
5993
6398
  // Floating menu.
5994
6399
  floatingMenu(),
5995
6400
  // Line decorations.
5996
- decorations(options),
6401
+ decorations(),
5997
6402
  // Default markdown decorations.
5998
6403
  decorateMarkdown({
5999
6404
  listPaddingLeft: 8
6000
6405
  }),
6001
6406
  // Researve space for menu.
6002
- import_view29.EditorView.contentAttributes.of({
6407
+ import_view32.EditorView.contentAttributes.of({
6003
6408
  class: "is-full !mr-[3rem]"
6004
6409
  })
6005
6410
  ];
6006
- var decorations = (options) => [
6007
- import_view29.ViewPlugin.fromClass(class {
6411
+ var decorations = () => [
6412
+ import_view32.ViewPlugin.fromClass(class {
6008
6413
  constructor(view) {
6009
- this.decorations = import_view29.Decoration.none;
6414
+ this.decorations = import_view32.Decoration.none;
6010
6415
  this.updateDecorations(view.state, view);
6011
6416
  }
6012
6417
  update(update2) {
@@ -6028,18 +6433,18 @@ var decorations = (options) => [
6028
6433
  const lineFrom = doc.lineAt(item.contentRange.from);
6029
6434
  const lineTo = doc.lineAt(item.contentRange.to);
6030
6435
  const isSelected = selection.includes(item.index) || item === current;
6031
- decorations2.push(import_view29.Decoration.line({
6032
- class: (0, import_react_ui_theme7.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"))
6033
6438
  }).range(line.from, line.from));
6034
6439
  }
6035
6440
  }
6036
- this.decorations = import_view29.Decoration.set(decorations2);
6441
+ this.decorations = import_view32.Decoration.set(decorations2);
6037
6442
  }
6038
6443
  }, {
6039
6444
  decorations: (v) => v.decorations
6040
6445
  }),
6041
6446
  // Theme.
6042
- import_view29.EditorView.theme(Object.assign({
6447
+ import_view32.EditorView.theme(Object.assign({
6043
6448
  ".cm-list-item": {
6044
6449
  borderLeftWidth: "1px",
6045
6450
  borderRightWidth: "1px",
@@ -6063,11 +6468,11 @@ var decorations = (options) => [
6063
6468
  paddingBottom: "4px",
6064
6469
  marginBottom: "2px"
6065
6470
  },
6066
- ".cm-list-item-selected": {
6067
- borderColor: options.showSelected ? "var(--dx-separator)" : void 0
6068
- },
6069
6471
  ".cm-list-item-focused": {
6070
6472
  borderColor: "var(--dx-accentFocusIndicator)"
6473
+ },
6474
+ "[data-has-focus] & .cm-list-item-selected": {
6475
+ borderColor: "var(--dx-separator)"
6071
6476
  }
6072
6477
  }))
6073
6478
  ];
@@ -6075,22 +6480,19 @@ var preview = (options = {}) => {
6075
6480
  return [
6076
6481
  // NOTE: Atomic block decorations must be created from a state field, now a widget, otherwise it results in the following error:
6077
6482
  // "Block decorations may not be specified via plugins"
6078
- import_state29.StateField.define({
6483
+ import_state30.StateField.define({
6079
6484
  create: (state) => buildDecorations3(state, options),
6080
6485
  update: (_, tr) => buildDecorations3(tr.state, options),
6081
6486
  provide: (field) => [
6082
- import_view31.EditorView.decorations.from(field),
6083
- import_view31.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))
6084
6489
  ]
6085
6490
  }),
6086
- import_view31.EditorView.theme({
6491
+ import_view34.EditorView.theme({
6087
6492
  ".cm-preview-block": {
6088
- marginLeft: "-1rem",
6089
- marginRight: "-1rem",
6090
- padding: "1rem",
6091
- borderRadius: "0.5rem",
6092
- background: "var(--dx-modalSurface)",
6093
- 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))"
6094
6496
  }
6095
6497
  })
6096
6498
  ];
@@ -6109,7 +6511,7 @@ var getLinkRef = (state, node) => {
6109
6511
  }
6110
6512
  };
6111
6513
  var buildDecorations3 = (state, options) => {
6112
- const builder = new import_state29.RangeSetBuilder();
6514
+ const builder = new import_state30.RangeSetBuilder();
6113
6515
  (0, import_language15.syntaxTree)(state).iterate({
6114
6516
  enter: (node) => {
6115
6517
  switch (node.name) {
@@ -6120,7 +6522,7 @@ var buildDecorations3 = (state, options) => {
6120
6522
  case "Link": {
6121
6523
  const link = getLinkRef(state, node.node);
6122
6524
  if (link) {
6123
- builder.add(node.from, node.to, import_view31.Decoration.replace({
6525
+ builder.add(node.from, node.to, import_view34.Decoration.replace({
6124
6526
  widget: new PreviewInlineWidget(options, link)
6125
6527
  }));
6126
6528
  }
@@ -6133,7 +6535,7 @@ var buildDecorations3 = (state, options) => {
6133
6535
  case "Image": {
6134
6536
  const link = getLinkRef(state, node.node);
6135
6537
  if (options.renderBlock && link) {
6136
- builder.add(node.from, node.to, import_view31.Decoration.replace({
6538
+ builder.add(node.from, node.to, import_view34.Decoration.replace({
6137
6539
  block: true,
6138
6540
  // atomic: true,
6139
6541
  widget: new PreviewBlockWidget(options, link)
@@ -6146,7 +6548,7 @@ var buildDecorations3 = (state, options) => {
6146
6548
  });
6147
6549
  return builder.finish();
6148
6550
  };
6149
- var PreviewInlineWidget = class extends import_view31.WidgetType {
6551
+ var PreviewInlineWidget = class extends import_view34.WidgetType {
6150
6552
  constructor(_options, _link) {
6151
6553
  super(), this._options = _options, this._link = _link;
6152
6554
  }
@@ -6163,7 +6565,7 @@ var PreviewInlineWidget = class extends import_view31.WidgetType {
6163
6565
  return root;
6164
6566
  }
6165
6567
  };
6166
- var PreviewBlockWidget = class extends import_view31.WidgetType {
6568
+ var PreviewBlockWidget = class extends import_view34.WidgetType {
6167
6569
  constructor(_options, _link) {
6168
6570
  super(), this._options = _options, this._link = _link;
6169
6571
  }
@@ -6229,7 +6631,7 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
6229
6631
  let t;
6230
6632
  let idx = 0;
6231
6633
  return [
6232
- import_view32.keymap.of([
6634
+ import_view35.keymap.of([
6233
6635
  {
6234
6636
  // Reset.
6235
6637
  key: "alt-meta-'",
@@ -6556,28 +6958,6 @@ var createViewMode = (state, onViewModeChange) => {
6556
6958
  ]
6557
6959
  };
6558
6960
  };
6559
- var editorWidth = "!mli-auto is-full max-is-[min(50rem,100%-4rem)]";
6560
- var editorSlots = {
6561
- scroll: {
6562
- className: "pbs-2"
6563
- },
6564
- content: {
6565
- className: editorWidth
6566
- }
6567
- };
6568
- var editorGutter = import_view33.EditorView.theme({
6569
- ".cm-gutters": {
6570
- paddingRight: "1rem"
6571
- }
6572
- });
6573
- var editorMonospace = import_view33.EditorView.theme({
6574
- ".cm-content": {
6575
- fontFamily: fontMono
6576
- }
6577
- });
6578
- var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden";
6579
- var stackItemContentEditorClassNames = (role) => (0, import_react_ui_theme8.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");
6580
- var stackItemContentToolbarClassNames = (role) => (0, import_react_ui_theme8.mx)("relative z-[1] flex is-full bg-toolbarSurface border-be border-subduedSeparator", role === "section" && "sticky block-start-0 -mbe-px min-is-0");
6581
6961
  var createToolbar = ({ getView, state, customActions, ...features }) => {
6582
6962
  return import_rx_react.Rx.make((get2) => {
6583
6963
  const nodes = [];
@@ -6679,20 +7059,304 @@ var EditorToolbar = /* @__PURE__ */ (0, import_react.memo)(({ classNames, attend
6679
7059
  _effect.f();
6680
7060
  }
6681
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
+ };
6682
7322
  var customEventOptions = {
6683
7323
  capture: true,
6684
7324
  passive: false
6685
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
+ });
6686
7351
  var REF_POPOVER = "RefPopover";
6687
7352
  var [RefPopoverContextProvider, useRefPopover] = (0, import_react_context.createContext)(REF_POPOVER, {});
6688
- var RefPopoverProvider = ({ children, onLookup }) => {
6689
- var _effect = (0, import_tracking2.useSignals)();
7353
+ var PreviewProvider = ({ children, onLookup }) => {
7354
+ var _effect = (0, import_tracking3.useSignals)();
6690
7355
  try {
6691
- const trigger = (0, import_react7.useRef)(null);
6692
- const [value, setValue] = (0, import_react7.useState)({});
6693
- const [rootRef, setRootRef] = (0, import_react7.useState)(null);
6694
- const [open, setOpen] = (0, import_react7.useState)(false);
6695
- 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) => {
6696
7360
  const { refId, label, trigger: dxTrigger } = event;
6697
7361
  setValue((value2) => ({
6698
7362
  ...value2,
@@ -6715,32 +7379,20 @@ var RefPopoverProvider = ({ children, onLookup }) => {
6715
7379
  }, [
6716
7380
  onLookup
6717
7381
  ]);
6718
- (0, import_react7.useEffect)(() => {
6719
- return rootRef ? (0, import_async5.addEventListener)(rootRef, "dx-ref-tag-activate", handleDxRefTagActivate, customEventOptions) : void 0;
6720
- }, [
6721
- rootRef
6722
- ]);
6723
- return /* @__PURE__ */ import_react7.default.createElement(RefPopoverContextProvider, {
7382
+ return /* @__PURE__ */ import_react9.default.createElement(RefPopoverContextProvider, {
6724
7383
  pending: value.pending,
6725
7384
  link: value.link,
6726
7385
  target: value.target
6727
- }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui4.Popover.Root, {
7386
+ }, /* @__PURE__ */ import_react9.default.createElement(RefPopover, {
7387
+ ref: trigger,
6728
7388
  open,
6729
- onOpenChange: setOpen
6730
- }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui4.Popover.VirtualTrigger, {
6731
- virtualRef: trigger
6732
- }), /* @__PURE__ */ import_react7.default.createElement("div", {
6733
- role: "none",
6734
- className: "contents",
6735
- ref: setRootRef
6736
- }, children)));
7389
+ onOpenChange: setOpen,
7390
+ onActivate: handleDxRefTagActivate
7391
+ }, children));
6737
7392
  } finally {
6738
7393
  _effect.f();
6739
7394
  }
6740
7395
  };
6741
- var RefPopover = {
6742
- Provider: RefPopoverProvider
6743
- };
6744
7396
  var customEventOptions2 = {
6745
7397
  capture: true,
6746
7398
  passive: false
@@ -6748,13 +7400,13 @@ var customEventOptions2 = {
6748
7400
  var REF_DROPDOWN_MENU = "RefDropdownMenu";
6749
7401
  var [RefDropdownMenuContextProvider, useRefDropdownMenu] = (0, import_react_context2.createContext)(REF_DROPDOWN_MENU, {});
6750
7402
  var RefDropdownMenuProvider = ({ children, onLookup }) => {
6751
- var _effect = (0, import_tracking3.useSignals)();
7403
+ var _effect = (0, import_tracking4.useSignals)();
6752
7404
  try {
6753
- const trigger = (0, import_react8.useRef)(null);
6754
- const [value, setValue] = (0, import_react8.useState)({});
6755
- const [rootRef, setRootRef] = (0, import_react8.useState)(null);
6756
- const [open, setOpen] = (0, import_react8.useState)(false);
6757
- 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) => {
6758
7410
  const { refId, label, trigger: dxTrigger } = event;
6759
7411
  setValue((value2) => ({
6760
7412
  ...value2,
@@ -6777,21 +7429,21 @@ var RefDropdownMenuProvider = ({ children, onLookup }) => {
6777
7429
  }, [
6778
7430
  onLookup
6779
7431
  ]);
6780
- (0, import_react8.useEffect)(() => {
6781
- return rootRef ? (0, import_async6.addEventListener)(rootRef, "dx-ref-tag-activate", handleDxRefTagActivate, customEventOptions2) : void 0;
7432
+ (0, import_react10.useEffect)(() => {
7433
+ return rootRef ? (0, import_async7.addEventListener)(rootRef, "dx-ref-tag-activate", handleDxRefTagActivate, customEventOptions2) : void 0;
6782
7434
  }, [
6783
7435
  rootRef
6784
7436
  ]);
6785
- return /* @__PURE__ */ import_react8.default.createElement(RefDropdownMenuContextProvider, {
7437
+ return /* @__PURE__ */ import_react10.default.createElement(RefDropdownMenuContextProvider, {
6786
7438
  pending: value.pending,
6787
7439
  link: value.link,
6788
7440
  target: value.target
6789
- }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui5.DropdownMenu.Root, {
7441
+ }, /* @__PURE__ */ import_react10.default.createElement(import_react_ui6.DropdownMenu.Root, {
6790
7442
  open,
6791
7443
  onOpenChange: setOpen
6792
- }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui5.DropdownMenu.VirtualTrigger, {
7444
+ }, /* @__PURE__ */ import_react10.default.createElement(import_react_ui6.DropdownMenu.VirtualTrigger, {
6793
7445
  virtualRef: trigger
6794
- }), /* @__PURE__ */ import_react8.default.createElement("div", {
7446
+ }), /* @__PURE__ */ import_react10.default.createElement("div", {
6795
7447
  role: "none",
6796
7448
  className: "contents",
6797
7449
  ref: setRootRef
@@ -6806,11 +7458,11 @@ var RefDropdownMenu = {
6806
7458
  var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
6807
7459
  var instanceCount = 0;
6808
7460
  var useTextEditor = (props = {}, deps = []) => {
6809
- const { id, doc, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0, import_react9.useMemo)(() => (0, import_util6.getProviderValue)(props), deps ?? []);
6810
- const [instanceId] = (0, import_react9.useState)(() => `text-editor-${++instanceCount}`);
6811
- const [view, setView] = (0, import_react9.useState)();
6812
- const parentRef = (0, import_react9.useRef)(null);
6813
- (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)(() => {
6814
7466
  let view2;
6815
7467
  if (parentRef.current) {
6816
7468
  (0, import_log8.log)("create", {
@@ -6819,7 +7471,7 @@ var useTextEditor = (props = {}, deps = []) => {
6819
7471
  doc: initialValue?.length ?? 0
6820
7472
  }, {
6821
7473
  F: __dxlog_file13,
6822
- L: 76,
7474
+ L: 75,
6823
7475
  S: void 0,
6824
7476
  C: (f, a) => f(...a)
6825
7477
  });
@@ -6835,27 +7487,27 @@ var useTextEditor = (props = {}, deps = []) => {
6835
7487
  anchor
6836
7488
  };
6837
7489
  }
6838
- const state = import_state30.EditorState.create({
7490
+ const state = import_state31.EditorState.create({
6839
7491
  doc: doc ?? initialValue,
6840
7492
  // selection: initialSelection,
6841
7493
  extensions: [
6842
7494
  id && documentId.of(id),
6843
7495
  extensions,
6844
7496
  // NOTE: This doesn't catch errors in keymap functions.
6845
- import_view34.EditorView.exceptionSink.of((err) => {
7497
+ import_view36.EditorView.exceptionSink.of((err) => {
6846
7498
  import_log8.log.catch(err, void 0, {
6847
7499
  F: __dxlog_file13,
6848
- L: 98,
7500
+ L: 97,
6849
7501
  S: void 0,
6850
7502
  C: (f, a) => f(...a)
6851
7503
  });
6852
7504
  })
6853
7505
  ].filter(import_util6.isNotFalsy)
6854
7506
  });
6855
- view2 = new import_view34.EditorView({
7507
+ view2 = new import_view36.EditorView({
6856
7508
  parent: parentRef.current,
6857
7509
  state,
6858
- scrollTo: scrollTo ? import_view34.EditorView.scrollIntoView(scrollTo, {
7510
+ scrollTo: scrollTo ? import_view36.EditorView.scrollIntoView(scrollTo, {
6859
7511
  yMargin: 96
6860
7512
  }) : void 0,
6861
7513
  dispatchTransactions: debug ? debugDispatcher : void 0
@@ -6877,14 +7529,14 @@ var useTextEditor = (props = {}, deps = []) => {
6877
7529
  id
6878
7530
  }, {
6879
7531
  F: __dxlog_file13,
6880
- L: 135,
7532
+ L: 134,
6881
7533
  S: void 0,
6882
7534
  C: (f, a) => f(...a)
6883
7535
  });
6884
7536
  view2?.destroy();
6885
7537
  };
6886
7538
  }, deps);
6887
- (0, import_react9.useEffect)(() => {
7539
+ (0, import_react11.useEffect)(() => {
6888
7540
  if (view) {
6889
7541
  if (scrollTo || selection) {
6890
7542
  if (selection && selection.anchor > view.state.doc.length) {
@@ -6894,7 +7546,7 @@ var useTextEditor = (props = {}, deps = []) => {
6894
7546
  selection
6895
7547
  }, {
6896
7548
  F: __dxlog_file13,
6897
- L: 144,
7549
+ L: 143,
6898
7550
  S: void 0,
6899
7551
  C: (f, a) => f(...a)
6900
7552
  });
@@ -6911,7 +7563,7 @@ var useTextEditor = (props = {}, deps = []) => {
6911
7563
  scrollTo,
6912
7564
  selection
6913
7565
  ]);
6914
- (0, import_react9.useEffect)(() => {
7566
+ (0, import_react11.useEffect)(() => {
6915
7567
  if (view && autoFocus) {
6916
7568
  view.focus();
6917
7569
  }
@@ -6925,7 +7577,7 @@ var useTextEditor = (props = {}, deps = []) => {
6925
7577
  Escape: view?.state.facet(editorInputMode).noTabster
6926
7578
  }
6927
7579
  });
6928
- const handleKeyUp = (0, import_react9.useCallback)((event) => {
7580
+ const handleKeyUp = (0, import_react11.useCallback)((event) => {
6929
7581
  const { key, target, currentTarget } = event;
6930
7582
  if (target === currentTarget) {
6931
7583
  switch (key) {
@@ -6950,6 +7602,7 @@ var useTextEditor = (props = {}, deps = []) => {
6950
7602
  };
6951
7603
  // Annotate the CommonJS export names for ESM import in node:
6952
7604
  0 && (module.exports = {
7605
+ CommandMenu,
6953
7606
  Cursor,
6954
7607
  EditorInputMode,
6955
7608
  EditorInputModes,
@@ -6961,6 +7614,7 @@ var useTextEditor = (props = {}, deps = []) => {
6961
7614
  Inline,
6962
7615
  InputModeExtensions,
6963
7616
  List,
7617
+ PreviewProvider,
6964
7618
  RefDropdownMenu,
6965
7619
  RefPopover,
6966
7620
  RemoteSelectionsDecorator,
@@ -6984,11 +7638,14 @@ var useTextEditor = (props = {}, deps = []) => {
6984
7638
  closeEffect,
6985
7639
  command,
6986
7640
  commandKeyBindings,
7641
+ commandMenu,
7642
+ commandRangeEffect,
6987
7643
  commands,
6988
7644
  commentClickedEffect,
6989
7645
  comments,
6990
7646
  commentsState,
6991
7647
  convertTreeToJson,
7648
+ coreSlashCommands,
6992
7649
  createBasicExtensions,
6993
7650
  createComment,
6994
7651
  createDataExtensions,
@@ -7016,6 +7673,7 @@ var useTextEditor = (props = {}, deps = []) => {
7016
7673
  editorSlots,
7017
7674
  editorWidth,
7018
7675
  editorWithToolbarLayout,
7676
+ filterItems,
7019
7677
  flattenRect,
7020
7678
  floatingMenu,
7021
7679
  focus,
@@ -7024,14 +7682,21 @@ var useTextEditor = (props = {}, deps = []) => {
7024
7682
  formattingEquals,
7025
7683
  formattingKeymap,
7026
7684
  getFormatting,
7685
+ getItem,
7027
7686
  getListItemContent,
7687
+ getNextItem,
7688
+ getPreviousItem,
7028
7689
  getRange,
7690
+ hashtag,
7029
7691
  image,
7030
7692
  indentItemLess,
7031
7693
  indentItemMore,
7694
+ insertAtCursor,
7695
+ insertAtLineStart,
7032
7696
  insertTable,
7033
7697
  itemToJSON,
7034
7698
  keymap,
7699
+ linkSlashCommands,
7035
7700
  linkTooltip,
7036
7701
  listItemToString,
7037
7702
  listener,
@@ -7043,6 +7708,7 @@ var useTextEditor = (props = {}, deps = []) => {
7043
7708
  mention,
7044
7709
  moveItemDown,
7045
7710
  moveItemUp,
7711
+ multilinePlaceholder,
7046
7712
  openCommand,
7047
7713
  openEffect,
7048
7714
  outliner,
@@ -7085,6 +7751,7 @@ var useTextEditor = (props = {}, deps = []) => {
7085
7751
  treeFacet,
7086
7752
  typeahead,
7087
7753
  typewriter,
7754
+ useCommandMenu,
7088
7755
  useComments,
7089
7756
  useEditorToolbarState,
7090
7757
  useFormattingState,