@dxos/react-ui-editor 0.8.3-main.672df60 → 0.8.3-staging.0fa589b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/lib/browser/index.mjs +981 -377
  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 +1025 -420
  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 +981 -377
  8. package/dist/lib/node-esm/index.mjs.map +4 -4
  9. package/dist/lib/node-esm/meta.json +1 -1
  10. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  11. package/dist/types/src/components/EditorToolbar/util.d.ts +2 -2
  12. package/dist/types/src/components/Popover/CommandMenu.d.ts +34 -0
  13. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +1 -0
  14. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +1 -1
  15. package/dist/types/src/components/Popover/RefPopover.d.ts +19 -6
  16. package/dist/types/src/components/Popover/RefPopover.d.ts.map +1 -1
  17. package/dist/types/src/components/Popover/index.d.ts +1 -0
  18. package/dist/types/src/components/Popover/index.d.ts.map +1 -1
  19. package/dist/types/src/defaults.d.ts +0 -1
  20. package/dist/types/src/defaults.d.ts.map +1 -1
  21. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  22. package/dist/types/src/extensions/command/action.d.ts.map +1 -1
  23. package/dist/types/src/extensions/command/command-menu.d.ts +20 -0
  24. package/dist/types/src/extensions/command/command-menu.d.ts.map +1 -0
  25. package/dist/types/src/extensions/command/command.d.ts.map +1 -1
  26. package/dist/types/src/extensions/command/{menu.d.ts → floating-menu.d.ts} +1 -1
  27. package/dist/types/src/extensions/command/floating-menu.d.ts.map +1 -0
  28. package/dist/types/src/extensions/command/hint.d.ts +5 -2
  29. package/dist/types/src/extensions/command/hint.d.ts.map +1 -1
  30. package/dist/types/src/extensions/command/index.d.ts +3 -1
  31. package/dist/types/src/extensions/command/index.d.ts.map +1 -1
  32. package/dist/types/src/extensions/command/placeholder.d.ts +10 -0
  33. package/dist/types/src/extensions/command/placeholder.d.ts.map +1 -0
  34. package/dist/types/src/extensions/command/state.d.ts +1 -1
  35. package/dist/types/src/extensions/command/state.d.ts.map +1 -1
  36. package/dist/types/src/extensions/command/useCommandMenu.d.ts +26 -0
  37. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +1 -0
  38. package/dist/types/src/extensions/factories.d.ts +1 -0
  39. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  40. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  41. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
  42. package/dist/types/src/extensions/preview/preview.d.ts +12 -19
  43. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  44. package/dist/types/src/hooks/useTextEditor.d.ts +8 -9
  45. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  46. package/dist/types/src/stories/CommandMenu.stories.d.ts +13 -0
  47. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +1 -0
  48. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  49. package/dist/types/src/util/dom.d.ts +5 -0
  50. package/dist/types/src/util/dom.d.ts.map +1 -1
  51. package/dist/types/src/util/react.d.ts +2 -4
  52. package/dist/types/src/util/react.d.ts.map +1 -1
  53. package/package.json +31 -28
  54. package/src/components/EditorToolbar/EditorToolbar.tsx +5 -9
  55. package/src/components/Popover/CommandMenu.tsx +279 -0
  56. package/src/components/Popover/RefDropdownMenu.tsx +5 -3
  57. package/src/components/Popover/RefPopover.tsx +46 -22
  58. package/src/components/Popover/index.ts +1 -0
  59. package/src/defaults.ts +1 -6
  60. package/src/extensions/automerge/automerge.stories.tsx +5 -5
  61. package/src/extensions/command/action.ts +9 -2
  62. package/src/extensions/command/command-menu.ts +210 -0
  63. package/src/extensions/command/command.ts +8 -8
  64. package/src/extensions/command/{menu.ts → floating-menu.ts} +0 -4
  65. package/src/extensions/command/hint.ts +29 -9
  66. package/src/extensions/command/index.ts +3 -1
  67. package/src/extensions/command/placeholder.ts +113 -0
  68. package/src/extensions/command/state.ts +1 -2
  69. package/src/extensions/command/useCommandMenu.ts +118 -0
  70. package/src/extensions/factories.ts +4 -1
  71. package/src/extensions/markdown/bundle.ts +0 -2
  72. package/src/extensions/outliner/outliner.ts +0 -3
  73. package/src/extensions/outliner/tree.test.ts +13 -10
  74. package/src/extensions/outliner/tree.ts +5 -3
  75. package/src/extensions/preview/preview.ts +11 -89
  76. package/src/hooks/useTextEditor.ts +11 -12
  77. package/src/stories/Command.stories.tsx +1 -1
  78. package/src/stories/CommandMenu.stories.tsx +159 -0
  79. package/src/stories/Preview.stories.tsx +157 -78
  80. package/src/stories/components/util.tsx +2 -2
  81. package/src/util/dom.ts +20 -0
  82. package/src/util/react.tsx +3 -20
  83. package/dist/types/src/extensions/command/menu.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,15 +108,22 @@ __export(node_exports, {
102
108
  formattingEquals: () => formattingEquals,
103
109
  formattingKeymap: () => formattingKeymap,
104
110
  getFormatting: () => getFormatting,
111
+ getItem: () => getItem,
112
+ getLinkRef: () => getLinkRef,
105
113
  getListItemContent: () => getListItemContent,
114
+ getNextItem: () => getNextItem,
115
+ getPreviousItem: () => getPreviousItem,
106
116
  getRange: () => getRange,
107
117
  hashtag: () => hashtag,
108
118
  image: () => image,
109
119
  indentItemLess: () => indentItemLess,
110
120
  indentItemMore: () => indentItemMore,
121
+ insertAtCursor: () => insertAtCursor,
122
+ insertAtLineStart: () => insertAtLineStart,
111
123
  insertTable: () => insertTable,
112
124
  itemToJSON: () => itemToJSON,
113
125
  keymap: () => import_view.keymap,
126
+ linkSlashCommands: () => linkSlashCommands,
114
127
  linkTooltip: () => linkTooltip,
115
128
  listItemToString: () => listItemToString,
116
129
  listener: () => listener,
@@ -145,7 +158,6 @@ __export(node_exports, {
145
158
  setStyle: () => setStyle,
146
159
  singleValueFacet: () => singleValueFacet,
147
160
  stackItemContentEditorClassNames: () => stackItemContentEditorClassNames,
148
- stackItemContentToolbarClassNames: () => stackItemContentToolbarClassNames,
149
161
  staticCompletion: () => staticCompletion,
150
162
  table: () => table,
151
163
  tags: () => import_highlight.tags,
@@ -164,6 +176,7 @@ __export(node_exports, {
164
176
  treeFacet: () => treeFacet,
165
177
  typeahead: () => typeahead,
166
178
  typewriter: () => typewriter,
179
+ useCommandMenu: () => useCommandMenu,
167
180
  useComments: () => useComments,
168
181
  useEditorToolbarState: () => useEditorToolbarState,
169
182
  useFormattingState: () => useFormattingState,
@@ -183,7 +196,6 @@ var import_react = __toESM(require("react"));
183
196
  var import_app_graph = require("@dxos/app-graph");
184
197
  var import_react_ui = require("@dxos/react-ui");
185
198
  var import_react_ui_menu = require("@dxos/react-ui-menu");
186
- var import_react_ui_theme = require("@dxos/react-ui-theme");
187
199
  var import_react2 = require("react");
188
200
  var import_live_object = require("@dxos/live-object");
189
201
  var import_react_ui_menu2 = require("@dxos/react-ui-menu");
@@ -206,7 +218,7 @@ var import_log2 = require("@dxos/log");
206
218
  var import_react3 = __toESM(require("react"));
207
219
  var import_client = require("react-dom/client");
208
220
  var import_react_ui2 = require("@dxos/react-ui");
209
- var import_react_ui_theme2 = require("@dxos/react-ui-theme");
221
+ var import_react_ui_theme = require("@dxos/react-ui-theme");
210
222
  var import_state7 = require("@codemirror/state");
211
223
  var import_view5 = require("@codemirror/view");
212
224
  var import_async = require("@dxos/async");
@@ -221,138 +233,146 @@ var import_invariant2 = require("@dxos/invariant");
221
233
  var import_state8 = require("@codemirror/state");
222
234
  var import_state9 = require("@codemirror/state");
223
235
  var import_view7 = require("@codemirror/view");
224
- var import_view8 = require("@codemirror/view");
225
236
  var import_state10 = require("@codemirror/state");
237
+ var import_view8 = require("@codemirror/view");
238
+ var import_util = require("@dxos/util");
239
+ var import_state11 = require("@codemirror/state");
226
240
  var import_view9 = require("@codemirror/view");
241
+ var import_state12 = require("@codemirror/state");
227
242
  var import_view10 = require("@codemirror/view");
228
- var import_async3 = require("@dxos/async");
229
- var import_state11 = require("@codemirror/state");
230
243
  var import_view11 = require("@codemirror/view");
231
- var import_commands = require("@codemirror/commands");
232
- var import_state12 = require("@codemirror/state");
233
244
  var import_view12 = require("@codemirror/view");
234
- var import_lodash2 = __toESM(require("lodash.sortby"));
245
+ var import_async3 = require("@dxos/async");
235
246
  var import_react4 = require("react");
236
- var import_async4 = require("@dxos/async");
237
- var import_log4 = require("@dxos/log");
238
- var import_util = require("@dxos/util");
239
247
  var import_state13 = require("@codemirror/state");
240
248
  var import_view13 = require("@codemirror/view");
249
+ var import_commands = require("@codemirror/commands");
250
+ var import_state14 = require("@codemirror/state");
251
+ var import_view14 = require("@codemirror/view");
252
+ var import_lodash2 = __toESM(require("lodash.sortby"));
253
+ var import_react5 = require("react");
254
+ var import_async4 = require("@dxos/async");
255
+ var import_log4 = require("@dxos/log");
256
+ var import_util2 = require("@dxos/util");
257
+ var import_state15 = require("@codemirror/state");
258
+ var import_view15 = require("@codemirror/view");
241
259
  var import_async5 = require("@dxos/async");
242
260
  var import_invariant3 = require("@dxos/invariant");
243
- var import_util2 = require("@dxos/util");
261
+ var import_util3 = require("@dxos/util");
244
262
  var import_language = require("@codemirror/language");
245
- var import_state14 = require("@codemirror/state");
246
- var import_view14 = require("@codemirror/view");
263
+ var import_state16 = require("@codemirror/state");
264
+ var import_view16 = require("@codemirror/view");
247
265
  var import_autocomplete2 = require("@codemirror/autocomplete");
248
266
  var import_commands2 = require("@codemirror/commands");
249
267
  var import_language2 = require("@codemirror/language");
250
268
  var import_search = require("@codemirror/search");
251
- var import_state15 = require("@codemirror/state");
269
+ var import_state17 = require("@codemirror/state");
252
270
  var import_theme_one_dark = require("@codemirror/theme-one-dark");
253
- var import_view15 = require("@codemirror/view");
271
+ var import_view17 = require("@codemirror/view");
254
272
  var import_lodash3 = __toESM(require("lodash.defaultsdeep"));
255
273
  var import_lodash4 = __toESM(require("lodash.merge"));
256
274
  var import_display_name = require("@dxos/display-name");
257
275
  var import_log5 = require("@dxos/log");
258
- var import_util3 = require("@dxos/util");
259
- var import_state16 = require("@codemirror/state");
260
- var import_view16 = require("@codemirror/view");
276
+ var import_util4 = require("@dxos/util");
277
+ var import_state18 = require("@codemirror/state");
278
+ var import_view18 = require("@codemirror/view");
279
+ var import_view19 = require("@codemirror/view");
280
+ var import_react_ui_theme2 = require("@dxos/react-ui-theme");
261
281
  var import_react_ui_theme3 = require("@dxos/react-ui-theme");
262
282
  var import_react_ui_theme4 = require("@dxos/react-ui-theme");
263
- var import_util4 = require("@dxos/util");
283
+ var import_util5 = require("@dxos/util");
264
284
  var import_language3 = require("@codemirror/language");
265
- var import_view17 = require("@codemirror/view");
266
- var import_react5 = __toESM(require("react"));
285
+ var import_view20 = require("@codemirror/view");
286
+ var import_react6 = __toESM(require("react"));
267
287
  var import_react_ui3 = require("@dxos/react-ui");
268
- var import_view18 = require("@codemirror/view");
288
+ var import_view21 = require("@codemirror/view");
269
289
  var import_react_ui_theme5 = require("@dxos/react-ui-theme");
270
290
  var import_lang_json = require("@codemirror/lang-json");
271
291
  var import_lint = require("@codemirror/lint");
272
292
  var import_ajv = __toESM(require("ajv"));
273
- var import_view19 = require("@codemirror/view");
293
+ var import_view22 = require("@codemirror/view");
274
294
  var import_autocomplete3 = require("@codemirror/autocomplete");
275
295
  var import_language4 = require("@codemirror/language");
276
- var import_state17 = require("@codemirror/state");
277
- var import_view20 = require("@codemirror/view");
278
- var import_react6 = require("react");
296
+ var import_state19 = require("@codemirror/state");
297
+ var import_view23 = require("@codemirror/view");
298
+ var import_react7 = require("react");
279
299
  var import_autocomplete4 = require("@codemirror/autocomplete");
280
300
  var import_commands3 = require("@codemirror/commands");
281
301
  var import_lang_markdown2 = require("@codemirror/lang-markdown");
282
302
  var import_language5 = require("@codemirror/language");
283
303
  var import_language_data = require("@codemirror/language-data");
284
- var import_lint2 = require("@codemirror/lint");
285
- var import_view21 = require("@codemirror/view");
286
- var import_util5 = require("@dxos/util");
304
+ var import_view24 = require("@codemirror/view");
305
+ var import_util6 = require("@dxos/util");
287
306
  var import_lang_markdown3 = require("@codemirror/lang-markdown");
288
307
  var import_language6 = require("@codemirror/language");
289
308
  var import_highlight2 = require("@lezer/highlight");
290
309
  var import_markdown = require("@lezer/markdown");
291
310
  var import_language7 = require("@codemirror/language");
292
- var import_state18 = require("@codemirror/state");
311
+ var import_state20 = require("@codemirror/state");
293
312
  var import_language8 = require("@codemirror/language");
294
- var import_state19 = require("@codemirror/state");
295
- var import_view22 = require("@codemirror/view");
313
+ var import_state21 = require("@codemirror/state");
314
+ var import_view25 = require("@codemirror/view");
296
315
  var import_invariant4 = require("@dxos/invariant");
297
316
  var import_react_ui_theme6 = require("@dxos/react-ui-theme");
298
317
  var import_language9 = require("@codemirror/language");
299
- var import_state20 = require("@codemirror/state");
300
- var import_view23 = require("@codemirror/view");
301
- var import_language10 = require("@codemirror/language");
302
- var import_state21 = require("@codemirror/state");
303
- var import_view24 = require("@codemirror/view");
304
- var import_view25 = require("@codemirror/view");
305
- var import_language11 = require("@codemirror/language");
306
318
  var import_state22 = require("@codemirror/state");
307
319
  var import_view26 = require("@codemirror/view");
308
- var import_language12 = require("@codemirror/language");
320
+ var import_language10 = require("@codemirror/language");
321
+ var import_state23 = require("@codemirror/state");
309
322
  var import_view27 = require("@codemirror/view");
323
+ var import_view28 = require("@codemirror/view");
324
+ var import_language11 = require("@codemirror/language");
325
+ var import_state24 = require("@codemirror/state");
326
+ var import_view29 = require("@codemirror/view");
327
+ var import_language12 = require("@codemirror/language");
328
+ var import_view30 = require("@codemirror/view");
310
329
  var import_react_ui_theme7 = require("@dxos/react-ui-theme");
311
330
  var import_autocomplete5 = require("@codemirror/autocomplete");
312
331
  var import_log6 = require("@dxos/log");
313
- var import_view28 = require("@codemirror/view");
332
+ var import_view31 = require("@codemirror/view");
314
333
  var import_codemirror_vim = require("@replit/codemirror-vim");
315
334
  var import_codemirror_vscode_keymap = require("@replit/codemirror-vscode-keymap");
316
335
  var import_effect = require("effect");
317
336
  var import_commands4 = require("@codemirror/commands");
318
337
  var import_language13 = require("@codemirror/language");
319
- var import_state23 = require("@codemirror/state");
320
- var import_view29 = require("@codemirror/view");
321
- var import_state24 = require("@codemirror/state");
322
- var import_language14 = require("@codemirror/language");
323
338
  var import_state25 = require("@codemirror/state");
339
+ var import_view32 = require("@codemirror/view");
324
340
  var import_state26 = require("@codemirror/state");
325
- var import_invariant5 = require("@dxos/invariant");
341
+ var import_language14 = require("@codemirror/language");
326
342
  var import_state27 = require("@codemirror/state");
327
- var import_view30 = require("@codemirror/view");
328
- var import_react_ui_theme8 = require("@dxos/react-ui-theme");
329
343
  var import_state28 = require("@codemirror/state");
330
- var import_view31 = require("@codemirror/view");
344
+ var import_invariant5 = require("@dxos/invariant");
345
+ var import_state29 = require("@codemirror/state");
346
+ var import_view33 = require("@codemirror/view");
347
+ var import_react_ui_theme8 = require("@dxos/react-ui-theme");
348
+ var import_state30 = require("@codemirror/state");
349
+ var import_view34 = require("@codemirror/view");
331
350
  var import_log7 = require("@dxos/log");
332
351
  var import_dx_ref_tag = require("@dxos/lit-ui/dx-ref-tag.pcss");
333
352
  var import_language15 = require("@codemirror/language");
334
- var import_state29 = require("@codemirror/state");
335
- var import_view32 = require("@codemirror/view");
336
- var import_view33 = require("@codemirror/view");
353
+ var import_state31 = require("@codemirror/state");
354
+ var import_view35 = require("@codemirror/view");
355
+ var import_view36 = require("@codemirror/view");
337
356
  var import_search2 = require("@codemirror/search");
338
- var import_view34 = require("@codemirror/view");
339
- var import_react_ui_theme9 = require("@dxos/react-ui-theme");
340
357
  var import_tracking2 = require("@preact-signals/safe-react/tracking");
341
- var import_react_context = require("@radix-ui/react-context");
342
- var import_react7 = __toESM(require("react"));
343
- var import_async6 = require("@dxos/async");
358
+ var import_react8 = __toESM(require("react"));
344
359
  var import_react_ui4 = require("@dxos/react-ui");
345
360
  var import_tracking3 = require("@preact-signals/safe-react/tracking");
361
+ var import_react_context = require("@radix-ui/react-context");
362
+ var import_react9 = __toESM(require("react"));
363
+ var import_async6 = require("@dxos/async");
364
+ var import_react_ui5 = require("@dxos/react-ui");
365
+ var import_tracking4 = require("@preact-signals/safe-react/tracking");
346
366
  var import_react_context2 = require("@radix-ui/react-context");
347
- var import_react8 = __toESM(require("react"));
367
+ var import_react10 = __toESM(require("react"));
348
368
  var import_async7 = require("@dxos/async");
349
- var import_react_ui5 = require("@dxos/react-ui");
350
- var import_state30 = require("@codemirror/state");
351
- var import_view35 = require("@codemirror/view");
369
+ var import_react_ui6 = require("@dxos/react-ui");
370
+ var import_state32 = require("@codemirror/state");
371
+ var import_view37 = require("@codemirror/view");
352
372
  var import_react_tabster = require("@fluentui/react-tabster");
353
- var import_react9 = require("react");
373
+ var import_react11 = require("react");
354
374
  var import_log8 = require("@dxos/log");
355
- var import_util6 = require("@dxos/util");
375
+ var import_util7 = require("@dxos/util");
356
376
  var translationKey = "react-ui-editor";
357
377
  var translations_default = [
358
378
  {
@@ -814,6 +834,9 @@ var createElement = (tag, options, children) => {
814
834
  if (options?.className) {
815
835
  el.className = options.className;
816
836
  }
837
+ if (options?.text) {
838
+ el.textContent = options.text;
839
+ }
817
840
  if (children) {
818
841
  el.append(...Array.isArray(children) ? children : [
819
842
  children
@@ -823,13 +846,13 @@ var createElement = (tag, options, children) => {
823
846
  };
824
847
  var renderRoot = (root, node) => {
825
848
  (0, import_client.createRoot)(root).render(/* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ThemeProvider, {
826
- tx: import_react_ui_theme2.defaultTx
849
+ tx: import_react_ui_theme.defaultTx
827
850
  }, node));
828
851
  return root;
829
852
  };
830
853
  var createRenderer = (Component) => (el, props) => {
831
854
  renderRoot(el, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ThemeProvider, {
832
- tx: import_react_ui_theme2.defaultTx
855
+ tx: import_react_ui_theme.defaultTx
833
856
  }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Tooltip.Provider, null, /* @__PURE__ */ import_react3.default.createElement(Component, props))));
834
857
  };
835
858
  var automerge = (accessor) => {
@@ -1616,6 +1639,7 @@ var closeCommand = (view) => {
1616
1639
  var commandKeyBindings = [
1617
1640
  {
1618
1641
  key: "/",
1642
+ preventDefault: true,
1619
1643
  run: openCommand
1620
1644
  },
1621
1645
  {
@@ -1623,32 +1647,48 @@ var commandKeyBindings = [
1623
1647
  run: closeCommand
1624
1648
  }
1625
1649
  ];
1626
- var hintViewPlugin = ({ onHint }) => import_view9.ViewPlugin.fromClass(class {
1627
- constructor() {
1628
- this.decorations = import_view9.Decoration.none;
1629
- }
1630
- update(update2) {
1631
- const builder = new import_state10.RangeSetBuilder();
1632
- const cState = update2.view.state.field(commandState, false);
1633
- if (!cState?.tooltip) {
1634
- const selection = update2.view.state.selection.main;
1635
- const line = update2.view.state.doc.lineAt(selection.from);
1636
- if (selection.from === selection.to && line.from === line.to) {
1637
- const hint = onHint();
1638
- if (hint) {
1639
- builder.add(selection.from, selection.to, import_view9.Decoration.widget({
1640
- widget: new Hint(hint)
1641
- }));
1650
+ var hint = ({ delay = 3e3, onHint }) => {
1651
+ return import_view9.ViewPlugin.fromClass(class {
1652
+ constructor() {
1653
+ this.decorations = import_view9.Decoration.none;
1654
+ }
1655
+ update(update2) {
1656
+ if (this.timeout) {
1657
+ clearTimeout(this.timeout);
1658
+ this.timeout = void 0;
1659
+ }
1660
+ const builder = new import_state11.RangeSetBuilder();
1661
+ const cState = update2.view.state.field(commandState, false);
1662
+ if (!cState?.tooltip) {
1663
+ const selection = update2.view.state.selection.main;
1664
+ const line = update2.view.state.doc.lineAt(selection.from);
1665
+ if (selection.from === selection.to && line.from === line.to) {
1666
+ this.timeout = setTimeout(() => {
1667
+ const hint2 = onHint?.();
1668
+ if (hint2) {
1669
+ const builder2 = new import_state11.RangeSetBuilder();
1670
+ builder2.add(selection.from, selection.to, import_view9.Decoration.widget({
1671
+ widget: new Hint(hint2)
1672
+ }));
1673
+ this.decorations = builder2.finish();
1674
+ update2.view.update([]);
1675
+ }
1676
+ }, delay);
1642
1677
  }
1643
1678
  }
1679
+ this.decorations = builder.finish();
1644
1680
  }
1645
- this.decorations = builder.finish();
1646
- }
1647
- }, {
1648
- provide: (plugin) => [
1649
- import_view9.EditorView.decorations.of((view) => view.plugin(plugin)?.decorations ?? import_view9.Decoration.none)
1650
- ]
1651
- });
1681
+ destroy() {
1682
+ if (this.timeout) {
1683
+ clearTimeout(this.timeout);
1684
+ }
1685
+ }
1686
+ }, {
1687
+ provide: (plugin) => [
1688
+ import_view9.EditorView.decorations.of((view) => view.plugin(plugin)?.decorations ?? import_view9.Decoration.none)
1689
+ ]
1690
+ });
1691
+ };
1652
1692
  var Hint = class extends import_view9.WidgetType {
1653
1693
  constructor(content) {
1654
1694
  super(), this.content = content;
@@ -1689,24 +1729,254 @@ var Hint = class extends import_view9.WidgetType {
1689
1729
  };
1690
1730
  var command = (options = {}) => {
1691
1731
  return [
1692
- import_view8.keymap.of(commandKeyBindings),
1732
+ import_state10.Prec.highest(import_view8.keymap.of(commandKeyBindings)),
1693
1733
  commandConfig.of(options),
1694
1734
  commandState,
1695
- options.onHint ? hintViewPlugin({
1696
- onHint: options.onHint
1697
- }) : [],
1698
- import_view8.EditorView.focusChangeEffect.of((_, focusing) => {
1699
- return focusing ? closeEffect.of(null) : null;
1700
- }),
1735
+ options.onHint && hint(options),
1736
+ import_view8.EditorView.focusChangeEffect.of((_, focusing) => focusing ? closeEffect.of(null) : null),
1701
1737
  import_view8.EditorView.theme({
1702
1738
  ".cm-tooltip": {
1703
1739
  background: "transparent"
1704
1740
  }
1705
1741
  })
1742
+ ].filter(import_util.isNonNullable);
1743
+ };
1744
+ var placeholder = ({ delay = 3e3, content }) => {
1745
+ const plugin = import_view11.ViewPlugin.fromClass(class {
1746
+ constructor() {
1747
+ this.decorations = import_view11.Decoration.none;
1748
+ }
1749
+ update(update2) {
1750
+ if (this.timeout) {
1751
+ window.clearTimeout(this.timeout);
1752
+ this.timeout = void 0;
1753
+ }
1754
+ const activeLine = update2.view.state.doc.lineAt(update2.view.state.selection.main.head);
1755
+ const isEmpty = activeLine.text.trim() === "";
1756
+ if (isEmpty) {
1757
+ const lineStart = activeLine.from;
1758
+ this.timeout = setTimeout(() => {
1759
+ this.decorations = import_view11.Decoration.set([
1760
+ import_view11.Decoration.widget({
1761
+ widget: new Placeholder(content),
1762
+ side: 1
1763
+ }).range(lineStart)
1764
+ ]);
1765
+ update2.view.update([]);
1766
+ }, delay);
1767
+ }
1768
+ this.decorations = import_view11.Decoration.none;
1769
+ }
1770
+ destroy() {
1771
+ if (this.timeout) {
1772
+ clearTimeout(this.timeout);
1773
+ }
1774
+ }
1775
+ }, {
1776
+ provide: (plugin2) => {
1777
+ return [
1778
+ import_view11.EditorView.decorations.of((view) => view.plugin(plugin2)?.decorations ?? import_view11.Decoration.none)
1779
+ ];
1780
+ }
1781
+ });
1782
+ return typeof content === "string" ? [
1783
+ plugin,
1784
+ import_view11.EditorView.contentAttributes.of({
1785
+ "aria-placeholder": content
1786
+ })
1787
+ ] : plugin;
1788
+ };
1789
+ var Placeholder = class extends import_view11.WidgetType {
1790
+ constructor(content) {
1791
+ super(), this.content = content;
1792
+ }
1793
+ toDOM(view) {
1794
+ const wrap = document.createElement("span");
1795
+ wrap.className = "cm-placeholder";
1796
+ wrap.style.pointerEvents = "none";
1797
+ wrap.appendChild(typeof this.content === "string" ? document.createTextNode(this.content) : typeof this.content === "function" ? this.content(view) : this.content.cloneNode(true));
1798
+ wrap.setAttribute("aria-hidden", "true");
1799
+ return wrap;
1800
+ }
1801
+ coordsAt(dom) {
1802
+ const rects = dom.firstChild ? clientRectsFor(dom.firstChild) : [];
1803
+ if (!rects.length) {
1804
+ return null;
1805
+ }
1806
+ const style = window.getComputedStyle(dom.parentNode);
1807
+ const rect = flattenRect(rects[0], style.direction !== "rtl");
1808
+ const lineHeight = parseInt(style.lineHeight);
1809
+ if (rect.bottom - rect.top > lineHeight * 1.5) {
1810
+ return {
1811
+ left: rect.left,
1812
+ right: rect.right,
1813
+ top: rect.top,
1814
+ bottom: rect.top + lineHeight
1815
+ };
1816
+ }
1817
+ return rect;
1818
+ }
1819
+ ignoreEvent() {
1820
+ return false;
1821
+ }
1822
+ };
1823
+ var commandMenu = (options) => {
1824
+ const commandMenuPlugin = import_view10.ViewPlugin.fromClass(class {
1825
+ constructor(view) {
1826
+ this.view = view;
1827
+ this.decorations = import_view10.Decoration.none;
1828
+ }
1829
+ // TODO(wittjosiah): The decorations are repainted on every update, this occasionally causes menu to flicker.
1830
+ update(update2) {
1831
+ const builder = new import_state12.RangeSetBuilder();
1832
+ const selection = update2.view.state.selection.main;
1833
+ const { range: activeRange, trigger } = update2.view.state.field(commandMenuState) ?? {};
1834
+ const shouldShowWidget = activeRange && selection.head >= activeRange.from && selection.head <= activeRange.to;
1835
+ if (shouldShowWidget) {
1836
+ builder.add(activeRange.from, activeRange.to, import_view10.Decoration.mark({
1837
+ tagName: "dx-ref-tag",
1838
+ class: "cm-ref-tag",
1839
+ attributes: {
1840
+ "data-auto-trigger": "true",
1841
+ "data-trigger": trigger
1842
+ }
1843
+ }));
1844
+ }
1845
+ const activeRangeChanged = update2.transactions.some((tr) => tr.effects.some((effect) => effect.is(commandRangeEffect)));
1846
+ if (activeRange && activeRangeChanged && trigger) {
1847
+ const content = update2.view.state.sliceDoc(activeRange.from + 1, activeRange.to);
1848
+ options.onTextChange?.(trigger, content);
1849
+ }
1850
+ this.decorations = builder.finish();
1851
+ }
1852
+ }, {
1853
+ decorations: (v) => v.decorations
1854
+ });
1855
+ const triggers = Array.isArray(options.trigger) ? options.trigger : [
1856
+ options.trigger
1857
+ ];
1858
+ const commandKeymap = import_view10.keymap.of([
1859
+ ...triggers.map((trigger) => ({
1860
+ key: trigger,
1861
+ preventDefault: true,
1862
+ run: (view) => {
1863
+ const selection = view.state.selection.main;
1864
+ const line = view.state.doc.lineAt(selection.head);
1865
+ if (line.text.trim() === "" || selection.head === line.from || selection.head > line.from && line.text[selection.head - line.from - 1] === " ") {
1866
+ view.dispatch({
1867
+ changes: {
1868
+ from: selection.head,
1869
+ insert: trigger
1870
+ },
1871
+ selection: {
1872
+ anchor: selection.head + 1,
1873
+ head: selection.head + 1
1874
+ },
1875
+ effects: commandRangeEffect.of({
1876
+ trigger,
1877
+ range: {
1878
+ from: selection.head,
1879
+ to: selection.head + 1
1880
+ }
1881
+ })
1882
+ });
1883
+ return true;
1884
+ }
1885
+ return false;
1886
+ }
1887
+ })),
1888
+ {
1889
+ key: "Enter",
1890
+ run: (view) => {
1891
+ const activeRange = view.state.field(commandMenuState)?.range;
1892
+ if (activeRange) {
1893
+ view.dispatch({
1894
+ changes: {
1895
+ from: activeRange.from,
1896
+ to: activeRange.to,
1897
+ insert: ""
1898
+ }
1899
+ });
1900
+ options.onEnter?.();
1901
+ return true;
1902
+ }
1903
+ return false;
1904
+ }
1905
+ },
1906
+ {
1907
+ key: "ArrowDown",
1908
+ run: (view) => {
1909
+ const activeRange = view.state.field(commandMenuState)?.range;
1910
+ if (activeRange) {
1911
+ options.onArrowDown?.();
1912
+ return true;
1913
+ }
1914
+ return false;
1915
+ }
1916
+ },
1917
+ {
1918
+ key: "ArrowUp",
1919
+ run: (view) => {
1920
+ const activeRange = view.state.field(commandMenuState)?.range;
1921
+ if (activeRange) {
1922
+ options.onArrowUp?.();
1923
+ return true;
1924
+ }
1925
+ return false;
1926
+ }
1927
+ }
1928
+ ]);
1929
+ const updateListener = import_view10.EditorView.updateListener.of((update2) => {
1930
+ const { trigger, range: activeRange } = update2.view.state.field(commandMenuState) ?? {};
1931
+ if (!activeRange || !trigger) {
1932
+ return;
1933
+ }
1934
+ const selection = update2.view.state.selection.main;
1935
+ const firstChar = update2.view.state.doc.sliceString(activeRange.from, activeRange.from + 1);
1936
+ const shouldRemove = firstChar !== trigger || // Trigger deleted.
1937
+ selection.head < activeRange.from || // Cursor moved before the range.
1938
+ selection.head > activeRange.to + 1;
1939
+ const nextRange = shouldRemove ? null : update2.docChanged ? {
1940
+ from: activeRange.from,
1941
+ to: selection.head
1942
+ } : activeRange;
1943
+ if (nextRange !== activeRange) {
1944
+ update2.view.dispatch({
1945
+ effects: commandRangeEffect.of(nextRange ? {
1946
+ trigger,
1947
+ range: nextRange
1948
+ } : null)
1949
+ });
1950
+ }
1951
+ if (shouldRemove) {
1952
+ options.onClose?.();
1953
+ }
1954
+ });
1955
+ return [
1956
+ import_state12.Prec.highest(commandKeymap),
1957
+ placeholder(Object.assign({
1958
+ content: `Press '${Array.isArray(options.trigger) ? options.trigger[0] : options.trigger}' for commands`
1959
+ }, options.placeholder)),
1960
+ updateListener,
1961
+ commandMenuState,
1962
+ commandMenuPlugin
1706
1963
  ];
1707
1964
  };
1965
+ var commandRangeEffect = import_state12.StateEffect.define();
1966
+ var commandMenuState = import_state12.StateField.define({
1967
+ create: () => null,
1968
+ update: (value, tr) => {
1969
+ let newValue = value;
1970
+ for (const effect of tr.effects) {
1971
+ if (effect.is(commandRangeEffect)) {
1972
+ newValue = effect.value;
1973
+ }
1974
+ }
1975
+ return newValue;
1976
+ }
1977
+ });
1708
1978
  var floatingMenu = (options = {}) => [
1709
- import_view10.ViewPlugin.fromClass(class {
1979
+ import_view12.ViewPlugin.fromClass(class {
1710
1980
  constructor(view) {
1711
1981
  this.view = view;
1712
1982
  const container = view.scrollDOM;
@@ -1771,7 +2041,7 @@ var floatingMenu = (options = {}) => [
1771
2041
  this.rafId = requestAnimationFrame(this.updateButtonPosition.bind(this));
1772
2042
  }
1773
2043
  }),
1774
- import_view10.EditorView.theme({
2044
+ import_view12.EditorView.theme({
1775
2045
  ".cm-ref-tag": {
1776
2046
  position: "fixed",
1777
2047
  padding: "0",
@@ -1781,9 +2051,6 @@ var floatingMenu = (options = {}) => [
1781
2051
  "[data-has-focus] & .cm-ref-tag": {
1782
2052
  opacity: "1"
1783
2053
  },
1784
- "[data-is-attention-source] & .cm-ref-tag": {
1785
- opacity: "1"
1786
- },
1787
2054
  ".cm-ref-tag button": {
1788
2055
  display: "grid",
1789
2056
  alignItems: "center",
@@ -1793,10 +2060,108 @@ var floatingMenu = (options = {}) => [
1793
2060
  }
1794
2061
  })
1795
2062
  ];
2063
+ var useCommandMenu = ({ viewRef, trigger, placeholder: placeholder3, getMenu }) => {
2064
+ const triggerRef = (0, import_react4.useRef)(null);
2065
+ const currentRef = (0, import_react4.useRef)(null);
2066
+ const groupsRef = (0, import_react4.useRef)([]);
2067
+ const [currentItem, setCurrentItem] = (0, import_react4.useState)();
2068
+ const [open, setOpen] = (0, import_react4.useState)(false);
2069
+ const [_, refresh] = (0, import_react4.useState)({});
2070
+ const handleOpenChange = (0, import_react4.useCallback)(async (open2, trigger2) => {
2071
+ if (open2 && trigger2) {
2072
+ groupsRef.current = await getMenu(trigger2);
2073
+ }
2074
+ setOpen(open2);
2075
+ if (!open2) {
2076
+ triggerRef.current = null;
2077
+ setCurrentItem(void 0);
2078
+ viewRef.current?.dispatch({
2079
+ effects: [
2080
+ commandRangeEffect.of(null)
2081
+ ]
2082
+ });
2083
+ }
2084
+ }, [
2085
+ getMenu
2086
+ ]);
2087
+ const handleActivate = (0, import_react4.useCallback)(async (event) => {
2088
+ const item = getItem(groupsRef.current, currentItem);
2089
+ if (item) {
2090
+ currentRef.current = item;
2091
+ }
2092
+ triggerRef.current = event.trigger;
2093
+ const triggerKey = event.trigger.getAttribute("data-trigger");
2094
+ if (!open && triggerKey) {
2095
+ await handleOpenChange(true, triggerKey);
2096
+ }
2097
+ }, [
2098
+ open,
2099
+ handleOpenChange
2100
+ ]);
2101
+ const handleSelect = (0, import_react4.useCallback)((item) => {
2102
+ const view = viewRef.current;
2103
+ if (!view) {
2104
+ return;
2105
+ }
2106
+ const selection = view.state.selection.main;
2107
+ void item.onSelect?.(view, selection.head);
2108
+ }, []);
2109
+ const serializedTrigger = Array.isArray(trigger) ? trigger.join(",") : trigger;
2110
+ const _commandMenu = (0, import_react4.useMemo)(() => {
2111
+ return commandMenu({
2112
+ trigger,
2113
+ placeholder: placeholder3,
2114
+ onClose: () => handleOpenChange(false),
2115
+ onArrowDown: () => {
2116
+ setCurrentItem((currentItem2) => {
2117
+ const next = getNextItem(groupsRef.current, currentItem2);
2118
+ currentRef.current = next;
2119
+ return next.id;
2120
+ });
2121
+ },
2122
+ onArrowUp: () => {
2123
+ setCurrentItem((currentItem2) => {
2124
+ const previous = getPreviousItem(groupsRef.current, currentItem2);
2125
+ currentRef.current = previous;
2126
+ return previous.id;
2127
+ });
2128
+ },
2129
+ onEnter: () => {
2130
+ if (currentRef.current) {
2131
+ handleSelect(currentRef.current);
2132
+ }
2133
+ },
2134
+ onTextChange: async (trigger2, text) => {
2135
+ groupsRef.current = await getMenu(trigger2, text);
2136
+ const firstItem = groupsRef.current.filter((group) => group.items.length > 0)[0]?.items[0];
2137
+ if (firstItem) {
2138
+ setCurrentItem(firstItem.id);
2139
+ currentRef.current = firstItem;
2140
+ }
2141
+ refresh({});
2142
+ }
2143
+ });
2144
+ }, [
2145
+ handleOpenChange,
2146
+ getMenu,
2147
+ serializedTrigger,
2148
+ placeholder3
2149
+ ]);
2150
+ return {
2151
+ commandMenu: _commandMenu,
2152
+ currentItem,
2153
+ groupsRef,
2154
+ ref: triggerRef,
2155
+ open,
2156
+ onActivate: handleActivate,
2157
+ onOpenChange: setOpen,
2158
+ onSelect: handleSelect
2159
+ };
2160
+ };
1796
2161
  var typeahead = ({ onComplete } = {}) => {
1797
- let hint;
2162
+ let hint2;
1798
2163
  const complete = (view) => {
1799
- if (!hint) {
2164
+ if (!hint2) {
1800
2165
  return false;
1801
2166
  }
1802
2167
  const selection = view.state.selection.main;
@@ -1805,30 +2170,30 @@ var typeahead = ({ onComplete } = {}) => {
1805
2170
  {
1806
2171
  from: selection.from,
1807
2172
  to: selection.to,
1808
- insert: hint
2173
+ insert: hint2
1809
2174
  }
1810
2175
  ],
1811
- selection: import_state11.EditorSelection.cursor(selection.from + hint.length)
2176
+ selection: import_state13.EditorSelection.cursor(selection.from + hint2.length)
1812
2177
  });
1813
2178
  return true;
1814
2179
  };
1815
2180
  return [
1816
- import_view11.ViewPlugin.fromClass(class {
2181
+ import_view13.ViewPlugin.fromClass(class {
1817
2182
  constructor() {
1818
- this.decorations = import_view11.Decoration.none;
2183
+ this.decorations = import_view13.Decoration.none;
1819
2184
  }
1820
2185
  update(update2) {
1821
- const builder = new import_state11.RangeSetBuilder();
2186
+ const builder = new import_state13.RangeSetBuilder();
1822
2187
  const selection = update2.view.state.selection.main;
1823
2188
  const line = update2.view.state.doc.lineAt(selection.from);
1824
2189
  if (selection.from === selection.to && selection.from === line.to) {
1825
2190
  const str = update2.state.sliceDoc(line.from, selection.from);
1826
- hint = onComplete?.({
2191
+ hint2 = onComplete?.({
1827
2192
  line: str
1828
2193
  });
1829
- if (hint) {
1830
- builder.add(selection.from, selection.to, import_view11.Decoration.widget({
1831
- widget: new Hint(hint)
2194
+ if (hint2) {
2195
+ builder.add(selection.from, selection.to, import_view13.Decoration.widget({
2196
+ widget: new Hint(hint2)
1832
2197
  }));
1833
2198
  }
1834
2199
  }
@@ -1838,7 +2203,7 @@ var typeahead = ({ onComplete } = {}) => {
1838
2203
  decorations: (v) => v.decorations
1839
2204
  }),
1840
2205
  // Keys.
1841
- import_state11.Prec.highest(import_view11.keymap.of([
2206
+ import_state13.Prec.highest(import_view13.keymap.of([
1842
2207
  {
1843
2208
  key: "Tab",
1844
2209
  preventDefault: true,
@@ -1879,10 +2244,10 @@ var createEditorStateTransaction = ({ scrollTo, selection }) => {
1879
2244
  return {
1880
2245
  selection,
1881
2246
  scrollIntoView: !scrollTo,
1882
- effects: scrollTo ? import_view13.EditorView.scrollIntoView(scrollTo, {
2247
+ effects: scrollTo ? import_view15.EditorView.scrollIntoView(scrollTo, {
1883
2248
  yMargin: 96
1884
2249
  }) : void 0,
1885
- annotations: import_state13.Transaction.userEvent.of(stateRestoreAnnotation)
2250
+ annotations: import_state15.Transaction.userEvent.of(stateRestoreAnnotation)
1886
2251
  };
1887
2252
  };
1888
2253
  var createEditorStateStore = (keyPrefix) => ({
@@ -1921,7 +2286,7 @@ var selectionState = ({ getState, setState } = {}) => {
1921
2286
  // setStateDebounced(id, {});
1922
2287
  // },
1923
2288
  // }),
1924
- import_view13.EditorView.updateListener.of(({ view, transactions }) => {
2289
+ import_view15.EditorView.updateListener.of(({ view, transactions }) => {
1925
2290
  const id = view.state.facet(documentId);
1926
2291
  if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
1927
2292
  return;
@@ -1944,7 +2309,7 @@ var selectionState = ({ getState, setState } = {}) => {
1944
2309
  }
1945
2310
  }
1946
2311
  }),
1947
- getState && import_view13.keymap.of([
2312
+ getState && import_view15.keymap.of([
1948
2313
  {
1949
2314
  key: "ctrl-r",
1950
2315
  run: (view) => {
@@ -1956,13 +2321,13 @@ var selectionState = ({ getState, setState } = {}) => {
1956
2321
  }
1957
2322
  }
1958
2323
  ])
1959
- ].filter(import_util2.isNotFalsy);
2324
+ ].filter(import_util3.isNotFalsy);
1960
2325
  };
1961
2326
  var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
1962
- var setComments = import_state12.StateEffect.define();
1963
- var setSelection = import_state12.StateEffect.define();
1964
- var setCommentState = import_state12.StateEffect.define();
1965
- var commentsState = import_state12.StateField.define({
2327
+ var setComments = import_state14.StateEffect.define();
2328
+ var setSelection = import_state14.StateEffect.define();
2329
+ var setCommentState = import_state14.StateEffect.define();
2330
+ var commentsState = import_state14.StateField.define({
1966
2331
  create: (state) => ({
1967
2332
  id: state.facet(documentId),
1968
2333
  comments: [],
@@ -1987,7 +2352,7 @@ var commentsState = import_state12.StateField.define({
1987
2352
  comment,
1988
2353
  range
1989
2354
  };
1990
- }).filter(import_util.isNonNullable);
2355
+ }).filter(import_util2.isNonNullable);
1991
2356
  return {
1992
2357
  ...value,
1993
2358
  comments: commentStates
@@ -2000,7 +2365,7 @@ var commentsState = import_state12.StateField.define({
2000
2365
  return value;
2001
2366
  }
2002
2367
  });
2003
- var styles2 = import_view12.EditorView.theme({
2368
+ var styles2 = import_view14.EditorView.theme({
2004
2369
  ".cm-comment, .cm-comment-current": {
2005
2370
  margin: "0 -3px",
2006
2371
  padding: "3px",
@@ -2013,14 +2378,14 @@ var styles2 = import_view12.EditorView.theme({
2013
2378
  textDecoration: "underline"
2014
2379
  }
2015
2380
  });
2016
- var createCommentMark = (id, isCurrent) => import_view12.Decoration.mark({
2381
+ var createCommentMark = (id, isCurrent) => import_view14.Decoration.mark({
2017
2382
  class: isCurrent ? "cm-comment-current" : "cm-comment",
2018
2383
  attributes: {
2019
2384
  "data-testid": "cm-comment",
2020
2385
  "data-comment-id": id
2021
2386
  }
2022
2387
  });
2023
- var commentsDecorations = import_view12.EditorView.decorations.compute([
2388
+ var commentsDecorations = import_view14.EditorView.decorations.compute([
2024
2389
  commentsState
2025
2390
  ], (state) => {
2026
2391
  const { selection: { current }, comments: comments2 } = state.field(commentsState);
@@ -2039,11 +2404,11 @@ var commentsDecorations = import_view12.EditorView.decorations.compute([
2039
2404
  }
2040
2405
  const mark = createCommentMark(comment.comment.id, comment.comment.id === current);
2041
2406
  return mark.range(range.from, range.to);
2042
- }).filter(import_util.isNonNullable);
2043
- return import_view12.Decoration.set(decorations2);
2407
+ }).filter(import_util2.isNonNullable);
2408
+ return import_view14.Decoration.set(decorations2);
2044
2409
  });
2045
- var commentClickedEffect = import_state12.StateEffect.define();
2046
- var handleCommentClick = import_view12.EditorView.domEventHandlers({
2410
+ var commentClickedEffect = import_state14.StateEffect.define();
2411
+ var handleCommentClick = import_view14.EditorView.domEventHandlers({
2047
2412
  click: (event, view) => {
2048
2413
  let target = event.target;
2049
2414
  const editorRoot = view.dom;
@@ -2082,7 +2447,7 @@ var trackPastedComments = (onUpdate) => {
2082
2447
  }
2083
2448
  };
2084
2449
  return [
2085
- import_view12.EditorView.domEventHandlers({
2450
+ import_view14.EditorView.domEventHandlers({
2086
2451
  cut: handleTrack,
2087
2452
  copy: handleTrack
2088
2453
  }),
@@ -2104,7 +2469,7 @@ var trackPastedComments = (onUpdate) => {
2104
2469
  return effects;
2105
2470
  }),
2106
2471
  // Handle paste or the undo of comment deletion.
2107
- import_view12.EditorView.updateListener.of((update2) => {
2472
+ import_view14.EditorView.updateListener.of((update2) => {
2108
2473
  const restore = [];
2109
2474
  for (let i = 0; i < update2.transactions.length; i++) {
2110
2475
  const tr = update2.transactions[i];
@@ -2160,7 +2525,7 @@ var mapTrackedComment = (comment, changes) => ({
2160
2525
  from: changes.mapPos(comment.from, 1),
2161
2526
  to: changes.mapPos(comment.to, 1)
2162
2527
  });
2163
- var restoreCommentEffect = import_state12.StateEffect.define({
2528
+ var restoreCommentEffect = import_state14.StateEffect.define({
2164
2529
  map: mapTrackedComment
2165
2530
  });
2166
2531
  var createComment = (view) => {
@@ -2205,7 +2570,7 @@ var comments = (options = {}) => {
2205
2570
  //
2206
2571
  // Keymap.
2207
2572
  //
2208
- options.onCreate && import_view12.keymap.of([
2573
+ options.onCreate && import_view14.keymap.of([
2209
2574
  {
2210
2575
  key: shortcut,
2211
2576
  run: callbackWrapper(createComment)
@@ -2215,7 +2580,7 @@ var comments = (options = {}) => {
2215
2580
  // Hover tooltip (for key shortcut hints, etc.)
2216
2581
  // TODO(burdon): Factor out to generic hints extension for current selection/line.
2217
2582
  //
2218
- options.renderTooltip && (0, import_view12.hoverTooltip)((view, pos) => {
2583
+ options.renderTooltip && (0, import_view14.hoverTooltip)((view, pos) => {
2219
2584
  const selection = view.state.selection.main;
2220
2585
  if (selection && pos >= selection.from && pos <= selection.to) {
2221
2586
  return {
@@ -2246,7 +2611,7 @@ var comments = (options = {}) => {
2246
2611
  //
2247
2612
  // Track deleted ranges and update ranges for decorations.
2248
2613
  //
2249
- import_view12.EditorView.updateListener.of(({ view, state, changes }) => {
2614
+ import_view14.EditorView.updateListener.of(({ view, state, changes }) => {
2250
2615
  let mod = false;
2251
2616
  const { comments: comments2, ...value } = state.field(commentsState);
2252
2617
  changes.iterChanges((from, to, from2, to2) => {
@@ -2278,7 +2643,7 @@ var comments = (options = {}) => {
2278
2643
  //
2279
2644
  // Track selection/proximity.
2280
2645
  //
2281
- import_view12.EditorView.updateListener.of(({ view, state }) => {
2646
+ import_view14.EditorView.updateListener.of(({ view, state }) => {
2282
2647
  let min = Infinity;
2283
2648
  const { selection: { current, closest }, comments: comments2 } = state.field(commentsState);
2284
2649
  const { head } = state.selection.main;
@@ -2312,7 +2677,7 @@ var comments = (options = {}) => {
2312
2677
  }
2313
2678
  }),
2314
2679
  options.onUpdate && trackPastedComments(options.onUpdate)
2315
- ].filter(import_util.isNonNullable);
2680
+ ].filter(import_util2.isNonNullable);
2316
2681
  };
2317
2682
  var scrollThreadIntoView = (view, id, center = true) => {
2318
2683
  const comment = view.state.field(commentsState).comments.find((range2) => range2.comment.id === id);
@@ -2332,7 +2697,7 @@ var scrollThreadIntoView = (view, id, center = true) => {
2332
2697
  anchor: range.from
2333
2698
  } : void 0,
2334
2699
  effects: [
2335
- needsScroll ? import_view12.EditorView.scrollIntoView(range.from, center ? {
2700
+ needsScroll ? import_view14.EditorView.scrollIntoView(range.from, center ? {
2336
2701
  y: "center"
2337
2702
  } : void 0) : [],
2338
2703
  needsSelectionUpdate ? setSelection.of({
@@ -2362,13 +2727,13 @@ var ExternalCommentSync = class {
2362
2727
  this.unsubscribe = subscribe(updateComments);
2363
2728
  }
2364
2729
  };
2365
- var createExternalCommentSync = (id, subscribe, getComments) => import_view12.ViewPlugin.fromClass(class {
2730
+ var createExternalCommentSync = (id, subscribe, getComments) => import_view14.ViewPlugin.fromClass(class {
2366
2731
  constructor(view) {
2367
2732
  return new ExternalCommentSync(view, id, subscribe, getComments);
2368
2733
  }
2369
2734
  });
2370
2735
  var useComments = (view, id, comments2) => {
2371
- (0, import_react4.useEffect)(() => {
2736
+ (0, import_react5.useEffect)(() => {
2372
2737
  if (view) {
2373
2738
  if (id === view.state.facet(documentId)) {
2374
2739
  view.dispatch({
@@ -2385,12 +2750,12 @@ var debugNodeLogger = (log9 = console.log) => {
2385
2750
  const logTokens = (state) => (0, import_language.syntaxTree)(state).iterate({
2386
2751
  enter: (node) => log9(node.type)
2387
2752
  });
2388
- return import_state14.StateField.define({
2753
+ return import_state16.StateField.define({
2389
2754
  create: (state) => logTokens(state),
2390
2755
  update: (_, tr) => logTokens(tr.state)
2391
2756
  });
2392
2757
  };
2393
- var styles3 = import_view14.EditorView.theme({
2758
+ var styles3 = import_view16.EditorView.theme({
2394
2759
  ".cm-dropCursor": {
2395
2760
  borderLeft: "2px solid var(--dx-accentText)",
2396
2761
  color: "var(--dx-accentText)",
@@ -2403,8 +2768,8 @@ var styles3 = import_view14.EditorView.theme({
2403
2768
  var dropFile = (options = {}) => {
2404
2769
  return [
2405
2770
  styles3,
2406
- (0, import_view14.dropCursor)(),
2407
- import_view14.EditorView.domEventHandlers({
2771
+ (0, import_view16.dropCursor)(),
2772
+ import_view16.EditorView.domEventHandlers({
2408
2773
  drop: (event, view) => {
2409
2774
  event.preventDefault();
2410
2775
  const files = event.dataTransfer?.files;
@@ -2423,8 +2788,8 @@ var dropFile = (options = {}) => {
2423
2788
  })
2424
2789
  ];
2425
2790
  };
2426
- var focusEffect = import_state16.StateEffect.define();
2427
- var focusField = import_state16.StateField.define({
2791
+ var focusEffect = import_state18.StateEffect.define();
2792
+ var focusField = import_state18.StateField.define({
2428
2793
  create: () => false,
2429
2794
  update: (value, tr) => {
2430
2795
  for (const effect of tr.effects) {
@@ -2437,7 +2802,7 @@ var focusField = import_state16.StateField.define({
2437
2802
  });
2438
2803
  var focus = [
2439
2804
  focusField,
2440
- import_view16.EditorView.domEventHandlers({
2805
+ import_view18.EditorView.domEventHandlers({
2441
2806
  focus: (event, view) => {
2442
2807
  setTimeout(() => view.dispatch({
2443
2808
  effects: focusEffect.of(true)
@@ -2467,7 +2832,7 @@ var theme = {
2467
2832
  }
2468
2833
  };
2469
2834
  var getToken = (path, defaultValue) => {
2470
- const value = (0, import_util4.get)(import_react_ui_theme4.tokens, path, defaultValue);
2835
+ const value = (0, import_util5.get)(import_react_ui_theme4.tokens, path, defaultValue);
2471
2836
  return value?.toString() ?? "";
2472
2837
  };
2473
2838
  var fontBody = getToken("fontFamily.body");
@@ -2682,8 +3047,30 @@ var defaultTheme = {
2682
3047
  borderTop: "1px solid var(--dx-separator)"
2683
3048
  }
2684
3049
  };
3050
+ var editorWidth = "!mli-auto is-full max-is-[min(50rem,100%-4rem)]";
3051
+ var editorSlots = {
3052
+ scroll: {
3053
+ className: "pbs-2"
3054
+ },
3055
+ content: {
3056
+ className: editorWidth
3057
+ }
3058
+ };
3059
+ var editorGutter = import_view19.EditorView.theme({
3060
+ ".cm-gutters": {
3061
+ background: "var(--dx-baseSurface)",
3062
+ paddingRight: "1rem"
3063
+ }
3064
+ });
3065
+ var editorMonospace = import_view19.EditorView.theme({
3066
+ ".cm-content": {
3067
+ fontFamily: fontMono
3068
+ }
3069
+ });
3070
+ var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden";
3071
+ var stackItemContentEditorClassNames = (role) => (0, import_react_ui_theme2.mx)("attention-surface dx-focus-ring-inset data-[toolbar=disabled]:pbs-2", role === "section" ? "[&_.cm-scroller]:overflow-hidden [&_.cm-scroller]:min-bs-24" : "min-bs-0");
2685
3072
  var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
2686
- var preventNewline = import_state15.EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
3073
+ var preventNewline = import_state17.EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
2687
3074
  var defaultBasicOptions = {
2688
3075
  allowMultipleSelections: true,
2689
3076
  bracketMatching: true,
@@ -2705,33 +3092,37 @@ var createBasicExtensions = (_props) => {
2705
3092
  const props = (0, import_lodash3.default)({}, _props, defaultBasicOptions);
2706
3093
  return [
2707
3094
  // NOTE: Doesn't catch errors in keymap functions.
2708
- import_view15.EditorView.exceptionSink.of((err) => {
3095
+ import_view17.EditorView.exceptionSink.of((err) => {
2709
3096
  import_log5.log.catch(err, void 0, {
2710
3097
  F: __dxlog_file8,
2711
- L: 98,
3098
+ L: 100,
2712
3099
  S: void 0,
2713
3100
  C: (f, a) => f(...a)
2714
3101
  });
2715
3102
  }),
2716
- props.allowMultipleSelections && import_state15.EditorState.allowMultipleSelections.of(true),
3103
+ props.allowMultipleSelections && import_state17.EditorState.allowMultipleSelections.of(true),
2717
3104
  props.bracketMatching && (0, import_language2.bracketMatching)(),
2718
3105
  props.closeBrackets && (0, import_autocomplete2.closeBrackets)(),
2719
- props.dropCursor && (0, import_view15.dropCursor)(),
2720
- props.drawSelection && (0, import_view15.drawSelection)({
3106
+ props.dropCursor && (0, import_view17.dropCursor)(),
3107
+ props.drawSelection && (0, import_view17.drawSelection)({
2721
3108
  cursorBlinkRate: 1200
2722
3109
  }),
2723
- props.editable !== void 0 && import_view15.EditorView.editable.of(props.editable),
3110
+ props.editable !== void 0 && import_view17.EditorView.editable.of(props.editable),
2724
3111
  props.focus && focus,
2725
- props.highlightActiveLine && (0, import_view15.highlightActiveLine)(),
3112
+ props.highlightActiveLine && (0, import_view17.highlightActiveLine)(),
2726
3113
  props.history && (0, import_commands2.history)(),
2727
- props.lineNumbers && (0, import_view15.lineNumbers)(),
2728
- props.lineWrapping && import_view15.EditorView.lineWrapping,
2729
- props.placeholder && (0, import_view15.placeholder)(props.placeholder),
2730
- props.readOnly !== void 0 && import_state15.EditorState.readOnly.of(props.readOnly),
2731
- props.scrollPastEnd && (0, import_view15.scrollPastEnd)(),
2732
- props.tabSize && import_state15.EditorState.tabSize.of(props.tabSize),
3114
+ props.lineNumbers && [
3115
+ (0, import_view17.lineNumbers)(),
3116
+ editorGutter
3117
+ ],
3118
+ props.lineWrapping && import_view17.EditorView.lineWrapping,
3119
+ props.monospace && editorMonospace,
3120
+ props.placeholder && (0, import_view17.placeholder)(props.placeholder),
3121
+ props.readOnly !== void 0 && import_state17.EditorState.readOnly.of(props.readOnly),
3122
+ props.scrollPastEnd && (0, import_view17.scrollPastEnd)(),
3123
+ props.tabSize && import_state17.EditorState.tabSize.of(props.tabSize),
2733
3124
  // https://codemirror.net/docs/ref/#view.KeyBinding
2734
- import_view15.keymap.of([
3125
+ import_view17.keymap.of([
2735
3126
  ...(props.keymap && keymaps[props.keymap]) ?? [],
2736
3127
  // NOTE: Tabs are also configured by markdown extension.
2737
3128
  // https://codemirror.net/docs/ref/#commands.indentWithTab
@@ -2751,8 +3142,8 @@ var createBasicExtensions = (_props) => {
2751
3142
  preventDefault: true,
2752
3143
  run: () => true
2753
3144
  }
2754
- ].filter(import_util3.isNotFalsy))
2755
- ].filter(import_util3.isNotFalsy);
3145
+ ].filter(import_util4.isNotFalsy))
3146
+ ].filter(import_util4.isNotFalsy);
2756
3147
  };
2757
3148
  var defaultThemeSlots = {
2758
3149
  editor: {
@@ -2762,22 +3153,22 @@ var defaultThemeSlots = {
2762
3153
  var createThemeExtensions = ({ themeMode, styles: styles4, syntaxHighlighting: _syntaxHighlighting, slots: _slots } = {}) => {
2763
3154
  const slots = (0, import_lodash3.default)({}, _slots, defaultThemeSlots);
2764
3155
  return [
2765
- import_view15.EditorView.darkTheme.of(themeMode === "dark"),
2766
- import_view15.EditorView.baseTheme(styles4 ? (0, import_lodash4.default)({}, defaultTheme, styles4) : defaultTheme),
3156
+ import_view17.EditorView.darkTheme.of(themeMode === "dark"),
3157
+ import_view17.EditorView.baseTheme(styles4 ? (0, import_lodash4.default)({}, defaultTheme, styles4) : defaultTheme),
2767
3158
  // https://github.com/codemirror/theme-one-dark
2768
3159
  _syntaxHighlighting && (themeMode === "dark" ? (0, import_language2.syntaxHighlighting)(import_theme_one_dark.oneDarkHighlightStyle) : (0, import_language2.syntaxHighlighting)(import_language2.defaultHighlightStyle)),
2769
- slots.editor?.className && import_view15.EditorView.editorAttributes.of({
3160
+ slots.editor?.className && import_view17.EditorView.editorAttributes.of({
2770
3161
  class: slots.editor.className
2771
3162
  }),
2772
- slots.content?.className && import_view15.EditorView.contentAttributes.of({
3163
+ slots.content?.className && import_view17.EditorView.contentAttributes.of({
2773
3164
  class: slots.content.className
2774
3165
  }),
2775
- slots.scroll?.className && import_view15.ViewPlugin.fromClass(class {
3166
+ slots.scroll?.className && import_view17.ViewPlugin.fromClass(class {
2776
3167
  constructor(view) {
2777
3168
  view.scrollDOM.classList.add(slots.scroll.className);
2778
3169
  }
2779
3170
  })
2780
- ].filter(import_util3.isNotFalsy);
3171
+ ].filter(import_util4.isNotFalsy);
2781
3172
  };
2782
3173
  var createDataExtensions = ({ id, text, space, identity }) => {
2783
3174
  const extensions = [];
@@ -2786,7 +3177,7 @@ var createDataExtensions = ({ id, text, space, identity }) => {
2786
3177
  }
2787
3178
  if (space && identity) {
2788
3179
  const peerId = identity?.identityKey.toHex();
2789
- const hue = identity?.profile?.data?.hue ?? (0, import_util3.hexToHue)(peerId ?? "0");
3180
+ const hue = identity?.profile?.data?.hue ?? (0, import_util4.hexToHue)(peerId ?? "0");
2790
3181
  extensions.push(awareness(new SpaceAwarenessProvider({
2791
3182
  space,
2792
3183
  channel: `awareness.${id}`,
@@ -2811,7 +3202,7 @@ var folding = (_props = {}) => [
2811
3202
  const el = createElement("div", {
2812
3203
  className: "flex h-full items-center"
2813
3204
  });
2814
- return renderRoot(el, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Icon, {
3205
+ return renderRoot(el, /* @__PURE__ */ import_react6.default.createElement(import_react_ui3.Icon, {
2815
3206
  icon: "ph--caret-right--bold",
2816
3207
  size: 3,
2817
3208
  classNames: [
@@ -2821,7 +3212,7 @@ var folding = (_props = {}) => [
2821
3212
  }));
2822
3213
  }
2823
3214
  }),
2824
- import_view17.EditorView.theme({
3215
+ import_view20.EditorView.theme({
2825
3216
  ".cm-foldGutter": {
2826
3217
  opacity: 0.3,
2827
3218
  transition: "opacity 0.3s",
@@ -2832,7 +3223,7 @@ var folding = (_props = {}) => [
2832
3223
  }
2833
3224
  })
2834
3225
  ];
2835
- var TagWidget = class extends import_view18.WidgetType {
3226
+ var TagWidget = class extends import_view21.WidgetType {
2836
3227
  constructor(_text) {
2837
3228
  super(), this._text = _text;
2838
3229
  }
@@ -2843,14 +3234,14 @@ var TagWidget = class extends import_view18.WidgetType {
2843
3234
  return span;
2844
3235
  }
2845
3236
  };
2846
- var tagMatcher = new import_view18.MatchDecorator({
3237
+ var tagMatcher = new import_view21.MatchDecorator({
2847
3238
  regexp: /#(\w+)\W/g,
2848
- decoration: (match) => import_view18.Decoration.replace({
3239
+ decoration: (match) => import_view21.Decoration.replace({
2849
3240
  widget: new TagWidget(match[1])
2850
3241
  })
2851
3242
  });
2852
3243
  var hashtag = () => [
2853
- import_view18.ViewPlugin.fromClass(class {
3244
+ import_view21.ViewPlugin.fromClass(class {
2854
3245
  constructor(view) {
2855
3246
  this.tags = tagMatcher.createDeco(view);
2856
3247
  }
@@ -2859,11 +3250,11 @@ var hashtag = () => [
2859
3250
  }
2860
3251
  }, {
2861
3252
  decorations: (instance) => instance.tags,
2862
- provide: (plugin) => import_view18.EditorView.atomicRanges.of((view) => {
2863
- return view.plugin(plugin)?.tags || import_view18.Decoration.none;
3253
+ provide: (plugin) => import_view21.EditorView.atomicRanges.of((view) => {
3254
+ return view.plugin(plugin)?.tags || import_view21.Decoration.none;
2864
3255
  })
2865
3256
  }),
2866
- import_view18.EditorView.theme({
3257
+ import_view21.EditorView.theme({
2867
3258
  ".cm-tag": {
2868
3259
  borderRadius: "4px",
2869
3260
  marginRight: "6px",
@@ -2913,11 +3304,11 @@ var schemaLinter = (validate) => (view) => {
2913
3304
  };
2914
3305
  var listener = ({ onFocus, onChange }) => {
2915
3306
  const extensions = [];
2916
- onFocus && extensions.push(import_view19.EditorView.focusChangeEffect.of((_, focusing) => {
3307
+ onFocus && extensions.push(import_view22.EditorView.focusChangeEffect.of((_, focusing) => {
2917
3308
  onFocus(focusing);
2918
3309
  return null;
2919
3310
  }));
2920
- onChange && extensions.push(import_view19.EditorView.updateListener.of((update2) => {
3311
+ onChange && extensions.push(import_view22.EditorView.updateListener.of((update2) => {
2921
3312
  onChange(update2.state.doc.toString(), update2.state.facet(documentId));
2922
3313
  }));
2923
3314
  return extensions;
@@ -3040,7 +3431,7 @@ var setStyle = (type, enable) => {
3040
3431
  to: range.head + found + marker.length
3041
3432
  }
3042
3433
  ],
3043
- range: import_state17.EditorSelection.cursor(range.from - marker.length)
3434
+ range: import_state19.EditorSelection.cursor(range.from - marker.length)
3044
3435
  };
3045
3436
  }
3046
3437
  }
@@ -3168,13 +3559,13 @@ var setStyle = (type, enable) => {
3168
3559
  from: range.head,
3169
3560
  insert: marker + marker
3170
3561
  },
3171
- range: import_state17.EditorSelection.cursor(range.head + marker.length)
3562
+ range: import_state19.EditorSelection.cursor(range.head + marker.length)
3172
3563
  };
3173
3564
  }
3174
3565
  const changeSet = state.changes(changes2.concat(changesAtEnd));
3175
3566
  return {
3176
3567
  changes: changeSet,
3177
- range: range.empty && !changeSet.empty ? import_state17.EditorSelection.cursor(range.head + marker.length) : import_state17.EditorSelection.range(changeSet.mapPos(range.from, 1), changeSet.mapPos(range.to, -1))
3568
+ range: range.empty && !changeSet.empty ? import_state19.EditorSelection.cursor(range.head + marker.length) : import_state19.EditorSelection.range(changeSet.mapPos(range.from, 1), changeSet.mapPos(range.to, -1))
3178
3569
  };
3179
3570
  });
3180
3571
  dispatch(state.update(changes, {
@@ -3374,7 +3765,7 @@ var addLink = ({ url, image: image2 } = {}) => {
3374
3765
  const changeSet = state.changes(changes2.concat(changesAfter));
3375
3766
  return {
3376
3767
  changes: changeSet,
3377
- range: import_state17.EditorSelection.cursor(changeSet.mapPos(to, 1) - cursorOffset - (url ? url.length + 2 : 0))
3768
+ range: import_state19.EditorSelection.cursor(changeSet.mapPos(to, 1) - cursorOffset - (url ? url.length + 2 : 0))
3378
3769
  };
3379
3770
  });
3380
3771
  if (changes.changes.empty) {
@@ -3808,7 +4199,7 @@ var toggleCodeblock = (target) => {
3808
4199
  };
3809
4200
  var formattingKeymap = (_options = {}) => {
3810
4201
  return [
3811
- import_view20.keymap.of([
4202
+ import_view23.keymap.of([
3812
4203
  {
3813
4204
  key: "meta-b",
3814
4205
  run: toggleStrong
@@ -4009,7 +4400,7 @@ var getFormatting = (state) => {
4009
4400
  };
4010
4401
  };
4011
4402
  var useFormattingState = (state) => {
4012
- return (0, import_react6.useMemo)(() => import_view20.EditorView.updateListener.of((update2) => {
4403
+ return (0, import_react7.useMemo)(() => import_view23.EditorView.updateListener.of((update2) => {
4013
4404
  if (update2.docChanged || update2.selectionSet) {
4014
4405
  Object.entries(getFormatting(update2.state)).forEach(([key, active]) => {
4015
4406
  state[key] = active;
@@ -4261,17 +4652,16 @@ var createMarkdownExtensions = (options = {}) => {
4261
4652
  }),
4262
4653
  // Custom styles.
4263
4654
  (0, import_language5.syntaxHighlighting)(markdownHighlightStyle()),
4264
- import_view21.keymap.of([
4655
+ import_view24.keymap.of([
4265
4656
  // https://codemirror.net/docs/ref/#commands.indentWithTab
4266
4657
  options.indentWithTab !== false && import_commands3.indentWithTab,
4267
4658
  // https://codemirror.net/docs/ref/#commands.defaultKeymap
4268
4659
  ...import_commands3.defaultKeymap,
4269
- ...import_autocomplete4.completionKeymap,
4270
- ...import_lint2.lintKeymap
4271
- ].filter(import_util5.isNotFalsy))
4660
+ ...import_autocomplete4.completionKeymap
4661
+ ].filter(import_util6.isNotFalsy))
4272
4662
  ];
4273
4663
  };
4274
- var debugTree = (cb) => import_state18.StateField.define({
4664
+ var debugTree = (cb) => import_state20.StateField.define({
4275
4665
  create: (state) => cb(convertTreeToJson(state)),
4276
4666
  update: (value, tr) => cb(convertTreeToJson(tr.state))
4277
4667
  });
@@ -4295,12 +4685,12 @@ var convertTreeToJson = (state) => {
4295
4685
  return treeToJson((0, import_language7.syntaxTree)(state).cursor());
4296
4686
  };
4297
4687
  var adjustChanges = () => {
4298
- return import_view23.ViewPlugin.fromClass(class {
4688
+ return import_view26.ViewPlugin.fromClass(class {
4299
4689
  update(update2) {
4300
4690
  const tree = (0, import_language9.syntaxTree)(update2.state);
4301
4691
  const adjustments = [];
4302
4692
  for (const tr of update2.transactions) {
4303
- const event = tr.annotation(import_state20.Transaction.userEvent);
4693
+ const event = tr.annotation(import_state22.Transaction.userEvent);
4304
4694
  switch (event) {
4305
4695
  //
4306
4696
  // Enter
@@ -4435,9 +4825,9 @@ var getValidUrl = (str) => {
4435
4825
  };
4436
4826
  var image = (_options = {}) => {
4437
4827
  return [
4438
- import_state21.StateField.define({
4828
+ import_state23.StateField.define({
4439
4829
  create: (state) => {
4440
- return import_view24.Decoration.set(buildDecorations(0, state.doc.length, state));
4830
+ return import_view27.Decoration.set(buildDecorations(0, state.doc.length, state));
4441
4831
  },
4442
4832
  update: (value, tr) => {
4443
4833
  if (!tr.docChanged && !tr.selection) {
@@ -4460,7 +4850,7 @@ var image = (_options = {}) => {
4460
4850
  add: buildDecorations(from, to, tr.state)
4461
4851
  });
4462
4852
  },
4463
- provide: (field) => import_view24.EditorView.decorations.from(field)
4853
+ provide: (field) => import_view27.EditorView.decorations.from(field)
4464
4854
  })
4465
4855
  ];
4466
4856
  };
@@ -4478,7 +4868,7 @@ var buildDecorations = (from, to, state) => {
4478
4868
  return;
4479
4869
  }
4480
4870
  preloadImage(url);
4481
- decorations2.push(import_view24.Decoration.replace({
4871
+ decorations2.push(import_view27.Decoration.replace({
4482
4872
  block: true,
4483
4873
  widget: new ImageWidget(url)
4484
4874
  }).range(hide2 ? node.from : node.to, node.to));
@@ -4498,7 +4888,7 @@ var preloadImage = (url) => {
4498
4888
  preloaded.add(url);
4499
4889
  }
4500
4890
  };
4501
- var ImageWidget = class extends import_view24.WidgetType {
4891
+ var ImageWidget = class extends import_view27.WidgetType {
4502
4892
  constructor(_url) {
4503
4893
  super(), this._url = _url;
4504
4894
  }
@@ -4519,7 +4909,7 @@ var ImageWidget = class extends import_view24.WidgetType {
4519
4909
  };
4520
4910
  var bulletListIndentationWidth = 24;
4521
4911
  var orderedListIndentationWidth = 36;
4522
- var formattingStyles = import_view25.EditorView.theme({
4912
+ var formattingStyles = import_view28.EditorView.theme({
4523
4913
  /**
4524
4914
  * Horizontal rule.
4525
4915
  */
@@ -4638,14 +5028,14 @@ var formattingStyles = import_view25.EditorView.theme({
4638
5028
  }
4639
5029
  });
4640
5030
  var table = (options = {}) => {
4641
- return import_state22.StateField.define({
5031
+ return import_state24.StateField.define({
4642
5032
  create: (state) => update(state, options),
4643
5033
  update: (_, tr) => update(tr.state, options),
4644
- provide: (field) => import_view26.EditorView.decorations.from(field)
5034
+ provide: (field) => import_view29.EditorView.decorations.from(field)
4645
5035
  });
4646
5036
  };
4647
5037
  var update = (state, _options) => {
4648
- const builder = new import_state22.RangeSetBuilder();
5038
+ const builder = new import_state24.RangeSetBuilder();
4649
5039
  const cursor = state.selection.main.head;
4650
5040
  const tables = [];
4651
5041
  const getTable = () => tables[tables.length - 1];
@@ -4686,19 +5076,19 @@ var update = (state, _options) => {
4686
5076
  tables.forEach((table2) => {
4687
5077
  const replace = state.readOnly || cursor < table2.from || cursor > table2.to;
4688
5078
  if (replace) {
4689
- builder.add(table2.from, table2.to, import_view26.Decoration.replace({
5079
+ builder.add(table2.from, table2.to, import_view29.Decoration.replace({
4690
5080
  block: true,
4691
5081
  widget: new TableWidget(table2)
4692
5082
  }));
4693
5083
  } else {
4694
- builder.add(table2.from, table2.to, import_view26.Decoration.mark({
5084
+ builder.add(table2.from, table2.to, import_view29.Decoration.mark({
4695
5085
  class: "cm-table"
4696
5086
  }));
4697
5087
  }
4698
5088
  });
4699
5089
  return builder.finish();
4700
5090
  };
4701
- var TableWidget = class extends import_view26.WidgetType {
5091
+ var TableWidget = class extends import_view29.WidgetType {
4702
5092
  constructor(_table) {
4703
5093
  super(), this._table = _table;
4704
5094
  }
@@ -4737,14 +5127,14 @@ var Unicode = {
4737
5127
  bulletSmall: "\u2219",
4738
5128
  bulletSquare: "\u2B1D"
4739
5129
  };
4740
- var HorizontalRuleWidget = class extends import_view22.WidgetType {
5130
+ var HorizontalRuleWidget = class extends import_view25.WidgetType {
4741
5131
  toDOM() {
4742
5132
  const el = document.createElement("span");
4743
5133
  el.className = "cm-hr";
4744
5134
  return el;
4745
5135
  }
4746
5136
  };
4747
- var LinkButton = class extends import_view22.WidgetType {
5137
+ var LinkButton = class extends import_view25.WidgetType {
4748
5138
  constructor(url, render) {
4749
5139
  super(), this.url = url, this.render = render;
4750
5140
  }
@@ -4760,7 +5150,7 @@ var LinkButton = class extends import_view22.WidgetType {
4760
5150
  return el;
4761
5151
  }
4762
5152
  };
4763
- var CheckboxWidget = class extends import_view22.WidgetType {
5153
+ var CheckboxWidget = class extends import_view25.WidgetType {
4764
5154
  constructor(_checked) {
4765
5155
  super(), this._checked = _checked;
4766
5156
  }
@@ -4804,7 +5194,7 @@ var CheckboxWidget = class extends import_view22.WidgetType {
4804
5194
  return false;
4805
5195
  }
4806
5196
  };
4807
- var TextWidget = class extends import_view22.WidgetType {
5197
+ var TextWidget = class extends import_view25.WidgetType {
4808
5198
  constructor(text, className) {
4809
5199
  super(), this.text = text, this.className = className;
4810
5200
  }
@@ -4817,29 +5207,29 @@ var TextWidget = class extends import_view22.WidgetType {
4817
5207
  return el;
4818
5208
  }
4819
5209
  };
4820
- var hide = import_view22.Decoration.replace({});
4821
- var blockQuote = import_view22.Decoration.line({
5210
+ var hide = import_view25.Decoration.replace({});
5211
+ var blockQuote = import_view25.Decoration.line({
4822
5212
  class: "cm-blockquote"
4823
5213
  });
4824
- var fencedCodeLine = import_view22.Decoration.line({
5214
+ var fencedCodeLine = import_view25.Decoration.line({
4825
5215
  class: "cm-code cm-codeblock-line"
4826
5216
  });
4827
- var fencedCodeLineFirst = import_view22.Decoration.line({
5217
+ var fencedCodeLineFirst = import_view25.Decoration.line({
4828
5218
  class: (0, import_react_ui_theme6.mx)("cm-code cm-codeblock-line", "cm-codeblock-start")
4829
5219
  });
4830
- var fencedCodeLineLast = import_view22.Decoration.line({
5220
+ var fencedCodeLineLast = import_view25.Decoration.line({
4831
5221
  class: (0, import_react_ui_theme6.mx)("cm-code cm-codeblock-line", "cm-codeblock-end")
4832
5222
  });
4833
5223
  var commentBlockLine = fencedCodeLine;
4834
5224
  var commentBlockLineFirst = fencedCodeLineFirst;
4835
5225
  var commentBlockLineLast = fencedCodeLineLast;
4836
- var horizontalRule = import_view22.Decoration.replace({
5226
+ var horizontalRule = import_view25.Decoration.replace({
4837
5227
  widget: new HorizontalRuleWidget()
4838
5228
  });
4839
- var checkedTask = import_view22.Decoration.replace({
5229
+ var checkedTask = import_view25.Decoration.replace({
4840
5230
  widget: new CheckboxWidget(true)
4841
5231
  });
4842
- var uncheckedTask = import_view22.Decoration.replace({
5232
+ var uncheckedTask = import_view25.Decoration.replace({
4843
5233
  widget: new CheckboxWidget(false)
4844
5234
  });
4845
5235
  var editingRange = (state, range, focus2) => {
@@ -4855,8 +5245,8 @@ var autoHideTags = /* @__PURE__ */ new Set([
4855
5245
  "SuperscriptMark"
4856
5246
  ]);
4857
5247
  var buildDecorations2 = (view, options, focus2) => {
4858
- const deco = new import_state19.RangeSetBuilder();
4859
- const atomicDeco = new import_state19.RangeSetBuilder();
5248
+ const deco = new import_state21.RangeSetBuilder();
5249
+ const atomicDeco = new import_state21.RangeSetBuilder();
4860
5250
  const { state } = view;
4861
5251
  const headerLevels = [];
4862
5252
  const getHeaderLevels = (node, level) => {
@@ -4943,7 +5333,7 @@ var buildDecorations2 = (view, options, focus2) => {
4943
5333
  } else {
4944
5334
  const num = headers.slice(from - 1).map((level2) => level2?.number ?? 0).join(".") + " ";
4945
5335
  if (num.length) {
4946
- atomicDeco.add(mark.from, mark.from + len, import_view22.Decoration.replace({
5336
+ atomicDeco.add(mark.from, mark.from + len, import_view25.Decoration.replace({
4947
5337
  widget: new TextWidget(num, theme.heading(level))
4948
5338
  }));
4949
5339
  }
@@ -4968,7 +5358,7 @@ var buildDecorations2 = (view, options, focus2) => {
4968
5358
  if (node.from === line.to - 1) {
4969
5359
  return false;
4970
5360
  }
4971
- deco.add(line.from, line.from, import_view22.Decoration.line({
5361
+ deco.add(line.from, line.from, import_view25.Decoration.line({
4972
5362
  class: "cm-list-item",
4973
5363
  attributes: {
4974
5364
  style: `padding-left: ${offset}px; text-indent: -${width}px;`
@@ -4985,7 +5375,7 @@ var buildDecorations2 = (view, options, focus2) => {
4985
5375
  const label = list.type === "OrderedList" ? `${++list.number}.` : Unicode.bulletSmall;
4986
5376
  const line = state.doc.lineAt(node.from);
4987
5377
  const to = state.doc.sliceString(node.to, node.to + 1) === " " ? node.to + 1 : node.to;
4988
- atomicDeco.add(line.from, to, import_view22.Decoration.replace({
5378
+ atomicDeco.add(line.from, to, import_view25.Decoration.replace({
4989
5379
  widget: new TextWidget(label, list.type === "OrderedList" ? "cm-list-mark cm-list-mark-ordered" : "cm-list-mark cm-list-mark-bullet")
4990
5380
  }));
4991
5381
  break;
@@ -5072,7 +5462,7 @@ var buildDecorations2 = (view, options, focus2) => {
5072
5462
  if (!editing) {
5073
5463
  atomicDeco.add(node.from, marks[0].to, hide);
5074
5464
  }
5075
- deco.add(marks[0].to, marks[1].from, import_view22.Decoration.mark({
5465
+ deco.add(marks[0].to, marks[1].from, import_view25.Decoration.mark({
5076
5466
  tagName: "a",
5077
5467
  attributes: {
5078
5468
  class: "cm-link",
@@ -5082,7 +5472,7 @@ var buildDecorations2 = (view, options, focus2) => {
5082
5472
  }
5083
5473
  }));
5084
5474
  if (!editing) {
5085
- atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view22.Decoration.replace({
5475
+ atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view25.Decoration.replace({
5086
5476
  widget: new LinkButton(url, options.renderLinkButton)
5087
5477
  }) : hide);
5088
5478
  }
@@ -5137,10 +5527,10 @@ var buildDecorations2 = (view, options, focus2) => {
5137
5527
  atomicDeco: atomicDeco.finish()
5138
5528
  };
5139
5529
  };
5140
- var forceUpdate = import_state19.StateEffect.define();
5530
+ var forceUpdate = import_state21.StateEffect.define();
5141
5531
  var decorateMarkdown = (options = {}) => {
5142
5532
  return [
5143
- import_view22.ViewPlugin.fromClass(class {
5533
+ import_view25.ViewPlugin.fromClass(class {
5144
5534
  constructor(view) {
5145
5535
  ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations2(view, options, view.hasFocus));
5146
5536
  }
@@ -5172,9 +5562,9 @@ var decorateMarkdown = (options = {}) => {
5172
5562
  }
5173
5563
  }, {
5174
5564
  provide: (plugin) => [
5175
- import_view22.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view22.Decoration.none),
5176
- import_view22.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view22.Decoration.none),
5177
- import_view22.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view22.Decoration.none)
5565
+ import_view25.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view25.Decoration.none),
5566
+ import_view25.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view25.Decoration.none),
5567
+ import_view25.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view25.Decoration.none)
5178
5568
  ]
5179
5569
  }),
5180
5570
  image(),
@@ -5184,7 +5574,7 @@ var decorateMarkdown = (options = {}) => {
5184
5574
  ];
5185
5575
  };
5186
5576
  var linkTooltip = (renderTooltip) => {
5187
- return (0, import_view27.hoverTooltip)((view, pos, side) => {
5577
+ return (0, import_view30.hoverTooltip)((view, pos, side) => {
5188
5578
  const syntax = (0, import_language12.syntaxTree)(view.state).resolveInner(pos, side);
5189
5579
  let link = null;
5190
5580
  for (let i = 0, node = syntax; !link && node && i < 5; node = node.parent, i++) {
@@ -5274,7 +5664,7 @@ var InputModeExtensions = {
5274
5664
  editorInputMode.of({
5275
5665
  type: "vscode"
5276
5666
  }),
5277
- import_view28.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5667
+ import_view31.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5278
5668
  ],
5279
5669
  vim: [
5280
5670
  // https://github.com/replit/codemirror-vim
@@ -5283,7 +5673,7 @@ var InputModeExtensions = {
5283
5673
  type: "vim",
5284
5674
  noTabster: true
5285
5675
  }),
5286
- import_view28.keymap.of([
5676
+ import_view31.keymap.of([
5287
5677
  {
5288
5678
  key: "Alt-Escape",
5289
5679
  run: (view) => {
@@ -5389,6 +5779,7 @@ var traverse = (root, cb) => {
5389
5779
  return value;
5390
5780
  }
5391
5781
  }
5782
+ return void 0;
5392
5783
  };
5393
5784
  return t(root, root.type === "root" ? -1 : 0);
5394
5785
  };
@@ -5423,7 +5814,7 @@ var format = (value) => JSON.stringify(value, (key, value2) => {
5423
5814
  }
5424
5815
  return value2;
5425
5816
  }).replaceAll('"', "");
5426
- var treeFacet = import_state26.Facet.define({
5817
+ var treeFacet = import_state28.Facet.define({
5427
5818
  combine: (values) => values[0]
5428
5819
  });
5429
5820
  var outlinerTree = (options = {}) => {
@@ -5446,7 +5837,7 @@ var outlinerTree = (options = {}) => {
5446
5837
  case "BulletList": {
5447
5838
  (0, import_invariant5.invariant)(current, void 0, {
5448
5839
  F: __dxlog_file11,
5449
- L: 217,
5840
+ L: 219,
5450
5841
  S: void 0,
5451
5842
  A: [
5452
5843
  "current",
@@ -5463,7 +5854,7 @@ var outlinerTree = (options = {}) => {
5463
5854
  case "ListItem": {
5464
5855
  (0, import_invariant5.invariant)(parent, void 0, {
5465
5856
  F: __dxlog_file11,
5466
- L: 226,
5857
+ L: 228,
5467
5858
  S: void 0,
5468
5859
  A: [
5469
5860
  "parent",
@@ -5505,7 +5896,7 @@ var outlinerTree = (options = {}) => {
5505
5896
  case "ListMark": {
5506
5897
  (0, import_invariant5.invariant)(current, void 0, {
5507
5898
  F: __dxlog_file11,
5508
- L: 270,
5899
+ L: 272,
5509
5900
  S: void 0,
5510
5901
  A: [
5511
5902
  "current",
@@ -5519,7 +5910,7 @@ var outlinerTree = (options = {}) => {
5519
5910
  case "Task": {
5520
5911
  (0, import_invariant5.invariant)(current, void 0, {
5521
5912
  F: __dxlog_file11,
5522
- L: 276,
5913
+ L: 278,
5523
5914
  S: void 0,
5524
5915
  A: [
5525
5916
  "current",
@@ -5532,7 +5923,7 @@ var outlinerTree = (options = {}) => {
5532
5923
  case "TaskMarker": {
5533
5924
  (0, import_invariant5.invariant)(current, void 0, {
5534
5925
  F: __dxlog_file11,
5535
- L: 281,
5926
+ L: 283,
5536
5927
  S: void 0,
5537
5928
  A: [
5538
5929
  "current",
@@ -5548,7 +5939,7 @@ var outlinerTree = (options = {}) => {
5548
5939
  if (node.name === "BulletList") {
5549
5940
  (0, import_invariant5.invariant)(parent, void 0, {
5550
5941
  F: __dxlog_file11,
5551
- L: 289,
5942
+ L: 291,
5552
5943
  S: void 0,
5553
5944
  A: [
5554
5945
  "parent",
@@ -5562,7 +5953,7 @@ var outlinerTree = (options = {}) => {
5562
5953
  });
5563
5954
  (0, import_invariant5.invariant)(tree, void 0, {
5564
5955
  F: __dxlog_file11,
5565
- L: 296,
5956
+ L: 298,
5566
5957
  S: void 0,
5567
5958
  A: [
5568
5959
  "tree",
@@ -5572,7 +5963,7 @@ var outlinerTree = (options = {}) => {
5572
5963
  return tree;
5573
5964
  };
5574
5965
  return [
5575
- import_state25.StateField.define({
5966
+ import_state27.StateField.define({
5576
5967
  create: (state) => {
5577
5968
  return buildTree(state);
5578
5969
  },
@@ -5588,10 +5979,10 @@ var outlinerTree = (options = {}) => {
5588
5979
  };
5589
5980
  var getSelection = (state) => state.selection.main;
5590
5981
  var selectionEquals = (a, b) => a.length === b.length && a.every((i) => b.includes(i));
5591
- var selectionFacet = import_state24.Facet.define({
5982
+ var selectionFacet = import_state26.Facet.define({
5592
5983
  combine: (values) => values[0]
5593
5984
  });
5594
- var selectionCompartment = new import_state24.Compartment();
5985
+ var selectionCompartment = new import_state26.Compartment();
5595
5986
  var selectNone = (view) => {
5596
5987
  view.dispatch({
5597
5988
  effects: selectionCompartment.reconfigure(selectionFacet.of([]))
@@ -5672,7 +6063,7 @@ var moveItemDown = (view) => {
5672
6063
  ];
5673
6064
  view.dispatch({
5674
6065
  changes,
5675
- selection: import_state23.EditorSelection.cursor(pos + nextContent.length + 1),
6066
+ selection: import_state25.EditorSelection.cursor(pos + nextContent.length + 1),
5676
6067
  scrollIntoView: true
5677
6068
  });
5678
6069
  }
@@ -5700,7 +6091,7 @@ var moveItemUp = (view) => {
5700
6091
  ];
5701
6092
  view.dispatch({
5702
6093
  changes,
5703
- selection: import_state23.EditorSelection.cursor(pos - prevContent.length - 1),
6094
+ selection: import_state25.EditorSelection.cursor(pos - prevContent.length - 1),
5704
6095
  scrollIntoView: true
5705
6096
  });
5706
6097
  }
@@ -5712,7 +6103,7 @@ var deleteItem = (view) => {
5712
6103
  const current = tree.find(pos);
5713
6104
  if (current) {
5714
6105
  view.dispatch({
5715
- selection: import_state23.EditorSelection.cursor(current.lineRange.from),
6106
+ selection: import_state25.EditorSelection.cursor(current.lineRange.from),
5716
6107
  changes: [
5717
6108
  {
5718
6109
  from: current.lineRange.from,
@@ -5742,7 +6133,7 @@ var toggleTask = (view) => {
5742
6133
  }
5743
6134
  return true;
5744
6135
  };
5745
- var commands = () => import_view29.keymap.of([
6136
+ var commands = () => import_view32.keymap.of([
5746
6137
  //
5747
6138
  // Indentation.
5748
6139
  //
@@ -5768,7 +6159,7 @@ var commands = () => import_view29.keymap.of([
5768
6159
  insert
5769
6160
  }
5770
6161
  ],
5771
- selection: import_state23.EditorSelection.cursor(pos + insert.length)
6162
+ selection: import_state25.EditorSelection.cursor(pos + insert.length)
5772
6163
  });
5773
6164
  return true;
5774
6165
  }
@@ -5786,7 +6177,7 @@ var commands = () => import_view29.keymap.of([
5786
6177
  const next = tree.next(item);
5787
6178
  if (next) {
5788
6179
  view.dispatch({
5789
- selection: import_state23.EditorSelection.cursor(next.contentRange.from)
6180
+ selection: import_state25.EditorSelection.cursor(next.contentRange.from)
5790
6181
  });
5791
6182
  return true;
5792
6183
  }
@@ -5849,7 +6240,7 @@ var commands = () => import_view29.keymap.of([
5849
6240
  var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/outliner/editor.ts";
5850
6241
  var LIST_ITEM_REGEX = /^\s*- (\[ \]|\[x\])? /;
5851
6242
  var initialize = () => {
5852
- return import_view31.ViewPlugin.fromClass(class {
6243
+ return import_view34.ViewPlugin.fromClass(class {
5853
6244
  constructor(view) {
5854
6245
  const first = view.state.doc.lineAt(0);
5855
6246
  const text = view.state.sliceDoc(first.from, first.to);
@@ -5865,7 +6256,7 @@ var initialize = () => {
5865
6256
  insert
5866
6257
  }
5867
6258
  ],
5868
- selection: import_state28.EditorSelection.cursor(insert.length)
6259
+ selection: import_state30.EditorSelection.cursor(insert.length)
5869
6260
  });
5870
6261
  });
5871
6262
  }
@@ -5874,7 +6265,7 @@ var initialize = () => {
5874
6265
  };
5875
6266
  var editor = () => [
5876
6267
  initialize(),
5877
- import_state28.EditorState.transactionFilter.of((tr) => {
6268
+ import_state30.EditorState.transactionFilter.of((tr) => {
5878
6269
  const tree = tr.state.facet(treeFacet);
5879
6270
  if (!tr.docChanged) {
5880
6271
  const current = getSelection(tr.state).from;
@@ -5889,20 +6280,20 @@ var editor = () => [
5889
6280
  if (!prevItem) {
5890
6281
  return [
5891
6282
  {
5892
- selection: import_state28.EditorSelection.cursor(currentItem.contentRange.from)
6283
+ selection: import_state30.EditorSelection.cursor(currentItem.contentRange.from)
5893
6284
  }
5894
6285
  ];
5895
6286
  } else {
5896
6287
  if (currentItem.index < prevItem.index) {
5897
6288
  return [
5898
6289
  {
5899
- selection: import_state28.EditorSelection.cursor(currentItem.contentRange.to)
6290
+ selection: import_state30.EditorSelection.cursor(currentItem.contentRange.to)
5900
6291
  }
5901
6292
  ];
5902
6293
  } else if (currentItem.index > prevItem.index) {
5903
6294
  return [
5904
6295
  {
5905
- selection: import_state28.EditorSelection.cursor(currentItem.contentRange.from)
6296
+ selection: import_state30.EditorSelection.cursor(currentItem.contentRange.from)
5906
6297
  }
5907
6298
  ];
5908
6299
  } else {
@@ -5912,14 +6303,14 @@ var editor = () => [
5912
6303
  } else {
5913
6304
  return [
5914
6305
  {
5915
- selection: import_state28.EditorSelection.cursor(currentItem.lineRange.from - 1)
6306
+ selection: import_state30.EditorSelection.cursor(currentItem.lineRange.from - 1)
5916
6307
  }
5917
6308
  ];
5918
6309
  }
5919
6310
  } else {
5920
6311
  return [
5921
6312
  {
5922
- selection: import_state28.EditorSelection.cursor(currentItem.contentRange.to)
6313
+ selection: import_state30.EditorSelection.cursor(currentItem.contentRange.to)
5923
6314
  }
5924
6315
  ];
5925
6316
  }
@@ -6032,7 +6423,7 @@ var editor = () => [
6032
6423
  ];
6033
6424
  var outliner = (options = {}) => [
6034
6425
  // Commands.
6035
- import_state27.Prec.highest(commands()),
6426
+ import_state29.Prec.highest(commands()),
6036
6427
  // Selection.
6037
6428
  selectionCompartment.of(selectionFacet.of([])),
6038
6429
  // State.
@@ -6048,14 +6439,14 @@ var outliner = (options = {}) => [
6048
6439
  listPaddingLeft: 8
6049
6440
  }),
6050
6441
  // Researve space for menu.
6051
- import_view30.EditorView.contentAttributes.of({
6442
+ import_view33.EditorView.contentAttributes.of({
6052
6443
  class: "is-full !mr-[3rem]"
6053
6444
  })
6054
6445
  ];
6055
6446
  var decorations = () => [
6056
- import_view30.ViewPlugin.fromClass(class {
6447
+ import_view33.ViewPlugin.fromClass(class {
6057
6448
  constructor(view) {
6058
- this.decorations = import_view30.Decoration.none;
6449
+ this.decorations = import_view33.Decoration.none;
6059
6450
  this.updateDecorations(view.state, view);
6060
6451
  }
6061
6452
  update(update2) {
@@ -6077,18 +6468,18 @@ var decorations = () => [
6077
6468
  const lineFrom = doc.lineAt(item.contentRange.from);
6078
6469
  const lineTo = doc.lineAt(item.contentRange.to);
6079
6470
  const isSelected = selection.includes(item.index) || item === current;
6080
- decorations2.push(import_view30.Decoration.line({
6471
+ decorations2.push(import_view33.Decoration.line({
6081
6472
  class: (0, import_react_ui_theme8.mx)("cm-list-item", lineFrom.number === line.number && "cm-list-item-start", lineTo.number === line.number && "cm-list-item-end", isSelected && (hasFocus ? "cm-list-item-focused" : "cm-list-item-selected"))
6082
6473
  }).range(line.from, line.from));
6083
6474
  }
6084
6475
  }
6085
- this.decorations = import_view30.Decoration.set(decorations2);
6476
+ this.decorations = import_view33.Decoration.set(decorations2);
6086
6477
  }
6087
6478
  }, {
6088
6479
  decorations: (v) => v.decorations
6089
6480
  }),
6090
6481
  // Theme.
6091
- import_view30.EditorView.theme(Object.assign({
6482
+ import_view33.EditorView.theme(Object.assign({
6092
6483
  ".cm-list-item": {
6093
6484
  borderLeftWidth: "1px",
6094
6485
  borderRightWidth: "1px",
@@ -6117,9 +6508,6 @@ var decorations = () => [
6117
6508
  },
6118
6509
  "[data-has-focus] & .cm-list-item-selected": {
6119
6510
  borderColor: "var(--dx-separator)"
6120
- },
6121
- "[data-is-attention-source] & .cm-list-item-selected": {
6122
- borderColor: "var(--dx-separator)"
6123
6511
  }
6124
6512
  }))
6125
6513
  ];
@@ -6127,23 +6515,13 @@ var preview = (options = {}) => {
6127
6515
  return [
6128
6516
  // NOTE: Atomic block decorations must be created from a state field, now a widget, otherwise it results in the following error:
6129
6517
  // "Block decorations may not be specified via plugins"
6130
- import_state29.StateField.define({
6518
+ import_state31.StateField.define({
6131
6519
  create: (state) => buildDecorations3(state, options),
6132
6520
  update: (_, tr) => buildDecorations3(tr.state, options),
6133
6521
  provide: (field) => [
6134
- import_view32.EditorView.decorations.from(field),
6135
- import_view32.EditorView.atomicRanges.of((view) => view.state.field(field))
6522
+ import_view35.EditorView.decorations.from(field),
6523
+ import_view35.EditorView.atomicRanges.of((view) => view.state.field(field))
6136
6524
  ]
6137
- }),
6138
- import_view32.EditorView.theme({
6139
- ".cm-preview-block": {
6140
- marginLeft: "-1rem",
6141
- marginRight: "-1rem",
6142
- padding: "1rem",
6143
- borderRadius: "0.5rem",
6144
- background: "var(--dx-modalSurface)",
6145
- border: "1px solid var(--dx-separator)"
6146
- }
6147
6525
  })
6148
6526
  ];
6149
6527
  };
@@ -6161,7 +6539,7 @@ var getLinkRef = (state, node) => {
6161
6539
  }
6162
6540
  };
6163
6541
  var buildDecorations3 = (state, options) => {
6164
- const builder = new import_state29.RangeSetBuilder();
6542
+ const builder = new import_state31.RangeSetBuilder();
6165
6543
  (0, import_language15.syntaxTree)(state).iterate({
6166
6544
  enter: (node) => {
6167
6545
  switch (node.name) {
@@ -6172,7 +6550,7 @@ var buildDecorations3 = (state, options) => {
6172
6550
  case "Link": {
6173
6551
  const link = getLinkRef(state, node.node);
6174
6552
  if (link) {
6175
- builder.add(node.from, node.to, import_view32.Decoration.replace({
6553
+ builder.add(node.from, node.to, import_view35.Decoration.replace({
6176
6554
  widget: new PreviewInlineWidget(options, link)
6177
6555
  }));
6178
6556
  }
@@ -6184,8 +6562,8 @@ var buildDecorations3 = (state, options) => {
6184
6562
  //
6185
6563
  case "Image": {
6186
6564
  const link = getLinkRef(state, node.node);
6187
- if (options.renderBlock && link) {
6188
- builder.add(node.from, node.to, import_view32.Decoration.replace({
6565
+ if (options.addBlockContainer && options.removeBlockContainer && link) {
6566
+ builder.add(node.from, node.to, import_view35.Decoration.replace({
6189
6567
  block: true,
6190
6568
  // atomic: true,
6191
6569
  widget: new PreviewBlockWidget(options, link)
@@ -6198,7 +6576,7 @@ var buildDecorations3 = (state, options) => {
6198
6576
  });
6199
6577
  return builder.finish();
6200
6578
  };
6201
- var PreviewInlineWidget = class extends import_view32.WidgetType {
6579
+ var PreviewInlineWidget = class extends import_view35.WidgetType {
6202
6580
  constructor(_options, _link) {
6203
6581
  super(), this._options = _options, this._link = _link;
6204
6582
  }
@@ -6215,7 +6593,7 @@ var PreviewInlineWidget = class extends import_view32.WidgetType {
6215
6593
  return root;
6216
6594
  }
6217
6595
  };
6218
- var PreviewBlockWidget = class extends import_view32.WidgetType {
6596
+ var PreviewBlockWidget = class extends import_view35.WidgetType {
6219
6597
  constructor(_options, _link) {
6220
6598
  super(), this._options = _options, this._link = _link;
6221
6599
  }
@@ -6227,50 +6605,13 @@ var PreviewBlockWidget = class extends import_view32.WidgetType {
6227
6605
  }
6228
6606
  toDOM(view) {
6229
6607
  const root = document.createElement("div");
6230
- root.classList.add("cm-preview-block");
6231
- const handleAction = (action) => {
6232
- const pos = view.posAtDOM(root);
6233
- const node = (0, import_language15.syntaxTree)(view.state).resolve(pos + 1).node.parent;
6234
- if (!node) {
6235
- return;
6236
- }
6237
- const link = getLinkRef(view.state, node);
6238
- if (link?.ref !== action.link.ref) {
6239
- return;
6240
- }
6241
- switch (action.type) {
6242
- // TODO(burdon): Should we dispatch to the view or mutate the document? (i.e., handle externally?)
6243
- // Insert ref text.
6244
- case "insert": {
6245
- view.dispatch({
6246
- changes: {
6247
- from: node.from,
6248
- to: node.to,
6249
- insert: action.target.text
6250
- }
6251
- });
6252
- break;
6253
- }
6254
- // Remove ref.
6255
- case "delete": {
6256
- view.dispatch({
6257
- changes: {
6258
- from: node.from,
6259
- to: node.to
6260
- }
6261
- });
6262
- break;
6263
- }
6264
- }
6265
- };
6266
- this._options.renderBlock(root, {
6267
- readonly: view.state.readOnly,
6268
- link: this._link,
6269
- onAction: handleAction,
6270
- onLookup: this._options.onLookup
6271
- }, view);
6608
+ root.classList.add("cm-preview-block", "density-coarse");
6609
+ this._options.addBlockContainer?.(this._link, root);
6272
6610
  return root;
6273
6611
  }
6612
+ destroy() {
6613
+ this._options.removeBlockContainer?.(this._link);
6614
+ }
6274
6615
  };
6275
6616
  var defaultItems = [
6276
6617
  "hello world!",
@@ -6281,7 +6622,7 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
6281
6622
  let t;
6282
6623
  let idx = 0;
6283
6624
  return [
6284
- import_view33.keymap.of([
6625
+ import_view36.keymap.of([
6285
6626
  {
6286
6627
  // Reset.
6287
6628
  key: "alt-meta-'",
@@ -6608,28 +6949,6 @@ var createViewMode = (state, onViewModeChange) => {
6608
6949
  ]
6609
6950
  };
6610
6951
  };
6611
- var editorWidth = "!mli-auto is-full max-is-[min(50rem,100%-4rem)]";
6612
- var editorSlots = {
6613
- scroll: {
6614
- className: "pbs-2"
6615
- },
6616
- content: {
6617
- className: editorWidth
6618
- }
6619
- };
6620
- var editorGutter = import_view34.EditorView.theme({
6621
- ".cm-gutters": {
6622
- paddingRight: "1rem"
6623
- }
6624
- });
6625
- var editorMonospace = import_view34.EditorView.theme({
6626
- ".cm-content": {
6627
- fontFamily: fontMono
6628
- }
6629
- });
6630
- var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden";
6631
- var stackItemContentEditorClassNames = (role) => (0, import_react_ui_theme9.mx)("attention-surface dx-focus-ring-inset data-[toolbar=disabled]:pbs-2", role === "section" ? "[&_.cm-scroller]:overflow-hidden [&_.cm-scroller]:min-bs-24" : "min-bs-0");
6632
- var stackItemContentToolbarClassNames = (role) => (0, import_react_ui_theme9.mx)("relative z-[1] flex is-full bg-toolbarSurface border-be border-subduedSeparator", role === "section" && "sticky block-start-0 -mbe-px min-is-0");
6633
6952
  var createToolbar = ({ getView, state, customActions, ...features }) => {
6634
6953
  return import_rx_react.Rx.make((get2) => {
6635
6954
  const nodes = [];
@@ -6713,38 +7032,320 @@ var EditorToolbar = /* @__PURE__ */ (0, import_react.memo)(({ classNames, attend
6713
7032
  var _effect = (0, import_tracking.useSignals)();
6714
7033
  try {
6715
7034
  const menuProps = useEditorToolbarActionGraph(props);
6716
- return /* @__PURE__ */ import_react.default.createElement("div", {
6717
- role: "none",
6718
- className: stackItemContentToolbarClassNames(role)
6719
- }, /* @__PURE__ */ import_react.default.createElement(import_react_ui.ElevationProvider, {
7035
+ return /* @__PURE__ */ import_react.default.createElement(import_react_ui.ElevationProvider, {
6720
7036
  elevation: role === "section" ? "positioned" : "base"
6721
7037
  }, /* @__PURE__ */ import_react.default.createElement(import_react_ui_menu.MenuProvider, {
6722
7038
  ...menuProps,
6723
7039
  attendableId
6724
7040
  }, /* @__PURE__ */ import_react.default.createElement(import_react_ui_menu.ToolbarMenu, {
6725
- classNames: [
6726
- import_react_ui_theme.textBlockWidth,
6727
- classNames
6728
- ]
6729
- }))));
7041
+ classNames,
7042
+ textBlockWidth: true
7043
+ })));
6730
7044
  } finally {
6731
7045
  _effect.f();
6732
7046
  }
6733
7047
  });
7048
+ var CommandMenu = ({ groups, currentItem, onSelect }) => {
7049
+ var _effect = (0, import_tracking2.useSignals)();
7050
+ try {
7051
+ const { tx } = (0, import_react_ui4.useThemeContext)();
7052
+ const groupsWithItems = groups.filter((group) => group.items.length > 0);
7053
+ return /* @__PURE__ */ import_react8.default.createElement(import_react_ui4.Popover.Portal, null, /* @__PURE__ */ import_react8.default.createElement(import_react_ui4.Popover.Content, {
7054
+ align: "start",
7055
+ onOpenAutoFocus: (event) => event.preventDefault(),
7056
+ classNames: tx("menu.content", "menu--exotic-unfocusable", {
7057
+ elevation: "positioned"
7058
+ }, [
7059
+ "max-h-[300px] overflow-y-auto"
7060
+ ])
7061
+ }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui4.Popover.Viewport, {
7062
+ classNames: tx("menu.viewport", "menu__viewport--exotic-unfocusable", {})
7063
+ }, /* @__PURE__ */ import_react8.default.createElement("ul", null, groupsWithItems.map((group, index) => /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, {
7064
+ key: group.id
7065
+ }, /* @__PURE__ */ import_react8.default.createElement(CommandGroup, {
7066
+ group,
7067
+ currentItem,
7068
+ onSelect
7069
+ }), index < groupsWithItems.length - 1 && /* @__PURE__ */ import_react8.default.createElement("div", {
7070
+ className: tx("menu.separator", "menu__item", {})
7071
+ })))))));
7072
+ } finally {
7073
+ _effect.f();
7074
+ }
7075
+ };
7076
+ var CommandGroup = ({ group, currentItem, onSelect }) => {
7077
+ var _effect = (0, import_tracking2.useSignals)();
7078
+ try {
7079
+ const { tx } = (0, import_react_ui4.useThemeContext)();
7080
+ const { t } = (0, import_react_ui4.useTranslation)();
7081
+ return /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, group.label && /* @__PURE__ */ import_react8.default.createElement("div", {
7082
+ className: tx("menu.groupLabel", "menu__group__label", {})
7083
+ }, /* @__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, {
7084
+ key: item.id,
7085
+ item,
7086
+ current: currentItem === item.id,
7087
+ onSelect
7088
+ })));
7089
+ } finally {
7090
+ _effect.f();
7091
+ }
7092
+ };
7093
+ var CommandItem = ({ item, current, onSelect }) => {
7094
+ var _effect = (0, import_tracking2.useSignals)();
7095
+ try {
7096
+ const ref = (0, import_react8.useRef)(null);
7097
+ const { tx } = (0, import_react_ui4.useThemeContext)();
7098
+ const { t } = (0, import_react_ui4.useTranslation)();
7099
+ const handleSelect = (0, import_react8.useCallback)(() => onSelect(item), [
7100
+ item,
7101
+ onSelect
7102
+ ]);
7103
+ (0, import_react8.useEffect)(() => {
7104
+ if (current && ref.current) {
7105
+ ref.current.scrollIntoView({
7106
+ behavior: "smooth",
7107
+ block: "nearest"
7108
+ });
7109
+ }
7110
+ }, [
7111
+ current
7112
+ ]);
7113
+ return /* @__PURE__ */ import_react8.default.createElement("li", {
7114
+ ref,
7115
+ className: tx("menu.item", "menu__item--exotic-unfocusable", {}, [
7116
+ current && "bg-hoverSurface"
7117
+ ]),
7118
+ onClick: handleSelect
7119
+ }, item.icon && /* @__PURE__ */ import_react8.default.createElement(import_react_ui4.Icon, {
7120
+ icon: item.icon,
7121
+ size: 5
7122
+ }), /* @__PURE__ */ import_react8.default.createElement("span", {
7123
+ className: "grow truncate"
7124
+ }, (0, import_react_ui4.toLocalizedString)(item.label, t)));
7125
+ } finally {
7126
+ _effect.f();
7127
+ }
7128
+ };
7129
+ var getItem = (groups, id) => {
7130
+ return groups.flatMap((group) => group.items).find((item) => item.id === id);
7131
+ };
7132
+ var getNextItem = (groups, id) => {
7133
+ const items = groups.flatMap((group) => group.items);
7134
+ const index = items.findIndex((item) => item.id === id);
7135
+ return items[(index + 1) % items.length];
7136
+ };
7137
+ var getPreviousItem = (groups, id) => {
7138
+ const items = groups.flatMap((group) => group.items);
7139
+ const index = items.findIndex((item) => item.id === id);
7140
+ return items[(index - 1 + items.length) % items.length];
7141
+ };
7142
+ var filterItems = (groups, filter) => {
7143
+ return groups.map((group) => ({
7144
+ ...group,
7145
+ items: group.items.filter(filter)
7146
+ }));
7147
+ };
7148
+ var insertAtCursor = (view, head, insert) => {
7149
+ view.dispatch({
7150
+ changes: {
7151
+ from: head,
7152
+ to: head,
7153
+ insert
7154
+ },
7155
+ selection: {
7156
+ anchor: head + insert.length,
7157
+ head: head + insert.length
7158
+ }
7159
+ });
7160
+ };
7161
+ var insertAtLineStart = (view, head, insert) => {
7162
+ const line = view.state.doc.lineAt(head);
7163
+ if (line.from === head) {
7164
+ insertAtCursor(view, head, insert);
7165
+ } else {
7166
+ insert = "\n" + insert;
7167
+ view.dispatch({
7168
+ changes: {
7169
+ from: line.to,
7170
+ to: line.to,
7171
+ insert
7172
+ },
7173
+ selection: {
7174
+ anchor: line.to + insert.length,
7175
+ head: line.to + insert.length
7176
+ }
7177
+ });
7178
+ }
7179
+ };
7180
+ var coreSlashCommands = {
7181
+ id: "markdown",
7182
+ label: "Markdown",
7183
+ items: [
7184
+ {
7185
+ id: "heading-1",
7186
+ label: "Heading 1",
7187
+ icon: "ph--text-h-one--regular",
7188
+ onSelect: (view, head) => insertAtLineStart(view, head, "# ")
7189
+ },
7190
+ {
7191
+ id: "heading-2",
7192
+ label: "Heading 2",
7193
+ icon: "ph--text-h-two--regular",
7194
+ onSelect: (view, head) => insertAtLineStart(view, head, "## ")
7195
+ },
7196
+ {
7197
+ id: "heading-3",
7198
+ label: "Heading 3",
7199
+ icon: "ph--text-h-three--regular",
7200
+ onSelect: (view, head) => insertAtLineStart(view, head, "### ")
7201
+ },
7202
+ {
7203
+ id: "heading-4",
7204
+ label: "Heading 4",
7205
+ icon: "ph--text-h-four--regular",
7206
+ onSelect: (view, head) => insertAtLineStart(view, head, "#### ")
7207
+ },
7208
+ {
7209
+ id: "heading-5",
7210
+ label: "Heading 5",
7211
+ icon: "ph--text-h-five--regular",
7212
+ onSelect: (view, head) => insertAtLineStart(view, head, "##### ")
7213
+ },
7214
+ {
7215
+ id: "heading-6",
7216
+ label: "Heading 6",
7217
+ icon: "ph--text-h-six--regular",
7218
+ onSelect: (view, head) => insertAtLineStart(view, head, "###### ")
7219
+ },
7220
+ {
7221
+ id: "bullet-list",
7222
+ label: "Bullet List",
7223
+ icon: "ph--list-bullets--regular",
7224
+ onSelect: (view, head) => insertAtLineStart(view, head, "- ")
7225
+ },
7226
+ {
7227
+ id: "numbered-list",
7228
+ label: "Numbered List",
7229
+ icon: "ph--list-numbers--regular",
7230
+ onSelect: (view, head) => insertAtLineStart(view, head, "1. ")
7231
+ },
7232
+ {
7233
+ id: "task-list",
7234
+ label: "Task List",
7235
+ icon: "ph--list-checks--regular",
7236
+ onSelect: (view, head) => insertAtLineStart(view, head, "- [ ] ")
7237
+ },
7238
+ {
7239
+ id: "quote",
7240
+ label: "Quote",
7241
+ icon: "ph--quotes--regular",
7242
+ onSelect: (view, head) => insertAtLineStart(view, head, "> ")
7243
+ },
7244
+ {
7245
+ id: "code-block",
7246
+ label: "Code Block",
7247
+ icon: "ph--code-block--regular",
7248
+ onSelect: (view, head) => insertAtLineStart(view, head, "```\n\n```")
7249
+ },
7250
+ {
7251
+ id: "table",
7252
+ label: "Table",
7253
+ icon: "ph--table--regular",
7254
+ onSelect: (view, head) => insertAtLineStart(view, head, "| | | |\n|---|---|---|\n| | | |")
7255
+ }
7256
+ ]
7257
+ };
7258
+ var linkSlashCommands = {
7259
+ id: "link",
7260
+ label: "Link",
7261
+ items: [
7262
+ {
7263
+ id: "inline-link",
7264
+ label: "Inline link",
7265
+ icon: "ph--link--regular",
7266
+ onSelect: (view, head) => view.dispatch({
7267
+ changes: {
7268
+ from: head,
7269
+ insert: "@"
7270
+ },
7271
+ selection: {
7272
+ anchor: head + 1,
7273
+ head: head + 1
7274
+ },
7275
+ effects: commandRangeEffect.of({
7276
+ trigger: "@",
7277
+ range: {
7278
+ from: head,
7279
+ to: head + 1
7280
+ }
7281
+ })
7282
+ })
7283
+ },
7284
+ {
7285
+ id: "block-embed",
7286
+ label: "Block embed",
7287
+ icon: "ph--lego--regular",
7288
+ onSelect: (view, head) => view.dispatch({
7289
+ changes: {
7290
+ from: head,
7291
+ insert: "@@"
7292
+ },
7293
+ selection: {
7294
+ anchor: head + 2,
7295
+ head: head + 2
7296
+ },
7297
+ effects: commandRangeEffect.of({
7298
+ trigger: "@",
7299
+ range: {
7300
+ from: head,
7301
+ to: head + 2
7302
+ }
7303
+ })
7304
+ })
7305
+ }
7306
+ ]
7307
+ };
6734
7308
  var customEventOptions = {
6735
7309
  capture: true,
6736
7310
  passive: false
6737
7311
  };
7312
+ var RefPopover = /* @__PURE__ */ (0, import_react9.forwardRef)(({ children, open, onOpenChange, modal, onActivate }, ref) => {
7313
+ var _effect = (0, import_tracking3.useSignals)();
7314
+ try {
7315
+ const [rootRef, setRootRef] = (0, import_react9.useState)(null);
7316
+ (0, import_react9.useEffect)(() => {
7317
+ if (!rootRef || !onActivate) {
7318
+ return;
7319
+ }
7320
+ return (0, import_async6.addEventListener)(rootRef, "dx-ref-tag-activate", onActivate, customEventOptions);
7321
+ }, [
7322
+ rootRef,
7323
+ onActivate
7324
+ ]);
7325
+ return /* @__PURE__ */ import_react9.default.createElement(import_react_ui5.Popover.Root, {
7326
+ open,
7327
+ onOpenChange,
7328
+ modal
7329
+ }, /* @__PURE__ */ import_react9.default.createElement(import_react_ui5.Popover.VirtualTrigger, {
7330
+ virtualRef: ref
7331
+ }), /* @__PURE__ */ import_react9.default.createElement("div", {
7332
+ role: "none",
7333
+ className: "contents",
7334
+ ref: setRootRef
7335
+ }, children));
7336
+ } finally {
7337
+ _effect.f();
7338
+ }
7339
+ });
6738
7340
  var REF_POPOVER = "RefPopover";
6739
7341
  var [RefPopoverContextProvider, useRefPopover] = (0, import_react_context.createContext)(REF_POPOVER, {});
6740
- var RefPopoverProvider = ({ children, onLookup }) => {
6741
- var _effect = (0, import_tracking2.useSignals)();
7342
+ var PreviewProvider = ({ children, onLookup }) => {
7343
+ var _effect = (0, import_tracking3.useSignals)();
6742
7344
  try {
6743
- const trigger = (0, import_react7.useRef)(null);
6744
- const [value, setValue] = (0, import_react7.useState)({});
6745
- const [rootRef, setRootRef] = (0, import_react7.useState)(null);
6746
- const [open, setOpen] = (0, import_react7.useState)(false);
6747
- const handleDxRefTagActivate = (0, import_react7.useCallback)((event) => {
7345
+ const trigger = (0, import_react9.useRef)(null);
7346
+ const [value, setValue] = (0, import_react9.useState)({});
7347
+ const [open, setOpen] = (0, import_react9.useState)(false);
7348
+ const handleDxRefTagActivate = (0, import_react9.useCallback)((event) => {
6748
7349
  const { refId, label, trigger: dxTrigger } = event;
6749
7350
  setValue((value2) => ({
6750
7351
  ...value2,
@@ -6767,32 +7368,20 @@ var RefPopoverProvider = ({ children, onLookup }) => {
6767
7368
  }, [
6768
7369
  onLookup
6769
7370
  ]);
6770
- (0, import_react7.useEffect)(() => {
6771
- return rootRef ? (0, import_async6.addEventListener)(rootRef, "dx-ref-tag-activate", handleDxRefTagActivate, customEventOptions) : void 0;
6772
- }, [
6773
- rootRef
6774
- ]);
6775
- return /* @__PURE__ */ import_react7.default.createElement(RefPopoverContextProvider, {
7371
+ return /* @__PURE__ */ import_react9.default.createElement(RefPopoverContextProvider, {
6776
7372
  pending: value.pending,
6777
7373
  link: value.link,
6778
7374
  target: value.target
6779
- }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui4.Popover.Root, {
7375
+ }, /* @__PURE__ */ import_react9.default.createElement(RefPopover, {
7376
+ ref: trigger,
6780
7377
  open,
6781
- onOpenChange: setOpen
6782
- }, /* @__PURE__ */ import_react7.default.createElement(import_react_ui4.Popover.VirtualTrigger, {
6783
- virtualRef: trigger
6784
- }), /* @__PURE__ */ import_react7.default.createElement("div", {
6785
- role: "none",
6786
- className: "contents",
6787
- ref: setRootRef
6788
- }, children)));
7378
+ onOpenChange: setOpen,
7379
+ onActivate: handleDxRefTagActivate
7380
+ }, children));
6789
7381
  } finally {
6790
7382
  _effect.f();
6791
7383
  }
6792
7384
  };
6793
- var RefPopover = {
6794
- Provider: RefPopoverProvider
6795
- };
6796
7385
  var customEventOptions2 = {
6797
7386
  capture: true,
6798
7387
  passive: false
@@ -6800,13 +7389,13 @@ var customEventOptions2 = {
6800
7389
  var REF_DROPDOWN_MENU = "RefDropdownMenu";
6801
7390
  var [RefDropdownMenuContextProvider, useRefDropdownMenu] = (0, import_react_context2.createContext)(REF_DROPDOWN_MENU, {});
6802
7391
  var RefDropdownMenuProvider = ({ children, onLookup }) => {
6803
- var _effect = (0, import_tracking3.useSignals)();
7392
+ var _effect = (0, import_tracking4.useSignals)();
6804
7393
  try {
6805
- const trigger = (0, import_react8.useRef)(null);
6806
- const [value, setValue] = (0, import_react8.useState)({});
6807
- const [rootRef, setRootRef] = (0, import_react8.useState)(null);
6808
- const [open, setOpen] = (0, import_react8.useState)(false);
6809
- const handleDxRefTagActivate = (0, import_react8.useCallback)((event) => {
7394
+ const trigger = (0, import_react10.useRef)(null);
7395
+ const [value, setValue] = (0, import_react10.useState)({});
7396
+ const [rootRef, setRootRef] = (0, import_react10.useState)(null);
7397
+ const [open, setOpen] = (0, import_react10.useState)(false);
7398
+ const handleDxRefTagActivate = (0, import_react10.useCallback)((event) => {
6810
7399
  const { refId, label, trigger: dxTrigger } = event;
6811
7400
  setValue((value2) => ({
6812
7401
  ...value2,
@@ -6829,21 +7418,24 @@ var RefDropdownMenuProvider = ({ children, onLookup }) => {
6829
7418
  }, [
6830
7419
  onLookup
6831
7420
  ]);
6832
- (0, import_react8.useEffect)(() => {
6833
- return rootRef ? (0, import_async7.addEventListener)(rootRef, "dx-ref-tag-activate", handleDxRefTagActivate, customEventOptions2) : void 0;
7421
+ (0, import_react10.useEffect)(() => {
7422
+ if (!rootRef) {
7423
+ return;
7424
+ }
7425
+ return (0, import_async7.addEventListener)(rootRef, "dx-ref-tag-activate", handleDxRefTagActivate, customEventOptions2);
6834
7426
  }, [
6835
7427
  rootRef
6836
7428
  ]);
6837
- return /* @__PURE__ */ import_react8.default.createElement(RefDropdownMenuContextProvider, {
7429
+ return /* @__PURE__ */ import_react10.default.createElement(RefDropdownMenuContextProvider, {
6838
7430
  pending: value.pending,
6839
7431
  link: value.link,
6840
7432
  target: value.target
6841
- }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui5.DropdownMenu.Root, {
7433
+ }, /* @__PURE__ */ import_react10.default.createElement(import_react_ui6.DropdownMenu.Root, {
6842
7434
  open,
6843
7435
  onOpenChange: setOpen
6844
- }, /* @__PURE__ */ import_react8.default.createElement(import_react_ui5.DropdownMenu.VirtualTrigger, {
7436
+ }, /* @__PURE__ */ import_react10.default.createElement(import_react_ui6.DropdownMenu.VirtualTrigger, {
6845
7437
  virtualRef: trigger
6846
- }), /* @__PURE__ */ import_react8.default.createElement("div", {
7438
+ }), /* @__PURE__ */ import_react10.default.createElement("div", {
6847
7439
  role: "none",
6848
7440
  className: "contents",
6849
7441
  ref: setRootRef
@@ -6858,11 +7450,11 @@ var RefDropdownMenu = {
6858
7450
  var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
6859
7451
  var instanceCount = 0;
6860
7452
  var useTextEditor = (props = {}, deps = []) => {
6861
- const { id, doc, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0, import_react9.useMemo)(() => (0, import_util6.getProviderValue)(props), deps ?? []);
6862
- const [instanceId] = (0, import_react9.useState)(() => `text-editor-${++instanceCount}`);
6863
- const [view, setView] = (0, import_react9.useState)();
6864
- const parentRef = (0, import_react9.useRef)(null);
6865
- (0, import_react9.useEffect)(() => {
7453
+ const { id, doc, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0, import_react11.useMemo)(() => (0, import_util7.getProviderValue)(props), deps ?? []);
7454
+ const [instanceId] = (0, import_react11.useState)(() => `text-editor-${++instanceCount}`);
7455
+ const [view, setView] = (0, import_react11.useState)();
7456
+ const parentRef = (0, import_react11.useRef)(null);
7457
+ (0, import_react11.useEffect)(() => {
6866
7458
  let view2;
6867
7459
  if (parentRef.current) {
6868
7460
  (0, import_log8.log)("create", {
@@ -6871,7 +7463,7 @@ var useTextEditor = (props = {}, deps = []) => {
6871
7463
  doc: initialValue?.length ?? 0
6872
7464
  }, {
6873
7465
  F: __dxlog_file13,
6874
- L: 76,
7466
+ L: 75,
6875
7467
  S: void 0,
6876
7468
  C: (f, a) => f(...a)
6877
7469
  });
@@ -6887,27 +7479,27 @@ var useTextEditor = (props = {}, deps = []) => {
6887
7479
  anchor
6888
7480
  };
6889
7481
  }
6890
- const state = import_state30.EditorState.create({
7482
+ const state = import_state32.EditorState.create({
6891
7483
  doc: doc ?? initialValue,
6892
7484
  // selection: initialSelection,
6893
7485
  extensions: [
6894
7486
  id && documentId.of(id),
6895
7487
  extensions,
6896
7488
  // NOTE: This doesn't catch errors in keymap functions.
6897
- import_view35.EditorView.exceptionSink.of((err) => {
7489
+ import_view37.EditorView.exceptionSink.of((err) => {
6898
7490
  import_log8.log.catch(err, void 0, {
6899
7491
  F: __dxlog_file13,
6900
- L: 98,
7492
+ L: 97,
6901
7493
  S: void 0,
6902
7494
  C: (f, a) => f(...a)
6903
7495
  });
6904
7496
  })
6905
- ].filter(import_util6.isNotFalsy)
7497
+ ].filter(import_util7.isNotFalsy)
6906
7498
  });
6907
- view2 = new import_view35.EditorView({
7499
+ view2 = new import_view37.EditorView({
6908
7500
  parent: parentRef.current,
6909
7501
  state,
6910
- scrollTo: scrollTo ? import_view35.EditorView.scrollIntoView(scrollTo, {
7502
+ scrollTo: scrollTo ? import_view37.EditorView.scrollIntoView(scrollTo, {
6911
7503
  yMargin: 96
6912
7504
  }) : void 0,
6913
7505
  dispatchTransactions: debug ? debugDispatcher : void 0
@@ -6929,14 +7521,14 @@ var useTextEditor = (props = {}, deps = []) => {
6929
7521
  id
6930
7522
  }, {
6931
7523
  F: __dxlog_file13,
6932
- L: 135,
7524
+ L: 134,
6933
7525
  S: void 0,
6934
7526
  C: (f, a) => f(...a)
6935
7527
  });
6936
7528
  view2?.destroy();
6937
7529
  };
6938
7530
  }, deps);
6939
- (0, import_react9.useEffect)(() => {
7531
+ (0, import_react11.useEffect)(() => {
6940
7532
  if (view) {
6941
7533
  if (scrollTo || selection) {
6942
7534
  if (selection && selection.anchor > view.state.doc.length) {
@@ -6946,7 +7538,7 @@ var useTextEditor = (props = {}, deps = []) => {
6946
7538
  selection
6947
7539
  }, {
6948
7540
  F: __dxlog_file13,
6949
- L: 144,
7541
+ L: 143,
6950
7542
  S: void 0,
6951
7543
  C: (f, a) => f(...a)
6952
7544
  });
@@ -6963,7 +7555,7 @@ var useTextEditor = (props = {}, deps = []) => {
6963
7555
  scrollTo,
6964
7556
  selection
6965
7557
  ]);
6966
- (0, import_react9.useEffect)(() => {
7558
+ (0, import_react11.useEffect)(() => {
6967
7559
  if (view && autoFocus) {
6968
7560
  view.focus();
6969
7561
  }
@@ -6977,7 +7569,7 @@ var useTextEditor = (props = {}, deps = []) => {
6977
7569
  Escape: view?.state.facet(editorInputMode).noTabster
6978
7570
  }
6979
7571
  });
6980
- const handleKeyUp = (0, import_react9.useCallback)((event) => {
7572
+ const handleKeyUp = (0, import_react11.useCallback)((event) => {
6981
7573
  const { key, target, currentTarget } = event;
6982
7574
  if (target === currentTarget) {
6983
7575
  switch (key) {
@@ -7002,6 +7594,7 @@ var useTextEditor = (props = {}, deps = []) => {
7002
7594
  };
7003
7595
  // Annotate the CommonJS export names for ESM import in node:
7004
7596
  0 && (module.exports = {
7597
+ CommandMenu,
7005
7598
  Cursor,
7006
7599
  EditorInputMode,
7007
7600
  EditorInputModes,
@@ -7013,6 +7606,7 @@ var useTextEditor = (props = {}, deps = []) => {
7013
7606
  Inline,
7014
7607
  InputModeExtensions,
7015
7608
  List,
7609
+ PreviewProvider,
7016
7610
  RefDropdownMenu,
7017
7611
  RefPopover,
7018
7612
  RemoteSelectionsDecorator,
@@ -7036,11 +7630,14 @@ var useTextEditor = (props = {}, deps = []) => {
7036
7630
  closeEffect,
7037
7631
  command,
7038
7632
  commandKeyBindings,
7633
+ commandMenu,
7634
+ commandRangeEffect,
7039
7635
  commands,
7040
7636
  commentClickedEffect,
7041
7637
  comments,
7042
7638
  commentsState,
7043
7639
  convertTreeToJson,
7640
+ coreSlashCommands,
7044
7641
  createBasicExtensions,
7045
7642
  createComment,
7046
7643
  createDataExtensions,
@@ -7068,6 +7665,7 @@ var useTextEditor = (props = {}, deps = []) => {
7068
7665
  editorSlots,
7069
7666
  editorWidth,
7070
7667
  editorWithToolbarLayout,
7668
+ filterItems,
7071
7669
  flattenRect,
7072
7670
  floatingMenu,
7073
7671
  focus,
@@ -7076,15 +7674,22 @@ var useTextEditor = (props = {}, deps = []) => {
7076
7674
  formattingEquals,
7077
7675
  formattingKeymap,
7078
7676
  getFormatting,
7677
+ getItem,
7678
+ getLinkRef,
7079
7679
  getListItemContent,
7680
+ getNextItem,
7681
+ getPreviousItem,
7080
7682
  getRange,
7081
7683
  hashtag,
7082
7684
  image,
7083
7685
  indentItemLess,
7084
7686
  indentItemMore,
7687
+ insertAtCursor,
7688
+ insertAtLineStart,
7085
7689
  insertTable,
7086
7690
  itemToJSON,
7087
7691
  keymap,
7692
+ linkSlashCommands,
7088
7693
  linkTooltip,
7089
7694
  listItemToString,
7090
7695
  listener,
@@ -7119,7 +7724,6 @@ var useTextEditor = (props = {}, deps = []) => {
7119
7724
  setStyle,
7120
7725
  singleValueFacet,
7121
7726
  stackItemContentEditorClassNames,
7122
- stackItemContentToolbarClassNames,
7123
7727
  staticCompletion,
7124
7728
  table,
7125
7729
  tags,
@@ -7138,6 +7742,7 @@ var useTextEditor = (props = {}, deps = []) => {
7138
7742
  treeFacet,
7139
7743
  typeahead,
7140
7744
  typewriter,
7745
+ useCommandMenu,
7141
7746
  useComments,
7142
7747
  useEditorToolbarState,
7143
7748
  useFormattingState,