@dxos/react-ui-editor 0.7.5-main.9d26e3a → 0.7.5-main.b19bfc8

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 (87) hide show
  1. package/dist/lib/browser/index.mjs +1125 -1137
  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 +1145 -1171
  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 +1125 -1137
  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/InputMode.stories.d.ts +3 -4
  11. package/dist/types/src/InputMode.stories.d.ts.map +1 -1
  12. package/dist/types/src/TextEditor.stories.d.ts +34 -35
  13. package/dist/types/src/TextEditor.stories.d.ts.map +1 -1
  14. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +3 -0
  15. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -0
  16. package/dist/types/src/components/EditorToolbar/blocks.d.ts +18 -0
  17. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -0
  18. package/dist/types/src/components/EditorToolbar/comment.d.ts +17 -0
  19. package/dist/types/src/components/EditorToolbar/comment.d.ts.map +1 -0
  20. package/dist/types/src/components/EditorToolbar/formatting.d.ts +18 -0
  21. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -0
  22. package/dist/types/src/components/EditorToolbar/headings.d.ts +18 -0
  23. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -0
  24. package/dist/types/src/components/EditorToolbar/index.d.ts +3 -0
  25. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -0
  26. package/dist/types/src/components/EditorToolbar/lists.d.ts +18 -0
  27. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -0
  28. package/dist/types/src/components/EditorToolbar/util.d.ts +58 -0
  29. package/dist/types/src/components/EditorToolbar/util.d.ts.map +1 -0
  30. package/dist/types/src/components/EditorToolbar/viewMode.d.ts +18 -0
  31. package/dist/types/src/components/EditorToolbar/viewMode.d.ts.map +1 -0
  32. package/dist/types/src/components/index.d.ts +1 -1
  33. package/dist/types/src/components/index.d.ts.map +1 -1
  34. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +5 -6
  35. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  36. package/dist/types/src/extensions/comments.d.ts +3 -4
  37. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  38. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  39. package/dist/types/src/extensions/markdown/editorAction.d.ts +12 -0
  40. package/dist/types/src/extensions/markdown/editorAction.d.ts.map +1 -0
  41. package/dist/types/src/extensions/markdown/formatting.d.ts +14 -12
  42. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  43. package/dist/types/src/extensions/markdown/index.d.ts +1 -1
  44. package/dist/types/src/extensions/markdown/index.d.ts.map +1 -1
  45. package/dist/types/src/extensions/markdown/styles.d.ts.map +1 -1
  46. package/dist/types/src/hooks/useActionHandler.d.ts +2 -2
  47. package/dist/types/src/hooks/useActionHandler.d.ts.map +1 -1
  48. package/dist/types/src/index.d.ts +1 -0
  49. package/dist/types/src/index.d.ts.map +1 -1
  50. package/dist/types/src/styles/stack-item-content-class-names.d.ts +3 -0
  51. package/dist/types/src/styles/stack-item-content-class-names.d.ts.map +1 -0
  52. package/dist/types/src/styles/theme.d.ts.map +1 -1
  53. package/dist/types/tsconfig.tsbuildinfo +1 -1
  54. package/package.json +31 -29
  55. package/src/InputMode.stories.tsx +7 -10
  56. package/src/components/EditorToolbar/EditorToolbar.tsx +106 -0
  57. package/src/components/EditorToolbar/blocks.ts +41 -0
  58. package/src/components/EditorToolbar/comment.ts +23 -0
  59. package/src/components/EditorToolbar/formatting.ts +41 -0
  60. package/src/components/EditorToolbar/headings.ts +59 -0
  61. package/src/components/EditorToolbar/index.ts +6 -0
  62. package/src/components/EditorToolbar/lists.ts +40 -0
  63. package/src/components/EditorToolbar/util.ts +65 -0
  64. package/src/components/EditorToolbar/viewMode.ts +48 -0
  65. package/src/components/index.ts +1 -1
  66. package/src/extensions/automerge/automerge.stories.tsx +2 -2
  67. package/src/extensions/comments.ts +12 -19
  68. package/src/extensions/factories.ts +11 -5
  69. package/src/extensions/markdown/decorate.ts +1 -1
  70. package/src/extensions/markdown/{action.ts → editorAction.ts} +22 -20
  71. package/src/extensions/markdown/formatting.test.ts +7 -6
  72. package/src/extensions/markdown/formatting.ts +20 -24
  73. package/src/extensions/markdown/index.ts +1 -1
  74. package/src/extensions/markdown/styles.ts +21 -0
  75. package/src/hooks/useActionHandler.ts +4 -4
  76. package/src/index.ts +4 -0
  77. package/src/styles/markdown.ts +1 -1
  78. package/src/styles/stack-item-content-class-names.ts +17 -0
  79. package/src/styles/theme.ts +2 -3
  80. package/dist/types/src/components/Toolbar/Toolbar.d.ts +0 -34
  81. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +0 -1
  82. package/dist/types/src/components/Toolbar/index.d.ts +0 -2
  83. package/dist/types/src/components/Toolbar/index.d.ts.map +0 -1
  84. package/dist/types/src/extensions/markdown/action.d.ts +0 -9
  85. package/dist/types/src/extensions/markdown/action.d.ts.map +0 -1
  86. package/src/components/Toolbar/Toolbar.tsx +0 -522
  87. package/src/components/Toolbar/index.ts +0 -5
@@ -32,6 +32,7 @@ __export(node_exports, {
32
32
  EditorInputMode: () => EditorInputMode,
33
33
  EditorInputModes: () => EditorInputModes,
34
34
  EditorState: () => import_state.EditorState,
35
+ EditorToolbar: () => EditorToolbar,
35
36
  EditorView: () => import_view.EditorView,
36
37
  EditorViewMode: () => EditorViewMode,
37
38
  EditorViewModes: () => EditorViewModes,
@@ -41,7 +42,6 @@ __export(node_exports, {
41
42
  RemoteSelectionsDecorator: () => RemoteSelectionsDecorator,
42
43
  SpaceAwarenessProvider: () => SpaceAwarenessProvider,
43
44
  TextKind: () => import_text.TextKind,
44
- Toolbar: () => Toolbar,
45
45
  addBlockquote: () => addBlockquote,
46
46
  addCodeblock: () => addCodeblock,
47
47
  addLink: () => addLink,
@@ -60,8 +60,10 @@ __export(node_exports, {
60
60
  commentsState: () => commentsState,
61
61
  convertTreeToJson: () => convertTreeToJson,
62
62
  createBasicExtensions: () => createBasicExtensions,
63
- createComment: () => createComment,
63
+ createComment: () => createComment2,
64
64
  createDataExtensions: () => createDataExtensions,
65
+ createEditorAction: () => createEditorAction,
66
+ createEditorActionGroup: () => createEditorActionGroup,
65
67
  createEditorStateStore: () => createEditorStateStore,
66
68
  createEditorStateTransaction: () => createEditorStateTransaction,
67
69
  createElement: () => createElement,
@@ -100,7 +102,7 @@ __export(node_exports, {
100
102
  mention: () => mention,
101
103
  overlap: () => overlap,
102
104
  preventNewline: () => preventNewline,
103
- processAction: () => processAction,
105
+ processEditorPayload: () => processEditorPayload,
104
106
  removeBlockquote: () => removeBlockquote,
105
107
  removeCodeblock: () => removeCodeblock,
106
108
  removeLink: () => removeLink,
@@ -116,6 +118,8 @@ __export(node_exports, {
116
118
  setSelection: () => setSelection,
117
119
  setStyle: () => setStyle,
118
120
  singleValueFacet: () => singleValueFacet,
121
+ stackItemContentEditorClassNames: () => stackItemContentEditorClassNames,
122
+ stackItemContentToolbarClassNames: () => stackItemContentToolbarClassNames,
119
123
  table: () => table,
120
124
  tags: () => import_highlight.tags,
121
125
  textRange: () => textRange,
@@ -133,9 +137,9 @@ __export(node_exports, {
133
137
  useCommentClickListener: () => useCommentClickListener,
134
138
  useCommentState: () => useCommentState,
135
139
  useComments: () => useComments,
140
+ useEditorToolbarState: () => useEditorToolbarState,
136
141
  useFormattingState: () => useFormattingState,
137
142
  useTextEditor: () => useTextEditor,
138
- useToolbarContext: () => useToolbarContext,
139
143
  wrapWithCatch: () => wrapWithCatch
140
144
  });
141
145
  module.exports = __toCommonJS(node_exports);
@@ -143,26 +147,33 @@ var import_state = require("@codemirror/state");
143
147
  var import_view = require("@codemirror/view");
144
148
  var import_highlight = require("@lezer/highlight");
145
149
  var import_text = require("@dxos/protocols/proto/dxos/echo/model/text");
146
- var import_react = require("@phosphor-icons/react");
147
- var import_react_context = require("@radix-ui/react-context");
148
- var import_react2 = __toESM(require("react"));
149
- var import_react_dropzone = require("react-dropzone");
150
+ var import_react = __toESM(require("react"));
150
151
  var import_react_ui = require("@dxos/react-ui");
152
+ var import_react_ui_menu = require("@dxos/react-ui-menu");
151
153
  var import_react_ui_theme = require("@dxos/react-ui-theme");
152
- var import_state2 = require("@codemirror/state");
154
+ var import_react2 = require("react");
155
+ var import_live_object = require("@dxos/live-object");
156
+ var import_react_ui_menu2 = require("@dxos/react-ui-menu");
157
+ var import_react_ui_theme2 = require("@dxos/react-ui-theme");
153
158
  var import_view2 = require("@codemirror/view");
159
+ var import_react_ui_theme3 = require("@dxos/react-ui-theme");
160
+ var import_react_ui_theme4 = require("@dxos/react-ui-theme");
161
+ var import_lodash = __toESM(require("lodash.get"));
162
+ var import_react_ui_theme5 = require("@dxos/react-ui-theme");
163
+ var import_state2 = require("@codemirror/state");
164
+ var import_view3 = require("@codemirror/view");
154
165
  var import_util = require("@dxos/util");
155
166
  var import_state3 = require("@codemirror/state");
156
167
  var import_log = require("@dxos/log");
157
168
  var import_react3 = __toESM(require("react"));
158
169
  var import_client = require("react-dom/client");
159
170
  var import_react_ui2 = require("@dxos/react-ui");
160
- var import_react_ui_theme2 = require("@dxos/react-ui-theme");
171
+ var import_react_ui_theme6 = require("@dxos/react-ui-theme");
161
172
  var import_autocomplete = require("@codemirror/autocomplete");
162
173
  var import_lang_markdown = require("@codemirror/lang-markdown");
163
- var import_view3 = require("@codemirror/view");
164
- var import_state4 = require("@codemirror/state");
165
174
  var import_view4 = require("@codemirror/view");
175
+ var import_state4 = require("@codemirror/state");
176
+ var import_view5 = require("@codemirror/view");
166
177
  var import_automerge = require("@dxos/automerge/automerge");
167
178
  var import_log2 = require("@dxos/log");
168
179
  var import_echo = require("@dxos/react-client/echo");
@@ -171,64 +182,60 @@ var import_automerge2 = require("@dxos/automerge/automerge");
171
182
  var import_automerge3 = require("@dxos/automerge/automerge");
172
183
  var import_state6 = require("@codemirror/state");
173
184
  var import_state7 = require("@codemirror/state");
174
- var import_view5 = require("@codemirror/view");
185
+ var import_view6 = require("@codemirror/view");
175
186
  var import_async = require("@dxos/async");
176
187
  var import_context = require("@dxos/context");
177
188
  var import_async2 = require("@dxos/async");
178
189
  var import_context2 = require("@dxos/context");
179
190
  var import_invariant = require("@dxos/invariant");
180
191
  var import_log3 = require("@dxos/log");
181
- var import_view6 = require("@codemirror/view");
182
- var import_lodash = __toESM(require("lodash.defaultsdeep"));
183
- var import_invariant2 = require("@dxos/invariant");
184
192
  var import_view7 = require("@codemirror/view");
185
- var import_state8 = require("@codemirror/state");
193
+ var import_lodash2 = __toESM(require("lodash.defaultsdeep"));
194
+ var import_invariant2 = require("@dxos/invariant");
186
195
  var import_view8 = require("@codemirror/view");
187
- var import_state9 = require("@codemirror/state");
196
+ var import_state8 = require("@codemirror/state");
188
197
  var import_view9 = require("@codemirror/view");
198
+ var import_state9 = require("@codemirror/state");
199
+ var import_view10 = require("@codemirror/view");
189
200
  var import_commands = require("@codemirror/commands");
190
201
  var import_state10 = require("@codemirror/state");
191
- var import_view10 = require("@codemirror/view");
192
- var import_lodash2 = __toESM(require("lodash.sortby"));
202
+ var import_view11 = require("@codemirror/view");
203
+ var import_lodash3 = __toESM(require("lodash.sortby"));
193
204
  var import_react4 = require("react");
194
205
  var import_async3 = require("@dxos/async");
195
206
  var import_log4 = require("@dxos/log");
196
207
  var import_util2 = require("@dxos/util");
197
208
  var import_state11 = require("@codemirror/state");
198
- var import_view11 = require("@codemirror/view");
209
+ var import_view12 = require("@codemirror/view");
199
210
  var import_async4 = require("@dxos/async");
200
211
  var import_invariant3 = require("@dxos/invariant");
201
212
  var import_util3 = require("@dxos/util");
202
213
  var import_language = require("@codemirror/language");
203
214
  var import_state12 = require("@codemirror/state");
204
- var import_view12 = require("@codemirror/view");
215
+ var import_view13 = require("@codemirror/view");
205
216
  var import_autocomplete2 = require("@codemirror/autocomplete");
206
217
  var import_commands2 = require("@codemirror/commands");
207
218
  var import_language2 = require("@codemirror/language");
208
219
  var import_search = require("@codemirror/search");
209
220
  var import_state13 = require("@codemirror/state");
210
221
  var import_theme_one_dark = require("@codemirror/theme-one-dark");
211
- var import_view13 = require("@codemirror/view");
212
- var import_lodash3 = __toESM(require("lodash.defaultsdeep"));
213
- var import_lodash4 = __toESM(require("lodash.merge"));
222
+ var import_view14 = require("@codemirror/view");
223
+ var import_lodash4 = __toESM(require("lodash.defaultsdeep"));
224
+ var import_lodash5 = __toESM(require("lodash.merge"));
214
225
  var import_display_name = require("@dxos/display-name");
215
226
  var import_log5 = require("@dxos/log");
216
- var import_react_ui_theme3 = require("@dxos/react-ui-theme");
217
227
  var import_util4 = require("@dxos/util");
218
228
  var import_state14 = require("@codemirror/state");
219
- var import_view14 = require("@codemirror/view");
220
- var import_react_ui_theme4 = require("@dxos/react-ui-theme");
221
- var import_lodash5 = __toESM(require("lodash.get"));
222
- var import_react_ui_theme5 = require("@dxos/react-ui-theme");
223
- var import_language3 = require("@codemirror/language");
224
229
  var import_view15 = require("@codemirror/view");
230
+ var import_language3 = require("@codemirror/language");
231
+ var import_view16 = require("@codemirror/view");
225
232
  var import_react5 = __toESM(require("react"));
226
233
  var import_react_ui3 = require("@dxos/react-ui");
227
- var import_view16 = require("@codemirror/view");
234
+ var import_view17 = require("@codemirror/view");
228
235
  var import_autocomplete3 = require("@codemirror/autocomplete");
229
236
  var import_language4 = require("@codemirror/language");
230
237
  var import_state15 = require("@codemirror/state");
231
- var import_view17 = require("@codemirror/view");
238
+ var import_view18 = require("@codemirror/view");
232
239
  var import_react6 = require("react");
233
240
  var import_autocomplete4 = require("@codemirror/autocomplete");
234
241
  var import_commands3 = require("@codemirror/commands");
@@ -236,7 +243,7 @@ var import_lang_markdown2 = require("@codemirror/lang-markdown");
236
243
  var import_language5 = require("@codemirror/language");
237
244
  var import_language_data = require("@codemirror/language-data");
238
245
  var import_lint = require("@codemirror/lint");
239
- var import_view18 = require("@codemirror/view");
246
+ var import_view19 = require("@codemirror/view");
240
247
  var import_lang_markdown3 = require("@codemirror/lang-markdown");
241
248
  var import_language6 = require("@codemirror/language");
242
249
  var import_highlight2 = require("@lezer/highlight");
@@ -245,35 +252,34 @@ var import_language7 = require("@codemirror/language");
245
252
  var import_state16 = require("@codemirror/state");
246
253
  var import_language8 = require("@codemirror/language");
247
254
  var import_state17 = require("@codemirror/state");
248
- var import_view19 = require("@codemirror/view");
255
+ var import_view20 = require("@codemirror/view");
249
256
  var import_invariant4 = require("@dxos/invariant");
250
- var import_react_ui_theme6 = require("@dxos/react-ui-theme");
257
+ var import_react_ui_theme7 = require("@dxos/react-ui-theme");
251
258
  var import_language9 = require("@codemirror/language");
252
259
  var import_state18 = require("@codemirror/state");
253
- var import_view20 = require("@codemirror/view");
260
+ var import_view21 = require("@codemirror/view");
254
261
  var import_language10 = require("@codemirror/language");
255
262
  var import_state19 = require("@codemirror/state");
256
- var import_view21 = require("@codemirror/view");
257
263
  var import_view22 = require("@codemirror/view");
264
+ var import_view23 = require("@codemirror/view");
258
265
  var import_language11 = require("@codemirror/language");
259
266
  var import_state20 = require("@codemirror/state");
260
- var import_view23 = require("@codemirror/view");
261
- var import_language12 = require("@codemirror/language");
262
267
  var import_view24 = require("@codemirror/view");
263
- var import_react_ui_theme7 = require("@dxos/react-ui-theme");
268
+ var import_language12 = require("@codemirror/language");
269
+ var import_view25 = require("@codemirror/view");
270
+ var import_react_ui_theme8 = require("@dxos/react-ui-theme");
264
271
  var import_autocomplete5 = require("@codemirror/autocomplete");
265
272
  var import_log6 = require("@dxos/log");
266
- var import_view25 = require("@codemirror/view");
273
+ var import_view26 = require("@codemirror/view");
267
274
  var import_codemirror_vim = require("@replit/codemirror-vim");
268
275
  var import_codemirror_vscode_keymap = require("@replit/codemirror-vscode-keymap");
269
276
  var import_echo_schema = require("@dxos/echo-schema");
270
- var import_view26 = require("@codemirror/view");
271
277
  var import_view27 = require("@codemirror/view");
272
- var import_react_ui_theme8 = require("@dxos/react-ui-theme");
278
+ var import_react7 = require("react");
273
279
  var import_state21 = require("@codemirror/state");
274
280
  var import_view28 = require("@codemirror/view");
275
281
  var import_react_tabster = require("@fluentui/react-tabster");
276
- var import_react7 = require("react");
282
+ var import_react8 = require("react");
277
283
  var import_log7 = require("@dxos/log");
278
284
  var import_util5 = require("@dxos/util");
279
285
  var translationKey = "react-ui-editor";
@@ -309,214 +315,780 @@ var translations_default = [
309
315
  }
310
316
  }
311
317
  ];
312
- var singleValueFacet = (defaultValue) => import_state3.Facet.define({
313
- // Called immediately.
314
- combine: (providers) => {
315
- return providers[0] ?? defaultValue;
318
+ var useEditorToolbarState = (initialState = {}) => {
319
+ return (0, import_react2.useMemo)(() => (0, import_live_object.create)(initialState), []);
320
+ };
321
+ var createEditorAction = (payload, icon, label = [
322
+ `${payload.type} label`,
323
+ {
324
+ ns: translationKey
316
325
  }
326
+ ], id = payload.type) => (0, import_react_ui_menu2.createMenuAction)(id, {
327
+ icon,
328
+ label,
329
+ ...payload
317
330
  });
318
- var overlap = (a, b) => a.from <= b.to && a.to >= b.from;
319
- var defaultCursorConverter = {
320
- toCursor: (position) => position.toString(),
321
- fromCursor: (cursor) => parseInt(cursor)
331
+ var createEditorActionGroup = (id, props, icon) => (0, import_react_ui_menu2.createMenuItemGroup)(id, {
332
+ icon,
333
+ iconOnly: true,
334
+ ...props
335
+ });
336
+ var editorToolbarSearch = createEditorAction({
337
+ type: "search"
338
+ }, "ph--magnifying-glass--regular");
339
+ var createBlockGroupAction = (value) => createEditorActionGroup("block", {
340
+ variant: "toggleGroup",
341
+ selectCardinality: "single",
342
+ value
343
+ });
344
+ var createBlockActions = (value, blankLine) => Object.entries({
345
+ blockquote: "ph--quotes--regular",
346
+ codeblock: "ph--code-block--regular",
347
+ table: "ph--table--regular"
348
+ }).map(([type, icon]) => {
349
+ return createEditorAction({
350
+ type,
351
+ checked: type === value,
352
+ ...type === "table" && {
353
+ disabled: !!blankLine
354
+ }
355
+ }, icon);
356
+ });
357
+ var createBlocks = (state) => {
358
+ const value = state?.blockQuote ? "blockquote" : state.blockType ?? "";
359
+ const blockGroupAction = createBlockGroupAction(value);
360
+ const blockActions = createBlockActions(value, state.blankLine);
361
+ return {
362
+ nodes: [
363
+ blockGroupAction,
364
+ ...blockActions
365
+ ],
366
+ edges: [
367
+ {
368
+ source: "root",
369
+ target: "block"
370
+ },
371
+ ...blockActions.map(({ id }) => ({
372
+ source: blockGroupAction.id,
373
+ target: id
374
+ }))
375
+ ]
376
+ };
322
377
  };
323
- var Cursor = class _Cursor {
324
- static {
325
- this.converter = singleValueFacet(defaultCursorConverter);
326
- }
327
- static {
328
- this.getCursorFromRange = (state, range) => {
329
- const cursorConverter2 = state.facet(_Cursor.converter);
330
- const from = cursorConverter2.toCursor(range.from);
331
- const to = cursorConverter2.toCursor(range.to, -1);
332
- return [
333
- from,
334
- to
335
- ].join(":");
336
- };
337
- }
338
- static {
339
- this.getRangeFromCursor = (state, cursor) => {
340
- const cursorConverter2 = state.facet(_Cursor.converter);
341
- const parts = cursor.split(":");
342
- const from = cursorConverter2.fromCursor(parts[0]);
343
- const to = cursorConverter2.fromCursor(parts[1]);
344
- return from !== void 0 && to !== void 0 ? {
345
- from,
346
- to
347
- } : void 0;
348
- };
349
- }
378
+ var commentLabel = (comment, selection) => comment ? "selection overlaps existing comment label" : selection === false ? "select text to comment label" : "comment label";
379
+ var createCommentAction = (label) => createEditorAction({
380
+ type: "comment",
381
+ testId: "editor.toolbar.comment"
382
+ }, "ph--chat-text--regular", label);
383
+ var createComment = (state) => ({
384
+ nodes: [
385
+ createCommentAction([
386
+ commentLabel(state.comment, state.selection),
387
+ {
388
+ ns: translationKey
389
+ }
390
+ ])
391
+ ],
392
+ edges: [
393
+ {
394
+ source: "root",
395
+ target: "comment"
396
+ }
397
+ ]
398
+ });
399
+ var formats = {
400
+ strong: "ph--text-b--regular",
401
+ emphasis: "ph--text-italic--regular",
402
+ strikethrough: "ph--text-strikethrough--regular",
403
+ code: "ph--code--regular",
404
+ link: "ph--link--regular"
405
+ };
406
+ var createFormattingGroup = (formatting) => createEditorActionGroup("formatting", {
407
+ variant: "toggleGroup",
408
+ selectCardinality: "multiple",
409
+ value: Object.keys(formats).filter((key) => !!formatting[key])
410
+ });
411
+ var createFormattingActions = (formatting) => Object.entries(formats).map(([type, icon]) => createEditorAction({
412
+ type,
413
+ checked: !!formatting[type]
414
+ }, icon));
415
+ var createFormatting = (state) => {
416
+ const formattingGroupAction = createFormattingGroup(state);
417
+ const formattingActions = createFormattingActions(state);
418
+ return {
419
+ nodes: [
420
+ formattingGroupAction,
421
+ ...formattingActions
422
+ ],
423
+ edges: [
424
+ {
425
+ source: "root",
426
+ target: "formatting"
427
+ },
428
+ ...formattingActions.map(({ id }) => ({
429
+ source: formattingGroupAction.id,
430
+ target: id
431
+ }))
432
+ ]
433
+ };
350
434
  };
351
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/util/debug.ts";
352
- var wrapWithCatch = (fn) => {
353
- return (...args) => {
354
- try {
355
- return fn(...args);
356
- } catch (err) {
357
- import_log.log.catch(err, void 0, {
358
- F: __dxlog_file,
359
- L: 15,
360
- S: void 0,
361
- C: (f, a) => f(...a)
362
- });
435
+ var createHeadingGroupAction = (value) => createEditorActionGroup("heading", {
436
+ variant: "dropdownMenu",
437
+ applyActive: true,
438
+ selectCardinality: "single",
439
+ value
440
+ }, "ph--text-h--regular");
441
+ var createHeadingActions = (value) => Object.entries({
442
+ "0": "ph--paragraph--regular",
443
+ "1": "ph--text-h-one--regular",
444
+ "2": "ph--text-h-two--regular",
445
+ "3": "ph--text-h-three--regular",
446
+ "4": "ph--text-h-four--regular",
447
+ "5": "ph--text-h-five--regular",
448
+ "6": "ph--text-h-six--regular"
449
+ }).map(([levelStr, icon]) => {
450
+ const level = parseInt(levelStr);
451
+ return createEditorAction({
452
+ type: "heading",
453
+ data: level,
454
+ checked: value === levelStr
455
+ }, icon, [
456
+ "heading level label",
457
+ {
458
+ count: level,
459
+ ns: translationKey
363
460
  }
461
+ ], `heading--${levelStr}`);
462
+ });
463
+ var computeHeadingValue = (state) => {
464
+ const blockType = state ? state.blockType : "paragraph";
465
+ const header = blockType && /heading(\d)/.exec(blockType);
466
+ return header ? header[1] : blockType === "paragraph" || !blockType ? "0" : "";
467
+ };
468
+ var createHeadings = (state) => {
469
+ const headingValue = computeHeadingValue(state);
470
+ const headingGroupAction = createHeadingGroupAction(headingValue);
471
+ const headingActions = createHeadingActions(headingValue);
472
+ return {
473
+ nodes: [
474
+ headingGroupAction,
475
+ ...headingActions
476
+ ],
477
+ edges: [
478
+ {
479
+ source: "root",
480
+ target: "heading"
481
+ },
482
+ ...headingActions.map(({ id }) => ({
483
+ source: headingGroupAction.id,
484
+ target: id
485
+ }))
486
+ ]
364
487
  };
365
488
  };
366
- var callbackWrapper = (fn) => (...args) => {
367
- try {
368
- return fn(...args);
369
- } catch (err) {
370
- import_log.log.catch(err, void 0, {
371
- F: __dxlog_file,
372
- L: 29,
373
- S: void 0,
374
- C: (f, a) => f(...a)
375
- });
376
- }
489
+ var listStyles = {
490
+ bullet: "ph--list-bullets--regular",
491
+ ordered: "ph--list-numbers--regular",
492
+ task: "ph--list-checks--regular"
377
493
  };
378
- var debugDispatcher = (trs, view) => {
379
- logChanges(trs);
380
- view.update(trs);
494
+ var createListGroupAction = (value) => createEditorActionGroup("list", {
495
+ variant: "toggleGroup",
496
+ selectCardinality: "single",
497
+ value
498
+ });
499
+ var createListActions = (value) => Object.entries(listStyles).map(([listStyle, icon]) => createEditorAction({
500
+ type: `list-${listStyle}`,
501
+ checked: value === listStyle
502
+ }, icon));
503
+ var createLists = (state) => {
504
+ const value = state.listStyle ?? "";
505
+ const listGroupAction = createListGroupAction(value);
506
+ const listActionsMap = createListActions(value);
507
+ return {
508
+ nodes: [
509
+ listGroupAction,
510
+ ...listActionsMap
511
+ ],
512
+ edges: [
513
+ {
514
+ source: "root",
515
+ target: "list"
516
+ },
517
+ ...listActionsMap.map(({ id }) => ({
518
+ source: listGroupAction.id,
519
+ target: id
520
+ }))
521
+ ]
522
+ };
381
523
  };
382
- var logChanges = (trs) => {
383
- const changes = trs.flatMap((tr) => {
384
- if (tr.changes.empty) {
385
- return void 0;
524
+ var createViewModeGroupAction = (value) => createEditorActionGroup("viewMode", {
525
+ variant: "dropdownMenu",
526
+ applyActive: true,
527
+ selectCardinality: "single",
528
+ value
529
+ }, "ph--eye--regular");
530
+ var createViewModeActions = (value) => Object.entries({
531
+ preview: "ph--eye--regular",
532
+ source: "ph--pencil-simple--regular",
533
+ readonly: "ph--pencil-slash--regular"
534
+ }).map(([viewMode, icon]) => {
535
+ return createEditorAction({
536
+ type: "view-mode",
537
+ data: viewMode,
538
+ checked: viewMode === value
539
+ }, icon, [
540
+ `${viewMode} mode label`,
541
+ {
542
+ ns: translationKey
386
543
  }
387
- const changes2 = [];
388
- tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => changes2.push(JSON.stringify({
389
- fromA,
390
- toA,
391
- fromB,
392
- toB,
393
- inserted: inserted.toString()
394
- })));
395
- return changes2;
396
- }).filter(Boolean);
397
- if (changes.length) {
398
- import_log.log.info("changes", {
399
- changes
400
- }, {
401
- F: __dxlog_file,
402
- L: 62,
403
- S: void 0,
404
- C: (f, a) => f(...a)
544
+ ], `view-mode--${viewMode}`);
545
+ });
546
+ var createViewMode = (state) => {
547
+ const value = state.viewMode ?? "source";
548
+ const viewModeGroupAction = createViewModeGroupAction(value);
549
+ const viewModeActions = createViewModeActions(value);
550
+ return {
551
+ nodes: [
552
+ viewModeGroupAction,
553
+ ...viewModeActions
554
+ ],
555
+ edges: [
556
+ {
557
+ source: "root",
558
+ target: "viewMode"
559
+ },
560
+ ...viewModeActions.map(({ id }) => ({
561
+ source: viewModeGroupAction.id,
562
+ target: id
563
+ }))
564
+ ]
565
+ };
566
+ };
567
+ var stackItemContentEditorClassNames = (role) => (0, import_react_ui_theme2.mx)("dx-focus-ring-inset data-[toolbar=disabled]:pbs-2 attention-surface", role === "article" ? "min-bs-0" : "[&_.cm-scroller]:overflow-hidden [&_.cm-scroller]:min-bs-24");
568
+ var stackItemContentToolbarClassNames = (role) => (0, import_react_ui_theme2.mx)("attention-surface is-full border-be !border-separator", role === "section" && "sticky block-start-0 z-[1] -mbe-px min-is-0");
569
+ var createToolbar = ({ state, customActions, ...features }) => {
570
+ const nodes = [];
571
+ const edges = [];
572
+ if (features.headings ?? true) {
573
+ const headings2 = createHeadings(state);
574
+ nodes.push(...headings2.nodes);
575
+ edges.push(...headings2.edges);
576
+ }
577
+ if (features.formatting ?? true) {
578
+ const formatting = createFormatting(state);
579
+ nodes.push(...formatting.nodes);
580
+ edges.push(...formatting.edges);
581
+ }
582
+ if (features.lists ?? true) {
583
+ const lists = createLists(state);
584
+ nodes.push(...lists.nodes);
585
+ edges.push(...lists.edges);
586
+ }
587
+ if (features.blocks ?? true) {
588
+ const blocks = createBlocks(state);
589
+ nodes.push(...blocks.nodes);
590
+ edges.push(...blocks.edges);
591
+ }
592
+ if (customActions) {
593
+ const custom = customActions();
594
+ nodes.push(...custom.nodes);
595
+ edges.push(...custom.edges);
596
+ }
597
+ const editorToolbarGap = (0, import_react_ui_menu.createGapSeparator)();
598
+ nodes.push(...editorToolbarGap.nodes);
599
+ edges.push(...editorToolbarGap.edges);
600
+ if (features.comment ?? true) {
601
+ const comment = createComment(state);
602
+ nodes.push(...comment.nodes);
603
+ edges.push(...comment.edges);
604
+ }
605
+ if (features.search ?? true) {
606
+ nodes.push(editorToolbarSearch);
607
+ edges.push({
608
+ source: "root",
609
+ target: editorToolbarSearch.id
405
610
  });
406
611
  }
612
+ if (features.viewMode ?? true) {
613
+ const viewMode = createViewMode(state);
614
+ nodes.push(...viewMode.nodes);
615
+ edges.push(...viewMode.edges);
616
+ }
617
+ return {
618
+ nodes,
619
+ edges
620
+ };
407
621
  };
408
- var flattenRect = (rect, left) => {
409
- const x = left ? rect.left : rect.right;
622
+ var useEditorToolbarActionGraph = ({ onAction, ...props }) => {
623
+ const menuCreator = (0, import_react.useCallback)(() => createToolbar(props), [
624
+ props
625
+ ]);
626
+ const { resolveGroupItems } = (0, import_react_ui_menu.useMenuActions)(menuCreator);
410
627
  return {
411
- left: x,
412
- right: x,
413
- top: rect.top,
414
- bottom: rect.bottom
628
+ resolveGroupItems,
629
+ onAction
415
630
  };
416
631
  };
417
- var scratchRange;
418
- var textRange = (node, from, to = from) => {
419
- const range = scratchRange || (scratchRange = document.createRange());
420
- range.setEnd(node, to);
421
- range.setStart(node, from);
422
- return range;
632
+ var EditorToolbar = ({ classNames, attendableId, role, ...props }) => {
633
+ const menuProps = useEditorToolbarActionGraph(props);
634
+ return /* @__PURE__ */ import_react.default.createElement("div", {
635
+ role: "none",
636
+ className: stackItemContentToolbarClassNames(role)
637
+ }, /* @__PURE__ */ import_react.default.createElement(import_react_ui.ElevationProvider, {
638
+ elevation: role === "section" ? "positioned" : "base"
639
+ }, /* @__PURE__ */ import_react.default.createElement(import_react_ui_menu.MenuProvider, {
640
+ ...menuProps,
641
+ attendableId
642
+ }, /* @__PURE__ */ import_react.default.createElement(import_react_ui_menu.ToolbarMenu, {
643
+ classNames: [
644
+ import_react_ui_theme.textBlockWidth,
645
+ "!bg-transparent",
646
+ classNames
647
+ ]
648
+ }))));
423
649
  };
424
- var clientRectsFor = (dom) => {
425
- if (dom.nodeType === 3) {
426
- return textRange(dom, 0, dom.nodeValue.length).getClientRects();
427
- } else if (dom.nodeType === 1) {
428
- return dom.getClientRects();
429
- } else {
430
- return [];
431
- }
650
+ var headings = {
651
+ 1: "text-4xl",
652
+ 2: "text-3xl",
653
+ 3: "text-2xl",
654
+ 4: "text-xl",
655
+ 5: "text-lg",
656
+ 6: ""
432
657
  };
433
- var createElement = (tag, options, children) => {
434
- const el = document.createElement(tag);
435
- if (options?.className) {
436
- el.className = options.className;
437
- }
438
- if (children) {
439
- el.append(...Array.isArray(children) ? children : [
440
- children
441
- ]);
658
+ var theme = {
659
+ code: "font-mono !no-underline text-neutral-700 dark:text-neutral-300",
660
+ codeMark: "font-mono text-primary-500",
661
+ mark: "opacity-50",
662
+ heading: (level) => {
663
+ return (0, import_react_ui_theme4.mx)(headings[level], "dark:text-primary-400");
442
664
  }
443
- return el;
444
665
  };
445
- var renderRoot = (root, node) => {
446
- (0, import_client.createRoot)(root).render(/* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ThemeProvider, {
447
- tx: import_react_ui_theme2.defaultTx
448
- }, node));
449
- return root;
666
+ var getToken = (path, defaultValue) => {
667
+ const value = (0, import_lodash.default)(import_react_ui_theme5.tokens, path, defaultValue);
668
+ return value?.toString() ?? "";
450
669
  };
451
- var annotationMark = import_view2.Decoration.mark({
452
- class: "cm-annotation"
453
- });
454
- var annotations = (options = {}) => {
455
- const match = (state) => {
456
- const annotations2 = [];
457
- const text = state.doc.toString();
458
- if (options.match) {
459
- const matches = text.matchAll(options.match);
460
- for (const match2 of matches) {
461
- const from = match2.index;
462
- const to = from + match2[0].length;
463
- const cursor = Cursor.getCursorFromRange(state, {
464
- from,
465
- to
466
- });
467
- annotations2.push({
468
- cursor
469
- });
470
- }
471
- }
472
- return annotations2;
473
- };
474
- const annotationsState = import_state2.StateField.define({
475
- create: (state) => {
476
- return match(state);
670
+ var fontBody = getToken("fontFamily.body");
671
+ var fontMono = getToken("fontFamily.mono");
672
+ var defaultTheme = {
673
+ "&": {},
674
+ "&.cm-focused": {
675
+ outline: "none"
676
+ },
677
+ /**
678
+ * Scroller
679
+ */
680
+ ".cm-scroller": {
681
+ overflowY: "auto"
682
+ },
683
+ /**
684
+ * Content
685
+ * NOTE: Apply margins to content so that scrollbar is at the edge of the container.
686
+ */
687
+ ".cm-content": {
688
+ padding: "unset",
689
+ fontFamily: fontBody,
690
+ // NOTE: Base font size (otherwise defined by HTML tag, which might be different for storybook).
691
+ fontSize: "16px",
692
+ lineHeight: 1.5,
693
+ color: "unset"
694
+ },
695
+ /**
696
+ * Gutters
697
+ * NOTE: Gutters should have the same top margin as the content.
698
+ */
699
+ ".cm-gutters": {
700
+ borderRight: "none",
701
+ background: "transparent"
702
+ },
703
+ ".cm-gutter": {},
704
+ ".cm-gutter.cm-lineNumbers .cm-gutterElement": {
705
+ minWidth: "40px",
706
+ alignContent: "center"
707
+ },
708
+ /**
709
+ * Height is set to match the corresponding line.
710
+ */
711
+ ".cm-gutterElement": {
712
+ alignItems: "center",
713
+ fontSize: "16px"
714
+ },
715
+ /**
716
+ * Line.
717
+ */
718
+ ".cm-line": {
719
+ paddingInline: 0
720
+ },
721
+ ".cm-activeLine": {
722
+ background: "var(--dx-cmActiveLine)"
723
+ },
724
+ /**
725
+ * Cursor (layer).
726
+ */
727
+ ".cm-cursor, .cm-dropCursor": {
728
+ borderLeft: "2px solid var(--dx-cmCursor)"
729
+ },
730
+ ".cm-placeholder": {
731
+ color: "var(--dx-subdued)"
732
+ },
733
+ /**
734
+ * Selection (layer).
735
+ */
736
+ ".cm-selectionBackground": {
737
+ background: "var(--dx-cmSelection)"
738
+ },
739
+ /**
740
+ * Search.
741
+ * NOTE: Matches comment.
742
+ */
743
+ ".cm-searchMatch": {
744
+ margin: "0 -3px",
745
+ padding: "3px",
746
+ borderRadius: "3px",
747
+ background: "var(--dx-cmHighlightSurface)",
748
+ color: "var(--dx-cmHighlight)"
749
+ },
750
+ ".cm-searchMatch-selected": {
751
+ textDecoration: "underline"
752
+ },
753
+ /**
754
+ * Link.
755
+ */
756
+ ".cm-link": {
757
+ textDecorationLine: "underline",
758
+ textDecorationThickness: "1px",
759
+ textUnderlineOffset: "2px",
760
+ borderRadius: ".125rem"
761
+ },
762
+ ".cm-link > span": {
763
+ color: "var(--dx-accentText)"
764
+ },
765
+ /**
766
+ * Tooltip.
767
+ */
768
+ ".cm-tooltip": {
769
+ background: "var(--dx-baseSurface)"
770
+ },
771
+ ".cm-tooltip-below": {},
772
+ /**
773
+ * Autocomplete.
774
+ * https://github.com/codemirror/autocomplete/blob/main/src/completion.ts
775
+ */
776
+ ".cm-tooltip.cm-tooltip-autocomplete": {
777
+ marginTop: "4px",
778
+ marginLeft: "-3px"
779
+ },
780
+ ".cm-tooltip.cm-tooltip-autocomplete > ul": {
781
+ maxHeight: "20em"
782
+ },
783
+ ".cm-tooltip.cm-tooltip-autocomplete > ul > li": {},
784
+ ".cm-tooltip.cm-tooltip-autocomplete > ul > li[aria-selected]": {},
785
+ ".cm-tooltip.cm-tooltip-autocomplete > ul > completion-section": {
786
+ paddingLeft: "4px !important",
787
+ borderBottom: "none !important",
788
+ color: "var(--dx-accentText)"
789
+ },
790
+ ".cm-tooltip.cm-completionInfo": {
791
+ width: "360px !important",
792
+ margin: "-10px 1px 0 1px",
793
+ padding: "8px !important",
794
+ borderColor: "var(--dx-separator)"
795
+ },
796
+ ".cm-completionIcon": {
797
+ display: "none"
798
+ },
799
+ ".cm-completionLabel": {
800
+ fontFamily: fontBody
801
+ },
802
+ ".cm-completionMatchedText": {
803
+ textDecoration: "none !important",
804
+ opacity: 0.5
805
+ },
806
+ /**
807
+ * Panels
808
+ * https://github.com/codemirror/search/blob/main/src/search.ts#L745
809
+ *
810
+ * Find/replace panel.
811
+ * <div class="cm-announced">...</div>
812
+ * <div class="cm-scroller">...</div>
813
+ * <div class="cm-panels cm-panels-bottom">
814
+ * <div class="cm-search cm-panel">
815
+ * <input class="cm-textfield" />
816
+ * <button class="cm-button">...</button>
817
+ * <label><input type="checkbox" />...</label>
818
+ * </div>
819
+ * </div
820
+ */
821
+ // TODO(burdon): Implement custom panel (with icon buttons).
822
+ ".cm-panels": {},
823
+ ".cm-panel": {
824
+ fontFamily: fontBody,
825
+ backgroundColor: "var(--surface-bg)"
826
+ },
827
+ ".cm-panel input, .cm-panel button, .cm-panel label": {
828
+ color: "var(--dx-subdued)",
829
+ fontFamily: fontBody,
830
+ fontSize: "14px",
831
+ all: "unset",
832
+ margin: "3px !important",
833
+ padding: "2px 6px !important",
834
+ outline: "1px solid transparent"
835
+ },
836
+ ".cm-panel input, .cm-panel button": {
837
+ backgroundColor: "var(--dx-input)"
838
+ },
839
+ ".cm-panel input:focus, .cm-panel button:focus": {
840
+ outline: "1px solid var(--dx-accentFocusIndicator)"
841
+ },
842
+ ".cm-panel label": {
843
+ display: "inline-flex",
844
+ alignItems: "center",
845
+ cursor: "pointer"
846
+ },
847
+ ".cm-panel input.cm-textfield": {},
848
+ ".cm-panel input[type=checkbox]": {
849
+ width: "8px",
850
+ height: "8px",
851
+ marginRight: "6px !important",
852
+ padding: "2px !important",
853
+ color: "var(--dx-accentFocusIndicator)"
854
+ },
855
+ ".cm-panel button": {
856
+ "&:hover": {
857
+ backgroundColor: "var(--dx-accentSurfaceHover) !important"
477
858
  },
478
- update: (value, tr) => {
479
- if (!tr.changes.empty) {
480
- return match(tr.state);
481
- }
482
- return value;
859
+ "&:active": {
860
+ backgroundColor: "var(--dx-accentSurfaceHover)"
483
861
  }
484
- });
485
- return [
486
- annotationsState,
487
- import_view2.EditorView.decorations.compute([
488
- annotationsState
489
- ], (state) => {
490
- const annotations2 = state.field(annotationsState);
491
- const decorations = annotations2.map((annotation) => {
492
- const range = Cursor.getRangeFromCursor(state, annotation.cursor);
493
- return range && annotationMark.range(range.from, range.to);
494
- }).filter(import_util.isNotFalsy);
495
- return import_view2.Decoration.set(decorations);
496
- }),
497
- styles
498
- ];
862
+ },
863
+ ".cm-panel.cm-search": {
864
+ padding: "4px",
865
+ borderTop: "1px solid var(--dx-separator)"
866
+ }
499
867
  };
500
- var styles = import_view2.EditorView.theme({
501
- ".cm-annotation": {
502
- textDecoration: "underline",
503
- textDecorationStyle: "wavy",
504
- textDecorationColor: "var(--dx-error)"
868
+ var margin = "!mt-[1rem]";
869
+ var editorContent = (0, import_react_ui_theme3.mx)(margin, "!mli-auto w-full max-w-[min(50rem,100%-2rem)]");
870
+ var editorFullWidth = (0, import_react_ui_theme3.mx)(margin);
871
+ var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden";
872
+ var editorGutter = import_view2.EditorView.theme({
873
+ // Match margin from content.
874
+ ".cm-gutters": {
875
+ marginTop: "16px",
876
+ paddingRight: "1rem"
505
877
  }
506
878
  });
507
- var autocomplete = ({ debug, activateOnTyping, override, onSearch } = {}) => {
508
- const extensions = [
509
- // https://codemirror.net/docs/ref/#view.keymap
510
- // https://discuss.codemirror.net/t/how-can-i-replace-the-default-autocompletion-keymap-v6/3322
511
- // TODO(burdon): Set custom keymap.
512
- import_view3.keymap.of(import_autocomplete.completionKeymap),
513
- // https://codemirror.net/examples/autocompletion
514
- // https://codemirror.net/docs/ref/#autocomplete.autocompletion
515
- (0, import_autocomplete.autocompletion)({
516
- activateOnTyping,
517
- override,
518
- closeOnBlur: !debug,
519
- tooltipClass: () => "shadow rounded"
879
+ var editorMonospace = import_view2.EditorView.theme({
880
+ ".cm-content": {
881
+ fontFamily: fontMono
882
+ }
883
+ });
884
+ var singleValueFacet = (defaultValue) => import_state3.Facet.define({
885
+ // Called immediately.
886
+ combine: (providers) => {
887
+ return providers[0] ?? defaultValue;
888
+ }
889
+ });
890
+ var overlap = (a, b) => a.from <= b.to && a.to >= b.from;
891
+ var defaultCursorConverter = {
892
+ toCursor: (position) => position.toString(),
893
+ fromCursor: (cursor) => parseInt(cursor)
894
+ };
895
+ var Cursor = class _Cursor {
896
+ static {
897
+ this.converter = singleValueFacet(defaultCursorConverter);
898
+ }
899
+ static {
900
+ this.getCursorFromRange = (state, range) => {
901
+ const cursorConverter2 = state.facet(_Cursor.converter);
902
+ const from = cursorConverter2.toCursor(range.from);
903
+ const to = cursorConverter2.toCursor(range.to, -1);
904
+ return [
905
+ from,
906
+ to
907
+ ].join(":");
908
+ };
909
+ }
910
+ static {
911
+ this.getRangeFromCursor = (state, cursor) => {
912
+ const cursorConverter2 = state.facet(_Cursor.converter);
913
+ const parts = cursor.split(":");
914
+ const from = cursorConverter2.fromCursor(parts[0]);
915
+ const to = cursorConverter2.fromCursor(parts[1]);
916
+ return from !== void 0 && to !== void 0 ? {
917
+ from,
918
+ to
919
+ } : void 0;
920
+ };
921
+ }
922
+ };
923
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/util/debug.ts";
924
+ var wrapWithCatch = (fn) => {
925
+ return (...args) => {
926
+ try {
927
+ return fn(...args);
928
+ } catch (err) {
929
+ import_log.log.catch(err, void 0, {
930
+ F: __dxlog_file,
931
+ L: 15,
932
+ S: void 0,
933
+ C: (f, a) => f(...a)
934
+ });
935
+ }
936
+ };
937
+ };
938
+ var callbackWrapper = (fn) => (...args) => {
939
+ try {
940
+ return fn(...args);
941
+ } catch (err) {
942
+ import_log.log.catch(err, void 0, {
943
+ F: __dxlog_file,
944
+ L: 29,
945
+ S: void 0,
946
+ C: (f, a) => f(...a)
947
+ });
948
+ }
949
+ };
950
+ var debugDispatcher = (trs, view) => {
951
+ logChanges(trs);
952
+ view.update(trs);
953
+ };
954
+ var logChanges = (trs) => {
955
+ const changes = trs.flatMap((tr) => {
956
+ if (tr.changes.empty) {
957
+ return void 0;
958
+ }
959
+ const changes2 = [];
960
+ tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => changes2.push(JSON.stringify({
961
+ fromA,
962
+ toA,
963
+ fromB,
964
+ toB,
965
+ inserted: inserted.toString()
966
+ })));
967
+ return changes2;
968
+ }).filter(Boolean);
969
+ if (changes.length) {
970
+ import_log.log.info("changes", {
971
+ changes
972
+ }, {
973
+ F: __dxlog_file,
974
+ L: 62,
975
+ S: void 0,
976
+ C: (f, a) => f(...a)
977
+ });
978
+ }
979
+ };
980
+ var flattenRect = (rect, left) => {
981
+ const x = left ? rect.left : rect.right;
982
+ return {
983
+ left: x,
984
+ right: x,
985
+ top: rect.top,
986
+ bottom: rect.bottom
987
+ };
988
+ };
989
+ var scratchRange;
990
+ var textRange = (node, from, to = from) => {
991
+ const range = scratchRange || (scratchRange = document.createRange());
992
+ range.setEnd(node, to);
993
+ range.setStart(node, from);
994
+ return range;
995
+ };
996
+ var clientRectsFor = (dom) => {
997
+ if (dom.nodeType === 3) {
998
+ return textRange(dom, 0, dom.nodeValue.length).getClientRects();
999
+ } else if (dom.nodeType === 1) {
1000
+ return dom.getClientRects();
1001
+ } else {
1002
+ return [];
1003
+ }
1004
+ };
1005
+ var createElement = (tag, options, children) => {
1006
+ const el = document.createElement(tag);
1007
+ if (options?.className) {
1008
+ el.className = options.className;
1009
+ }
1010
+ if (children) {
1011
+ el.append(...Array.isArray(children) ? children : [
1012
+ children
1013
+ ]);
1014
+ }
1015
+ return el;
1016
+ };
1017
+ var renderRoot = (root, node) => {
1018
+ (0, import_client.createRoot)(root).render(/* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ThemeProvider, {
1019
+ tx: import_react_ui_theme6.defaultTx
1020
+ }, node));
1021
+ return root;
1022
+ };
1023
+ var annotationMark = import_view3.Decoration.mark({
1024
+ class: "cm-annotation"
1025
+ });
1026
+ var annotations = (options = {}) => {
1027
+ const match = (state) => {
1028
+ const annotations2 = [];
1029
+ const text = state.doc.toString();
1030
+ if (options.match) {
1031
+ const matches = text.matchAll(options.match);
1032
+ for (const match2 of matches) {
1033
+ const from = match2.index;
1034
+ const to = from + match2[0].length;
1035
+ const cursor = Cursor.getCursorFromRange(state, {
1036
+ from,
1037
+ to
1038
+ });
1039
+ annotations2.push({
1040
+ cursor
1041
+ });
1042
+ }
1043
+ }
1044
+ return annotations2;
1045
+ };
1046
+ const annotationsState = import_state2.StateField.define({
1047
+ create: (state) => {
1048
+ return match(state);
1049
+ },
1050
+ update: (value, tr) => {
1051
+ if (!tr.changes.empty) {
1052
+ return match(tr.state);
1053
+ }
1054
+ return value;
1055
+ }
1056
+ });
1057
+ return [
1058
+ annotationsState,
1059
+ import_view3.EditorView.decorations.compute([
1060
+ annotationsState
1061
+ ], (state) => {
1062
+ const annotations2 = state.field(annotationsState);
1063
+ const decorations = annotations2.map((annotation) => {
1064
+ const range = Cursor.getRangeFromCursor(state, annotation.cursor);
1065
+ return range && annotationMark.range(range.from, range.to);
1066
+ }).filter(import_util.isNotFalsy);
1067
+ return import_view3.Decoration.set(decorations);
1068
+ }),
1069
+ styles
1070
+ ];
1071
+ };
1072
+ var styles = import_view3.EditorView.theme({
1073
+ ".cm-annotation": {
1074
+ textDecoration: "underline",
1075
+ textDecorationStyle: "wavy",
1076
+ textDecorationColor: "var(--dx-error)"
1077
+ }
1078
+ });
1079
+ var autocomplete = ({ debug, activateOnTyping, override, onSearch } = {}) => {
1080
+ const extensions = [
1081
+ // https://codemirror.net/docs/ref/#view.keymap
1082
+ // https://discuss.codemirror.net/t/how-can-i-replace-the-default-autocompletion-keymap-v6/3322
1083
+ // TODO(burdon): Set custom keymap.
1084
+ import_view4.keymap.of(import_autocomplete.completionKeymap),
1085
+ // https://codemirror.net/examples/autocompletion
1086
+ // https://codemirror.net/docs/ref/#autocomplete.autocompletion
1087
+ (0, import_autocomplete.autocompletion)({
1088
+ activateOnTyping,
1089
+ override,
1090
+ closeOnBlur: !debug,
1091
+ tooltipClass: () => "shadow rounded"
520
1092
  })
521
1093
  ];
522
1094
  if (onSearch) {
@@ -787,7 +1359,7 @@ var automerge = (accessor) => {
787
1359
  // Track heads.
788
1360
  syncState,
789
1361
  // Reconcile external updates.
790
- import_view4.ViewPlugin.fromClass(class {
1362
+ import_view5.ViewPlugin.fromClass(class {
791
1363
  constructor(_view) {
792
1364
  this._view = _view;
793
1365
  this._handleChange = () => {
@@ -800,7 +1372,7 @@ var automerge = (accessor) => {
800
1372
  }
801
1373
  }),
802
1374
  // Reconcile local updates.
803
- import_view4.EditorView.updateListener.of(({ view, changes }) => {
1375
+ import_view5.EditorView.updateListener.of(({ view, changes }) => {
804
1376
  if (!changes.empty) {
805
1377
  syncer.reconcile(view, true);
806
1378
  }
@@ -823,7 +1395,7 @@ var RemoteSelectionChangedAnnotation = import_state7.Annotation.define();
823
1395
  var awareness = (provider = dummyProvider) => {
824
1396
  return [
825
1397
  awarenessProvider.of(provider),
826
- import_view5.ViewPlugin.fromClass(RemoteSelectionsDecorator, {
1398
+ import_view6.ViewPlugin.fromClass(RemoteSelectionsDecorator, {
827
1399
  decorations: (value) => value.decorations
828
1400
  }),
829
1401
  styles2
@@ -887,7 +1459,7 @@ var RemoteSelectionsDecorator = class {
887
1459
  decorations.push({
888
1460
  from: start,
889
1461
  to: end,
890
- value: import_view5.Decoration.mark({
1462
+ value: import_view6.Decoration.mark({
891
1463
  attributes: {
892
1464
  style: `background-color: ${lightColor}`
893
1465
  },
@@ -898,7 +1470,7 @@ var RemoteSelectionsDecorator = class {
898
1470
  decorations.push({
899
1471
  from: start,
900
1472
  to: startLine.from + startLine.length,
901
- value: import_view5.Decoration.mark({
1473
+ value: import_view6.Decoration.mark({
902
1474
  attributes: {
903
1475
  style: `background-color: ${lightColor}`
904
1476
  },
@@ -908,7 +1480,7 @@ var RemoteSelectionsDecorator = class {
908
1480
  decorations.push({
909
1481
  from: endLine.from,
910
1482
  to: end,
911
- value: import_view5.Decoration.mark({
1483
+ value: import_view6.Decoration.mark({
912
1484
  attributes: {
913
1485
  style: `background-color: ${lightColor}`
914
1486
  },
@@ -920,7 +1492,7 @@ var RemoteSelectionsDecorator = class {
920
1492
  decorations.push({
921
1493
  from: linePos,
922
1494
  to: linePos,
923
- value: import_view5.Decoration.line({
1495
+ value: import_view6.Decoration.line({
924
1496
  attributes: {
925
1497
  style: `background-color: ${lightColor}`,
926
1498
  class: "cm-collab-selectionLine"
@@ -932,17 +1504,17 @@ var RemoteSelectionsDecorator = class {
932
1504
  decorations.push({
933
1505
  from: head,
934
1506
  to: head,
935
- value: import_view5.Decoration.widget({
1507
+ value: import_view6.Decoration.widget({
936
1508
  side: head - anchor > 0 ? -1 : 1,
937
1509
  block: false,
938
1510
  widget: new RemoteCaretWidget(state.info.displayName ?? "Anonymous", darkColor)
939
1511
  })
940
1512
  });
941
1513
  }
942
- this.decorations = import_view5.Decoration.set(decorations, true);
1514
+ this.decorations = import_view6.Decoration.set(decorations, true);
943
1515
  }
944
1516
  };
945
- var RemoteCaretWidget = class extends import_view5.WidgetType {
1517
+ var RemoteCaretWidget = class extends import_view6.WidgetType {
946
1518
  constructor(_name, _color) {
947
1519
  super();
948
1520
  this._name = _name;
@@ -978,7 +1550,7 @@ var RemoteCaretWidget = class extends import_view5.WidgetType {
978
1550
  return true;
979
1551
  }
980
1552
  };
981
- var styles2 = import_view5.EditorView.theme({
1553
+ var styles2 = import_view6.EditorView.theme({
982
1554
  ".cm-collab-selection": {},
983
1555
  ".cm-collab-selectionLine": {
984
1556
  padding: 0,
@@ -1181,12 +1753,12 @@ var blast = (options = defaultOptions) => {
1181
1753
  };
1182
1754
  return [
1183
1755
  // Cursor moved.
1184
- import_view6.EditorView.updateListener.of((update2) => {
1756
+ import_view7.EditorView.updateListener.of((update2) => {
1185
1757
  if (blaster?.node !== update2.view.scrollDOM) {
1186
1758
  if (blaster) {
1187
1759
  blaster.destroy();
1188
1760
  }
1189
- blaster = new Blaster(update2.view.scrollDOM, (0, import_lodash.default)({
1761
+ blaster = new Blaster(update2.view.scrollDOM, (0, import_lodash2.default)({
1190
1762
  particleGravity: 0.2,
1191
1763
  particleShrinkRate: 0.995,
1192
1764
  color: () => [
@@ -1212,7 +1784,7 @@ var blast = (options = defaultOptions) => {
1212
1784
  }
1213
1785
  }
1214
1786
  }),
1215
- import_view6.keymap.of([
1787
+ import_view7.keymap.of([
1216
1788
  {
1217
1789
  any: (_, event) => {
1218
1790
  if (blaster) {
@@ -1498,7 +2070,7 @@ var commandState = import_state9.StateField.define({
1498
2070
  return state;
1499
2071
  },
1500
2072
  provide: (field) => [
1501
- import_view9.showTooltip.from(field, (value) => value.tooltip ?? null)
2073
+ import_view10.showTooltip.from(field, (value) => value.tooltip ?? null)
1502
2074
  ]
1503
2075
  });
1504
2076
  var openEffect = import_state9.StateEffect.define();
@@ -1538,7 +2110,7 @@ var commandKeyBindings = [
1538
2110
  run: closeCommand
1539
2111
  }
1540
2112
  ];
1541
- var CommandHint = class extends import_view8.WidgetType {
2113
+ var CommandHint = class extends import_view9.WidgetType {
1542
2114
  constructor(content) {
1543
2115
  super();
1544
2116
  this.content = content;
@@ -1577,9 +2149,9 @@ var CommandHint = class extends import_view8.WidgetType {
1577
2149
  return false;
1578
2150
  }
1579
2151
  };
1580
- var hintViewPlugin = ({ onHint }) => import_view8.ViewPlugin.fromClass(class {
2152
+ var hintViewPlugin = ({ onHint }) => import_view9.ViewPlugin.fromClass(class {
1581
2153
  constructor() {
1582
- this.deco = import_view8.Decoration.none;
2154
+ this.deco = import_view9.Decoration.none;
1583
2155
  }
1584
2156
  update(update2) {
1585
2157
  const builder = new import_state8.RangeSetBuilder();
@@ -1590,7 +2162,7 @@ var hintViewPlugin = ({ onHint }) => import_view8.ViewPlugin.fromClass(class {
1590
2162
  if (selection.from === selection.to && line.from === line.to) {
1591
2163
  const hint = onHint();
1592
2164
  if (hint) {
1593
- builder.add(selection.from, selection.to, import_view8.Decoration.widget({
2165
+ builder.add(selection.from, selection.to, import_view9.Decoration.widget({
1594
2166
  widget: new CommandHint(hint)
1595
2167
  }));
1596
2168
  }
@@ -1600,16 +2172,16 @@ var hintViewPlugin = ({ onHint }) => import_view8.ViewPlugin.fromClass(class {
1600
2172
  }
1601
2173
  }, {
1602
2174
  provide: (plugin) => [
1603
- import_view8.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view8.Decoration.none)
2175
+ import_view9.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view9.Decoration.none)
1604
2176
  ]
1605
2177
  });
1606
2178
  var command = (options) => {
1607
2179
  return [
1608
2180
  commandConfig.of(options),
1609
2181
  commandState,
1610
- import_view7.keymap.of(commandKeyBindings),
2182
+ import_view8.keymap.of(commandKeyBindings),
1611
2183
  hintViewPlugin(options),
1612
- import_view7.EditorView.focusChangeEffect.of((_, focusing) => {
2184
+ import_view8.EditorView.focusChangeEffect.of((_, focusing) => {
1613
2185
  return focusing ? closeEffect.of(null) : null;
1614
2186
  })
1615
2187
  ];
@@ -1621,7 +2193,7 @@ var createEditorStateTransaction = ({ scrollTo, selection }) => {
1621
2193
  return {
1622
2194
  selection,
1623
2195
  scrollIntoView: !scrollTo,
1624
- effects: scrollTo ? import_view11.EditorView.scrollIntoView(scrollTo, {
2196
+ effects: scrollTo ? import_view12.EditorView.scrollIntoView(scrollTo, {
1625
2197
  yMargin: 96
1626
2198
  }) : void 0,
1627
2199
  annotations: import_state11.Transaction.userEvent.of(stateRestoreAnnotation)
@@ -1663,7 +2235,7 @@ var selectionState = ({ getState, setState } = {}) => {
1663
2235
  // setStateDebounced(id, {});
1664
2236
  // },
1665
2237
  // }),
1666
- import_view11.EditorView.updateListener.of(({ view, transactions }) => {
2238
+ import_view12.EditorView.updateListener.of(({ view, transactions }) => {
1667
2239
  const id = view.state.facet(documentId);
1668
2240
  if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
1669
2241
  return;
@@ -1686,7 +2258,7 @@ var selectionState = ({ getState, setState } = {}) => {
1686
2258
  }
1687
2259
  }
1688
2260
  }),
1689
- getState && import_view11.keymap.of([
2261
+ getState && import_view12.keymap.of([
1690
2262
  {
1691
2263
  key: "ctrl-r",
1692
2264
  run: (view) => {
@@ -1729,7 +2301,7 @@ var commentsState = import_state10.StateField.define({
1729
2301
  comment,
1730
2302
  range
1731
2303
  };
1732
- }).filter(import_util2.nonNullable);
2304
+ }).filter(import_util2.isNonNullable);
1733
2305
  return {
1734
2306
  ...value,
1735
2307
  comments: commentStates
@@ -1742,7 +2314,7 @@ var commentsState = import_state10.StateField.define({
1742
2314
  return value;
1743
2315
  }
1744
2316
  });
1745
- var styles3 = import_view10.EditorView.theme({
2317
+ var styles3 = import_view11.EditorView.theme({
1746
2318
  ".cm-comment, .cm-comment-current": {
1747
2319
  margin: "0 -3px",
1748
2320
  padding: "3px",
@@ -1755,23 +2327,23 @@ var styles3 = import_view10.EditorView.theme({
1755
2327
  textDecoration: "underline"
1756
2328
  }
1757
2329
  });
1758
- var createCommentMark = (id, isCurrent) => import_view10.Decoration.mark({
2330
+ var createCommentMark = (id, isCurrent) => import_view11.Decoration.mark({
1759
2331
  class: isCurrent ? "cm-comment-current" : "cm-comment",
1760
2332
  attributes: {
1761
2333
  "data-testid": "cm-comment",
1762
2334
  "data-comment-id": id
1763
2335
  }
1764
2336
  });
1765
- var commentsDecorations = import_view10.EditorView.decorations.compute([
2337
+ var commentsDecorations = import_view11.EditorView.decorations.compute([
1766
2338
  commentsState
1767
2339
  ], (state) => {
1768
2340
  const { selection: { current }, comments: comments2 } = state.field(commentsState);
1769
- const decorations = (0, import_lodash2.default)(comments2 ?? [], (range) => range.range.from)?.flatMap((comment) => {
2341
+ const decorations = (0, import_lodash3.default)(comments2 ?? [], (range) => range.range.from)?.flatMap((comment) => {
1770
2342
  const range = comment.range;
1771
2343
  if (!range) {
1772
2344
  import_log4.log.warn("Invalid range:", range, {
1773
2345
  F: __dxlog_file7,
1774
- L: 142,
2346
+ L: 144,
1775
2347
  S: void 0,
1776
2348
  C: (f, a) => f(...a)
1777
2349
  });
@@ -1781,11 +2353,11 @@ var commentsDecorations = import_view10.EditorView.decorations.compute([
1781
2353
  }
1782
2354
  const mark = createCommentMark(comment.comment.id, comment.comment.id === current);
1783
2355
  return mark.range(range.from, range.to);
1784
- }).filter(import_util2.nonNullable);
1785
- return import_view10.Decoration.set(decorations);
2356
+ }).filter(import_util2.isNonNullable);
2357
+ return import_view11.Decoration.set(decorations);
1786
2358
  });
1787
2359
  var commentClickedEffect = import_state10.StateEffect.define();
1788
- var handleCommentClick = import_view10.EditorView.domEventHandlers({
2360
+ var handleCommentClick = import_view11.EditorView.domEventHandlers({
1789
2361
  click: (event, view) => {
1790
2362
  let target = event.target;
1791
2363
  const editorRoot = view.dom;
@@ -1824,7 +2396,7 @@ var trackPastedComments = (onUpdate) => {
1824
2396
  }
1825
2397
  };
1826
2398
  return [
1827
- import_view10.EditorView.domEventHandlers({
2399
+ import_view11.EditorView.domEventHandlers({
1828
2400
  cut: handleTrack,
1829
2401
  copy: handleTrack
1830
2402
  }),
@@ -1846,7 +2418,7 @@ var trackPastedComments = (onUpdate) => {
1846
2418
  return effects;
1847
2419
  }),
1848
2420
  // Handle paste or the undo of comment deletion.
1849
- import_view10.EditorView.updateListener.of((update2) => {
2421
+ import_view11.EditorView.updateListener.of((update2) => {
1850
2422
  const restore = [];
1851
2423
  for (let i = 0; i < update2.transactions.length; i++) {
1852
2424
  const tr = update2.transactions[i];
@@ -1905,7 +2477,7 @@ var mapTrackedComment = (comment, changes) => ({
1905
2477
  var restoreCommentEffect = import_state10.StateEffect.define({
1906
2478
  map: mapTrackedComment
1907
2479
  });
1908
- var createComment = (view) => {
2480
+ var createComment2 = (view) => {
1909
2481
  const options = view.state.facet(optionsFacet);
1910
2482
  const { from, to } = view.state.selection.main;
1911
2483
  if (from === to) {
@@ -1947,17 +2519,17 @@ var comments = (options = {}) => {
1947
2519
  //
1948
2520
  // Keymap.
1949
2521
  //
1950
- options.onCreate && import_view10.keymap.of([
2522
+ options.onCreate && import_view11.keymap.of([
1951
2523
  {
1952
2524
  key: shortcut,
1953
- run: callbackWrapper(createComment)
2525
+ run: callbackWrapper(createComment2)
1954
2526
  }
1955
2527
  ]),
1956
2528
  //
1957
2529
  // Hover tooltip (for key shortcut hints, etc.)
1958
2530
  // TODO(burdon): Factor out to generic hints extension for current selection/line.
1959
2531
  //
1960
- options.onHover && (0, import_view10.hoverTooltip)((view, pos) => {
2532
+ options.onHover && (0, import_view11.hoverTooltip)((view, pos) => {
1961
2533
  const selection = view.state.selection.main;
1962
2534
  if (selection && pos >= selection.from && pos <= selection.to) {
1963
2535
  return {
@@ -1986,7 +2558,7 @@ var comments = (options = {}) => {
1986
2558
  //
1987
2559
  // Track deleted ranges and update ranges for decorations.
1988
2560
  //
1989
- import_view10.EditorView.updateListener.of(({ view, state, changes }) => {
2561
+ import_view11.EditorView.updateListener.of(({ view, state, changes }) => {
1990
2562
  let mod = false;
1991
2563
  const { comments: comments2, ...value } = state.field(commentsState);
1992
2564
  changes.iterChanges((from, to, from2, to2) => {
@@ -2018,7 +2590,7 @@ var comments = (options = {}) => {
2018
2590
  //
2019
2591
  // Track selection/proximity.
2020
2592
  //
2021
- import_view10.EditorView.updateListener.of(({ view, state }) => {
2593
+ import_view11.EditorView.updateListener.of(({ view, state }) => {
2022
2594
  let min = Infinity;
2023
2595
  const { selection: { current, closest }, comments: comments2 } = state.field(commentsState);
2024
2596
  const { head } = state.selection.main;
@@ -2049,413 +2621,186 @@ var comments = (options = {}) => {
2049
2621
  location: view.coordsAtPos(range.from)
2050
2622
  }))
2051
2623
  });
2052
- }
2053
- }),
2054
- options.onUpdate && trackPastedComments(options.onUpdate)
2055
- ].filter(import_util2.nonNullable);
2056
- };
2057
- var scrollThreadIntoView = (view, id, center = true) => {
2058
- const comment = view.state.field(commentsState).comments.find((range2) => range2.comment.id === id);
2059
- if (!comment?.comment.cursor) {
2060
- return;
2061
- }
2062
- const range = Cursor.getRangeFromCursor(view.state, comment.comment.cursor);
2063
- if (range) {
2064
- const currentSelection = view.state.selection.main;
2065
- const currentScrollPosition = view.scrollDOM.scrollTop;
2066
- const targetScrollPosition = view.coordsAtPos(range.from)?.top;
2067
- const needsScroll = targetScrollPosition !== void 0 && (targetScrollPosition < currentScrollPosition || targetScrollPosition > currentScrollPosition + view.scrollDOM.clientHeight);
2068
- const needsSelectionUpdate = currentSelection.from !== range.from || currentSelection.to !== range.from;
2069
- if (needsScroll || needsSelectionUpdate) {
2070
- view.dispatch({
2071
- selection: needsSelectionUpdate ? {
2072
- anchor: range.from
2073
- } : void 0,
2074
- effects: [
2075
- needsScroll ? import_view10.EditorView.scrollIntoView(range.from, center ? {
2076
- y: "center"
2077
- } : void 0) : [],
2078
- needsSelectionUpdate ? setSelection.of({
2079
- current: id
2080
- }) : []
2081
- ].flat()
2082
- });
2083
- }
2084
- }
2085
- };
2086
- var selectionOverlapsComment = (state) => {
2087
- const commentState = state.field(commentsState, false);
2088
- if (commentState === void 0) {
2089
- return false;
2090
- }
2091
- const { selection } = state;
2092
- for (const range of selection.ranges) {
2093
- if (commentState.comments.some(({ range: commentRange }) => overlap(commentRange, range))) {
2094
- return true;
2095
- }
2096
- }
2097
- return false;
2098
- };
2099
- var hasActiveSelection = (state) => {
2100
- return state.selection.ranges.some((range) => !range.empty);
2101
- };
2102
- var ExternalCommentSync = class {
2103
- constructor(view, id, subscribe, getComments) {
2104
- this.destroy = () => {
2105
- this.unsubscribe();
2106
- };
2107
- const updateComments = () => {
2108
- const comments2 = getComments();
2109
- if (id === view.state.facet(documentId)) {
2110
- queueMicrotask(() => view.dispatch({
2111
- effects: setComments.of({
2112
- id,
2113
- comments: comments2
2114
- })
2115
- }));
2116
- }
2117
- };
2118
- this.unsubscribe = subscribe(updateComments);
2119
- }
2120
- };
2121
- var createExternalCommentSync = (id, subscribe, getComments) => import_view10.ViewPlugin.fromClass(class {
2122
- constructor(view) {
2123
- return new ExternalCommentSync(view, id, subscribe, getComments);
2124
- }
2125
- });
2126
- var useCommentState = () => {
2127
- const [state, setState] = (0, import_react4.useState)({
2128
- comment: false,
2129
- selection: false
2130
- });
2131
- const observer = (0, import_react4.useMemo)(() => import_view10.EditorView.updateListener.of((update2) => {
2132
- if (update2.docChanged || update2.selectionSet) {
2133
- setState({
2134
- comment: selectionOverlapsComment(update2.state),
2135
- selection: hasActiveSelection(update2.state)
2136
- });
2137
- }
2138
- }), []);
2139
- return [
2140
- state,
2141
- observer
2142
- ];
2143
- };
2144
- var useComments = (view, id, comments2) => {
2145
- (0, import_react4.useEffect)(() => {
2146
- if (view) {
2147
- if (id === view.state.facet(documentId)) {
2148
- view.dispatch({
2149
- effects: setComments.of({
2150
- id,
2151
- comments: comments2 ?? []
2152
- })
2153
- });
2154
- }
2155
- }
2156
- });
2157
- };
2158
- var useCommentClickListener = (onCommentClick) => {
2159
- return (0, import_react4.useMemo)(() => import_view10.EditorView.updateListener.of((update2) => {
2160
- update2.transactions.forEach((transaction) => {
2161
- transaction.effects.forEach((effect) => {
2162
- if (effect.is(commentClickedEffect)) {
2163
- onCommentClick(effect.value);
2164
- }
2165
- });
2166
- });
2167
- }), [
2168
- onCommentClick
2169
- ]);
2170
- };
2171
- var debugNodeLogger = (log8 = console.log) => {
2172
- const logTokens = (state) => (0, import_language.syntaxTree)(state).iterate({
2173
- enter: (node) => log8(node.type)
2174
- });
2175
- return import_state12.StateField.define({
2176
- create: (state) => logTokens(state),
2177
- update: (_, tr) => logTokens(tr.state)
2178
- });
2179
- };
2180
- var styles4 = import_view12.EditorView.theme({
2181
- ".cm-dropCursor": {
2182
- borderLeft: "2px solid var(--dx-accentText)",
2183
- color: "var(--dx-accentText)",
2184
- padding: "0 4px"
2185
- },
2186
- ".cm-dropCursor:after": {
2187
- content: '"\u2190"'
2188
- }
2189
- });
2190
- var dropFile = (options = {}) => {
2191
- return [
2192
- styles4,
2193
- (0, import_view12.dropCursor)(),
2194
- import_view12.EditorView.domEventHandlers({
2195
- drop: (event, view) => {
2196
- event.preventDefault();
2197
- const files = event.dataTransfer?.files;
2198
- const pos = view.posAtCoords(event);
2199
- if (files?.length && pos !== null) {
2200
- view.dispatch({
2201
- selection: {
2202
- anchor: pos
2203
- }
2204
- });
2205
- options.onDrop?.(view, {
2206
- files
2207
- });
2208
- }
2209
- }
2210
- })
2211
- ];
2212
- };
2213
- var focusEffect = import_state14.StateEffect.define();
2214
- var focusField = import_state14.StateField.define({
2215
- create: () => false,
2216
- update: (value, tr) => {
2217
- for (const effect of tr.effects) {
2218
- if (effect.is(focusEffect)) {
2219
- return effect.value;
2220
- }
2221
- }
2222
- return value;
2223
- }
2224
- });
2225
- var focus = [
2226
- focusField,
2227
- import_view14.EditorView.domEventHandlers({
2228
- focus: (event, view) => {
2229
- setTimeout(() => view.dispatch({
2230
- effects: focusEffect.of(true)
2231
- }));
2232
- },
2233
- blur: (event, view) => {
2234
- setTimeout(() => view.dispatch({
2235
- effects: focusEffect.of(false)
2236
- }));
2237
- }
2238
- })
2239
- ];
2240
- var headings = {
2241
- 1: "text-4xl",
2242
- 2: "text-3xl",
2243
- 3: "text-2xl",
2244
- 4: "text-xl",
2245
- 5: "text-lg",
2246
- 6: "text-md"
2247
- };
2248
- var theme = {
2249
- code: "font-mono !no-underline text-neutral-700 dark:text-neutral-300",
2250
- codeMark: "font-mono text-primary-500",
2251
- mark: "opacity-50",
2252
- heading: (level) => {
2253
- return (0, import_react_ui_theme4.mx)(headings[level], "dark:text-primary-400");
2254
- }
2255
- };
2256
- var getToken = (path, defaultValue) => {
2257
- const value = (0, import_lodash5.default)(import_react_ui_theme5.tokens, path, defaultValue);
2258
- return value?.toString() ?? "";
2259
- };
2260
- var fontBody = getToken("fontFamily.body");
2261
- var fontMono = getToken("fontFamily.mono");
2262
- var defaultTheme = {
2263
- "&": {},
2264
- "&.cm-focused": {
2265
- outline: "none"
2266
- },
2267
- /**
2268
- * Scroller
2269
- */
2270
- ".cm-scroller": {
2271
- overflowY: "auto"
2272
- },
2273
- /**
2274
- * Content
2275
- * NOTE: Apply margins to content so that scrollbar is at the edge of the container.
2276
- */
2277
- ".cm-content": {
2278
- padding: "unset",
2279
- fontFamily: fontBody,
2280
- // NOTE: Base font size (otherwise defined by HTML tag, which might be different for storybook).
2281
- fontSize: "16px",
2282
- lineHeight: 1.5,
2283
- color: "unset"
2284
- },
2285
- /**
2286
- * Gutters
2287
- * NOTE: Gutters should have the same top margin as the content.
2288
- * NOTE: They can't be transparent since the content needs to scroll below.
2289
- */
2290
- ".cm-gutters": {
2291
- background: "var(--surface-bg)",
2292
- borderRight: "none"
2293
- },
2294
- ".cm-gutter": {},
2295
- ".cm-gutter.cm-lineNumbers .cm-gutterElement": {
2296
- minWidth: "40px",
2297
- alignContent: "center"
2298
- },
2299
- /**
2300
- * Height is set to match the corresponding line.
2301
- */
2302
- ".cm-gutterElement": {
2303
- alignItems: "center",
2304
- fontSize: "16px"
2305
- },
2306
- /**
2307
- * Line.
2308
- */
2309
- ".cm-line": {
2310
- paddingInline: 0
2311
- },
2312
- ".cm-activeLine": {
2313
- background: "var(--dx-cmActiveLine)"
2314
- },
2315
- /**
2316
- * Cursor (layer).
2317
- */
2318
- ".cm-cursor, .cm-dropCursor": {
2319
- borderLeft: "2px solid var(--dx-cmCursor)"
2320
- },
2321
- ".cm-placeholder": {
2322
- color: "var(--dx-subdued)"
2323
- },
2324
- /**
2325
- * Selection (layer).
2326
- */
2327
- ".cm-selectionBackground": {
2328
- background: "var(--dx-cmSelection)"
2329
- },
2330
- /**
2331
- * Search.
2332
- * NOTE: Matches comment.
2333
- */
2334
- ".cm-searchMatch": {
2335
- margin: "0 -3px",
2336
- padding: "3px",
2337
- borderRadius: "3px",
2338
- background: "var(--dx-cmHighlightSurface)",
2339
- color: "var(--dx-cmHighlight)"
2340
- },
2341
- ".cm-searchMatch-selected": {
2342
- textDecoration: "underline"
2343
- },
2344
- /**
2345
- * Link.
2346
- */
2347
- ".cm-link": {
2348
- textDecorationLine: "underline",
2349
- textDecorationThickness: "1px",
2350
- textUnderlineOffset: "2px",
2351
- borderRadius: ".125rem"
2352
- },
2353
- ".cm-link > span": {
2354
- color: "var(--dx-accentText)"
2355
- },
2356
- /**
2357
- * Tooltip.
2358
- */
2359
- ".cm-tooltip": {
2360
- background: "var(--dx-base)"
2361
- },
2362
- ".cm-tooltip-below": {},
2363
- /**
2364
- * Autocomplete.
2365
- * https://github.com/codemirror/autocomplete/blob/main/src/completion.ts
2366
- */
2367
- ".cm-tooltip.cm-tooltip-autocomplete": {
2368
- marginTop: "4px",
2369
- marginLeft: "-3px"
2370
- },
2371
- ".cm-tooltip.cm-tooltip-autocomplete > ul": {
2372
- maxHeight: "20em"
2373
- },
2374
- ".cm-tooltip.cm-tooltip-autocomplete > ul > li": {},
2375
- ".cm-tooltip.cm-tooltip-autocomplete > ul > li[aria-selected]": {},
2376
- ".cm-tooltip.cm-tooltip-autocomplete > ul > completion-section": {
2377
- paddingLeft: "4px !important",
2378
- borderBottom: "none !important",
2379
- color: "var(--dx-accentText)"
2380
- },
2381
- ".cm-tooltip.cm-completionInfo": {
2382
- width: "360px !important",
2383
- margin: "-10px 1px 0 1px",
2384
- padding: "8px !important",
2385
- borderColor: "var(--dx-separator)"
2386
- },
2387
- ".cm-completionIcon": {
2388
- display: "none"
2389
- },
2390
- ".cm-completionLabel": {
2391
- fontFamily: fontBody
2392
- },
2393
- ".cm-completionMatchedText": {
2394
- textDecoration: "none !important",
2395
- opacity: 0.5
2396
- },
2397
- /**
2398
- * Panels
2399
- * https://github.com/codemirror/search/blob/main/src/search.ts#L745
2400
- *
2401
- * Find/replace panel.
2402
- * <div class="cm-announced">...</div>
2403
- * <div class="cm-scroller">...</div>
2404
- * <div class="cm-panels cm-panels-bottom">
2405
- * <div class="cm-search cm-panel">
2406
- * <input class="cm-textfield" />
2407
- * <button class="cm-button">...</button>
2408
- * <label><input type="checkbox" />...</label>
2409
- * </div>
2410
- * </div
2411
- */
2412
- // TODO(burdon): Implement custom panel (with icon buttons).
2413
- ".cm-panels": {},
2414
- ".cm-panel": {
2415
- fontFamily: fontBody,
2416
- backgroundColor: "var(--surface-bg)"
2417
- },
2418
- ".cm-panel input, .cm-panel button, .cm-panel label": {
2419
- color: "var(--dx-subdued)",
2420
- fontFamily: fontBody,
2421
- fontSize: "14px",
2422
- all: "unset",
2423
- margin: "3px !important",
2424
- padding: "2px 6px !important",
2425
- outline: "1px solid transparent"
2426
- },
2427
- ".cm-panel input, .cm-panel button": {
2428
- backgroundColor: "var(--dx-input)"
2429
- },
2430
- ".cm-panel input:focus, .cm-panel button:focus": {
2431
- outline: "1px solid var(--dx-accentFocusIndicator)"
2432
- },
2433
- ".cm-panel label": {
2434
- display: "inline-flex",
2435
- alignItems: "center",
2436
- cursor: "pointer"
2437
- },
2438
- ".cm-panel input.cm-textfield": {},
2439
- ".cm-panel input[type=checkbox]": {
2440
- width: "8px",
2441
- height: "8px",
2442
- marginRight: "6px !important",
2443
- padding: "2px !important",
2444
- color: "var(--dx-accentFocusIndicator)"
2445
- },
2446
- ".cm-panel button": {
2447
- "&:hover": {
2448
- backgroundColor: "var(--dx-accentSurfaceHover) !important"
2449
- },
2450
- "&:active": {
2451
- backgroundColor: "var(--dx-accentSurfaceHover)"
2624
+ }
2625
+ }),
2626
+ options.onUpdate && trackPastedComments(options.onUpdate)
2627
+ ].filter(import_util2.isNonNullable);
2628
+ };
2629
+ var scrollThreadIntoView = (view, id, center = true) => {
2630
+ const comment = view.state.field(commentsState).comments.find((range2) => range2.comment.id === id);
2631
+ if (!comment?.comment.cursor) {
2632
+ return;
2633
+ }
2634
+ const range = Cursor.getRangeFromCursor(view.state, comment.comment.cursor);
2635
+ if (range) {
2636
+ const currentSelection = view.state.selection.main;
2637
+ const currentScrollPosition = view.scrollDOM.scrollTop;
2638
+ const targetScrollPosition = view.coordsAtPos(range.from)?.top;
2639
+ const needsScroll = targetScrollPosition !== void 0 && (targetScrollPosition < currentScrollPosition || targetScrollPosition > currentScrollPosition + view.scrollDOM.clientHeight);
2640
+ const needsSelectionUpdate = currentSelection.from !== range.from || currentSelection.to !== range.from;
2641
+ if (needsScroll || needsSelectionUpdate) {
2642
+ view.dispatch({
2643
+ selection: needsSelectionUpdate ? {
2644
+ anchor: range.from
2645
+ } : void 0,
2646
+ effects: [
2647
+ needsScroll ? import_view11.EditorView.scrollIntoView(range.from, center ? {
2648
+ y: "center"
2649
+ } : void 0) : [],
2650
+ needsSelectionUpdate ? setSelection.of({
2651
+ current: id
2652
+ }) : []
2653
+ ].flat()
2654
+ });
2655
+ }
2656
+ }
2657
+ };
2658
+ var selectionOverlapsComment = (state) => {
2659
+ const commentState = state.field(commentsState, false);
2660
+ if (commentState === void 0) {
2661
+ return false;
2662
+ }
2663
+ const { selection } = state;
2664
+ for (const range of selection.ranges) {
2665
+ if (commentState.comments.some(({ range: commentRange }) => overlap(commentRange, range))) {
2666
+ return true;
2667
+ }
2668
+ }
2669
+ return false;
2670
+ };
2671
+ var hasActiveSelection = (state) => {
2672
+ return state.selection.ranges.some((range) => !range.empty);
2673
+ };
2674
+ var ExternalCommentSync = class {
2675
+ constructor(view, id, subscribe, getComments) {
2676
+ this.destroy = () => {
2677
+ this.unsubscribe();
2678
+ };
2679
+ const updateComments = () => {
2680
+ const comments2 = getComments();
2681
+ if (id === view.state.facet(documentId)) {
2682
+ queueMicrotask(() => view.dispatch({
2683
+ effects: setComments.of({
2684
+ id,
2685
+ comments: comments2
2686
+ })
2687
+ }));
2688
+ }
2689
+ };
2690
+ this.unsubscribe = subscribe(updateComments);
2691
+ }
2692
+ };
2693
+ var createExternalCommentSync = (id, subscribe, getComments) => import_view11.ViewPlugin.fromClass(class {
2694
+ constructor(view) {
2695
+ return new ExternalCommentSync(view, id, subscribe, getComments);
2696
+ }
2697
+ });
2698
+ var useCommentState = (state) => {
2699
+ return (0, import_react4.useMemo)(() => import_view11.EditorView.updateListener.of((update2) => {
2700
+ if (update2.docChanged || update2.selectionSet) {
2701
+ state.comment = selectionOverlapsComment(update2.state);
2702
+ state.selection = hasActiveSelection(update2.state);
2703
+ }
2704
+ }), [
2705
+ state
2706
+ ]);
2707
+ };
2708
+ var useComments = (view, id, comments2) => {
2709
+ (0, import_react4.useEffect)(() => {
2710
+ if (view) {
2711
+ if (id === view.state.facet(documentId)) {
2712
+ view.dispatch({
2713
+ effects: setComments.of({
2714
+ id,
2715
+ comments: comments2 ?? []
2716
+ })
2717
+ });
2718
+ }
2452
2719
  }
2720
+ });
2721
+ };
2722
+ var useCommentClickListener = (onCommentClick) => {
2723
+ return (0, import_react4.useMemo)(() => import_view11.EditorView.updateListener.of((update2) => {
2724
+ update2.transactions.forEach((transaction) => {
2725
+ transaction.effects.forEach((effect) => {
2726
+ if (effect.is(commentClickedEffect)) {
2727
+ onCommentClick(effect.value);
2728
+ }
2729
+ });
2730
+ });
2731
+ }), [
2732
+ onCommentClick
2733
+ ]);
2734
+ };
2735
+ var debugNodeLogger = (log8 = console.log) => {
2736
+ const logTokens = (state) => (0, import_language.syntaxTree)(state).iterate({
2737
+ enter: (node) => log8(node.type)
2738
+ });
2739
+ return import_state12.StateField.define({
2740
+ create: (state) => logTokens(state),
2741
+ update: (_, tr) => logTokens(tr.state)
2742
+ });
2743
+ };
2744
+ var styles4 = import_view13.EditorView.theme({
2745
+ ".cm-dropCursor": {
2746
+ borderLeft: "2px solid var(--dx-accentText)",
2747
+ color: "var(--dx-accentText)",
2748
+ padding: "0 4px"
2453
2749
  },
2454
- ".cm-panel.cm-search": {
2455
- padding: "4px",
2456
- borderTop: "1px solid var(--dx-separator)"
2750
+ ".cm-dropCursor:after": {
2751
+ content: '"\u2190"'
2457
2752
  }
2753
+ });
2754
+ var dropFile = (options = {}) => {
2755
+ return [
2756
+ styles4,
2757
+ (0, import_view13.dropCursor)(),
2758
+ import_view13.EditorView.domEventHandlers({
2759
+ drop: (event, view) => {
2760
+ event.preventDefault();
2761
+ const files = event.dataTransfer?.files;
2762
+ const pos = view.posAtCoords(event);
2763
+ if (files?.length && pos !== null) {
2764
+ view.dispatch({
2765
+ selection: {
2766
+ anchor: pos
2767
+ }
2768
+ });
2769
+ options.onDrop?.(view, {
2770
+ files
2771
+ });
2772
+ }
2773
+ }
2774
+ })
2775
+ ];
2458
2776
  };
2777
+ var focusEffect = import_state14.StateEffect.define();
2778
+ var focusField = import_state14.StateField.define({
2779
+ create: () => false,
2780
+ update: (value, tr) => {
2781
+ for (const effect of tr.effects) {
2782
+ if (effect.is(focusEffect)) {
2783
+ return effect.value;
2784
+ }
2785
+ }
2786
+ return value;
2787
+ }
2788
+ });
2789
+ var focus = [
2790
+ focusField,
2791
+ import_view15.EditorView.domEventHandlers({
2792
+ focus: (event, view) => {
2793
+ setTimeout(() => view.dispatch({
2794
+ effects: focusEffect.of(true)
2795
+ }));
2796
+ },
2797
+ blur: (event, view) => {
2798
+ setTimeout(() => view.dispatch({
2799
+ effects: focusEffect.of(false)
2800
+ }));
2801
+ }
2802
+ })
2803
+ ];
2459
2804
  var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
2460
2805
  var preventNewline = import_state13.EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
2461
2806
  var defaultBasicOptions = {
@@ -2477,10 +2822,10 @@ var keymaps = {
2477
2822
  default: import_commands2.defaultKeymap
2478
2823
  };
2479
2824
  var createBasicExtensions = (_props) => {
2480
- const props = (0, import_lodash3.default)({}, _props, defaultBasicOptions);
2825
+ const props = (0, import_lodash4.default)({}, _props, defaultBasicOptions);
2481
2826
  return [
2482
2827
  // NOTE: Doesn't catch errors in keymap functions.
2483
- import_view13.EditorView.exceptionSink.of((err) => {
2828
+ import_view14.EditorView.exceptionSink.of((err) => {
2484
2829
  import_log5.log.catch(err, void 0, {
2485
2830
  F: __dxlog_file8,
2486
2831
  L: 96,
@@ -2491,24 +2836,24 @@ var createBasicExtensions = (_props) => {
2491
2836
  props.allowMultipleSelections && import_state13.EditorState.allowMultipleSelections.of(true),
2492
2837
  props.bracketMatching && (0, import_language2.bracketMatching)(),
2493
2838
  props.closeBrackets && (0, import_autocomplete2.closeBrackets)(),
2494
- props.dropCursor && (0, import_view13.dropCursor)(),
2495
- props.drawSelection && (0, import_view13.drawSelection)({
2839
+ props.dropCursor && (0, import_view14.dropCursor)(),
2840
+ props.drawSelection && (0, import_view14.drawSelection)({
2496
2841
  cursorBlinkRate: 1200
2497
2842
  }),
2498
2843
  props.focus && focus,
2499
- props.highlightActiveLine && (0, import_view13.highlightActiveLine)(),
2844
+ props.highlightActiveLine && (0, import_view14.highlightActiveLine)(),
2500
2845
  props.history && (0, import_commands2.history)(),
2501
- props.lineNumbers && (0, import_view13.lineNumbers)(),
2502
- props.lineWrapping && import_view13.EditorView.lineWrapping,
2503
- props.placeholder && (0, import_view13.placeholder)(props.placeholder),
2846
+ props.lineNumbers && (0, import_view14.lineNumbers)(),
2847
+ props.lineWrapping && import_view14.EditorView.lineWrapping,
2848
+ props.placeholder && (0, import_view14.placeholder)(props.placeholder),
2504
2849
  props.readonly && [
2505
2850
  import_state13.EditorState.readOnly.of(true),
2506
- import_view13.EditorView.editable.of(false)
2851
+ import_view14.EditorView.editable.of(false)
2507
2852
  ],
2508
- props.scrollPastEnd && (0, import_view13.scrollPastEnd)(),
2853
+ props.scrollPastEnd && (0, import_view14.scrollPastEnd)(),
2509
2854
  props.tabSize && import_state13.EditorState.tabSize.of(props.tabSize),
2510
2855
  // https://codemirror.net/docs/ref/#view.KeyBinding
2511
- import_view13.keymap.of([
2856
+ import_view14.keymap.of([
2512
2857
  ...(props.keymap && keymaps[props.keymap]) ?? [],
2513
2858
  // NOTE: Tabs are also configured by markdown extension.
2514
2859
  // https://codemirror.net/docs/ref/#commands.indentWithTab
@@ -2520,7 +2865,14 @@ var createBasicExtensions = (_props) => {
2520
2865
  // https://codemirror.net/docs/ref/#commands.historyKeymap
2521
2866
  ...props.history ? import_commands2.historyKeymap : [],
2522
2867
  // https://codemirror.net/docs/ref/#search.searchKeymap
2523
- ...props.search ? import_search.searchKeymap : []
2868
+ ...props.search ? import_search.searchKeymap : [],
2869
+ // Disable bindings that conflict with system shortcuts.
2870
+ // TODO(burdon): Catalog global shortcuts.
2871
+ {
2872
+ key: "Mod-Shift-k",
2873
+ preventDefault: true,
2874
+ run: () => true
2875
+ }
2524
2876
  ].filter(import_util4.isNotFalsy))
2525
2877
  ].filter(import_util4.isNotFalsy);
2526
2878
  };
@@ -2530,16 +2882,16 @@ var defaultThemeSlots = {
2530
2882
  }
2531
2883
  };
2532
2884
  var createThemeExtensions = ({ themeMode, styles: styles5, syntaxHighlighting: _syntaxHighlighting, slots: _slots } = {}) => {
2533
- const slots = (0, import_lodash3.default)({}, _slots, defaultThemeSlots);
2885
+ const slots = (0, import_lodash4.default)({}, _slots, defaultThemeSlots);
2534
2886
  return [
2535
- import_view13.EditorView.darkTheme.of(themeMode === "dark"),
2536
- import_view13.EditorView.baseTheme(styles5 ? (0, import_lodash4.default)({}, defaultTheme, styles5) : defaultTheme),
2887
+ import_view14.EditorView.darkTheme.of(themeMode === "dark"),
2888
+ import_view14.EditorView.baseTheme(styles5 ? (0, import_lodash5.default)({}, defaultTheme, styles5) : defaultTheme),
2537
2889
  // https://github.com/codemirror/theme-one-dark
2538
2890
  _syntaxHighlighting && (themeMode === "dark" ? (0, import_language2.syntaxHighlighting)(import_theme_one_dark.oneDarkHighlightStyle) : (0, import_language2.syntaxHighlighting)(import_language2.defaultHighlightStyle)),
2539
- slots.editor?.className && import_view13.EditorView.editorAttributes.of({
2891
+ slots.editor?.className && import_view14.EditorView.editorAttributes.of({
2540
2892
  class: slots.editor.className
2541
2893
  }),
2542
- slots.content?.className && import_view13.EditorView.contentAttributes.of({
2894
+ slots.content?.className && import_view14.EditorView.contentAttributes.of({
2543
2895
  class: slots.content.className
2544
2896
  })
2545
2897
  ].filter(import_util4.isNotFalsy);
@@ -2551,15 +2903,15 @@ var createDataExtensions = ({ id, text, space, identity }) => {
2551
2903
  }
2552
2904
  if (space && identity) {
2553
2905
  const peerId = identity?.identityKey.toHex();
2554
- const { cursorLightValue, cursorDarkValue } = import_react_ui_theme3.hueTokens[identity?.profile?.data?.hue ?? (0, import_util4.hexToHue)(peerId ?? "0")];
2906
+ const hue = identity?.profile?.data?.hue ?? (0, import_util4.hexToHue)(peerId ?? "0");
2555
2907
  extensions.push(awareness(new SpaceAwarenessProvider({
2556
2908
  space,
2557
2909
  channel: `awareness.${id}`,
2558
2910
  peerId: identity.identityKey.toHex(),
2559
2911
  info: {
2560
2912
  displayName: identity.profile?.displayName ?? (0, import_display_name.generateName)(identity.identityKey.toHex()),
2561
- darkColor: cursorDarkValue,
2562
- lightColor: cursorLightValue
2913
+ darkColor: `var(--dx-${hue}Cursor)`,
2914
+ lightColor: `var(--dx-${hue}Cursor)`
2563
2915
  }
2564
2916
  })));
2565
2917
  }
@@ -2586,7 +2938,7 @@ var folding = (_props = {}) => [
2586
2938
  }));
2587
2939
  }
2588
2940
  }),
2589
- import_view15.EditorView.theme({
2941
+ import_view16.EditorView.theme({
2590
2942
  ".cm-foldGutter": {
2591
2943
  opacity: 0.3,
2592
2944
  transition: "opacity 0.3s",
@@ -2599,11 +2951,11 @@ var folding = (_props = {}) => [
2599
2951
  ];
2600
2952
  var listener = ({ onFocus, onChange }) => {
2601
2953
  const extensions = [];
2602
- onFocus && extensions.push(import_view16.EditorView.focusChangeEffect.of((_, focusing) => {
2954
+ onFocus && extensions.push(import_view17.EditorView.focusChangeEffect.of((_, focusing) => {
2603
2955
  onFocus(focusing);
2604
2956
  return null;
2605
2957
  }));
2606
- onChange && extensions.push(import_view16.EditorView.updateListener.of((update2) => {
2958
+ onChange && extensions.push(import_view17.EditorView.updateListener.of((update2) => {
2607
2959
  onChange(update2.state.doc.toString(), update2.state.facet(documentId));
2608
2960
  }));
2609
2961
  return extensions;
@@ -3494,7 +3846,7 @@ var toggleCodeblock = (target) => {
3494
3846
  };
3495
3847
  var formattingKeymap = (_options = {}) => {
3496
3848
  return [
3497
- import_view17.keymap.of([
3849
+ import_view18.keymap.of([
3498
3850
  {
3499
3851
  key: "meta-b",
3500
3852
  run: toggleStrong
@@ -3694,63 +4046,54 @@ var getFormatting = (state) => {
3694
4046
  listStyle: listStyle || null
3695
4047
  };
3696
4048
  };
3697
- var useFormattingState = () => {
3698
- const [state, setState] = (0, import_react6.useState)();
3699
- const observer = (0, import_react6.useMemo)(() => import_view17.EditorView.updateListener.of((update2) => {
4049
+ var useFormattingState = (state) => {
4050
+ return (0, import_react6.useMemo)(() => import_view18.EditorView.updateListener.of((update2) => {
3700
4051
  if (update2.docChanged || update2.selectionSet) {
3701
- setState((prevState) => {
3702
- const newState = getFormatting(update2.state);
3703
- if (!prevState || !formattingEquals(prevState, newState)) {
3704
- return newState;
3705
- }
3706
- return prevState;
4052
+ Object.entries(getFormatting(update2.state)).forEach(([key, active]) => {
4053
+ state[key] = active;
3707
4054
  });
3708
4055
  }
3709
4056
  }), []);
3710
- return [
3711
- state,
3712
- observer
3713
- ];
3714
4057
  };
3715
- var processAction = (view, action) => {
4058
+ var processEditorPayload = (view, { type, data }) => {
3716
4059
  let inlineType, listType;
3717
- switch (action.type) {
4060
+ switch (type) {
3718
4061
  case "heading":
3719
- setHeading(parseInt(action.data))(view);
4062
+ setHeading(parseInt(data))(view);
3720
4063
  break;
3721
4064
  case "strong":
3722
4065
  case "emphasis":
3723
4066
  case "strikethrough":
3724
4067
  case "code":
3725
- inlineType = action.type === "strong" ? Inline.Strong : action.type === "emphasis" ? Inline.Emphasis : action.type === "strikethrough" ? Inline.Strikethrough : Inline.Code;
3726
- (typeof action.data === "boolean" ? setStyle(inlineType, action.data) : toggleStyle(inlineType))(view);
4068
+ inlineType = type === "strong" ? Inline.Strong : type === "emphasis" ? Inline.Emphasis : type === "strikethrough" ? Inline.Strikethrough : Inline.Code;
4069
+ (typeof data === "boolean" ? setStyle(inlineType, data) : toggleStyle(inlineType))(view);
3727
4070
  break;
3728
4071
  case "list-ordered":
3729
4072
  case "list-bullet":
3730
4073
  case "list-task":
3731
- listType = action.type === "list-ordered" ? List.Ordered : action.type === "list-bullet" ? List.Bullet : List.Task;
3732
- (action.data === false ? removeList(listType) : action.data === true ? addList(listType) : toggleList(listType))(view);
4074
+ listType = type === "list-ordered" ? List.Ordered : type === "list-bullet" ? List.Bullet : List.Task;
4075
+ (data === false ? removeList(listType) : data === true ? addList(listType) : toggleList(listType))(view);
3733
4076
  break;
3734
4077
  case "blockquote":
3735
- (action.data === false ? removeBlockquote : action.data === true ? addBlockquote : toggleBlockquote)(view);
4078
+ (data === false ? removeBlockquote : data === true ? addBlockquote : toggleBlockquote)(view);
3736
4079
  break;
3737
4080
  case "codeblock":
3738
- (action.data === false ? removeCodeblock : addCodeblock)(view);
4081
+ (data === false ? removeCodeblock : addCodeblock)(view);
3739
4082
  break;
3740
4083
  case "table":
3741
4084
  insertTable(view);
3742
4085
  break;
3743
4086
  case "link":
3744
- (action.data === false ? removeLink : addLink())(view);
4087
+ (data === false ? removeLink : addLink())(view);
3745
4088
  break;
3746
4089
  case "image":
3747
4090
  addLink({
3748
- url: action.data,
4091
+ url: data,
3749
4092
  image: true
3750
4093
  })(view);
3751
4094
  break;
3752
4095
  case "comment":
3753
- createComment(view);
4096
+ createComment2(view);
3754
4097
  break;
3755
4098
  }
3756
4099
  requestAnimationFrame(() => {
@@ -3956,7 +4299,7 @@ var createMarkdownExtensions = ({ themeMode } = {}) => {
3956
4299
  }),
3957
4300
  // Custom styles.
3958
4301
  (0, import_language5.syntaxHighlighting)(markdownHighlightStyle()),
3959
- import_view18.keymap.of([
4302
+ import_view19.keymap.of([
3960
4303
  // https://codemirror.net/docs/ref/#commands.indentWithTab
3961
4304
  import_commands3.indentWithTab,
3962
4305
  // https://codemirror.net/docs/ref/#commands.defaultKeymap
@@ -3990,7 +4333,7 @@ var convertTreeToJson = (state) => {
3990
4333
  return treeToJson((0, import_language7.syntaxTree)(state).cursor());
3991
4334
  };
3992
4335
  var adjustChanges = () => {
3993
- return import_view20.ViewPlugin.fromClass(class {
4336
+ return import_view21.ViewPlugin.fromClass(class {
3994
4337
  update(update2) {
3995
4338
  const tree = (0, import_language9.syntaxTree)(update2.state);
3996
4339
  const adjustments = [];
@@ -4132,7 +4475,7 @@ var image = (_options = {}) => {
4132
4475
  return [
4133
4476
  import_state19.StateField.define({
4134
4477
  create: (state) => {
4135
- return import_view21.Decoration.set(buildDecorations(0, state.doc.length, state));
4478
+ return import_view22.Decoration.set(buildDecorations(0, state.doc.length, state));
4136
4479
  },
4137
4480
  update: (value, tr) => {
4138
4481
  if (!tr.docChanged && !tr.selection) {
@@ -4155,7 +4498,7 @@ var image = (_options = {}) => {
4155
4498
  add: buildDecorations(from, to, tr.state)
4156
4499
  });
4157
4500
  },
4158
- provide: (field) => import_view21.EditorView.decorations.from(field)
4501
+ provide: (field) => import_view22.EditorView.decorations.from(field)
4159
4502
  })
4160
4503
  ];
4161
4504
  };
@@ -4181,7 +4524,7 @@ var buildDecorations = (from, to, state) => {
4181
4524
  return;
4182
4525
  }
4183
4526
  preloadImage(url);
4184
- decorations.push(import_view21.Decoration.replace({
4527
+ decorations.push(import_view22.Decoration.replace({
4185
4528
  block: true,
4186
4529
  widget: new ImageWidget(url)
4187
4530
  }).range(hide2 ? node.from : node.to, node.to));
@@ -4193,7 +4536,7 @@ var buildDecorations = (from, to, state) => {
4193
4536
  });
4194
4537
  return decorations;
4195
4538
  };
4196
- var ImageWidget = class extends import_view21.WidgetType {
4539
+ var ImageWidget = class extends import_view22.WidgetType {
4197
4540
  constructor(_url) {
4198
4541
  super();
4199
4542
  this._url = _url;
@@ -4215,7 +4558,7 @@ var ImageWidget = class extends import_view21.WidgetType {
4215
4558
  };
4216
4559
  var bulletListIndentationWidth = 24;
4217
4560
  var orderedListIndentationWidth = 36;
4218
- var formattingStyles = import_view22.EditorView.theme({
4561
+ var formattingStyles = import_view23.EditorView.theme({
4219
4562
  /**
4220
4563
  * Horizontal rule.
4221
4564
  */
@@ -4309,13 +4652,34 @@ var formattingStyles = import_view22.EditorView.theme({
4309
4652
  height: "auto",
4310
4653
  borderTop: "0.5rem solid transparent",
4311
4654
  borderBottom: "0.5rem solid transparent"
4655
+ },
4656
+ ".cm-image-with-loader": {
4657
+ display: "block",
4658
+ opacity: "0",
4659
+ transitionDuration: "350ms",
4660
+ transitionProperty: "opacity"
4661
+ },
4662
+ ".cm-image-with-loader.cm-loaded-image": {
4663
+ opacity: "1"
4664
+ },
4665
+ ".cm-image-wrapper": {
4666
+ "grid-template-columns": "1fr",
4667
+ display: "grid",
4668
+ margin: "0.5rem 0",
4669
+ overflow: "hidden",
4670
+ transitionDuration: "350ms",
4671
+ transitionProperty: "height",
4672
+ "& > *": {
4673
+ "grid-row-start": 1,
4674
+ "grid-column-start": 1
4675
+ }
4312
4676
  }
4313
4677
  });
4314
4678
  var table = (options = {}) => {
4315
4679
  return import_state20.StateField.define({
4316
4680
  create: (state) => update(state, options),
4317
4681
  update: (_, tr) => update(tr.state, options),
4318
- provide: (field) => import_view23.EditorView.decorations.from(field)
4682
+ provide: (field) => import_view24.EditorView.decorations.from(field)
4319
4683
  });
4320
4684
  };
4321
4685
  var update = (state, _options) => {
@@ -4360,19 +4724,19 @@ var update = (state, _options) => {
4360
4724
  tables.forEach((table2) => {
4361
4725
  const replace = state.readOnly || cursor < table2.from || cursor > table2.to;
4362
4726
  if (replace) {
4363
- builder.add(table2.from, table2.to, import_view23.Decoration.replace({
4727
+ builder.add(table2.from, table2.to, import_view24.Decoration.replace({
4364
4728
  block: true,
4365
4729
  widget: new TableWidget(table2)
4366
4730
  }));
4367
4731
  } else {
4368
- builder.add(table2.from, table2.to, import_view23.Decoration.mark({
4732
+ builder.add(table2.from, table2.to, import_view24.Decoration.mark({
4369
4733
  class: "cm-table"
4370
4734
  }));
4371
4735
  }
4372
4736
  });
4373
4737
  return builder.finish();
4374
4738
  };
4375
- var TableWidget = class extends import_view23.WidgetType {
4739
+ var TableWidget = class extends import_view24.WidgetType {
4376
4740
  constructor(_table) {
4377
4741
  super();
4378
4742
  this._table = _table;
@@ -4412,14 +4776,14 @@ var Unicode = {
4412
4776
  bulletSmall: "\u2219",
4413
4777
  bulletSquare: "\u2B1D"
4414
4778
  };
4415
- var HorizontalRuleWidget = class extends import_view19.WidgetType {
4779
+ var HorizontalRuleWidget = class extends import_view20.WidgetType {
4416
4780
  toDOM() {
4417
4781
  const el = document.createElement("span");
4418
4782
  el.className = "cm-hr";
4419
4783
  return el;
4420
4784
  }
4421
4785
  };
4422
- var LinkButton = class extends import_view19.WidgetType {
4786
+ var LinkButton = class extends import_view20.WidgetType {
4423
4787
  constructor(url, render) {
4424
4788
  super();
4425
4789
  this.url = url;
@@ -4435,7 +4799,7 @@ var LinkButton = class extends import_view19.WidgetType {
4435
4799
  return el;
4436
4800
  }
4437
4801
  };
4438
- var CheckboxWidget = class extends import_view19.WidgetType {
4802
+ var CheckboxWidget = class extends import_view20.WidgetType {
4439
4803
  constructor(_checked) {
4440
4804
  super();
4441
4805
  this._checked = _checked;
@@ -4445,7 +4809,7 @@ var CheckboxWidget = class extends import_view19.WidgetType {
4445
4809
  }
4446
4810
  toDOM(view) {
4447
4811
  const input = document.createElement("input");
4448
- input.className = "cm-task-checkbox ch-checkbox";
4812
+ input.className = "cm-task-checkbox dx-checkbox";
4449
4813
  input.type = "checkbox";
4450
4814
  input.tabIndex = -1;
4451
4815
  input.checked = this._checked;
@@ -4480,7 +4844,7 @@ var CheckboxWidget = class extends import_view19.WidgetType {
4480
4844
  return false;
4481
4845
  }
4482
4846
  };
4483
- var TextWidget = class extends import_view19.WidgetType {
4847
+ var TextWidget = class extends import_view20.WidgetType {
4484
4848
  constructor(text, className) {
4485
4849
  super();
4486
4850
  this.text = text;
@@ -4495,29 +4859,29 @@ var TextWidget = class extends import_view19.WidgetType {
4495
4859
  return el;
4496
4860
  }
4497
4861
  };
4498
- var hide = import_view19.Decoration.replace({});
4499
- var blockQuote = import_view19.Decoration.line({
4500
- class: (0, import_react_ui_theme6.mx)("cm-blockquote")
4862
+ var hide = import_view20.Decoration.replace({});
4863
+ var blockQuote = import_view20.Decoration.line({
4864
+ class: (0, import_react_ui_theme7.mx)("cm-blockquote")
4501
4865
  });
4502
- var fencedCodeLine = import_view19.Decoration.line({
4503
- class: (0, import_react_ui_theme6.mx)("cm-code cm-codeblock-line")
4866
+ var fencedCodeLine = import_view20.Decoration.line({
4867
+ class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line")
4504
4868
  });
4505
- var fencedCodeLineFirst = import_view19.Decoration.line({
4506
- class: (0, import_react_ui_theme6.mx)("cm-code cm-codeblock-line", "cm-codeblock-first")
4869
+ var fencedCodeLineFirst = import_view20.Decoration.line({
4870
+ class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line", "cm-codeblock-first")
4507
4871
  });
4508
- var fencedCodeLineLast = import_view19.Decoration.line({
4509
- class: (0, import_react_ui_theme6.mx)("cm-code cm-codeblock-line", "cm-codeblock-last")
4872
+ var fencedCodeLineLast = import_view20.Decoration.line({
4873
+ class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line", "cm-codeblock-last")
4510
4874
  });
4511
4875
  var commentBlockLine = fencedCodeLine;
4512
4876
  var commentBlockLineFirst = fencedCodeLineFirst;
4513
4877
  var commentBlockLineLast = fencedCodeLineLast;
4514
- var horizontalRule = import_view19.Decoration.replace({
4878
+ var horizontalRule = import_view20.Decoration.replace({
4515
4879
  widget: new HorizontalRuleWidget()
4516
4880
  });
4517
- var checkedTask = import_view19.Decoration.replace({
4881
+ var checkedTask = import_view20.Decoration.replace({
4518
4882
  widget: new CheckboxWidget(true)
4519
4883
  });
4520
- var uncheckedTask = import_view19.Decoration.replace({
4884
+ var uncheckedTask = import_view20.Decoration.replace({
4521
4885
  widget: new CheckboxWidget(false)
4522
4886
  });
4523
4887
  var editingRange = (state, range, focus2) => {
@@ -4618,7 +4982,7 @@ var buildDecorations2 = (view, options, focus2) => {
4618
4982
  } else {
4619
4983
  const num = headers.slice(from - 1).map((level2) => level2?.number ?? 0).join(".") + " ";
4620
4984
  if (num.length) {
4621
- atomicDeco.add(mark.from, mark.from + len, import_view19.Decoration.replace({
4985
+ atomicDeco.add(mark.from, mark.from + len, import_view20.Decoration.replace({
4622
4986
  widget: new TextWidget(num, theme.heading(level))
4623
4987
  }));
4624
4988
  }
@@ -4643,7 +5007,7 @@ var buildDecorations2 = (view, options, focus2) => {
4643
5007
  if (node.from === line.to - 1) {
4644
5008
  return false;
4645
5009
  }
4646
- deco.add(line.from, line.from, import_view19.Decoration.line({
5010
+ deco.add(line.from, line.from, import_view20.Decoration.line({
4647
5011
  class: "cm-list-item",
4648
5012
  attributes: {
4649
5013
  style: `padding-left: ${offset}px; text-indent: -${width}px;`
@@ -4660,7 +5024,7 @@ var buildDecorations2 = (view, options, focus2) => {
4660
5024
  const label = list.type === "OrderedList" ? `${++list.number}.` : Unicode.bulletSmall;
4661
5025
  const line = state.doc.lineAt(node.from);
4662
5026
  const to = state.doc.sliceString(node.to, node.to + 1) === " " ? node.to + 1 : node.to;
4663
- atomicDeco.add(line.from, to, import_view19.Decoration.replace({
5027
+ atomicDeco.add(line.from, to, import_view20.Decoration.replace({
4664
5028
  widget: new TextWidget(label, list.type === "OrderedList" ? "cm-list-mark cm-list-mark-ordered" : "cm-list-mark cm-list-mark-bullet")
4665
5029
  }));
4666
5030
  break;
@@ -4747,7 +5111,7 @@ var buildDecorations2 = (view, options, focus2) => {
4747
5111
  if (!editing) {
4748
5112
  atomicDeco.add(node.from, marks[0].to, hide);
4749
5113
  }
4750
- deco.add(marks[0].to, marks[1].from, import_view19.Decoration.mark({
5114
+ deco.add(marks[0].to, marks[1].from, import_view20.Decoration.mark({
4751
5115
  tagName: "a",
4752
5116
  attributes: {
4753
5117
  class: "cm-link",
@@ -4757,7 +5121,7 @@ var buildDecorations2 = (view, options, focus2) => {
4757
5121
  }
4758
5122
  }));
4759
5123
  if (!editing) {
4760
- atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view19.Decoration.replace({
5124
+ atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view20.Decoration.replace({
4761
5125
  widget: new LinkButton(url, options.renderLinkButton)
4762
5126
  }) : hide);
4763
5127
  }
@@ -4815,7 +5179,7 @@ var buildDecorations2 = (view, options, focus2) => {
4815
5179
  var forceUpdate = import_state17.StateEffect.define();
4816
5180
  var decorateMarkdown = (options = {}) => {
4817
5181
  return [
4818
- import_view19.ViewPlugin.fromClass(class {
5182
+ import_view20.ViewPlugin.fromClass(class {
4819
5183
  constructor(view) {
4820
5184
  ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations2(view, options, view.hasFocus));
4821
5185
  }
@@ -4847,9 +5211,9 @@ var decorateMarkdown = (options = {}) => {
4847
5211
  }
4848
5212
  }, {
4849
5213
  provide: (plugin) => [
4850
- import_view19.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view19.Decoration.none),
4851
- import_view19.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view19.Decoration.none),
4852
- import_view19.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view19.Decoration.none)
5214
+ import_view20.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view20.Decoration.none),
5215
+ import_view20.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view20.Decoration.none),
5216
+ import_view20.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view20.Decoration.none)
4853
5217
  ]
4854
5218
  }),
4855
5219
  image(),
@@ -4859,7 +5223,7 @@ var decorateMarkdown = (options = {}) => {
4859
5223
  ];
4860
5224
  };
4861
5225
  var linkTooltip = (render) => {
4862
- return (0, import_view24.hoverTooltip)((view, pos, side) => {
5226
+ return (0, import_view25.hoverTooltip)((view, pos, side) => {
4863
5227
  const syntax = (0, import_language12.syntaxTree)(view.state).resolveInner(pos, side);
4864
5228
  let link = null;
4865
5229
  for (let i = 0, node = syntax; !link && node && i < 5; node = node.parent, i++) {
@@ -4876,7 +5240,7 @@ var linkTooltip = (render) => {
4876
5240
  above: true,
4877
5241
  create: () => {
4878
5242
  const el = document.createElement("div");
4879
- el.className = (0, import_react_ui_theme7.tooltipContent)({}, "pli-2 plb-1");
5243
+ el.className = (0, import_react_ui_theme8.tooltipContent)({}, "pli-2 plb-1");
4880
5244
  render(el, urlText);
4881
5245
  return {
4882
5246
  dom: el,
@@ -4943,7 +5307,7 @@ var InputModeExtensions = {
4943
5307
  editorInputMode.of({
4944
5308
  type: "vscode"
4945
5309
  }),
4946
- import_view25.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5310
+ import_view26.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
4947
5311
  ],
4948
5312
  vim: [
4949
5313
  // https://github.com/replit/codemirror-vim
@@ -4952,7 +5316,7 @@ var InputModeExtensions = {
4952
5316
  type: "vim",
4953
5317
  noTabster: true
4954
5318
  }),
4955
- import_view25.keymap.of([
5319
+ import_view26.keymap.of([
4956
5320
  {
4957
5321
  key: "Alt-Escape",
4958
5322
  run: (view) => {
@@ -4972,7 +5336,7 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
4972
5336
  let t;
4973
5337
  let idx = 0;
4974
5338
  return [
4975
- import_view26.keymap.of([
5339
+ import_view27.keymap.of([
4976
5340
  {
4977
5341
  // Reset.
4978
5342
  key: "alt-meta-'",
@@ -5017,413 +5381,19 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
5017
5381
  ])
5018
5382
  ];
5019
5383
  };
5020
- var iconStyles = (0, import_react_ui_theme.getSize)(5);
5021
- var buttonStyles = "min-bs-0 p-1";
5022
- var tooltipProps = {
5023
- side: "top",
5024
- classNames: "z-10"
5025
- };
5026
- var ToolbarSeparator = () => /* @__PURE__ */ import_react2.default.createElement("div", {
5027
- role: "separator",
5028
- className: "grow"
5029
- });
5030
- var [ToolbarContextProvider, useToolbarContext] = (0, import_react_context.createContext)("Toolbar");
5031
- var ToolbarRoot = ({ children, onAction, classNames, state }) => {
5032
- return /* @__PURE__ */ import_react2.default.createElement(ToolbarContextProvider, {
5033
- onAction,
5034
- state
5035
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.ElevationProvider, {
5036
- elevation: "positioned"
5037
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.Root, {
5038
- classNames: [
5039
- "p-1 is-full shrink-0 overflow-x-auto overflow-y-hidden",
5040
- classNames
5041
- ],
5042
- style: {
5043
- contain: "layout"
5044
- }
5045
- }, children)));
5046
- };
5047
- var ToolbarToggleButton = ({ Icon: Icon2, children, ...props }) => {
5048
- return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Root, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Trigger, {
5049
- asChild: true
5050
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.ToggleGroupItem, {
5051
- variant: "ghost",
5052
- ...props,
5053
- classNames: buttonStyles
5054
- }, /* @__PURE__ */ import_react2.default.createElement(Icon2, {
5055
- className: iconStyles
5056
- }), /* @__PURE__ */ import_react2.default.createElement("span", {
5057
- className: "sr-only"
5058
- }, children))), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Portal, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Content, tooltipProps, children, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Arrow, null))));
5059
- };
5060
- var ToolbarButton = ({ Icon: Icon2, children, ...props }) => {
5061
- return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Root, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Trigger, {
5062
- asChild: true
5063
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.Button, {
5064
- variant: "ghost",
5065
- ...props,
5066
- classNames: buttonStyles
5067
- }, /* @__PURE__ */ import_react2.default.createElement(Icon2, {
5068
- className: iconStyles
5069
- }), /* @__PURE__ */ import_react2.default.createElement("span", {
5070
- className: "sr-only"
5071
- }, children))), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Portal, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Content, tooltipProps, children, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Arrow, null))));
5072
- };
5073
- var HeadingIcons = {
5074
- "0": import_react.Paragraph,
5075
- "1": import_react.TextHOne,
5076
- "2": import_react.TextHTwo,
5077
- "3": import_react.TextHThree,
5078
- "4": import_react.TextHFour,
5079
- "5": import_react.TextHFive,
5080
- "6": import_react.TextHSix
5081
- };
5082
- var MarkdownHeading = () => {
5083
- const { t } = (0, import_react_ui.useTranslation)(translationKey);
5084
- const { onAction, state } = useToolbarContext("MarkdownFormatting");
5085
- const blockType = state ? state.blockType : "paragraph";
5086
- const header = blockType && /heading(\d)/.exec(blockType);
5087
- const value = header ? header[1] : blockType === "paragraph" || !blockType ? "0" : void 0;
5088
- const HeadingIcon = HeadingIcons[value ?? "0"];
5089
- const suppressNextTooltip = (0, import_react2.useRef)(false);
5090
- const [tooltipOpen, setTooltipOpen] = (0, import_react2.useState)(false);
5091
- const [selectOpen, setSelectOpen] = (0, import_react2.useState)(false);
5092
- return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Root, {
5093
- open: tooltipOpen,
5094
- onOpenChange: (nextOpen) => {
5095
- if (nextOpen && suppressNextTooltip.current) {
5096
- suppressNextTooltip.current = false;
5097
- return setTooltipOpen(false);
5098
- } else {
5099
- return setTooltipOpen(nextOpen);
5100
- }
5101
- }
5102
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Root, {
5103
- open: selectOpen,
5104
- onOpenChange: (nextOpen) => {
5105
- if (!nextOpen) {
5106
- suppressNextTooltip.current = true;
5107
- }
5108
- return setSelectOpen(nextOpen);
5109
- }
5110
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Trigger, {
5111
- asChild: true
5112
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.Button, {
5113
- asChild: true
5114
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Trigger, {
5115
- asChild: true
5116
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Button, {
5117
- variant: "ghost",
5118
- classNames: buttonStyles,
5119
- disabled: value === null
5120
- }, /* @__PURE__ */ import_react2.default.createElement("span", {
5121
- className: "sr-only"
5122
- }, t("heading label")), /* @__PURE__ */ import_react2.default.createElement(HeadingIcon, {
5123
- className: iconStyles
5124
- }), /* @__PURE__ */ import_react2.default.createElement(import_react.CaretDown, null))))), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Portal, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Content, {
5125
- classNames: "is-min md:is-min",
5126
- onCloseAutoFocus: (e) => e.preventDefault()
5127
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Viewport, null, Object.keys(HeadingIcons).map((level) => {
5128
- const Icon2 = HeadingIcons[level];
5129
- return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.CheckboxItem, {
5130
- key: level,
5131
- checked: value === level,
5132
- onClick: () => onAction?.({
5133
- type: "heading",
5134
- data: level
5135
- })
5136
- }, /* @__PURE__ */ import_react2.default.createElement("span", {
5137
- className: "sr-only"
5138
- }, t("heading level label", {
5139
- count: parseInt(level)
5140
- })), /* @__PURE__ */ import_react2.default.createElement(Icon2, {
5141
- className: iconStyles
5142
- }), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.ItemIndicator, null, /* @__PURE__ */ import_react2.default.createElement(import_react.Check, null)));
5143
- })), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Arrow, null)))), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Portal, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Content, tooltipProps, t("heading label"), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Arrow, null))));
5144
- };
5145
- var markdownStyles = [
5146
- {
5147
- type: "strong",
5148
- Icon: import_react.TextB,
5149
- getState: (state) => !!state?.strong
5150
- },
5151
- {
5152
- type: "emphasis",
5153
- Icon: import_react.TextItalic,
5154
- getState: (state) => !!state?.emphasis
5155
- },
5156
- {
5157
- type: "strikethrough",
5158
- Icon: import_react.TextStrikethrough,
5159
- getState: (state) => !!state?.strikethrough
5160
- },
5161
- {
5162
- type: "code",
5163
- Icon: import_react.Code,
5164
- getState: (state) => !!state?.code
5165
- },
5166
- {
5167
- type: "link",
5168
- Icon: import_react.Link,
5169
- getState: (state) => !!state?.link
5170
- }
5171
- ];
5172
- var MarkdownStyles = () => {
5173
- const { onAction, state } = useToolbarContext("MarkdownStyles");
5174
- const { t } = (0, import_react_ui.useTranslation)(translationKey);
5175
- return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.ToggleGroup, {
5176
- type: "multiple",
5177
- value: markdownStyles.filter(({ getState }) => state && getState(state)).map(({ type }) => type)
5178
- }, markdownStyles.map(({ type, getState, Icon: Icon2 }) => /* @__PURE__ */ import_react2.default.createElement(ToolbarToggleButton, {
5179
- key: type,
5180
- value: type,
5181
- Icon: Icon2,
5182
- disabled: state?.blockType === "codeblock",
5183
- onClick: state ? () => onAction?.({
5184
- type,
5185
- data: !getState(state)
5186
- }) : void 0
5187
- }, t(`${type} label`))));
5188
- };
5189
- var markdownLists = [
5190
- {
5191
- type: "list-bullet",
5192
- Icon: import_react.ListBullets,
5193
- getState: (state) => state.listStyle === "bullet"
5194
- },
5195
- {
5196
- type: "list-ordered",
5197
- Icon: import_react.ListNumbers,
5198
- getState: (state) => state.listStyle === "ordered"
5199
- },
5200
- {
5201
- type: "list-task",
5202
- Icon: import_react.ListChecks,
5203
- getState: (state) => state.listStyle === "task"
5204
- }
5205
- ];
5206
- var MarkdownLists = () => {
5207
- const { onAction, state } = useToolbarContext("MarkdownStyles");
5208
- const { t } = (0, import_react_ui.useTranslation)(translationKey);
5209
- return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.ToggleGroup, {
5210
- type: "single",
5211
- value: state?.listStyle ? `list-${state.listStyle}` : ""
5212
- }, markdownLists.map(({ type, getState, Icon: Icon2 }) => /* @__PURE__ */ import_react2.default.createElement(ToolbarToggleButton, {
5213
- key: type,
5214
- value: type,
5215
- Icon: Icon2,
5216
- onClick: state ? () => onAction?.({
5217
- type,
5218
- data: !getState(state)
5219
- }) : void 0
5220
- }, t(`${type} label`))));
5221
- };
5222
- var markdownBlocks = [
5223
- {
5224
- type: "blockquote",
5225
- Icon: import_react.Quotes,
5226
- getState: (state) => !!state?.blockQuote
5227
- },
5228
- {
5229
- type: "codeblock",
5230
- Icon: import_react.CodeBlock,
5231
- getState: (state) => state.blockType === "codeblock"
5232
- },
5233
- {
5234
- type: "table",
5235
- Icon: import_react.Table,
5236
- getState: (state) => state.blockType === "tablecell",
5237
- disabled: (state) => !state.blankLine
5238
- }
5239
- ];
5240
- var MarkdownBlocks = () => {
5241
- const { onAction, state } = useToolbarContext("MarkdownStyles");
5242
- const { t } = (0, import_react_ui.useTranslation)(translationKey);
5243
- const value = markdownBlocks.find(({ getState }) => state && getState(state));
5244
- return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.ToggleGroup, {
5245
- type: "single",
5246
- value: value?.type ?? ""
5247
- }, markdownBlocks.map(({ type, disabled, getState, Icon: Icon2 }) => /* @__PURE__ */ import_react2.default.createElement(ToolbarToggleButton, {
5248
- key: type,
5249
- value: type,
5250
- Icon: Icon2,
5251
- disabled: !state || disabled?.(state),
5252
- onClick: state ? () => onAction?.({
5253
- type,
5254
- data: !getState(state)
5255
- }) : void 0
5256
- }, t(`${type} label`))));
5257
- };
5258
- var MarkdownStandard = () => /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(MarkdownHeading, null), /* @__PURE__ */ import_react2.default.createElement(MarkdownStyles, null), /* @__PURE__ */ import_react2.default.createElement(MarkdownLists, null), /* @__PURE__ */ import_react2.default.createElement(MarkdownBlocks, null));
5259
- var MarkdownCustom = ({ onUpload } = {}) => {
5260
- const { onAction } = useToolbarContext("MarkdownStyles");
5261
- const { t } = (0, import_react_ui.useTranslation)(translationKey);
5262
- const { acceptedFiles, getInputProps, open } = (0, import_react_dropzone.useDropzone)({
5263
- multiple: false,
5264
- noDrag: true,
5265
- accept: {
5266
- "image/*": [
5267
- ".jpg",
5268
- ".jpeg",
5269
- ".png",
5270
- ".gif"
5271
- ]
5272
- }
5273
- });
5274
- (0, import_react2.useEffect)(() => {
5275
- if (onUpload && acceptedFiles.length) {
5276
- requestAnimationFrame(async () => {
5277
- const f = acceptedFiles[0];
5278
- const file = new File([
5279
- f
5280
- ], f.name, {
5281
- type: f.type,
5282
- lastModified: f.lastModified
5283
- });
5284
- const info = await onUpload(file);
5285
- if (info) {
5286
- onAction?.({
5287
- type: "image",
5288
- data: info.url
5289
- });
5290
- }
5291
- });
5292
- }
5293
- }, [
5294
- acceptedFiles
5295
- ]);
5296
- return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement("input", getInputProps()), /* @__PURE__ */ import_react2.default.createElement(ToolbarButton, {
5297
- value: "image",
5298
- Icon: import_react.Image,
5299
- onClick: () => open()
5300
- }, t("image label")));
5301
- };
5302
- var ViewModeIcons = {
5303
- preview: import_react.PencilSimple,
5304
- readonly: import_react.PencilSimpleSlash,
5305
- source: import_react.MarkdownLogo
5306
- };
5307
- var MarkdownView = ({ mode }) => {
5308
- const { t } = (0, import_react_ui.useTranslation)(translationKey);
5309
- const { onAction } = useToolbarContext("ViewMode");
5310
- const ModeIcon = ViewModeIcons[mode ?? "preview"];
5311
- const suppressNextTooltip = (0, import_react2.useRef)(false);
5312
- const [tooltipOpen, setTooltipOpen] = (0, import_react2.useState)(false);
5313
- const [selectOpen, setSelectOpen] = (0, import_react2.useState)(false);
5314
- return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Root, {
5315
- open: tooltipOpen,
5316
- onOpenChange: (nextOpen) => {
5317
- if (nextOpen && suppressNextTooltip.current) {
5318
- suppressNextTooltip.current = false;
5319
- return setTooltipOpen(false);
5320
- } else {
5321
- return setTooltipOpen(nextOpen);
5322
- }
5323
- }
5324
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Root, {
5325
- open: selectOpen,
5326
- onOpenChange: (nextOpen) => {
5327
- if (!nextOpen) {
5328
- suppressNextTooltip.current = true;
5329
- }
5330
- return setSelectOpen(nextOpen);
5331
- }
5332
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Trigger, {
5333
- asChild: true
5334
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.Button, {
5335
- asChild: true
5336
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Trigger, {
5337
- asChild: true
5338
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Button, {
5339
- variant: "ghost",
5340
- classNames: buttonStyles
5341
- }, /* @__PURE__ */ import_react2.default.createElement("span", {
5342
- className: "sr-only"
5343
- }, t("mode label")), /* @__PURE__ */ import_react2.default.createElement(ModeIcon, {
5344
- className: iconStyles
5345
- }), /* @__PURE__ */ import_react2.default.createElement(import_react.CaretDown, null))))), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Portal, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Content, {
5346
- classNames: "is-min md:is-min",
5347
- onCloseAutoFocus: (e) => e.preventDefault()
5348
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Viewport, null, EditorViewModes.map((value) => {
5349
- const Icon2 = ViewModeIcons[value];
5350
- return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.CheckboxItem, {
5351
- key: value,
5352
- checked: value === mode,
5353
- onClick: () => onAction?.({
5354
- type: "view-mode",
5355
- data: value
5356
- })
5357
- }, /* @__PURE__ */ import_react2.default.createElement(Icon2, {
5358
- className: iconStyles
5359
- }), /* @__PURE__ */ import_react2.default.createElement("span", {
5360
- className: "whitespace-nowrap grow"
5361
- }, t(`${value} mode label`)), /* @__PURE__ */ import_react2.default.createElement(import_react.Check, {
5362
- className: value === mode ? "visible" : "invisible"
5363
- }));
5364
- })), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.DropdownMenu.Arrow, null)))), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Portal, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Content, tooltipProps, t("view mode label"), /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Tooltip.Arrow, null))));
5365
- };
5366
- var MarkdownActions = () => {
5367
- const { onAction, state } = useToolbarContext("MarkdownActions");
5368
- const { t } = (0, import_react_ui.useTranslation)(translationKey);
5369
- let commentToolTipKey = "comment label";
5370
- if (state?.comment) {
5371
- commentToolTipKey = "selection overlaps existing comment label";
5372
- } else if (state?.selection === false) {
5373
- commentToolTipKey = "select text to comment label";
5374
- }
5375
- return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(ToolbarButton, {
5376
- value: "search",
5377
- Icon: import_react.MagnifyingGlass,
5378
- onClick: () => onAction?.({
5379
- type: "search"
5380
- })
5381
- }, t("search label")), /* @__PURE__ */ import_react2.default.createElement(ToolbarButton, {
5382
- value: "comment",
5383
- Icon: import_react.ChatText,
5384
- "data-testid": "editor.toolbar.comment",
5385
- onClick: () => onAction?.({
5386
- type: "comment"
5387
- }),
5388
- disabled: !state || state.comment || !state.selection
5389
- }, t(commentToolTipKey)));
5390
- };
5391
- var Toolbar = {
5392
- Root: ToolbarRoot,
5393
- Button: ToolbarToggleButton,
5394
- Separator: ToolbarSeparator,
5395
- View: MarkdownView,
5396
- Markdown: MarkdownStandard,
5397
- Custom: MarkdownCustom,
5398
- Actions: MarkdownActions
5399
- };
5400
- var margin = "!mt-[1rem]";
5401
- var editorContent = (0, import_react_ui_theme8.mx)(margin, "!mli-auto w-full max-w-[min(50rem,100%-2rem)]");
5402
- var editorFullWidth = (0, import_react_ui_theme8.mx)(margin);
5403
- var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden";
5404
- var editorGutter = import_view27.EditorView.theme({
5405
- // Match margin from content.
5406
- ".cm-gutters": {
5407
- marginTop: "16px",
5408
- paddingRight: "1rem"
5409
- }
5410
- });
5411
- var editorMonospace = import_view27.EditorView.theme({
5412
- ".cm-content": {
5413
- fontFamily: fontMono
5414
- }
5415
- });
5416
5384
  var useActionHandler = (view) => {
5417
- return (action) => view && processAction(view, action);
5385
+ return (0, import_react7.useCallback)((action) => view && processEditorPayload(view, action.properties), [
5386
+ view
5387
+ ]);
5418
5388
  };
5419
5389
  var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
5420
5390
  var instanceCount = 0;
5421
5391
  var useTextEditor = (props = {}, deps = []) => {
5422
- const { id, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0, import_react7.useMemo)(() => (0, import_util5.getProviderValue)(props), deps ?? []);
5423
- const [instanceId] = (0, import_react7.useState)(() => `text-editor-${++instanceCount}`);
5424
- const [view, setView] = (0, import_react7.useState)();
5425
- const parentRef = (0, import_react7.useRef)(null);
5426
- (0, import_react7.useEffect)(() => {
5392
+ const { id, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0, import_react8.useMemo)(() => (0, import_util5.getProviderValue)(props), deps ?? []);
5393
+ const [instanceId] = (0, import_react8.useState)(() => `text-editor-${++instanceCount}`);
5394
+ const [view, setView] = (0, import_react8.useState)();
5395
+ const parentRef = (0, import_react8.useRef)(null);
5396
+ (0, import_react8.useEffect)(() => {
5427
5397
  let view2;
5428
5398
  if (parentRef.current) {
5429
5399
  (0, import_log7.log)("create", {
@@ -5497,7 +5467,7 @@ var useTextEditor = (props = {}, deps = []) => {
5497
5467
  view2?.destroy();
5498
5468
  };
5499
5469
  }, deps);
5500
- (0, import_react7.useEffect)(() => {
5470
+ (0, import_react8.useEffect)(() => {
5501
5471
  if (view) {
5502
5472
  if (scrollTo || selection) {
5503
5473
  if (selection && selection.anchor > view.state.doc.length) {
@@ -5524,7 +5494,7 @@ var useTextEditor = (props = {}, deps = []) => {
5524
5494
  scrollTo,
5525
5495
  selection
5526
5496
  ]);
5527
- (0, import_react7.useEffect)(() => {
5497
+ (0, import_react8.useEffect)(() => {
5528
5498
  if (view && autoFocus) {
5529
5499
  view.focus();
5530
5500
  }
@@ -5538,7 +5508,7 @@ var useTextEditor = (props = {}, deps = []) => {
5538
5508
  Escape: view?.state.facet(editorInputMode).noTabster
5539
5509
  }
5540
5510
  });
5541
- const handleKeyUp = (0, import_react7.useCallback)((event) => {
5511
+ const handleKeyUp = (0, import_react8.useCallback)((event) => {
5542
5512
  const { key, target, currentTarget } = event;
5543
5513
  if (target === currentTarget) {
5544
5514
  switch (key) {
@@ -5568,6 +5538,7 @@ var useTextEditor = (props = {}, deps = []) => {
5568
5538
  EditorInputMode,
5569
5539
  EditorInputModes,
5570
5540
  EditorState,
5541
+ EditorToolbar,
5571
5542
  EditorView,
5572
5543
  EditorViewMode,
5573
5544
  EditorViewModes,
@@ -5577,7 +5548,6 @@ var useTextEditor = (props = {}, deps = []) => {
5577
5548
  RemoteSelectionsDecorator,
5578
5549
  SpaceAwarenessProvider,
5579
5550
  TextKind,
5580
- Toolbar,
5581
5551
  addBlockquote,
5582
5552
  addCodeblock,
5583
5553
  addLink,
@@ -5598,6 +5568,8 @@ var useTextEditor = (props = {}, deps = []) => {
5598
5568
  createBasicExtensions,
5599
5569
  createComment,
5600
5570
  createDataExtensions,
5571
+ createEditorAction,
5572
+ createEditorActionGroup,
5601
5573
  createEditorStateStore,
5602
5574
  createEditorStateTransaction,
5603
5575
  createElement,
@@ -5636,7 +5608,7 @@ var useTextEditor = (props = {}, deps = []) => {
5636
5608
  mention,
5637
5609
  overlap,
5638
5610
  preventNewline,
5639
- processAction,
5611
+ processEditorPayload,
5640
5612
  removeBlockquote,
5641
5613
  removeCodeblock,
5642
5614
  removeLink,
@@ -5652,6 +5624,8 @@ var useTextEditor = (props = {}, deps = []) => {
5652
5624
  setSelection,
5653
5625
  setStyle,
5654
5626
  singleValueFacet,
5627
+ stackItemContentEditorClassNames,
5628
+ stackItemContentToolbarClassNames,
5655
5629
  table,
5656
5630
  tags,
5657
5631
  textRange,
@@ -5669,9 +5643,9 @@ var useTextEditor = (props = {}, deps = []) => {
5669
5643
  useCommentClickListener,
5670
5644
  useCommentState,
5671
5645
  useComments,
5646
+ useEditorToolbarState,
5672
5647
  useFormattingState,
5673
5648
  useTextEditor,
5674
- useToolbarContext,
5675
5649
  wrapWithCatch
5676
5650
  });
5677
5651
  //# sourceMappingURL=index.cjs.map