@dxos/react-ui-editor 0.6.14-main.7bd9c89 → 0.6.14-main.f49f251

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 (101) hide show
  1. package/dist/lib/browser/index.mjs +650 -479
  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 +726 -545
  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 +650 -478
  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/TextEditor.stories.d.ts.map +1 -1
  11. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  12. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  13. package/dist/types/src/extensions/comments.d.ts +1 -1
  14. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  15. package/dist/types/src/extensions/factories.d.ts +1 -0
  16. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  17. package/dist/types/src/extensions/focus.d.ts +7 -0
  18. package/dist/types/src/extensions/focus.d.ts.map +1 -0
  19. package/dist/types/src/extensions/index.d.ts +2 -0
  20. package/dist/types/src/extensions/index.d.ts.map +1 -1
  21. package/dist/types/src/extensions/markdown/image.d.ts +3 -6
  22. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
  23. package/dist/types/src/extensions/selection.d.ts +24 -0
  24. package/dist/types/src/extensions/selection.d.ts.map +1 -0
  25. package/dist/types/src/hooks/useTextEditor.d.ts +1 -1
  26. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  27. package/dist/types/src/index.d.ts +1 -1
  28. package/dist/types/src/types.d.ts.map +1 -0
  29. package/dist/types/src/{state → util}/cursor.d.ts +7 -1
  30. package/dist/types/src/util/cursor.d.ts.map +1 -0
  31. package/dist/types/src/{util.d.ts → util/debug.d.ts} +6 -2
  32. package/dist/types/src/util/debug.d.ts.map +1 -0
  33. package/dist/types/src/util/dom.d.ts.map +1 -0
  34. package/dist/types/src/{state/util.d.ts → util/facet.d.ts} +1 -1
  35. package/dist/types/src/util/facet.d.ts.map +1 -0
  36. package/dist/types/src/util/index.d.ts +6 -0
  37. package/dist/types/src/util/index.d.ts.map +1 -0
  38. package/dist/types/src/util/react.d.ts.map +1 -0
  39. package/package.json +28 -42
  40. package/src/TextEditor.stories.tsx +8 -6
  41. package/src/extensions/annotations.ts +1 -1
  42. package/src/extensions/automerge/automerge.ts +1 -1
  43. package/src/extensions/automerge/cursor.ts +1 -1
  44. package/src/extensions/awareness/awareness.ts +1 -1
  45. package/src/extensions/command/hint.ts +1 -1
  46. package/src/extensions/command/state.ts +1 -1
  47. package/src/extensions/comments.ts +3 -4
  48. package/src/extensions/factories.ts +5 -1
  49. package/src/extensions/focus.ts +35 -0
  50. package/src/extensions/folding.tsx +1 -1
  51. package/src/extensions/index.ts +2 -0
  52. package/src/extensions/markdown/decorate.ts +1 -1
  53. package/src/extensions/markdown/image.ts +53 -42
  54. package/src/extensions/modes.ts +1 -1
  55. package/src/{state/state.ts → extensions/selection.ts} +22 -22
  56. package/src/hooks/useTextEditor.ts +2 -3
  57. package/src/index.ts +1 -1
  58. package/src/{state → util}/cursor.ts +9 -3
  59. package/src/{util.ts → util/debug.ts} +15 -2
  60. package/src/{extensions/util → util}/index.ts +3 -2
  61. package/dist/lib/browser/chunk-CIQSMP7K.mjs +0 -148
  62. package/dist/lib/browser/chunk-CIQSMP7K.mjs.map +0 -7
  63. package/dist/lib/browser/state/index.mjs +0 -17
  64. package/dist/lib/browser/state/index.mjs.map +0 -7
  65. package/dist/lib/node/chunk-GZWIENFM.cjs +0 -169
  66. package/dist/lib/node/chunk-GZWIENFM.cjs.map +0 -7
  67. package/dist/lib/node/state/index.cjs +0 -39
  68. package/dist/lib/node/state/index.cjs.map +0 -7
  69. package/dist/lib/node-esm/chunk-GP5RCZ3X.mjs +0 -150
  70. package/dist/lib/node-esm/chunk-GP5RCZ3X.mjs.map +0 -7
  71. package/dist/lib/node-esm/state/index.mjs +0 -18
  72. package/dist/lib/node-esm/state/index.mjs.map +0 -7
  73. package/dist/types/src/extensions/util/dom.d.ts.map +0 -1
  74. package/dist/types/src/extensions/util/error.d.ts +0 -2
  75. package/dist/types/src/extensions/util/error.d.ts.map +0 -1
  76. package/dist/types/src/extensions/util/index.d.ts +0 -5
  77. package/dist/types/src/extensions/util/index.d.ts.map +0 -1
  78. package/dist/types/src/extensions/util/overlap.d.ts +0 -8
  79. package/dist/types/src/extensions/util/overlap.d.ts.map +0 -1
  80. package/dist/types/src/extensions/util/react.d.ts.map +0 -1
  81. package/dist/types/src/state/cursor.d.ts.map +0 -1
  82. package/dist/types/src/state/doc.d.ts +0 -5
  83. package/dist/types/src/state/doc.d.ts.map +0 -1
  84. package/dist/types/src/state/index.d.ts +0 -6
  85. package/dist/types/src/state/index.d.ts.map +0 -1
  86. package/dist/types/src/state/state.d.ts +0 -20
  87. package/dist/types/src/state/state.d.ts.map +0 -1
  88. package/dist/types/src/state/types.d.ts.map +0 -1
  89. package/dist/types/src/state/util.d.ts.map +0 -1
  90. package/dist/types/src/util.d.ts.map +0 -1
  91. package/src/extensions/util/error.ts +0 -15
  92. package/src/extensions/util/overlap.ts +0 -12
  93. package/src/state/doc.ts +0 -10
  94. package/src/state/index.ts +0 -11
  95. /package/dist/types/src/{state/types.d.ts → types.d.ts} +0 -0
  96. /package/dist/types/src/{extensions/util → util}/dom.d.ts +0 -0
  97. /package/dist/types/src/{extensions/util → util}/react.d.ts +0 -0
  98. /package/src/{state/types.ts → types.ts} +0 -0
  99. /package/src/{extensions/util → util}/dom.ts +0 -0
  100. /package/src/{state/util.ts → util/facet.ts} +0 -0
  101. /package/src/{extensions/util → util}/react.tsx +0 -0
@@ -28,7 +28,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
  var node_exports = {};
30
30
  __export(node_exports, {
31
- Cursor: () => import_chunk_GZWIENFM.Cursor,
31
+ Cursor: () => Cursor,
32
32
  EditorInputModes: () => EditorInputModes,
33
33
  EditorViewModes: () => EditorViewModes,
34
34
  Inline: () => Inline,
@@ -50,6 +50,7 @@ __export(node_exports, {
50
50
  awarenessProvider: () => awarenessProvider,
51
51
  blast: () => blast,
52
52
  callbackWrapper: () => callbackWrapper,
53
+ clientRectsFor: () => clientRectsFor,
53
54
  command: () => command,
54
55
  comments: () => comments,
55
56
  commentsState: () => commentsState,
@@ -57,7 +58,9 @@ __export(node_exports, {
57
58
  createBasicExtensions: () => createBasicExtensions,
58
59
  createComment: () => createComment,
59
60
  createDataExtensions: () => createDataExtensions,
60
- createEditorStateTransaction: () => import_chunk_GZWIENFM.createEditorStateTransaction,
61
+ createEditorStateStore: () => createEditorStateStore,
62
+ createEditorStateTransaction: () => createEditorStateTransaction,
63
+ createElement: () => createElement,
61
64
  createExternalCommentSync: () => createExternalCommentSync,
62
65
  createMarkdownExtensions: () => createMarkdownExtensions,
63
66
  createThemeExtensions: () => createThemeExtensions,
@@ -66,7 +69,7 @@ __export(node_exports, {
66
69
  debugTree: () => debugTree,
67
70
  decorateMarkdown: () => decorateMarkdown,
68
71
  defaultOptions: () => defaultOptions,
69
- documentId: () => import_chunk_GZWIENFM.documentId,
72
+ documentId: () => documentId,
70
73
  dropFile: () => dropFile,
71
74
  editorContent: () => editorContent,
72
75
  editorFullWidth: () => editorFullWidth,
@@ -74,23 +77,25 @@ __export(node_exports, {
74
77
  editorInputMode: () => editorInputMode,
75
78
  editorMonospace: () => editorMonospace,
76
79
  editorWithToolbarLayout: () => editorWithToolbarLayout,
80
+ flattenRect: () => flattenRect,
81
+ focus: () => focus,
77
82
  focusEvent: () => focusEvent,
83
+ focusField: () => focusField,
78
84
  folding: () => folding,
79
85
  formattingEquals: () => formattingEquals,
80
86
  formattingKeymap: () => formattingKeymap,
81
87
  getFormatting: () => getFormatting,
82
88
  image: () => image,
83
- imageUpload: () => imageUpload,
84
89
  insertTable: () => insertTable,
85
90
  keymap: () => import_view.keymap,
86
91
  linkTooltip: () => linkTooltip,
87
92
  listener: () => listener,
88
- localStorageStateStoreAdapter: () => import_chunk_GZWIENFM.localStorageStateStoreAdapter,
89
93
  logChanges: () => logChanges,
90
94
  markdownHighlightStyle: () => markdownHighlightStyle,
91
95
  markdownTags: () => markdownTags,
92
96
  markdownTagsExtensions: () => markdownTagsExtensions,
93
97
  mention: () => mention,
98
+ overlap: () => overlap,
94
99
  preventNewline: () => preventNewline,
95
100
  processAction: () => processAction,
96
101
  removeBlockquote: () => removeBlockquote,
@@ -98,17 +103,19 @@ __export(node_exports, {
98
103
  removeLink: () => removeLink,
99
104
  removeList: () => removeList,
100
105
  removeStyle: () => removeStyle,
106
+ renderRoot: () => renderRoot,
101
107
  scrollThreadIntoView: () => scrollThreadIntoView,
102
108
  selectionOverlapsComment: () => selectionOverlapsComment,
109
+ selectionState: () => selectionState,
103
110
  setBlockquote: () => setBlockquote,
104
111
  setComments: () => setComments,
105
112
  setHeading: () => setHeading,
106
113
  setSelection: () => setSelection,
107
114
  setStyle: () => setStyle,
108
- singleValueFacet: () => import_chunk_GZWIENFM.singleValueFacet,
109
- state: () => import_chunk_GZWIENFM.state,
115
+ singleValueFacet: () => singleValueFacet,
110
116
  table: () => table,
111
117
  tags: () => import_highlight.tags,
118
+ textRange: () => textRange,
112
119
  toggleBlockquote: () => toggleBlockquote,
113
120
  toggleCodeblock: () => toggleCodeblock,
114
121
  toggleEmphasis: () => toggleEmphasis,
@@ -125,10 +132,10 @@ __export(node_exports, {
125
132
  useComments: () => useComments,
126
133
  useFormattingState: () => useFormattingState,
127
134
  useTextEditor: () => useTextEditor,
128
- useToolbarContext: () => useToolbarContext
135
+ useToolbarContext: () => useToolbarContext,
136
+ wrapWithCatch: () => wrapWithCatch
129
137
  });
130
138
  module.exports = __toCommonJS(node_exports);
131
- var import_chunk_GZWIENFM = require("./chunk-GZWIENFM.cjs");
132
139
  var import_view = require("@codemirror/view");
133
140
  var import_highlight = require("@lezer/highlight");
134
141
  var import_text = require("@dxos/protocols/proto/dxos/echo/model/text");
@@ -141,76 +148,83 @@ var import_react_ui_theme = require("@dxos/react-ui-theme");
141
148
  var import_state = require("@codemirror/state");
142
149
  var import_view2 = require("@codemirror/view");
143
150
  var import_util = require("@dxos/util");
151
+ var import_state2 = require("@codemirror/state");
152
+ var import_log = require("@dxos/log");
153
+ var import_react3 = __toESM(require("react"));
154
+ var import_client = require("react-dom/client");
155
+ var import_react_ui2 = require("@dxos/react-ui");
156
+ var import_react_ui_theme2 = require("@dxos/react-ui-theme");
144
157
  var import_autocomplete = require("@codemirror/autocomplete");
145
158
  var import_lang_markdown = require("@codemirror/lang-markdown");
146
159
  var import_view3 = require("@codemirror/view");
147
- var import_state2 = require("@codemirror/state");
160
+ var import_state3 = require("@codemirror/state");
148
161
  var import_view4 = require("@codemirror/view");
149
162
  var import_automerge = require("@dxos/automerge/automerge");
150
- var import_log = require("@dxos/log");
163
+ var import_log2 = require("@dxos/log");
151
164
  var import_echo = require("@dxos/react-client/echo");
152
- var import_state3 = require("@codemirror/state");
165
+ var import_state4 = require("@codemirror/state");
153
166
  var import_automerge2 = require("@dxos/automerge/automerge");
154
167
  var import_automerge3 = require("@dxos/automerge/automerge");
155
- var import_state4 = require("@codemirror/state");
156
168
  var import_state5 = require("@codemirror/state");
169
+ var import_state6 = require("@codemirror/state");
157
170
  var import_view5 = require("@codemirror/view");
158
171
  var import_async = require("@dxos/async");
159
172
  var import_context = require("@dxos/context");
160
173
  var import_async2 = require("@dxos/async");
161
174
  var import_context2 = require("@dxos/context");
162
175
  var import_invariant = require("@dxos/invariant");
163
- var import_log2 = require("@dxos/log");
176
+ var import_log3 = require("@dxos/log");
164
177
  var import_view6 = require("@codemirror/view");
165
178
  var import_lodash = __toESM(require("lodash.defaultsdeep"));
166
179
  var import_invariant2 = require("@dxos/invariant");
167
180
  var import_view7 = require("@codemirror/view");
168
- var import_state6 = require("@codemirror/state");
169
- var import_view8 = require("@codemirror/view");
170
181
  var import_state7 = require("@codemirror/state");
182
+ var import_view8 = require("@codemirror/view");
183
+ var import_state8 = require("@codemirror/state");
171
184
  var import_view9 = require("@codemirror/view");
172
- var import_log3 = require("@dxos/log");
173
- var import_react3 = __toESM(require("react"));
174
- var import_client = require("react-dom/client");
175
- var import_react_ui2 = require("@dxos/react-ui");
176
- var import_react_ui_theme2 = require("@dxos/react-ui-theme");
177
185
  var import_commands = require("@codemirror/commands");
178
- var import_state8 = require("@codemirror/state");
186
+ var import_state9 = require("@codemirror/state");
179
187
  var import_view10 = require("@codemirror/view");
180
188
  var import_lodash2 = __toESM(require("lodash.sortby"));
181
189
  var import_react4 = require("react");
182
190
  var import_async3 = require("@dxos/async");
183
191
  var import_log4 = require("@dxos/log");
184
192
  var import_util2 = require("@dxos/util");
185
- var import_log5 = require("@dxos/log");
186
- var import_language = require("@codemirror/language");
187
- var import_state9 = require("@codemirror/state");
193
+ var import_state10 = require("@codemirror/state");
188
194
  var import_view11 = require("@codemirror/view");
195
+ var import_async4 = require("@dxos/async");
196
+ var import_invariant3 = require("@dxos/invariant");
197
+ var import_util3 = require("@dxos/util");
198
+ var import_language = require("@codemirror/language");
199
+ var import_state11 = require("@codemirror/state");
200
+ var import_view12 = require("@codemirror/view");
189
201
  var import_autocomplete2 = require("@codemirror/autocomplete");
190
202
  var import_commands2 = require("@codemirror/commands");
191
203
  var import_language2 = require("@codemirror/language");
192
204
  var import_search = require("@codemirror/search");
193
- var import_state10 = require("@codemirror/state");
205
+ var import_state12 = require("@codemirror/state");
194
206
  var import_theme_one_dark = require("@codemirror/theme-one-dark");
195
- var import_view12 = require("@codemirror/view");
207
+ var import_view13 = require("@codemirror/view");
196
208
  var import_lodash3 = __toESM(require("lodash.defaultsdeep"));
197
209
  var import_lodash4 = __toESM(require("lodash.merge"));
198
210
  var import_display_name = require("@dxos/display-name");
199
- var import_log6 = require("@dxos/log");
211
+ var import_log5 = require("@dxos/log");
200
212
  var import_react_ui_theme3 = require("@dxos/react-ui-theme");
201
- var import_util3 = require("@dxos/util");
213
+ var import_util4 = require("@dxos/util");
214
+ var import_state13 = require("@codemirror/state");
215
+ var import_view14 = require("@codemirror/view");
202
216
  var import_react_ui_theme4 = require("@dxos/react-ui-theme");
203
217
  var import_lodash5 = __toESM(require("lodash.get"));
204
218
  var import_react_ui_theme5 = require("@dxos/react-ui-theme");
205
219
  var import_language3 = require("@codemirror/language");
206
- var import_view13 = require("@codemirror/view");
220
+ var import_view15 = require("@codemirror/view");
207
221
  var import_react5 = __toESM(require("react"));
208
222
  var import_react_ui3 = require("@dxos/react-ui");
209
- var import_view14 = require("@codemirror/view");
223
+ var import_view16 = require("@codemirror/view");
210
224
  var import_autocomplete3 = require("@codemirror/autocomplete");
211
225
  var import_language4 = require("@codemirror/language");
212
- var import_state11 = require("@codemirror/state");
213
- var import_view15 = require("@codemirror/view");
226
+ var import_state14 = require("@codemirror/state");
227
+ var import_view17 = require("@codemirror/view");
214
228
  var import_react6 = require("react");
215
229
  var import_autocomplete4 = require("@codemirror/autocomplete");
216
230
  var import_commands3 = require("@codemirror/commands");
@@ -218,45 +232,45 @@ var import_lang_markdown2 = require("@codemirror/lang-markdown");
218
232
  var import_language5 = require("@codemirror/language");
219
233
  var import_language_data = require("@codemirror/language-data");
220
234
  var import_lint = require("@codemirror/lint");
221
- var import_view16 = require("@codemirror/view");
235
+ var import_view18 = require("@codemirror/view");
222
236
  var import_lang_markdown3 = require("@codemirror/lang-markdown");
223
237
  var import_language6 = require("@codemirror/language");
224
238
  var import_highlight2 = require("@lezer/highlight");
225
239
  var import_markdown = require("@lezer/markdown");
226
240
  var import_language7 = require("@codemirror/language");
227
- var import_state12 = require("@codemirror/state");
241
+ var import_state15 = require("@codemirror/state");
228
242
  var import_language8 = require("@codemirror/language");
229
- var import_state13 = require("@codemirror/state");
230
- var import_view17 = require("@codemirror/view");
231
- var import_invariant3 = require("@dxos/invariant");
243
+ var import_state16 = require("@codemirror/state");
244
+ var import_view19 = require("@codemirror/view");
245
+ var import_invariant4 = require("@dxos/invariant");
232
246
  var import_react_ui_theme6 = require("@dxos/react-ui-theme");
233
247
  var import_language9 = require("@codemirror/language");
234
- var import_state14 = require("@codemirror/state");
235
- var import_view18 = require("@codemirror/view");
236
- var import_language10 = require("@codemirror/language");
237
- var import_state15 = require("@codemirror/state");
238
- var import_view19 = require("@codemirror/view");
248
+ var import_state17 = require("@codemirror/state");
239
249
  var import_view20 = require("@codemirror/view");
240
- var import_language11 = require("@codemirror/language");
241
- var import_state16 = require("@codemirror/state");
250
+ var import_language10 = require("@codemirror/language");
251
+ var import_state18 = require("@codemirror/state");
242
252
  var import_view21 = require("@codemirror/view");
243
- var import_language12 = require("@codemirror/language");
244
253
  var import_view22 = require("@codemirror/view");
254
+ var import_language11 = require("@codemirror/language");
255
+ var import_state19 = require("@codemirror/state");
256
+ var import_view23 = require("@codemirror/view");
257
+ var import_language12 = require("@codemirror/language");
258
+ var import_view24 = require("@codemirror/view");
245
259
  var import_react_ui_theme7 = require("@dxos/react-ui-theme");
246
260
  var import_autocomplete5 = require("@codemirror/autocomplete");
247
- var import_log7 = require("@dxos/log");
248
- var import_view23 = require("@codemirror/view");
261
+ var import_log6 = require("@dxos/log");
262
+ var import_view25 = require("@codemirror/view");
249
263
  var import_codemirror_vim = require("@replit/codemirror-vim");
250
264
  var import_codemirror_vscode_keymap = require("@replit/codemirror-vscode-keymap");
251
- var import_view24 = require("@codemirror/view");
252
- var import_view25 = require("@codemirror/view");
253
- var import_react_ui_theme8 = require("@dxos/react-ui-theme");
254
- var import_state17 = require("@codemirror/state");
255
265
  var import_view26 = require("@codemirror/view");
266
+ var import_view27 = require("@codemirror/view");
267
+ var import_react_ui_theme8 = require("@dxos/react-ui-theme");
268
+ var import_state20 = require("@codemirror/state");
269
+ var import_view28 = require("@codemirror/view");
256
270
  var import_react_tabster = require("@fluentui/react-tabster");
257
271
  var import_react7 = require("react");
258
- var import_log8 = require("@dxos/log");
259
- var import_util4 = require("@dxos/util");
272
+ var import_log7 = require("@dxos/log");
273
+ var import_util5 = require("@dxos/util");
260
274
  var translationKey = "react-ui-editor";
261
275
  var translations_default = [
262
276
  {
@@ -290,19 +304,158 @@ var translations_default = [
290
304
  }
291
305
  }
292
306
  ];
307
+ var singleValueFacet = (defaultValue) => import_state2.Facet.define({
308
+ // Called immediately.
309
+ combine: (providers) => {
310
+ return providers[0] ?? defaultValue;
311
+ }
312
+ });
313
+ var overlap = (a, b) => a.from <= b.to && a.to >= b.from;
314
+ var defaultCursorConverter = {
315
+ toCursor: (position) => position.toString(),
316
+ fromCursor: (cursor) => parseInt(cursor)
317
+ };
318
+ var Cursor = class _Cursor {
319
+ static {
320
+ this.converter = singleValueFacet(defaultCursorConverter);
321
+ }
322
+ static {
323
+ this.getCursorFromRange = (state, range) => {
324
+ const cursorConverter2 = state.facet(_Cursor.converter);
325
+ const from = cursorConverter2.toCursor(range.from);
326
+ const to = cursorConverter2.toCursor(range.to, -1);
327
+ return [
328
+ from,
329
+ to
330
+ ].join(":");
331
+ };
332
+ }
333
+ static {
334
+ this.getRangeFromCursor = (state, cursor) => {
335
+ const cursorConverter2 = state.facet(_Cursor.converter);
336
+ const parts = cursor.split(":");
337
+ const from = cursorConverter2.fromCursor(parts[0]);
338
+ const to = cursorConverter2.fromCursor(parts[1]);
339
+ return from !== void 0 && to !== void 0 ? {
340
+ from,
341
+ to
342
+ } : void 0;
343
+ };
344
+ }
345
+ };
346
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/util/debug.ts";
347
+ var wrapWithCatch = (fn) => {
348
+ return (...args) => {
349
+ try {
350
+ return fn(...args);
351
+ } catch (err) {
352
+ import_log.log.catch(err, void 0, {
353
+ F: __dxlog_file,
354
+ L: 15,
355
+ S: void 0,
356
+ C: (f, a) => f(...a)
357
+ });
358
+ }
359
+ };
360
+ };
361
+ var callbackWrapper = (fn) => (...args) => {
362
+ try {
363
+ return fn(...args);
364
+ } catch (err) {
365
+ import_log.log.catch(err, void 0, {
366
+ F: __dxlog_file,
367
+ L: 29,
368
+ S: void 0,
369
+ C: (f, a) => f(...a)
370
+ });
371
+ }
372
+ };
373
+ var debugDispatcher = (trs, view) => {
374
+ logChanges(trs);
375
+ view.update(trs);
376
+ };
377
+ var logChanges = (trs) => {
378
+ const changes = trs.flatMap((tr) => {
379
+ if (tr.changes.empty) {
380
+ return void 0;
381
+ }
382
+ const changes2 = [];
383
+ tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => changes2.push(JSON.stringify({
384
+ fromA,
385
+ toA,
386
+ fromB,
387
+ toB,
388
+ inserted: inserted.toString()
389
+ })));
390
+ return changes2;
391
+ }).filter(Boolean);
392
+ if (changes.length) {
393
+ import_log.log.info("changes", {
394
+ changes
395
+ }, {
396
+ F: __dxlog_file,
397
+ L: 62,
398
+ S: void 0,
399
+ C: (f, a) => f(...a)
400
+ });
401
+ }
402
+ };
403
+ var flattenRect = (rect, left) => {
404
+ const x = left ? rect.left : rect.right;
405
+ return {
406
+ left: x,
407
+ right: x,
408
+ top: rect.top,
409
+ bottom: rect.bottom
410
+ };
411
+ };
412
+ var scratchRange;
413
+ var textRange = (node, from, to = from) => {
414
+ const range = scratchRange || (scratchRange = document.createRange());
415
+ range.setEnd(node, to);
416
+ range.setStart(node, from);
417
+ return range;
418
+ };
419
+ var clientRectsFor = (dom) => {
420
+ if (dom.nodeType === 3) {
421
+ return textRange(dom, 0, dom.nodeValue.length).getClientRects();
422
+ } else if (dom.nodeType === 1) {
423
+ return dom.getClientRects();
424
+ } else {
425
+ return [];
426
+ }
427
+ };
428
+ var createElement = (tag, options, children) => {
429
+ const el = document.createElement(tag);
430
+ if (options?.className) {
431
+ el.className = options.className;
432
+ }
433
+ if (children) {
434
+ el.append(...Array.isArray(children) ? children : [
435
+ children
436
+ ]);
437
+ }
438
+ return el;
439
+ };
440
+ var renderRoot = (root, node) => {
441
+ (0, import_client.createRoot)(root).render(/* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ThemeProvider, {
442
+ tx: import_react_ui_theme2.defaultTx
443
+ }, node));
444
+ return root;
445
+ };
293
446
  var annotationMark = import_view2.Decoration.mark({
294
447
  class: "cm-annotation"
295
448
  });
296
449
  var annotations = (options = {}) => {
297
- const match = (state2) => {
450
+ const match = (state) => {
298
451
  const annotations2 = [];
299
- const text = state2.doc.toString();
452
+ const text = state.doc.toString();
300
453
  if (options.match) {
301
454
  const matches = text.matchAll(options.match);
302
455
  for (const match2 of matches) {
303
456
  const from = match2.index;
304
457
  const to = from + match2[0].length;
305
- const cursor = import_chunk_GZWIENFM.Cursor.getCursorFromRange(state2, {
458
+ const cursor = Cursor.getCursorFromRange(state, {
306
459
  from,
307
460
  to
308
461
  });
@@ -314,8 +467,8 @@ var annotations = (options = {}) => {
314
467
  return annotations2;
315
468
  };
316
469
  const annotationsState = import_state.StateField.define({
317
- create: (state2) => {
318
- return match(state2);
470
+ create: (state) => {
471
+ return match(state);
319
472
  },
320
473
  update: (value, tr) => {
321
474
  if (!tr.changes.empty) {
@@ -328,10 +481,10 @@ var annotations = (options = {}) => {
328
481
  annotationsState,
329
482
  import_view2.EditorView.decorations.compute([
330
483
  annotationsState
331
- ], (state2) => {
332
- const annotations2 = state2.field(annotationsState);
484
+ ], (state) => {
485
+ const annotations2 = state.field(annotationsState);
333
486
  const decorations = annotations2.map((annotation) => {
334
- const range = import_chunk_GZWIENFM.Cursor.getRangeFromCursor(state2, annotation.cursor);
487
+ const range = Cursor.getRangeFromCursor(state, annotation.cursor);
335
488
  return range && annotationMark.range(range.from, range.to);
336
489
  }).filter(import_util.isNotFalsy);
337
490
  return import_view2.Decoration.set(decorations);
@@ -382,14 +535,14 @@ var autocomplete = ({ activateOnTyping, override, onSearch } = {}) => {
382
535
  }
383
536
  return extensions;
384
537
  };
385
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/automerge/cursor.ts";
538
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/automerge/cursor.ts";
386
539
  var cursorConverter = (accessor) => ({
387
540
  toCursor: (pos, assoc) => {
388
541
  try {
389
542
  return (0, import_echo.toCursor)(accessor, pos, assoc);
390
543
  } catch (err) {
391
- import_log.log.catch(err, void 0, {
392
- F: __dxlog_file,
544
+ import_log2.log.catch(err, void 0, {
545
+ F: __dxlog_file2,
393
546
  L: 15,
394
547
  S: void 0,
395
548
  C: (f, a) => f(...a)
@@ -401,8 +554,8 @@ var cursorConverter = (accessor) => ({
401
554
  try {
402
555
  return (0, import_echo.fromCursor)(accessor, cursor);
403
556
  } catch (err) {
404
- import_log.log.catch(err, void 0, {
405
- F: __dxlog_file,
557
+ import_log2.log.catch(err, void 0, {
558
+ F: __dxlog_file2,
406
559
  L: 24,
407
560
  S: void 0,
408
561
  C: (f, a) => f(...a)
@@ -411,18 +564,18 @@ var cursorConverter = (accessor) => ({
411
564
  }
412
565
  }
413
566
  });
414
- var getPath = (state2, field) => state2.field(field).path;
415
- var getLastHeads = (state2, field) => state2.field(field).lastHeads;
416
- var updateHeadsEffect = import_state3.StateEffect.define({});
567
+ var getPath = (state, field) => state.field(field).path;
568
+ var getLastHeads = (state, field) => state.field(field).lastHeads;
569
+ var updateHeadsEffect = import_state4.StateEffect.define({});
417
570
  var updateHeads = (newHeads) => updateHeadsEffect.of({
418
571
  newHeads
419
572
  });
420
- var reconcileAnnotation = import_state3.Annotation.define();
573
+ var reconcileAnnotation = import_state4.Annotation.define();
421
574
  var isReconcile = (tr) => {
422
575
  return !!tr.annotation(reconcileAnnotation);
423
576
  };
424
- var updateAutomerge = (field, handle, transactions, state2) => {
425
- const { lastHeads, path } = state2.field(field);
577
+ var updateAutomerge = (field, handle, transactions, state) => {
578
+ const { lastHeads, path } = state.field(field);
426
579
  let hasChanges = false;
427
580
  for (const tr of transactions) {
428
581
  tr.changes.iterChanges(() => {
@@ -453,7 +606,7 @@ var updateCodeMirror = (view, selection, target, patches) => {
453
606
  for (const patch of patches) {
454
607
  const changeSpec = handlePatch(patch, target, view.state);
455
608
  if (changeSpec != null) {
456
- const changeSet = import_state4.ChangeSet.of(changeSpec, view.state.doc.length, "\n");
609
+ const changeSet = import_state5.ChangeSet.of(changeSpec, view.state.doc.length, "\n");
457
610
  selection = selection.map(changeSet, 1);
458
611
  view.dispatch({
459
612
  changes: changeSet,
@@ -466,7 +619,7 @@ var updateCodeMirror = (view, selection, target, patches) => {
466
619
  annotations: reconcileAnnotation.of(false)
467
620
  });
468
621
  };
469
- var handlePatch = (patch, target, state2) => {
622
+ var handlePatch = (patch, target, state) => {
470
623
  if (patch.action === "insert") {
471
624
  return handleInsert(target, patch);
472
625
  } else if (patch.action === "splice") {
@@ -474,7 +627,7 @@ var handlePatch = (patch, target, state2) => {
474
627
  } else if (patch.action === "del") {
475
628
  return handleDel(target, patch);
476
629
  } else if (patch.action === "put") {
477
- return handlePut(target, patch, state2);
630
+ return handlePut(target, patch, state);
478
631
  } else {
479
632
  return null;
480
633
  }
@@ -518,7 +671,7 @@ var handleDel = (target, patch) => {
518
671
  }
519
672
  ];
520
673
  };
521
- var handlePut = (target, patch, state2) => {
674
+ var handlePut = (target, patch, state) => {
522
675
  const index = charPath(target, [
523
676
  ...patch.path,
524
677
  0
@@ -526,7 +679,7 @@ var handlePut = (target, patch, state2) => {
526
679
  if (index == null) {
527
680
  return [];
528
681
  }
529
- const length = state2.doc.length;
682
+ const length = state.doc.length;
530
683
  if (typeof patch.value !== "string") {
531
684
  return [];
532
685
  }
@@ -596,7 +749,7 @@ var Syncer = class {
596
749
  }
597
750
  };
598
751
  var automerge = (accessor) => {
599
- const syncState = import_state2.StateField.define({
752
+ const syncState = import_state3.StateField.define({
600
753
  create: () => ({
601
754
  path: accessor.path.slice(),
602
755
  lastHeads: import_automerge.next.getHeads(accessor.handle.docSync()),
@@ -627,7 +780,7 @@ var automerge = (accessor) => {
627
780
  });
628
781
  const syncer = new Syncer(accessor.handle, syncState);
629
782
  return [
630
- import_chunk_GZWIENFM.Cursor.converter.of(cursorConverter(accessor)),
783
+ Cursor.converter.of(cursorConverter(accessor)),
631
784
  // Track heads.
632
785
  syncState,
633
786
  // Reconcile external updates.
@@ -651,7 +804,7 @@ var automerge = (accessor) => {
651
804
  })
652
805
  ];
653
806
  };
654
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/awareness/awareness.ts";
807
+ var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/awareness/awareness.ts";
655
808
  var dummyProvider = {
656
809
  remoteStateChange: new import_async.Event(),
657
810
  open: () => {
@@ -662,8 +815,8 @@ var dummyProvider = {
662
815
  update: () => {
663
816
  }
664
817
  };
665
- var awarenessProvider = (0, import_chunk_GZWIENFM.singleValueFacet)(dummyProvider);
666
- var RemoteSelectionChangedAnnotation = import_state5.Annotation.define();
818
+ var awarenessProvider = singleValueFacet(dummyProvider);
819
+ var RemoteSelectionChangedAnnotation = import_state6.Annotation.define();
667
820
  var awareness = (provider = dummyProvider) => {
668
821
  return [
669
822
  awarenessProvider.of(provider),
@@ -676,11 +829,11 @@ var awareness = (provider = dummyProvider) => {
676
829
  var RemoteSelectionsDecorator = class {
677
830
  constructor(view) {
678
831
  this._ctx = new import_context.Context(void 0, {
679
- F: __dxlog_file2,
832
+ F: __dxlog_file3,
680
833
  L: 80
681
834
  });
682
- this.decorations = import_state5.RangeSet.of([]);
683
- this._cursorConverter = view.state.facet(import_chunk_GZWIENFM.Cursor.converter);
835
+ this.decorations = import_state6.RangeSet.of([]);
836
+ this._cursorConverter = view.state.facet(Cursor.converter);
684
837
  this._provider = view.state.facet(awarenessProvider);
685
838
  this._provider.open();
686
839
  this._provider.remoteStateChange.on(this._ctx, () => {
@@ -715,9 +868,9 @@ var RemoteSelectionsDecorator = class {
715
868
  _updateRemoteSelections(view) {
716
869
  const decorations = [];
717
870
  const awarenessStates = this._provider.getRemoteStates();
718
- for (const state2 of awarenessStates) {
719
- const anchor = state2.position?.anchor ? this._cursorConverter.fromCursor(state2.position.anchor) : null;
720
- const head = state2.position?.head ? this._cursorConverter.fromCursor(state2.position.head) : null;
871
+ for (const state of awarenessStates) {
872
+ const anchor = state.position?.anchor ? this._cursorConverter.fromCursor(state.position.anchor) : null;
873
+ const head = state.position?.head ? this._cursorConverter.fromCursor(state.position.head) : null;
721
874
  if (anchor == null || head == null) {
722
875
  continue;
723
876
  }
@@ -725,8 +878,8 @@ var RemoteSelectionsDecorator = class {
725
878
  const end = Math.min(Math.max(anchor, head), view.state.doc.length);
726
879
  const startLine = view.state.doc.lineAt(start);
727
880
  const endLine = view.state.doc.lineAt(end);
728
- const darkColor = state2.info.darkColor;
729
- const lightColor = state2.info.lightColor;
881
+ const darkColor = state.info.darkColor;
882
+ const lightColor = state.info.lightColor;
730
883
  if (startLine.number === endLine.number) {
731
884
  decorations.push({
732
885
  from: start,
@@ -779,7 +932,7 @@ var RemoteSelectionsDecorator = class {
779
932
  value: import_view5.Decoration.widget({
780
933
  side: head - anchor > 0 ? -1 : 1,
781
934
  block: false,
782
- widget: new RemoteCaretWidget(state2.info.displayName ?? "Anonymous", darkColor)
935
+ widget: new RemoteCaretWidget(state.info.displayName ?? "Anonymous", darkColor)
783
936
  })
784
937
  });
785
938
  }
@@ -879,7 +1032,7 @@ var styles2 = import_view5.EditorView.theme({
879
1032
  transitionDelay: "0s"
880
1033
  }
881
1034
  });
882
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/awareness/awareness-provider.ts";
1035
+ var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/awareness/awareness-provider.ts";
883
1036
  var DEBOUNCE_INTERVAL = 100;
884
1037
  var SpaceAwarenessProvider = class {
885
1038
  constructor(params) {
@@ -892,7 +1045,7 @@ var SpaceAwarenessProvider = class {
892
1045
  }
893
1046
  open() {
894
1047
  this._ctx = new import_context2.Context(void 0, {
895
- F: __dxlog_file3,
1048
+ F: __dxlog_file4,
896
1049
  L: 57
897
1050
  });
898
1051
  this._postTask = new import_async2.DeferredTask(this._ctx, async () => {
@@ -919,10 +1072,10 @@ var SpaceAwarenessProvider = class {
919
1072
  void this._space.postMessage(this._channel, {
920
1073
  kind: "query"
921
1074
  }).catch((err) => {
922
- import_log2.log.debug("failed to query awareness", {
1075
+ import_log3.log.debug("failed to query awareness", {
923
1076
  err
924
1077
  }, {
925
- F: __dxlog_file3,
1078
+ F: __dxlog_file4,
926
1079
  L: 91,
927
1080
  S: this,
928
1081
  C: (f, a) => f(...a)
@@ -939,7 +1092,7 @@ var SpaceAwarenessProvider = class {
939
1092
  }
940
1093
  update(position) {
941
1094
  (0, import_invariant.invariant)(this._postTask, void 0, {
942
- F: __dxlog_file3,
1095
+ F: __dxlog_file4,
943
1096
  L: 106,
944
1097
  S: this,
945
1098
  A: [
@@ -956,7 +1109,7 @@ var SpaceAwarenessProvider = class {
956
1109
  }
957
1110
  _handleQueryMessage() {
958
1111
  (0, import_invariant.invariant)(this._postTask, void 0, {
959
- F: __dxlog_file3,
1112
+ F: __dxlog_file4,
960
1113
  L: 117,
961
1114
  S: this,
962
1115
  A: [
@@ -968,7 +1121,7 @@ var SpaceAwarenessProvider = class {
968
1121
  }
969
1122
  _handlePostMessage(message) {
970
1123
  (0, import_invariant.invariant)(message.kind === "post", void 0, {
971
- F: __dxlog_file3,
1124
+ F: __dxlog_file4,
972
1125
  L: 122,
973
1126
  S: this,
974
1127
  A: [
@@ -980,7 +1133,7 @@ var SpaceAwarenessProvider = class {
980
1133
  this.remoteStateChange.emit();
981
1134
  }
982
1135
  };
983
- var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/blast.ts";
1136
+ var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/blast.ts";
984
1137
  var defaultOptions = {
985
1138
  effect: 2,
986
1139
  maxParticles: 200,
@@ -1107,7 +1260,7 @@ var Blaster = class {
1107
1260
  }
1108
1261
  initialize() {
1109
1262
  (0, import_invariant2.invariant)(!this._canvas && !this._ctx, void 0, {
1110
- F: __dxlog_file4,
1263
+ F: __dxlog_file5,
1111
1264
  L: 141,
1112
1265
  S: this,
1113
1266
  A: [
@@ -1144,7 +1297,7 @@ var Blaster = class {
1144
1297
  }
1145
1298
  start() {
1146
1299
  (0, import_invariant2.invariant)(this._canvas && this._ctx, void 0, {
1147
- F: __dxlog_file4,
1300
+ F: __dxlog_file5,
1148
1301
  L: 180,
1149
1302
  S: this,
1150
1303
  A: [
@@ -1285,10 +1438,10 @@ var random = (min, max) => {
1285
1438
  }
1286
1439
  return min + ~~(Math.random() * (max - min + 1));
1287
1440
  };
1288
- var commandConfig = (0, import_chunk_GZWIENFM.singleValueFacet)();
1289
- var commandState = import_state7.StateField.define({
1441
+ var commandConfig = singleValueFacet();
1442
+ var commandState = import_state8.StateField.define({
1290
1443
  create: () => ({}),
1291
- update: (state2, tr) => {
1444
+ update: (state, tr) => {
1292
1445
  for (const effect of tr.effects) {
1293
1446
  if (effect.is(closeEffect)) {
1294
1447
  return {};
@@ -1339,14 +1492,14 @@ var commandState = import_state7.StateField.define({
1339
1492
  };
1340
1493
  }
1341
1494
  }
1342
- return state2;
1495
+ return state;
1343
1496
  },
1344
1497
  provide: (field) => [
1345
1498
  import_view9.showTooltip.from(field, (value) => value.tooltip ?? null)
1346
1499
  ]
1347
1500
  });
1348
- var openEffect = import_state7.StateEffect.define();
1349
- var closeEffect = import_state7.StateEffect.define();
1501
+ var openEffect = import_state8.StateEffect.define();
1502
+ var closeEffect = import_state8.StateEffect.define();
1350
1503
  var openCommand = (view) => {
1351
1504
  if (view.state.field(commandState, false)) {
1352
1505
  const selection = view.state.selection.main;
@@ -1382,65 +1535,6 @@ var commandKeyBindings = [
1382
1535
  run: closeCommand
1383
1536
  }
1384
1537
  ];
1385
- var flattenRect = (rect, left) => {
1386
- const x = left ? rect.left : rect.right;
1387
- return {
1388
- left: x,
1389
- right: x,
1390
- top: rect.top,
1391
- bottom: rect.bottom
1392
- };
1393
- };
1394
- var scratchRange;
1395
- var textRange = (node, from, to = from) => {
1396
- const range = scratchRange || (scratchRange = document.createRange());
1397
- range.setEnd(node, to);
1398
- range.setStart(node, from);
1399
- return range;
1400
- };
1401
- var clientRectsFor = (dom) => {
1402
- if (dom.nodeType === 3) {
1403
- return textRange(dom, 0, dom.nodeValue.length).getClientRects();
1404
- } else if (dom.nodeType === 1) {
1405
- return dom.getClientRects();
1406
- } else {
1407
- return [];
1408
- }
1409
- };
1410
- var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/util/error.ts";
1411
- var wrapWithCatch = (fn) => {
1412
- return (...args) => {
1413
- try {
1414
- return fn(...args);
1415
- } catch (err) {
1416
- import_log3.log.catch(err, void 0, {
1417
- F: __dxlog_file5,
1418
- L: 12,
1419
- S: void 0,
1420
- C: (f, a) => f(...a)
1421
- });
1422
- }
1423
- };
1424
- };
1425
- var overlap = (a, b) => a.from <= b.to && a.to >= b.from;
1426
- var createElement = (tag, options, children) => {
1427
- const el = document.createElement(tag);
1428
- if (options?.className) {
1429
- el.className = options.className;
1430
- }
1431
- if (children) {
1432
- el.append(...Array.isArray(children) ? children : [
1433
- children
1434
- ]);
1435
- }
1436
- return el;
1437
- };
1438
- var renderRoot = (root, node) => {
1439
- (0, import_client.createRoot)(root).render(/* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ThemeProvider, {
1440
- tx: import_react_ui_theme2.defaultTx
1441
- }, node));
1442
- return root;
1443
- };
1444
1538
  var CommandHint = class extends import_view8.WidgetType {
1445
1539
  constructor(content) {
1446
1540
  super();
@@ -1485,7 +1579,7 @@ var hintViewPlugin = ({ onHint }) => import_view8.ViewPlugin.fromClass(class {
1485
1579
  this.deco = import_view8.Decoration.none;
1486
1580
  }
1487
1581
  update(update2) {
1488
- const builder = new import_state6.RangeSetBuilder();
1582
+ const builder = new import_state7.RangeSetBuilder();
1489
1583
  const cState = update2.view.state.field(commandState, false);
1490
1584
  if (!cState?.tooltip) {
1491
1585
  const selection = update2.view.state.selection.main;
@@ -1517,56 +1611,99 @@ var command = (options) => {
1517
1611
  })
1518
1612
  ];
1519
1613
  };
1520
- var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/util.ts";
1521
- var callbackWrapper = (fn) => (...args) => {
1522
- try {
1523
- return fn(...args);
1524
- } catch (err) {
1525
- import_log5.log.catch(err, void 0, {
1614
+ var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/selection.ts";
1615
+ var documentId = singleValueFacet();
1616
+ var stateRestoreAnnotation = "dxos.org/cm/state-restore";
1617
+ var createEditorStateTransaction = ({ scrollTo, selection }) => {
1618
+ return {
1619
+ selection,
1620
+ scrollIntoView: !scrollTo,
1621
+ effects: scrollTo ? import_view11.EditorView.scrollIntoView(scrollTo, {
1622
+ yMargin: 96
1623
+ }) : void 0,
1624
+ annotations: import_state10.Transaction.userEvent.of(stateRestoreAnnotation)
1625
+ };
1626
+ };
1627
+ var createEditorStateStore = (keyPrefix) => ({
1628
+ getState: (id) => {
1629
+ (0, import_invariant3.invariant)(id, void 0, {
1526
1630
  F: __dxlog_file6,
1527
- L: 19,
1631
+ L: 47,
1528
1632
  S: void 0,
1529
- C: (f, a) => f(...a)
1633
+ A: [
1634
+ "id",
1635
+ ""
1636
+ ]
1530
1637
  });
1531
- }
1532
- };
1533
- var debugDispatcher = (trs, view) => {
1534
- logChanges(trs);
1535
- view.update(trs);
1536
- };
1537
- var logChanges = (trs) => {
1538
- const changes = trs.flatMap((tr) => {
1539
- if (tr.changes.empty) {
1540
- return void 0;
1541
- }
1542
- const changes2 = [];
1543
- tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => changes2.push(JSON.stringify({
1544
- fromA,
1545
- toA,
1546
- fromB,
1547
- toB,
1548
- inserted: inserted.toString()
1549
- })));
1550
- return changes2;
1551
- }).filter(Boolean);
1552
- if (changes.length) {
1553
- import_log5.log.info("changes", {
1554
- changes
1555
- }, {
1638
+ const state = localStorage.getItem(`${keyPrefix}/${id}`);
1639
+ return state ? JSON.parse(state) : void 0;
1640
+ },
1641
+ setState: (id, state) => {
1642
+ (0, import_invariant3.invariant)(id, void 0, {
1556
1643
  F: __dxlog_file6,
1557
- L: 49,
1644
+ L: 53,
1558
1645
  S: void 0,
1559
- C: (f, a) => f(...a)
1646
+ A: [
1647
+ "id",
1648
+ ""
1649
+ ]
1560
1650
  });
1651
+ localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state));
1561
1652
  }
1653
+ });
1654
+ var selectionState = ({ getState, setState } = {}) => {
1655
+ const setStateDebounced = (0, import_async4.debounce)(setState, 1e3);
1656
+ return [
1657
+ // TODO(burdon): Track scrolling (currently only updates when cursor moves).
1658
+ // EditorView.domEventHandlers({
1659
+ // scroll: (event) => {
1660
+ // setStateDebounced(id, {});
1661
+ // },
1662
+ // }),
1663
+ import_view11.EditorView.updateListener.of(({ view, transactions }) => {
1664
+ const id = view.state.facet(documentId);
1665
+ if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
1666
+ return;
1667
+ }
1668
+ if (setState) {
1669
+ const { scrollTop } = view.scrollDOM;
1670
+ const pos = view.posAtCoords({
1671
+ x: 0,
1672
+ y: scrollTop
1673
+ });
1674
+ if (pos !== null) {
1675
+ const { anchor, head } = view.state.selection.main;
1676
+ setStateDebounced(id, {
1677
+ scrollTo: pos,
1678
+ selection: {
1679
+ anchor,
1680
+ head
1681
+ }
1682
+ });
1683
+ }
1684
+ }
1685
+ }),
1686
+ getState && import_view11.keymap.of([
1687
+ {
1688
+ key: "ctrl-r",
1689
+ run: (view) => {
1690
+ const state = getState(view.state.facet(documentId));
1691
+ if (state) {
1692
+ view.dispatch(createEditorStateTransaction(state));
1693
+ }
1694
+ return true;
1695
+ }
1696
+ }
1697
+ ])
1698
+ ].filter(import_util3.isNotFalsy);
1562
1699
  };
1563
1700
  var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
1564
- var setComments = import_state8.StateEffect.define();
1565
- var setSelection = import_state8.StateEffect.define();
1566
- var setCommentState = import_state8.StateEffect.define();
1567
- var commentsState = import_state8.StateField.define({
1568
- create: (state2) => ({
1569
- id: state2.facet(import_chunk_GZWIENFM.documentId),
1701
+ var setComments = import_state9.StateEffect.define();
1702
+ var setSelection = import_state9.StateEffect.define();
1703
+ var setCommentState = import_state9.StateEffect.define();
1704
+ var commentsState = import_state9.StateField.define({
1705
+ create: (state) => ({
1706
+ id: state.facet(documentId),
1570
1707
  comments: [],
1571
1708
  selection: {}
1572
1709
  }),
@@ -1584,7 +1721,7 @@ var commentsState = import_state8.StateField.define({
1584
1721
  if (!comment.cursor) {
1585
1722
  return void 0;
1586
1723
  }
1587
- const range = import_chunk_GZWIENFM.Cursor.getRangeFromCursor(tr.state, comment.cursor);
1724
+ const range = Cursor.getRangeFromCursor(tr.state, comment.cursor);
1588
1725
  return range && {
1589
1726
  comment,
1590
1727
  range
@@ -1624,14 +1761,14 @@ var createCommentMark = (id, isCurrent) => import_view10.Decoration.mark({
1624
1761
  });
1625
1762
  var commentsDecorations = import_view10.EditorView.decorations.compute([
1626
1763
  commentsState
1627
- ], (state2) => {
1628
- const { selection: { current }, comments: comments2 } = state2.field(commentsState);
1764
+ ], (state) => {
1765
+ const { selection: { current }, comments: comments2 } = state.field(commentsState);
1629
1766
  const decorations = (0, import_lodash2.default)(comments2 ?? [], (range) => range.range.from)?.flatMap((comment) => {
1630
1767
  const range = comment.range;
1631
1768
  if (!range) {
1632
1769
  import_log4.log.warn("Invalid range:", range, {
1633
1770
  F: __dxlog_file7,
1634
- L: 143,
1771
+ L: 142,
1635
1772
  S: void 0,
1636
1773
  C: (f, a) => f(...a)
1637
1774
  });
@@ -1644,7 +1781,7 @@ var commentsDecorations = import_view10.EditorView.decorations.compute([
1644
1781
  }).filter(import_util2.nonNullable);
1645
1782
  return import_view10.Decoration.set(decorations);
1646
1783
  });
1647
- var commentClickedEffect = import_state8.StateEffect.define();
1784
+ var commentClickedEffect = import_state9.StateEffect.define();
1648
1785
  var handleCommentClick = import_view10.EditorView.domEventHandlers({
1649
1786
  click: (event, view) => {
1650
1787
  let target = event.target;
@@ -1747,7 +1884,7 @@ var trackPastedComments = (onUpdate) => {
1747
1884
  const { comments: comments2 } = update2.startState.field(commentsState);
1748
1885
  const exists = comments2.some((c) => c.comment.id === comment.id && c.range.from < c.range.to);
1749
1886
  if (!exists) {
1750
- const cursor = import_chunk_GZWIENFM.Cursor.getCursorFromRange(update2.state, comment);
1887
+ const cursor = Cursor.getCursorFromRange(update2.state, comment);
1751
1888
  onUpdate({
1752
1889
  id: comment.id,
1753
1890
  cursor
@@ -1762,7 +1899,7 @@ var mapTrackedComment = (comment, changes) => ({
1762
1899
  from: changes.mapPos(comment.from, 1),
1763
1900
  to: changes.mapPos(comment.to, 1)
1764
1901
  });
1765
- var restoreCommentEffect = import_state8.StateEffect.define({
1902
+ var restoreCommentEffect = import_state9.StateEffect.define({
1766
1903
  map: mapTrackedComment
1767
1904
  });
1768
1905
  var createComment = (view) => {
@@ -1779,7 +1916,7 @@ var createComment = (view) => {
1779
1916
  }
1780
1917
  });
1781
1918
  }
1782
- const cursor = import_chunk_GZWIENFM.Cursor.getCursorFromRange(view.state, {
1919
+ const cursor = Cursor.getCursorFromRange(view.state, {
1783
1920
  from,
1784
1921
  to
1785
1922
  });
@@ -1793,13 +1930,13 @@ var createComment = (view) => {
1793
1930
  }
1794
1931
  return false;
1795
1932
  };
1796
- var optionsFacet = (0, import_chunk_GZWIENFM.singleValueFacet)();
1933
+ var optionsFacet = singleValueFacet();
1797
1934
  var comments = (options = {}) => {
1798
1935
  const { key: shortcut = "meta-'" } = options;
1799
- const handleSelect = (0, import_async3.debounce)((state2) => options.onSelect?.(state2), 200);
1936
+ const handleSelect = (0, import_async3.debounce)((state) => options.onSelect?.(state), 200);
1800
1937
  return [
1801
1938
  optionsFacet.of(options),
1802
- options.id ? import_chunk_GZWIENFM.documentId.of(options.id) : void 0,
1939
+ options.id ? documentId.of(options.id) : void 0,
1803
1940
  commentsState,
1804
1941
  commentsDecorations,
1805
1942
  handleCommentClick,
@@ -1846,13 +1983,13 @@ var comments = (options = {}) => {
1846
1983
  //
1847
1984
  // Track deleted ranges and update ranges for decorations.
1848
1985
  //
1849
- import_view10.EditorView.updateListener.of(({ view, state: state2, changes }) => {
1986
+ import_view10.EditorView.updateListener.of(({ view, state, changes }) => {
1850
1987
  let mod = false;
1851
- const { comments: comments2, ...value } = state2.field(commentsState);
1988
+ const { comments: comments2, ...value } = state.field(commentsState);
1852
1989
  changes.iterChanges((from, to, from2, to2) => {
1853
1990
  comments2.forEach(({ comment, range }) => {
1854
1991
  if (from2 === to2) {
1855
- const newRange = import_chunk_GZWIENFM.Cursor.getRangeFromCursor(view.state, comment.cursor);
1992
+ const newRange = Cursor.getRangeFromCursor(view.state, comment.cursor);
1856
1993
  if (!newRange || newRange.to - newRange.from === 0) {
1857
1994
  options.onDelete?.({
1858
1995
  id: comment.id
@@ -1860,7 +1997,7 @@ var comments = (options = {}) => {
1860
1997
  }
1861
1998
  }
1862
1999
  if (from <= range.to) {
1863
- const newRange = import_chunk_GZWIENFM.Cursor.getRangeFromCursor(view.state, comment.cursor);
2000
+ const newRange = Cursor.getRangeFromCursor(view.state, comment.cursor);
1864
2001
  Object.assign(range, newRange);
1865
2002
  mod = true;
1866
2003
  }
@@ -1878,10 +2015,10 @@ var comments = (options = {}) => {
1878
2015
  //
1879
2016
  // Track selection/proximity.
1880
2017
  //
1881
- import_view10.EditorView.updateListener.of(({ view, state: state2 }) => {
2018
+ import_view10.EditorView.updateListener.of(({ view, state }) => {
1882
2019
  let min = Infinity;
1883
- const { selection: { current, closest }, comments: comments2 } = state2.field(commentsState);
1884
- const { head } = state2.selection.main;
2020
+ const { selection: { current, closest }, comments: comments2 } = state.field(commentsState);
2021
+ const { head } = state.selection.main;
1885
2022
  const selection = {};
1886
2023
  comments2.forEach(({ comment, range }) => {
1887
2024
  if (head >= range.from && head <= range.to) {
@@ -1902,7 +2039,7 @@ var comments = (options = {}) => {
1902
2039
  });
1903
2040
  handleSelect({
1904
2041
  selection,
1905
- id: state2.facet(import_chunk_GZWIENFM.documentId),
2042
+ id: state.facet(documentId),
1906
2043
  comments: comments2.map(({ comment, range }) => ({
1907
2044
  comment,
1908
2045
  range,
@@ -1919,7 +2056,7 @@ var scrollThreadIntoView = (view, id, center = true) => {
1919
2056
  if (!comment?.comment.cursor) {
1920
2057
  return;
1921
2058
  }
1922
- const range = import_chunk_GZWIENFM.Cursor.getRangeFromCursor(view.state, comment.comment.cursor);
2059
+ const range = Cursor.getRangeFromCursor(view.state, comment.comment.cursor);
1923
2060
  if (range) {
1924
2061
  const currentSelection = view.state.selection.main;
1925
2062
  const currentScrollPosition = view.scrollDOM.scrollTop;
@@ -1943,12 +2080,12 @@ var scrollThreadIntoView = (view, id, center = true) => {
1943
2080
  }
1944
2081
  }
1945
2082
  };
1946
- var selectionOverlapsComment = (state2) => {
1947
- const commentState = state2.field(commentsState, false);
2083
+ var selectionOverlapsComment = (state) => {
2084
+ const commentState = state.field(commentsState, false);
1948
2085
  if (commentState === void 0) {
1949
2086
  return false;
1950
2087
  }
1951
- const { selection } = state2;
2088
+ const { selection } = state;
1952
2089
  for (const range of selection.ranges) {
1953
2090
  if (commentState.comments.some(({ range: commentRange }) => overlap(commentRange, range))) {
1954
2091
  return true;
@@ -1956,8 +2093,8 @@ var selectionOverlapsComment = (state2) => {
1956
2093
  }
1957
2094
  return false;
1958
2095
  };
1959
- var hasActiveSelection = (state2) => {
1960
- return state2.selection.ranges.some((range) => !range.empty);
2096
+ var hasActiveSelection = (state) => {
2097
+ return state.selection.ranges.some((range) => !range.empty);
1961
2098
  };
1962
2099
  var ExternalCommentSync = class {
1963
2100
  constructor(view, id, subscribe, getComments) {
@@ -1966,7 +2103,7 @@ var ExternalCommentSync = class {
1966
2103
  };
1967
2104
  const updateComments = () => {
1968
2105
  const comments2 = getComments();
1969
- if (id === view.state.facet(import_chunk_GZWIENFM.documentId)) {
2106
+ if (id === view.state.facet(documentId)) {
1970
2107
  queueMicrotask(() => view.dispatch({
1971
2108
  effects: setComments.of({
1972
2109
  id,
@@ -1984,7 +2121,7 @@ var createExternalCommentSync = (id, subscribe, getComments) => import_view10.Vi
1984
2121
  }
1985
2122
  });
1986
2123
  var useCommentState = () => {
1987
- const [state2, setState] = (0, import_react4.useState)({
2124
+ const [state, setState] = (0, import_react4.useState)({
1988
2125
  comment: false,
1989
2126
  selection: false
1990
2127
  });
@@ -1997,14 +2134,14 @@ var useCommentState = () => {
1997
2134
  }
1998
2135
  }), []);
1999
2136
  return [
2000
- state2,
2137
+ state,
2001
2138
  observer
2002
2139
  ];
2003
2140
  };
2004
2141
  var useComments = (view, id, comments2) => {
2005
2142
  (0, import_react4.useEffect)(() => {
2006
2143
  if (view) {
2007
- if (id === view.state.facet(import_chunk_GZWIENFM.documentId)) {
2144
+ if (id === view.state.facet(documentId)) {
2008
2145
  view.dispatch({
2009
2146
  effects: setComments.of({
2010
2147
  id,
@@ -2028,16 +2165,16 @@ var useCommentClickListener = (onCommentClick) => {
2028
2165
  onCommentClick
2029
2166
  ]);
2030
2167
  };
2031
- var debugNodeLogger = (log9 = console.log) => {
2032
- const logTokens = (state2) => (0, import_language.syntaxTree)(state2).iterate({
2033
- enter: (node) => log9(node.type)
2168
+ var debugNodeLogger = (log8 = console.log) => {
2169
+ const logTokens = (state) => (0, import_language.syntaxTree)(state).iterate({
2170
+ enter: (node) => log8(node.type)
2034
2171
  });
2035
- return import_state9.StateField.define({
2036
- create: (state2) => logTokens(state2),
2172
+ return import_state11.StateField.define({
2173
+ create: (state) => logTokens(state),
2037
2174
  update: (_, tr) => logTokens(tr.state)
2038
2175
  });
2039
2176
  };
2040
- var styles4 = import_view11.EditorView.theme({
2177
+ var styles4 = import_view12.EditorView.theme({
2041
2178
  ".cm-dropCursor": {
2042
2179
  borderLeft: "2px solid var(--dx-accentText)",
2043
2180
  color: "var(--dx-accentText)",
@@ -2050,8 +2187,8 @@ var styles4 = import_view11.EditorView.theme({
2050
2187
  var dropFile = (options = {}) => {
2051
2188
  return [
2052
2189
  styles4,
2053
- (0, import_view11.dropCursor)(),
2054
- import_view11.EditorView.domEventHandlers({
2190
+ (0, import_view12.dropCursor)(),
2191
+ import_view12.EditorView.domEventHandlers({
2055
2192
  drop: (event, view) => {
2056
2193
  event.preventDefault();
2057
2194
  const files = event.dataTransfer?.files;
@@ -2070,6 +2207,33 @@ var dropFile = (options = {}) => {
2070
2207
  })
2071
2208
  ];
2072
2209
  };
2210
+ var focusEffect = import_state13.StateEffect.define();
2211
+ var focusField = import_state13.StateField.define({
2212
+ create: () => false,
2213
+ update: (value, tr) => {
2214
+ for (const effect of tr.effects) {
2215
+ if (effect.is(focusEffect)) {
2216
+ return effect.value;
2217
+ }
2218
+ }
2219
+ return value;
2220
+ }
2221
+ });
2222
+ var focus = [
2223
+ focusField,
2224
+ import_view14.EditorView.domEventHandlers({
2225
+ focus: (event, view) => {
2226
+ setTimeout(() => view.dispatch({
2227
+ effects: focusEffect.of(true)
2228
+ }));
2229
+ },
2230
+ blur: (event, view) => {
2231
+ setTimeout(() => view.dispatch({
2232
+ effects: focusEffect.of(false)
2233
+ }));
2234
+ }
2235
+ })
2236
+ ];
2073
2237
  var headings = {
2074
2238
  1: "text-4xl",
2075
2239
  2: "text-3xl",
@@ -2290,13 +2454,14 @@ var defaultTheme = {
2290
2454
  }
2291
2455
  };
2292
2456
  var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
2293
- var preventNewline = import_state10.EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
2457
+ var preventNewline = import_state12.EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
2294
2458
  var defaultBasicOptions = {
2295
2459
  allowMultipleSelections: true,
2296
2460
  bracketMatching: true,
2297
2461
  closeBrackets: true,
2298
2462
  drawSelection: true,
2299
2463
  editable: true,
2464
+ focus: true,
2300
2465
  history: true,
2301
2466
  keymap: "standard",
2302
2467
  lineWrapping: true,
@@ -2312,34 +2477,35 @@ var createBasicExtensions = (_props) => {
2312
2477
  const props = (0, import_lodash3.default)({}, _props, defaultBasicOptions);
2313
2478
  return [
2314
2479
  // NOTE: Doesn't catch errors in keymap functions.
2315
- import_view12.EditorView.exceptionSink.of((err) => {
2316
- import_log6.log.catch(err, void 0, {
2480
+ import_view13.EditorView.exceptionSink.of((err) => {
2481
+ import_log5.log.catch(err, void 0, {
2317
2482
  F: __dxlog_file8,
2318
- L: 93,
2483
+ L: 96,
2319
2484
  S: void 0,
2320
2485
  C: (f, a) => f(...a)
2321
2486
  });
2322
2487
  }),
2323
- props.allowMultipleSelections && import_state10.EditorState.allowMultipleSelections.of(true),
2488
+ props.allowMultipleSelections && import_state12.EditorState.allowMultipleSelections.of(true),
2324
2489
  props.bracketMatching && (0, import_language2.bracketMatching)(),
2325
2490
  props.closeBrackets && (0, import_autocomplete2.closeBrackets)(),
2326
- props.dropCursor && (0, import_view12.dropCursor)(),
2327
- props.drawSelection && (0, import_view12.drawSelection)({
2491
+ props.dropCursor && (0, import_view13.dropCursor)(),
2492
+ props.drawSelection && (0, import_view13.drawSelection)({
2328
2493
  cursorBlinkRate: 1200
2329
2494
  }),
2330
- props.highlightActiveLine && (0, import_view12.highlightActiveLine)(),
2495
+ props.focus && focus,
2496
+ props.highlightActiveLine && (0, import_view13.highlightActiveLine)(),
2331
2497
  props.history && (0, import_commands2.history)(),
2332
- props.lineNumbers && (0, import_view12.lineNumbers)(),
2333
- props.lineWrapping && import_view12.EditorView.lineWrapping,
2334
- props.placeholder && (0, import_view12.placeholder)(props.placeholder),
2498
+ props.lineNumbers && (0, import_view13.lineNumbers)(),
2499
+ props.lineWrapping && import_view13.EditorView.lineWrapping,
2500
+ props.placeholder && (0, import_view13.placeholder)(props.placeholder),
2335
2501
  props.readonly && [
2336
- import_state10.EditorState.readOnly.of(true),
2337
- import_view12.EditorView.editable.of(false)
2502
+ import_state12.EditorState.readOnly.of(true),
2503
+ import_view13.EditorView.editable.of(false)
2338
2504
  ],
2339
- props.scrollPastEnd && (0, import_view12.scrollPastEnd)(),
2340
- props.tabSize && import_state10.EditorState.tabSize.of(props.tabSize),
2505
+ props.scrollPastEnd && (0, import_view13.scrollPastEnd)(),
2506
+ props.tabSize && import_state12.EditorState.tabSize.of(props.tabSize),
2341
2507
  // https://codemirror.net/docs/ref/#view.KeyBinding
2342
- import_view12.keymap.of([
2508
+ import_view13.keymap.of([
2343
2509
  ...(props.keymap && keymaps[props.keymap]) ?? [],
2344
2510
  // NOTE: Tabs are also configured by markdown extension.
2345
2511
  // https://codemirror.net/docs/ref/#commands.indentWithTab
@@ -2352,8 +2518,8 @@ var createBasicExtensions = (_props) => {
2352
2518
  ...props.history ? import_commands2.historyKeymap : [],
2353
2519
  // https://codemirror.net/docs/ref/#search.searchKeymap
2354
2520
  ...props.search ? import_search.searchKeymap : []
2355
- ].filter(import_util3.isNotFalsy))
2356
- ].filter(import_util3.isNotFalsy);
2521
+ ].filter(import_util4.isNotFalsy))
2522
+ ].filter(import_util4.isNotFalsy);
2357
2523
  };
2358
2524
  var defaultThemeSlots = {
2359
2525
  editor: {
@@ -2363,17 +2529,17 @@ var defaultThemeSlots = {
2363
2529
  var createThemeExtensions = ({ themeMode, styles: styles5, syntaxHighlighting: _syntaxHighlighting, slots: _slots } = {}) => {
2364
2530
  const slots = (0, import_lodash3.default)({}, _slots, defaultThemeSlots);
2365
2531
  return [
2366
- import_view12.EditorView.darkTheme.of(themeMode === "dark"),
2367
- import_view12.EditorView.baseTheme(styles5 ? (0, import_lodash4.default)({}, defaultTheme, styles5) : defaultTheme),
2532
+ import_view13.EditorView.darkTheme.of(themeMode === "dark"),
2533
+ import_view13.EditorView.baseTheme(styles5 ? (0, import_lodash4.default)({}, defaultTheme, styles5) : defaultTheme),
2368
2534
  // https://github.com/codemirror/theme-one-dark
2369
2535
  _syntaxHighlighting && (themeMode === "dark" ? (0, import_language2.syntaxHighlighting)(import_theme_one_dark.oneDarkHighlightStyle) : (0, import_language2.syntaxHighlighting)(import_language2.defaultHighlightStyle)),
2370
- slots.editor?.className && import_view12.EditorView.editorAttributes.of({
2536
+ slots.editor?.className && import_view13.EditorView.editorAttributes.of({
2371
2537
  class: slots.editor.className
2372
2538
  }),
2373
- slots.content?.className && import_view12.EditorView.contentAttributes.of({
2539
+ slots.content?.className && import_view13.EditorView.contentAttributes.of({
2374
2540
  class: slots.content.className
2375
2541
  })
2376
- ].filter(import_util3.isNotFalsy);
2542
+ ].filter(import_util4.isNotFalsy);
2377
2543
  };
2378
2544
  var createDataExtensions = ({ id, text, space, identity }) => {
2379
2545
  const extensions = [];
@@ -2382,7 +2548,7 @@ var createDataExtensions = ({ id, text, space, identity }) => {
2382
2548
  }
2383
2549
  if (space && identity) {
2384
2550
  const peerId = identity?.identityKey.toHex();
2385
- const { cursorLightValue, cursorDarkValue } = import_react_ui_theme3.hueTokens[identity?.profile?.data?.hue ?? (0, import_util3.hexToHue)(peerId ?? "0")];
2551
+ const { cursorLightValue, cursorDarkValue } = import_react_ui_theme3.hueTokens[identity?.profile?.data?.hue ?? (0, import_util4.hexToHue)(peerId ?? "0")];
2386
2552
  extensions.push(awareness(new SpaceAwarenessProvider({
2387
2553
  space,
2388
2554
  channel: `awareness.${id}`,
@@ -2417,7 +2583,7 @@ var folding = (_props = {}) => [
2417
2583
  }));
2418
2584
  }
2419
2585
  }),
2420
- import_view13.EditorView.theme({
2586
+ import_view15.EditorView.theme({
2421
2587
  ".cm-foldGutter": {
2422
2588
  opacity: 0.3,
2423
2589
  transition: "opacity 0.3s",
@@ -2430,11 +2596,11 @@ var folding = (_props = {}) => [
2430
2596
  ];
2431
2597
  var listener = ({ onFocus, onChange }) => {
2432
2598
  const extensions = [];
2433
- onFocus && extensions.push(import_view14.EditorView.focusChangeEffect.of((_, focusing) => {
2599
+ onFocus && extensions.push(import_view16.EditorView.focusChangeEffect.of((_, focusing) => {
2434
2600
  onFocus(focusing);
2435
2601
  return null;
2436
2602
  }));
2437
- onChange && extensions.push(import_view14.EditorView.updateListener.of((update2) => {
2603
+ onChange && extensions.push(import_view16.EditorView.updateListener.of((update2) => {
2438
2604
  onChange(update2.state.doc.toString());
2439
2605
  }));
2440
2606
  return extensions;
@@ -2454,13 +2620,13 @@ var List;
2454
2620
  List2[List2["Task"] = 2] = "Task";
2455
2621
  })(List || (List = {}));
2456
2622
  var setHeading = (level) => {
2457
- return ({ state: state2, dispatch }) => {
2458
- const { selection: { ranges }, doc } = state2;
2623
+ return ({ state, dispatch }) => {
2624
+ const { selection: { ranges }, doc } = state;
2459
2625
  const changes = [];
2460
2626
  let prevBlock = -1;
2461
2627
  for (const range of ranges) {
2462
2628
  let sawBlock = false;
2463
- (0, import_language4.syntaxTree)(state2).iterate({
2629
+ (0, import_language4.syntaxTree)(state).iterate({
2464
2630
  from: range.from,
2465
2631
  to: range.to,
2466
2632
  enter: (node) => {
@@ -2513,7 +2679,7 @@ var setHeading = (level) => {
2513
2679
  }
2514
2680
  });
2515
2681
  let line;
2516
- if (!sawBlock && range.empty && level > 0 && !/\S/.test((line = state2.doc.lineAt(range.from)).text)) {
2682
+ if (!sawBlock && range.empty && level > 0 && !/\S/.test((line = state.doc.lineAt(range.from)).text)) {
2517
2683
  changes.push({
2518
2684
  from: line.from,
2519
2685
  to: line.to,
@@ -2524,10 +2690,10 @@ var setHeading = (level) => {
2524
2690
  if (!changes.length) {
2525
2691
  return false;
2526
2692
  }
2527
- const changeSet = state2.changes(changes);
2528
- dispatch(state2.update({
2693
+ const changeSet = state.changes(changes);
2694
+ dispatch(state.update({
2529
2695
  changes: changeSet,
2530
- selection: state2.selection.map(changeSet, 1),
2696
+ selection: state.selection.map(changeSet, 1),
2531
2697
  userEvent: "format.setHeading",
2532
2698
  scrollIntoView: true
2533
2699
  }));
@@ -2535,14 +2701,14 @@ var setHeading = (level) => {
2535
2701
  };
2536
2702
  };
2537
2703
  var setStyle = (type, enable) => {
2538
- return ({ state: state2, dispatch }) => {
2704
+ return ({ state, dispatch }) => {
2539
2705
  const marker = inlineMarkerText(type);
2540
- const changes = state2.changeByRange((range) => {
2706
+ const changes = state.changeByRange((range) => {
2541
2707
  if (!enable && range.empty) {
2542
- const after = state2.doc.sliceString(range.head, range.head + 6);
2708
+ const after = state.doc.sliceString(range.head, range.head + 6);
2543
2709
  const found = after.indexOf(marker);
2544
2710
  if (found >= 0 && /^[*~`]*$/.test(after.slice(0, found))) {
2545
- const before = state2.doc.sliceString(range.head - 6, range.head);
2711
+ const before = state.doc.sliceString(range.head - 6, range.head);
2546
2712
  if (before.slice(before.length - found - marker.length, before.length - found) === marker && [
2547
2713
  ...before.slice(before.length - found)
2548
2714
  ].reverse().join("") === after.slice(0, found)) {
@@ -2557,7 +2723,7 @@ var setStyle = (type, enable) => {
2557
2723
  to: range.head + found + marker.length
2558
2724
  }
2559
2725
  ],
2560
- range: import_state11.EditorSelection.cursor(range.from - marker.length)
2726
+ range: import_state14.EditorSelection.cursor(range.from - marker.length)
2561
2727
  };
2562
2728
  }
2563
2729
  }
@@ -2569,14 +2735,14 @@ var setStyle = (type, enable) => {
2569
2735
  let startCovered = false;
2570
2736
  let endCovered = false;
2571
2737
  let { from, to } = range;
2572
- (0, import_language4.syntaxTree)(state2).iterate({
2738
+ (0, import_language4.syntaxTree)(state).iterate({
2573
2739
  from,
2574
2740
  to,
2575
2741
  enter: (node) => {
2576
2742
  const { name } = node;
2577
2743
  if (Object.hasOwn(Textblocks, name) && Textblocks[name] !== "codeblock") {
2578
2744
  blockStart = blockContentStart(node);
2579
- blockEnd = blockContentEnd(node, state2.doc);
2745
+ blockEnd = blockContentEnd(node, state.doc);
2580
2746
  startCovered = endCovered = false;
2581
2747
  } else if (name === "Link" || name === "Image" && enable) {
2582
2748
  if (from < node.from && to > node.from && to <= node.to) {
@@ -2621,7 +2787,7 @@ var setStyle = (type, enable) => {
2621
2787
  });
2622
2788
  if (markType !== type && closeStart >= to) {
2623
2789
  changesAtEnd.push({
2624
- from: skipSpaces(Math.min(to, blockEnd), state2.doc, 1, blockEnd),
2790
+ from: skipSpaces(Math.min(to, blockEnd), state.doc, 1, blockEnd),
2625
2791
  insert: inlineMarkerText(markType)
2626
2792
  });
2627
2793
  }
@@ -2633,7 +2799,7 @@ var setStyle = (type, enable) => {
2633
2799
  });
2634
2800
  if (markType !== type && openEnd <= from) {
2635
2801
  changes2.push({
2636
- from: skipSpaces(Math.max(from, blockStart), state2.doc, -1, blockStart),
2802
+ from: skipSpaces(Math.max(from, blockStart), state.doc, -1, blockStart),
2637
2803
  insert: inlineMarkerText(markType)
2638
2804
  });
2639
2805
  }
@@ -2663,7 +2829,7 @@ var setStyle = (type, enable) => {
2663
2829
  changes2.push(startCovered);
2664
2830
  } else if (startCovered) {
2665
2831
  changes2.push({
2666
- from: skipSpaces(rangeStart, state2.doc, -1, blockStart),
2832
+ from: skipSpaces(rangeStart, state.doc, -1, blockStart),
2667
2833
  insert: marker
2668
2834
  });
2669
2835
  }
@@ -2671,7 +2837,7 @@ var setStyle = (type, enable) => {
2671
2837
  changes2.push(endCovered);
2672
2838
  } else if (endCovered) {
2673
2839
  changes2.push({
2674
- from: skipSpaces(rangeEnd, state2.doc, 1, blockEnd),
2840
+ from: skipSpaces(rangeEnd, state.doc, 1, blockEnd),
2675
2841
  insert: marker
2676
2842
  });
2677
2843
  }
@@ -2679,22 +2845,22 @@ var setStyle = (type, enable) => {
2679
2845
  }
2680
2846
  }
2681
2847
  });
2682
- if (blockStart < 0 && range.empty && enable && !/\S/.test(state2.doc.lineAt(range.from).text)) {
2848
+ if (blockStart < 0 && range.empty && enable && !/\S/.test(state.doc.lineAt(range.from).text)) {
2683
2849
  return {
2684
2850
  changes: {
2685
2851
  from: range.head,
2686
2852
  insert: marker + marker
2687
2853
  },
2688
- range: import_state11.EditorSelection.cursor(range.head + marker.length)
2854
+ range: import_state14.EditorSelection.cursor(range.head + marker.length)
2689
2855
  };
2690
2856
  }
2691
- const changeSet = state2.changes(changes2.concat(changesAtEnd));
2857
+ const changeSet = state.changes(changes2.concat(changesAtEnd));
2692
2858
  return {
2693
2859
  changes: changeSet,
2694
- range: range.empty && !changeSet.empty ? import_state11.EditorSelection.cursor(range.head + marker.length) : import_state11.EditorSelection.range(changeSet.mapPos(range.from, 1), changeSet.mapPos(range.to, -1))
2860
+ range: range.empty && !changeSet.empty ? import_state14.EditorSelection.cursor(range.head + marker.length) : import_state14.EditorSelection.range(changeSet.mapPos(range.from, 1), changeSet.mapPos(range.to, -1))
2695
2861
  };
2696
2862
  });
2697
- dispatch(state2.update(changes, {
2863
+ dispatch(state.update(changes, {
2698
2864
  userEvent: enable ? "format.style.add" : "format.style.remove",
2699
2865
  scrollIntoView: true
2700
2866
  }));
@@ -2771,8 +2937,8 @@ var insertTable = (view) => {
2771
2937
  const { from } = doc.line(number);
2772
2938
  snippets.table(view, null, from, from);
2773
2939
  };
2774
- var removeLinkInner = (from, to, changes, state2) => {
2775
- (0, import_language4.syntaxTree)(state2).iterate({
2940
+ var removeLinkInner = (from, to, changes, state) => {
2941
+ (0, import_language4.syntaxTree)(state).iterate({
2776
2942
  from,
2777
2943
  to,
2778
2944
  enter: (node) => {
@@ -2786,8 +2952,8 @@ var removeLinkInner = (from, to, changes, state2) => {
2786
2952
  });
2787
2953
  } else if (name === "LinkTitle" || name === "URL") {
2788
2954
  changes.push({
2789
- from: skipSpaces(node2.from, state2.doc, -1),
2790
- to: skipSpaces(node2.to, state2.doc, 1)
2955
+ from: skipSpaces(node2.from, state.doc, -1),
2956
+ to: skipSpaces(node2.to, state.doc, 1)
2791
2957
  });
2792
2958
  }
2793
2959
  });
@@ -2796,15 +2962,15 @@ var removeLinkInner = (from, to, changes, state2) => {
2796
2962
  }
2797
2963
  });
2798
2964
  };
2799
- var removeLink = ({ state: state2, dispatch }) => {
2965
+ var removeLink = ({ state, dispatch }) => {
2800
2966
  const changes = [];
2801
- for (const { from, to } of state2.selection.ranges) {
2802
- removeLinkInner(from, to, changes, state2);
2967
+ for (const { from, to } of state.selection.ranges) {
2968
+ removeLinkInner(from, to, changes, state);
2803
2969
  }
2804
2970
  if (!changes) {
2805
2971
  return false;
2806
2972
  }
2807
- dispatch(state2.update({
2973
+ dispatch(state.update({
2808
2974
  changes,
2809
2975
  userEvent: "format.link.remove",
2810
2976
  scrollIntoView: true
@@ -2812,17 +2978,17 @@ var removeLink = ({ state: state2, dispatch }) => {
2812
2978
  return true;
2813
2979
  };
2814
2980
  var addLink = ({ url, image: image2 } = {}) => {
2815
- return ({ state: state2, dispatch }) => {
2816
- const changes = state2.changeByRange((range) => {
2981
+ return ({ state, dispatch }) => {
2982
+ const changes = state.changeByRange((range) => {
2817
2983
  let { from, to } = range;
2818
2984
  const cutStyles = [];
2819
2985
  let okay = null;
2820
- (0, import_language4.syntaxTree)(state2).iterate({
2986
+ (0, import_language4.syntaxTree)(state).iterate({
2821
2987
  from,
2822
2988
  to,
2823
2989
  enter: (node) => {
2824
2990
  if (Object.hasOwn(Textblocks, node.name)) {
2825
- okay = Textblocks[node.name] !== "codeblock" && from >= blockContentStart(node) && to <= blockContentEnd(node, state2.doc);
2991
+ okay = Textblocks[node.name] !== "codeblock" && from >= blockContentStart(node) && to <= blockContentEnd(node, state.doc);
2826
2992
  } else if (Object.hasOwn(InlineMarker, node.name)) {
2827
2993
  const sNode = node.node;
2828
2994
  if (node.from < from && node.to <= to) {
@@ -2842,7 +3008,7 @@ var addLink = ({ url, image: image2 } = {}) => {
2842
3008
  }
2843
3009
  });
2844
3010
  if (okay === null) {
2845
- const line = state2.doc.lineAt(from);
3011
+ const line = state.doc.lineAt(from);
2846
3012
  okay = to <= line.to && !/\S/.test(line.text.slice(from - line.from));
2847
3013
  }
2848
3014
  if (!okay) {
@@ -2852,26 +3018,26 @@ var addLink = ({ url, image: image2 } = {}) => {
2852
3018
  }
2853
3019
  const changes2 = [];
2854
3020
  const changesAfter = [];
2855
- removeLinkInner(from, to, changesAfter, state2);
3021
+ removeLinkInner(from, to, changesAfter, state);
2856
3022
  let cursorOffset = 1;
2857
3023
  for (const style of cutStyles) {
2858
3024
  const type = InlineMarker[style.name];
2859
3025
  const mark = inlineMarkerText(type);
2860
3026
  if (style.from < from) {
2861
3027
  changes2.push({
2862
- from: skipSpaces(from, state2.doc, -1),
3028
+ from: skipSpaces(from, state.doc, -1),
2863
3029
  insert: mark
2864
3030
  });
2865
3031
  changesAfter.push({
2866
- from: skipSpaces(from, state2.doc, 1, to),
3032
+ from: skipSpaces(from, state.doc, 1, to),
2867
3033
  insert: mark
2868
3034
  });
2869
3035
  } else {
2870
3036
  changes2.push({
2871
- from: skipSpaces(to, state2.doc, -1, from),
3037
+ from: skipSpaces(to, state.doc, -1, from),
2872
3038
  insert: mark
2873
3039
  });
2874
- const after = skipSpaces(to, state2.doc, 1);
3040
+ const after = skipSpaces(to, state.doc, 1);
2875
3041
  if (after === to) {
2876
3042
  cursorOffset += mark.length;
2877
3043
  }
@@ -2888,16 +3054,16 @@ var addLink = ({ url, image: image2 } = {}) => {
2888
3054
  from: to,
2889
3055
  insert: `](${url ?? ""})`
2890
3056
  });
2891
- const changeSet = state2.changes(changes2.concat(changesAfter));
3057
+ const changeSet = state.changes(changes2.concat(changesAfter));
2892
3058
  return {
2893
3059
  changes: changeSet,
2894
- range: import_state11.EditorSelection.cursor(changeSet.mapPos(to, 1) - cursorOffset - (url ? url.length + 2 : 0))
3060
+ range: import_state14.EditorSelection.cursor(changeSet.mapPos(to, 1) - cursorOffset - (url ? url.length + 2 : 0))
2895
3061
  };
2896
3062
  });
2897
3063
  if (changes.changes.empty) {
2898
3064
  return false;
2899
3065
  }
2900
- dispatch(state2.update(changes, {
3066
+ dispatch(state.update(changes, {
2901
3067
  userEvent: "format.link.add",
2902
3068
  scrollIntoView: true
2903
3069
  }));
@@ -2905,14 +3071,14 @@ var addLink = ({ url, image: image2 } = {}) => {
2905
3071
  };
2906
3072
  };
2907
3073
  var addList = (type) => {
2908
- return ({ state: state2, dispatch }) => {
3074
+ return ({ state, dispatch }) => {
2909
3075
  let lastBlock = -1;
2910
3076
  let counter = 1;
2911
3077
  let first = true;
2912
3078
  let parentColumn = null;
2913
3079
  const blocks = [];
2914
- for (const { from, to } of state2.selection.ranges) {
2915
- (0, import_language4.syntaxTree)(state2).iterate({
3080
+ for (const { from, to } of state.selection.ranges) {
3081
+ (0, import_language4.syntaxTree)(state).iterate({
2916
3082
  from,
2917
3083
  to,
2918
3084
  enter: (node) => {
@@ -2924,7 +3090,7 @@ var addList = (type) => {
2924
3090
  }
2925
3091
  if (before?.name === (type === 0 ? "OrderedList" : "BulletList")) {
2926
3092
  const item = before.lastChild;
2927
- const itemLine = state2.doc.lineAt(item.from);
3093
+ const itemLine = state.doc.lineAt(item.from);
2928
3094
  const itemText = itemLine.text.slice(item.from - itemLine.from);
2929
3095
  parentColumn = item.from - itemLine.from + /^\s*/.exec(itemText)[0].length;
2930
3096
  if (type === 0) {
@@ -2959,10 +3125,10 @@ var addList = (type) => {
2959
3125
  });
2960
3126
  }
2961
3127
  if (!blocks.length) {
2962
- const { from, to } = state2.doc.lineAt(state2.selection.main.anchor);
3128
+ const { from, to } = state.doc.lineAt(state.selection.main.anchor);
2963
3129
  if (from === to) {
2964
3130
  const insert = type === 1 ? "- " : type === 0 ? "1. " : "- [ ] ";
2965
- dispatch(state2.update({
3131
+ dispatch(state.update({
2966
3132
  changes: [
2967
3133
  {
2968
3134
  from,
@@ -2983,11 +3149,11 @@ var addList = (type) => {
2983
3149
  for (let i = 0; i < blocks.length; i++) {
2984
3150
  const { node, counter: counter2, parentColumn: parentColumn2 } = blocks[i];
2985
3151
  const nodeFrom = node.name === "CodeBlock" ? node.from - 4 : node.from;
2986
- let padding = nodeFrom > 0 && !/\s/.test(state2.doc.sliceString(nodeFrom - 1, nodeFrom)) ? 1 : 0;
3152
+ let padding = nodeFrom > 0 && !/\s/.test(state.doc.sliceString(nodeFrom - 1, nodeFrom)) ? 1 : 0;
2987
3153
  if (type === 0) {
2988
3154
  padding += String(counter2).length;
2989
3155
  }
2990
- let line = state2.doc.lineAt(nodeFrom);
3156
+ let line = state.doc.lineAt(nodeFrom);
2991
3157
  const column = nodeFrom - line.from;
2992
3158
  if (parentColumn2 !== null && parentColumn2 > column) {
2993
3159
  padding = Math.max(padding, parentColumn2 - column);
@@ -3012,7 +3178,7 @@ var addList = (type) => {
3012
3178
  insert: mark
3013
3179
  });
3014
3180
  while (line.to < node.to) {
3015
- line = state2.doc.lineAt(line.to + 1);
3181
+ line = state.doc.lineAt(line.to + 1);
3016
3182
  const open = /^[\s>]*/.exec(line.text)[0].length;
3017
3183
  changes.push({
3018
3184
  from: line.from + Math.min(open, column),
@@ -3027,13 +3193,13 @@ var addList = (type) => {
3027
3193
  next = next.nextSibling;
3028
3194
  }
3029
3195
  if (next?.name === "OrderedList") {
3030
- renumberListItems(next.firstChild, last.counter + 1, changes, state2.doc);
3196
+ renumberListItems(next.firstChild, last.counter + 1, changes, state.doc);
3031
3197
  }
3032
3198
  }
3033
- const changeSet = state2.changes(changes);
3034
- dispatch(state2.update({
3199
+ const changeSet = state.changes(changes);
3200
+ dispatch(state.update({
3035
3201
  changes: changeSet,
3036
- selection: state2.selection.map(changeSet, 1),
3202
+ selection: state.selection.map(changeSet, 1),
3037
3203
  userEvent: "format.list.add",
3038
3204
  scrollIntoView: true
3039
3205
  }));
@@ -3041,13 +3207,13 @@ var addList = (type) => {
3041
3207
  };
3042
3208
  };
3043
3209
  var removeList = (type) => {
3044
- return ({ state: state2, dispatch }) => {
3210
+ return ({ state, dispatch }) => {
3045
3211
  let lastBlock = -1;
3046
3212
  const changes = [];
3047
3213
  const stack = [];
3048
3214
  const targetNodeType = type === 0 ? "OrderedList" : type === 1 ? "BulletList" : "TaskList";
3049
- for (const { from, to } of state2.selection.ranges) {
3050
- (0, import_language4.syntaxTree)(state2).iterate({
3215
+ for (const { from, to } of state.selection.ranges) {
3216
+ (0, import_language4.syntaxTree)(state).iterate({
3051
3217
  from,
3052
3218
  to,
3053
3219
  enter: (node) => {
@@ -3064,7 +3230,7 @@ var removeList = (type) => {
3064
3230
  stack.pop();
3065
3231
  } else if (name === "ListItem" && stack[stack.length - 1] === targetNodeType && node.from !== lastBlock) {
3066
3232
  lastBlock = node.from;
3067
- let line = state2.doc.lineAt(node.from);
3233
+ let line = state.doc.lineAt(node.from);
3068
3234
  const mark = /^\s*(\d+[.)] |[-*+] (\[[ x]\] )?)/.exec(line.text.slice(node.from - line.from));
3069
3235
  if (!mark) {
3070
3236
  return false;
@@ -3075,7 +3241,7 @@ var removeList = (type) => {
3075
3241
  to: node.from + mark[0].length
3076
3242
  });
3077
3243
  while (line.to < node.to) {
3078
- line = state2.doc.lineAt(line.to + 1);
3244
+ line = state.doc.lineAt(line.to + 1);
3079
3245
  const open = /^[\s>]*/.exec(line.text)[0].length;
3080
3246
  if (open > column) {
3081
3247
  changes.push({
@@ -3085,7 +3251,7 @@ var removeList = (type) => {
3085
3251
  }
3086
3252
  }
3087
3253
  if (node.to >= to) {
3088
- renumberListItems(node.node.nextSibling, 1, changes, state2.doc);
3254
+ renumberListItems(node.node.nextSibling, 1, changes, state.doc);
3089
3255
  }
3090
3256
  return false;
3091
3257
  }
@@ -3095,7 +3261,7 @@ var removeList = (type) => {
3095
3261
  if (!changes.length) {
3096
3262
  return false;
3097
3263
  }
3098
- dispatch(state2.update({
3264
+ dispatch(state.update({
3099
3265
  changes,
3100
3266
  userEvent: "format.list.remove",
3101
3267
  scrollIntoView: true
@@ -3129,12 +3295,12 @@ var renumberListItems = (item, counter, changes, doc) => {
3129
3295
  }
3130
3296
  };
3131
3297
  var setBlockquote = (enable) => {
3132
- return ({ state: state2, dispatch }) => {
3298
+ return ({ state, dispatch }) => {
3133
3299
  const lines = [];
3134
3300
  let lastBlock = -1;
3135
- for (const { from, to } of state2.selection.ranges) {
3301
+ for (const { from, to } of state.selection.ranges) {
3136
3302
  const sawBlock = false;
3137
- (0, import_language4.syntaxTree)(state2).iterate({
3303
+ (0, import_language4.syntaxTree)(state).iterate({
3138
3304
  from,
3139
3305
  to,
3140
3306
  enter: (node) => {
@@ -3143,9 +3309,9 @@ var setBlockquote = (enable) => {
3143
3309
  return false;
3144
3310
  }
3145
3311
  lastBlock = node.from;
3146
- let line2 = state2.doc.lineAt(node.from);
3312
+ let line2 = state.doc.lineAt(node.from);
3147
3313
  if (line2.number > 1) {
3148
- const prevLine = state2.doc.line(line2.number - 1);
3314
+ const prevLine = state.doc.line(line2.number - 1);
3149
3315
  if (/^[>\s]*$/.test(prevLine.text)) {
3150
3316
  if (!enable || lines.length && lines[lines.length - 1].number === prevLine.number - 1) {
3151
3317
  lines.push(prevLine);
@@ -3157,10 +3323,10 @@ var setBlockquote = (enable) => {
3157
3323
  if (line2.to >= node.to) {
3158
3324
  break;
3159
3325
  }
3160
- line2 = state2.doc.line(line2.number + 1);
3326
+ line2 = state.doc.line(line2.number + 1);
3161
3327
  }
3162
- if (!enable && line2.number < state2.doc.lines) {
3163
- const nextLine = state2.doc.line(line2.number + 1);
3328
+ if (!enable && line2.number < state.doc.lines) {
3329
+ const nextLine = state.doc.line(line2.number + 1);
3164
3330
  if (/^[>\s]*$/.test(nextLine.text)) {
3165
3331
  lines.push(nextLine);
3166
3332
  }
@@ -3170,7 +3336,7 @@ var setBlockquote = (enable) => {
3170
3336
  }
3171
3337
  });
3172
3338
  let line;
3173
- if (!sawBlock && enable && from === to && !/\S/.test((line = state2.doc.lineAt(from)).text)) {
3339
+ if (!sawBlock && enable && from === to && !/\S/.test((line = state.doc.lineAt(from)).text)) {
3174
3340
  lines.push(line);
3175
3341
  }
3176
3342
  }
@@ -3194,10 +3360,10 @@ var setBlockquote = (enable) => {
3194
3360
  if (!changes.length) {
3195
3361
  return false;
3196
3362
  }
3197
- const changeSet = state2.changes(changes);
3198
- dispatch(state2.update({
3363
+ const changeSet = state.changes(changes);
3364
+ dispatch(state.update({
3199
3365
  changes: changeSet,
3200
- selection: state2.selection.map(changeSet, 1),
3366
+ selection: state.selection.map(changeSet, 1),
3201
3367
  userEvent: enable ? "format.blockquote.add" : "format.blockquote.remove",
3202
3368
  scrollIntoView: true
3203
3369
  }));
@@ -3210,11 +3376,11 @@ var toggleBlockquote = (target) => {
3210
3376
  return (getFormatting(target.state).blockQuote ? removeBlockquote : addBlockquote)(target);
3211
3377
  };
3212
3378
  var addCodeblock = (target) => {
3213
- const { state: state2, dispatch } = target;
3214
- const { selection } = state2;
3379
+ const { state, dispatch } = target;
3380
+ const { selection } = state;
3215
3381
  if (selection.ranges.length === 1 && selection.main.empty) {
3216
3382
  const { head } = selection.main;
3217
- const line = state2.doc.lineAt(head);
3383
+ const line = state.doc.lineAt(head);
3218
3384
  if (!/\S/.test(line.text) && head === line.from) {
3219
3385
  snippets.codeblock(target, null, line.from, line.to);
3220
3386
  return true;
@@ -3224,7 +3390,7 @@ var addCodeblock = (target) => {
3224
3390
  for (const { from, to } of selection.ranges) {
3225
3391
  let blockFrom = from;
3226
3392
  let blockTo = to;
3227
- (0, import_language4.syntaxTree)(state2).iterate({
3393
+ (0, import_language4.syntaxTree)(state).iterate({
3228
3394
  from,
3229
3395
  to,
3230
3396
  enter: (node) => {
@@ -3233,8 +3399,8 @@ var addCodeblock = (target) => {
3233
3399
  blockFrom = node.from;
3234
3400
  blockTo = node.to;
3235
3401
  } else {
3236
- blockFrom = Math.min(blockFrom, state2.doc.lineAt(node.from).from);
3237
- blockTo = Math.max(blockTo, state2.doc.lineAt(node.to).to);
3402
+ blockFrom = Math.min(blockFrom, state.doc.lineAt(node.from).from);
3403
+ blockTo = Math.max(blockTo, state.doc.lineAt(node.to).to);
3238
3404
  }
3239
3405
  }
3240
3406
  }
@@ -3252,7 +3418,7 @@ var addCodeblock = (target) => {
3252
3418
  return false;
3253
3419
  }
3254
3420
  const changes = ranges.map(({ from, to }) => {
3255
- const column = from - state2.doc.lineAt(from).from;
3421
+ const column = from - state.doc.lineAt(from).from;
3256
3422
  return [
3257
3423
  {
3258
3424
  from,
@@ -3264,30 +3430,30 @@ var addCodeblock = (target) => {
3264
3430
  }
3265
3431
  ];
3266
3432
  });
3267
- dispatch(state2.update({
3433
+ dispatch(state.update({
3268
3434
  changes,
3269
3435
  userEvent: "format.codeblock.add",
3270
3436
  scrollIntoView: true
3271
3437
  }));
3272
3438
  return true;
3273
3439
  };
3274
- var removeCodeblock = ({ state: state2, dispatch }) => {
3440
+ var removeCodeblock = ({ state, dispatch }) => {
3275
3441
  let lastBlock = -1;
3276
3442
  const changes = [];
3277
- for (const { from, to } of state2.selection.ranges) {
3278
- (0, import_language4.syntaxTree)(state2).iterate({
3443
+ for (const { from, to } of state.selection.ranges) {
3444
+ (0, import_language4.syntaxTree)(state).iterate({
3279
3445
  from,
3280
3446
  to,
3281
3447
  enter: (node) => {
3282
3448
  if (Textblocks[node.name] === "codeblock" && lastBlock !== node.from) {
3283
3449
  lastBlock = node.from;
3284
- const firstLine = state2.doc.lineAt(node.from);
3450
+ const firstLine = state.doc.lineAt(node.from);
3285
3451
  if (node.name === "FencedCode") {
3286
3452
  changes.push({
3287
3453
  from: node.from,
3288
3454
  to: firstLine.to + 1 + node.from - firstLine.from
3289
3455
  });
3290
- const lastLine = state2.doc.lineAt(node.to);
3456
+ const lastLine = state.doc.lineAt(node.to);
3291
3457
  if (/^([\s>]|[-*+] |\d+[).])*`+$/.test(lastLine.text)) {
3292
3458
  changes.push({
3293
3459
  from: lastLine.from - (lastLine.number === firstLine.number + 1 ? 0 : 1),
@@ -3296,7 +3462,7 @@ var removeCodeblock = ({ state: state2, dispatch }) => {
3296
3462
  }
3297
3463
  } else {
3298
3464
  const column = node.from - firstLine.from;
3299
- for (let line = firstLine; ; line = state2.doc.line(line.number + 1)) {
3465
+ for (let line = firstLine; ; line = state.doc.line(line.number + 1)) {
3300
3466
  changes.push({
3301
3467
  from: line.from + column - 4,
3302
3468
  to: line.from + column
@@ -3313,7 +3479,7 @@ var removeCodeblock = ({ state: state2, dispatch }) => {
3313
3479
  if (!changes.length) {
3314
3480
  return false;
3315
3481
  }
3316
- dispatch(state2.update({
3482
+ dispatch(state.update({
3317
3483
  changes,
3318
3484
  userEvent: "format.codeblock.remove",
3319
3485
  scrollIntoView: true
@@ -3325,7 +3491,7 @@ var toggleCodeblock = (target) => {
3325
3491
  };
3326
3492
  var formattingKeymap = (_options = {}) => {
3327
3493
  return [
3328
- import_view15.keymap.of([
3494
+ import_view17.keymap.of([
3329
3495
  {
3330
3496
  key: "meta-b",
3331
3497
  run: toggleStrong
@@ -3376,7 +3542,7 @@ var Textblocks = {
3376
3542
  TableCell: "tablecell",
3377
3543
  Task: "paragraph"
3378
3544
  };
3379
- var getFormatting = (state2) => {
3545
+ var getFormatting = (state) => {
3380
3546
  let blockType = null;
3381
3547
  const inline = [
3382
3548
  null,
@@ -3402,7 +3568,7 @@ var getFormatting = (state2) => {
3402
3568
  continue;
3403
3569
  } else if (currentBlock.active[i]) {
3404
3570
  inline[i] = true;
3405
- } else if (/\S/.test(state2.doc.sliceString(currentBlock.pos, upto))) {
3571
+ } else if (/\S/.test(state.doc.sliceString(currentBlock.pos, upto))) {
3406
3572
  inline[i] = false;
3407
3573
  }
3408
3574
  }
@@ -3413,12 +3579,12 @@ var getFormatting = (state2) => {
3413
3579
  currentBlock.pos = Math.min(upto, currentBlock.end);
3414
3580
  }
3415
3581
  };
3416
- const { selection } = state2;
3582
+ const { selection } = state;
3417
3583
  for (const range of selection.ranges) {
3418
3584
  if (range.empty && inline.some((v) => v === null)) {
3419
3585
  const contextSize = Math.min(range.head, 6);
3420
- const contextBefore = state2.doc.sliceString(range.head - contextSize, range.head);
3421
- let contextAfter = state2.doc.sliceString(range.head, range.head + contextSize);
3586
+ const contextBefore = state.doc.sliceString(range.head - contextSize, range.head);
3587
+ let contextAfter = state.doc.sliceString(range.head, range.head + contextSize);
3422
3588
  for (let i = 0; i < contextSize; i++) {
3423
3589
  const ch = contextAfter[i];
3424
3590
  if (ch !== contextBefore[contextBefore.length - 1 - i] || !/[~`*]/.test(ch)) {
@@ -3437,7 +3603,7 @@ var getFormatting = (state2) => {
3437
3603
  }
3438
3604
  }
3439
3605
  }
3440
- (0, import_language4.syntaxTree)(state2).iterate({
3606
+ (0, import_language4.syntaxTree)(state).iterate({
3441
3607
  from: range.from,
3442
3608
  to: range.to,
3443
3609
  enter: (node) => {
@@ -3511,7 +3677,7 @@ var getFormatting = (state2) => {
3511
3677
  }
3512
3678
  });
3513
3679
  }
3514
- const { from, to } = state2.doc.lineAt(selection.main.anchor);
3680
+ const { from, to } = state.doc.lineAt(selection.main.anchor);
3515
3681
  const blankLine = from === to;
3516
3682
  return {
3517
3683
  blankLine,
@@ -3526,8 +3692,8 @@ var getFormatting = (state2) => {
3526
3692
  };
3527
3693
  };
3528
3694
  var useFormattingState = () => {
3529
- const [state2, setState] = (0, import_react6.useState)();
3530
- const observer = (0, import_react6.useMemo)(() => import_view15.EditorView.updateListener.of((update2) => {
3695
+ const [state, setState] = (0, import_react6.useState)();
3696
+ const observer = (0, import_react6.useMemo)(() => import_view17.EditorView.updateListener.of((update2) => {
3531
3697
  if (update2.docChanged || update2.selectionSet) {
3532
3698
  setState((prevState) => {
3533
3699
  const newState = getFormatting(update2.state);
@@ -3539,7 +3705,7 @@ var useFormattingState = () => {
3539
3705
  }
3540
3706
  }), []);
3541
3707
  return [
3542
- state2,
3708
+ state,
3543
3709
  observer
3544
3710
  ];
3545
3711
  };
@@ -3787,7 +3953,7 @@ var createMarkdownExtensions = ({ themeMode } = {}) => {
3787
3953
  }),
3788
3954
  // Custom styles.
3789
3955
  (0, import_language5.syntaxHighlighting)(markdownHighlightStyle()),
3790
- import_view16.keymap.of([
3956
+ import_view18.keymap.of([
3791
3957
  // https://codemirror.net/docs/ref/#commands.indentWithTab
3792
3958
  import_commands3.indentWithTab,
3793
3959
  // https://codemirror.net/docs/ref/#commands.defaultKeymap
@@ -3797,17 +3963,17 @@ var createMarkdownExtensions = ({ themeMode } = {}) => {
3797
3963
  ])
3798
3964
  ];
3799
3965
  };
3800
- var debugTree = (cb) => import_state12.StateField.define({
3801
- create: (state2) => cb(convertTreeToJson(state2)),
3966
+ var debugTree = (cb) => import_state15.StateField.define({
3967
+ create: (state) => cb(convertTreeToJson(state)),
3802
3968
  update: (value, tr) => cb(convertTreeToJson(tr.state))
3803
3969
  });
3804
- var convertTreeToJson = (state2) => {
3970
+ var convertTreeToJson = (state) => {
3805
3971
  const treeToJson = (cursor) => {
3806
3972
  const node = {
3807
3973
  type: cursor.type.name,
3808
3974
  from: cursor.from,
3809
3975
  to: cursor.to,
3810
- text: state2.doc.slice(cursor.from, cursor.to).toString(),
3976
+ text: state.doc.slice(cursor.from, cursor.to).toString(),
3811
3977
  children: []
3812
3978
  };
3813
3979
  if (cursor.firstChild()) {
@@ -3818,15 +3984,15 @@ var convertTreeToJson = (state2) => {
3818
3984
  }
3819
3985
  return node;
3820
3986
  };
3821
- return treeToJson((0, import_language7.syntaxTree)(state2).cursor());
3987
+ return treeToJson((0, import_language7.syntaxTree)(state).cursor());
3822
3988
  };
3823
3989
  var adjustChanges = () => {
3824
- return import_view18.ViewPlugin.fromClass(class {
3990
+ return import_view20.ViewPlugin.fromClass(class {
3825
3991
  update(update2) {
3826
3992
  const tree = (0, import_language9.syntaxTree)(update2.state);
3827
3993
  const adjustments = [];
3828
3994
  for (const tr of update2.transactions) {
3829
- const event = tr.annotation(import_state14.Transaction.userEvent);
3995
+ const event = tr.annotation(import_state17.Transaction.userEvent);
3830
3996
  switch (event) {
3831
3997
  //
3832
3998
  // Enter
@@ -3960,33 +4126,35 @@ var getValidUrl = (str) => {
3960
4126
  }
3961
4127
  };
3962
4128
  var image = (_options = {}) => {
3963
- return import_state15.StateField.define({
3964
- create: (state2) => {
3965
- return import_view19.Decoration.set(buildDecorations(0, state2.doc.length, state2));
3966
- },
3967
- update: (value, tr) => {
3968
- if (!tr.docChanged && !tr.selection) {
3969
- return value;
3970
- }
3971
- const cursor = tr.state.selection.main.head;
3972
- const oldCursor = tr.changes.mapPos(tr.startState.selection.main.head);
3973
- let from = Math.min(cursor, oldCursor);
3974
- let to = Math.max(cursor, oldCursor);
3975
- tr.changes.iterChangedRanges((fromA, toA, fromB, toB) => {
3976
- from = Math.min(from, fromB);
3977
- to = Math.max(to, toB);
3978
- });
3979
- from = tr.state.doc.lineAt(from).from;
3980
- to = tr.state.doc.lineAt(to).to;
3981
- return value.map(tr.changes).update({
3982
- filterFrom: from,
3983
- filterTo: to,
3984
- filter: () => false,
3985
- add: buildDecorations(from, to, tr.state)
3986
- });
3987
- },
3988
- provide: (field) => import_view19.EditorView.decorations.from(field)
3989
- });
4129
+ return [
4130
+ import_state18.StateField.define({
4131
+ create: (state) => {
4132
+ return import_view21.Decoration.set(buildDecorations(0, state.doc.length, state));
4133
+ },
4134
+ update: (value, tr) => {
4135
+ if (!tr.docChanged && !tr.selection) {
4136
+ return value;
4137
+ }
4138
+ const cursor = tr.state.selection.main.head;
4139
+ const oldCursor = tr.changes.mapPos(tr.startState.selection.main.head);
4140
+ let from = Math.min(cursor, oldCursor);
4141
+ let to = Math.max(cursor, oldCursor);
4142
+ tr.changes.iterChangedRanges((fromA, toA, fromB, toB) => {
4143
+ from = Math.min(from, fromB);
4144
+ to = Math.max(to, toB);
4145
+ });
4146
+ from = tr.state.doc.lineAt(from).from;
4147
+ to = tr.state.doc.lineAt(to).to;
4148
+ return value.map(tr.changes).update({
4149
+ filterFrom: from,
4150
+ filterTo: to,
4151
+ filter: () => false,
4152
+ add: buildDecorations(from, to, tr.state)
4153
+ });
4154
+ },
4155
+ provide: (field) => import_view21.EditorView.decorations.from(field)
4156
+ })
4157
+ ];
3990
4158
  };
3991
4159
  var preloaded = /* @__PURE__ */ new Set();
3992
4160
  var preloadImage = (url) => {
@@ -3996,18 +4164,21 @@ var preloadImage = (url) => {
3996
4164
  preloaded.add(url);
3997
4165
  }
3998
4166
  };
3999
- var buildDecorations = (from, to, state2) => {
4167
+ var buildDecorations = (from, to, state) => {
4000
4168
  const decorations = [];
4001
- const cursor = state2.selection.main.head;
4002
- (0, import_language10.syntaxTree)(state2).iterate({
4169
+ const cursor = state.selection.main.head;
4170
+ (0, import_language10.syntaxTree)(state).iterate({
4003
4171
  enter: (node) => {
4004
4172
  if (node.name === "Image") {
4005
4173
  const urlNode = node.node.getChild("URL");
4006
4174
  if (urlNode) {
4007
- const hide2 = state2.readOnly || cursor < node.from || cursor > node.to;
4008
- const url = state2.sliceDoc(urlNode.from, urlNode.to);
4175
+ const hide2 = state.readOnly || cursor < node.from || cursor > node.to || !state.field(focusField);
4176
+ const url = state.sliceDoc(urlNode.from, urlNode.to);
4177
+ if (url.match(/^https?:\/\//) === null && url.match(/^file?:\/\//) === null) {
4178
+ return;
4179
+ }
4009
4180
  preloadImage(url);
4010
- decorations.push(import_view19.Decoration.replace({
4181
+ decorations.push(import_view21.Decoration.replace({
4011
4182
  block: true,
4012
4183
  widget: new ImageWidget(url)
4013
4184
  }).range(hide2 ? node.from : node.to, node.to));
@@ -4019,7 +4190,7 @@ var buildDecorations = (from, to, state2) => {
4019
4190
  });
4020
4191
  return decorations;
4021
4192
  };
4022
- var ImageWidget = class extends import_view19.WidgetType {
4193
+ var ImageWidget = class extends import_view21.WidgetType {
4023
4194
  constructor(_url) {
4024
4195
  super();
4025
4196
  this._url = _url;
@@ -4031,15 +4202,17 @@ var ImageWidget = class extends import_view19.WidgetType {
4031
4202
  const img = document.createElement("img");
4032
4203
  img.setAttribute("src", this._url);
4033
4204
  img.setAttribute("class", "cm-image");
4034
- img.onload = () => img.classList.add("cm-loaded-image");
4205
+ if (view.state.field(focusField)) {
4206
+ img.onload = () => img.classList.add("cm-loaded-image");
4207
+ } else {
4208
+ img.classList.add("cm-loaded-image");
4209
+ }
4035
4210
  return img;
4036
4211
  }
4037
4212
  };
4038
- var imageUpload = (options = {}) => {
4039
- };
4040
4213
  var bulletListIndentationWidth = 24;
4041
4214
  var orderedListIndentationWidth = 36;
4042
- var formattingStyles = import_view20.EditorView.theme({
4215
+ var formattingStyles = import_view22.EditorView.theme({
4043
4216
  /**
4044
4217
  * Horizontal rule.
4045
4218
  */
@@ -4136,22 +4309,22 @@ var formattingStyles = import_view20.EditorView.theme({
4136
4309
  }
4137
4310
  });
4138
4311
  var table = (options = {}) => {
4139
- return import_state16.StateField.define({
4140
- create: (state2) => update(state2, options),
4312
+ return import_state19.StateField.define({
4313
+ create: (state) => update(state, options),
4141
4314
  update: (_, tr) => update(tr.state, options),
4142
- provide: (field) => import_view21.EditorView.decorations.from(field)
4315
+ provide: (field) => import_view23.EditorView.decorations.from(field)
4143
4316
  });
4144
4317
  };
4145
- var update = (state2, _options) => {
4146
- const builder = new import_state16.RangeSetBuilder();
4147
- const cursor = state2.selection.main.head;
4318
+ var update = (state, _options) => {
4319
+ const builder = new import_state19.RangeSetBuilder();
4320
+ const cursor = state.selection.main.head;
4148
4321
  const tables = [];
4149
4322
  const getTable = () => tables[tables.length - 1];
4150
4323
  const getRow = () => {
4151
4324
  const table2 = getTable();
4152
4325
  return table2.rows?.[table2.rows.length - 1];
4153
4326
  };
4154
- (0, import_language11.syntaxTree)(state2).iterate({
4327
+ (0, import_language11.syntaxTree)(state).iterate({
4155
4328
  enter: (node) => {
4156
4329
  switch (node.name) {
4157
4330
  case "Table": {
@@ -4172,9 +4345,9 @@ var update = (state2, _options) => {
4172
4345
  case "TableCell": {
4173
4346
  const row = getRow();
4174
4347
  if (row) {
4175
- row.push(state2.sliceDoc(node.from, node.to));
4348
+ row.push(state.sliceDoc(node.from, node.to));
4176
4349
  } else {
4177
- getTable().header?.push(state2.sliceDoc(node.from, node.to));
4350
+ getTable().header?.push(state.sliceDoc(node.from, node.to));
4178
4351
  }
4179
4352
  break;
4180
4353
  }
@@ -4182,21 +4355,21 @@ var update = (state2, _options) => {
4182
4355
  }
4183
4356
  });
4184
4357
  tables.forEach((table2) => {
4185
- const replace = state2.readOnly || cursor < table2.from || cursor > table2.to;
4358
+ const replace = state.readOnly || cursor < table2.from || cursor > table2.to;
4186
4359
  if (replace) {
4187
- builder.add(table2.from, table2.to, import_view21.Decoration.replace({
4360
+ builder.add(table2.from, table2.to, import_view23.Decoration.replace({
4188
4361
  block: true,
4189
4362
  widget: new TableWidget(table2)
4190
4363
  }));
4191
4364
  } else {
4192
- builder.add(table2.from, table2.to, import_view21.Decoration.mark({
4365
+ builder.add(table2.from, table2.to, import_view23.Decoration.mark({
4193
4366
  class: "cm-table"
4194
4367
  }));
4195
4368
  }
4196
4369
  });
4197
4370
  return builder.finish();
4198
4371
  };
4199
- var TableWidget = class extends import_view21.WidgetType {
4372
+ var TableWidget = class extends import_view23.WidgetType {
4200
4373
  constructor(_table) {
4201
4374
  super();
4202
4375
  this._table = _table;
@@ -4236,14 +4409,14 @@ var Unicode = {
4236
4409
  bulletSmall: "\u2219",
4237
4410
  bulletSquare: "\u2B1D"
4238
4411
  };
4239
- var HorizontalRuleWidget = class extends import_view17.WidgetType {
4412
+ var HorizontalRuleWidget = class extends import_view19.WidgetType {
4240
4413
  toDOM() {
4241
4414
  const el = document.createElement("span");
4242
4415
  el.className = "cm-hr";
4243
4416
  return el;
4244
4417
  }
4245
4418
  };
4246
- var LinkButton = class extends import_view17.WidgetType {
4419
+ var LinkButton = class extends import_view19.WidgetType {
4247
4420
  constructor(url, render) {
4248
4421
  super();
4249
4422
  this.url = url;
@@ -4259,7 +4432,7 @@ var LinkButton = class extends import_view17.WidgetType {
4259
4432
  return el;
4260
4433
  }
4261
4434
  };
4262
- var CheckboxWidget = class extends import_view17.WidgetType {
4435
+ var CheckboxWidget = class extends import_view19.WidgetType {
4263
4436
  constructor(_checked) {
4264
4437
  super();
4265
4438
  this._checked = _checked;
@@ -4304,7 +4477,7 @@ var CheckboxWidget = class extends import_view17.WidgetType {
4304
4477
  return false;
4305
4478
  }
4306
4479
  };
4307
- var TextWidget = class extends import_view17.WidgetType {
4480
+ var TextWidget = class extends import_view19.WidgetType {
4308
4481
  constructor(text, className) {
4309
4482
  super();
4310
4483
  this.text = text;
@@ -4319,34 +4492,34 @@ var TextWidget = class extends import_view17.WidgetType {
4319
4492
  return el;
4320
4493
  }
4321
4494
  };
4322
- var hide = import_view17.Decoration.replace({});
4323
- var blockQuote = import_view17.Decoration.line({
4495
+ var hide = import_view19.Decoration.replace({});
4496
+ var blockQuote = import_view19.Decoration.line({
4324
4497
  class: (0, import_react_ui_theme6.mx)("cm-blockquote")
4325
4498
  });
4326
- var fencedCodeLine = import_view17.Decoration.line({
4499
+ var fencedCodeLine = import_view19.Decoration.line({
4327
4500
  class: (0, import_react_ui_theme6.mx)("cm-code cm-codeblock-line")
4328
4501
  });
4329
- var fencedCodeLineFirst = import_view17.Decoration.line({
4502
+ var fencedCodeLineFirst = import_view19.Decoration.line({
4330
4503
  class: (0, import_react_ui_theme6.mx)("cm-code cm-codeblock-line", "cm-codeblock-first")
4331
4504
  });
4332
- var fencedCodeLineLast = import_view17.Decoration.line({
4505
+ var fencedCodeLineLast = import_view19.Decoration.line({
4333
4506
  class: (0, import_react_ui_theme6.mx)("cm-code cm-codeblock-line", "cm-codeblock-last")
4334
4507
  });
4335
4508
  var commentBlockLine = fencedCodeLine;
4336
4509
  var commentBlockLineFirst = fencedCodeLineFirst;
4337
4510
  var commentBlockLineLast = fencedCodeLineLast;
4338
- var horizontalRule = import_view17.Decoration.replace({
4511
+ var horizontalRule = import_view19.Decoration.replace({
4339
4512
  widget: new HorizontalRuleWidget()
4340
4513
  });
4341
- var checkedTask = import_view17.Decoration.replace({
4514
+ var checkedTask = import_view19.Decoration.replace({
4342
4515
  widget: new CheckboxWidget(true)
4343
4516
  });
4344
- var uncheckedTask = import_view17.Decoration.replace({
4517
+ var uncheckedTask = import_view19.Decoration.replace({
4345
4518
  widget: new CheckboxWidget(false)
4346
4519
  });
4347
- var editingRange = (state2, range, focus) => {
4348
- const { readOnly, selection: { main: { head } } } = state2;
4349
- return focus && !readOnly && head >= range.from && head <= range.to;
4520
+ var editingRange = (state, range, focus2) => {
4521
+ const { readOnly, selection: { main: { head } } } = state;
4522
+ return focus2 && !readOnly && head >= range.from && head <= range.to;
4350
4523
  };
4351
4524
  var autoHideTags = /* @__PURE__ */ new Set([
4352
4525
  "CodeMark",
@@ -4356,13 +4529,13 @@ var autoHideTags = /* @__PURE__ */ new Set([
4356
4529
  "SubscriptMark",
4357
4530
  "SuperscriptMark"
4358
4531
  ]);
4359
- var buildDecorations2 = (view, options, focus) => {
4360
- const deco = new import_state13.RangeSetBuilder();
4361
- const atomicDeco = new import_state13.RangeSetBuilder();
4362
- const { state: state2 } = view;
4532
+ var buildDecorations2 = (view, options, focus2) => {
4533
+ const deco = new import_state16.RangeSetBuilder();
4534
+ const atomicDeco = new import_state16.RangeSetBuilder();
4535
+ const { state } = view;
4363
4536
  const headerLevels = [];
4364
4537
  const getHeaderLevels = (node, level) => {
4365
- (0, import_invariant3.invariant)(level > 0, void 0, {
4538
+ (0, import_invariant4.invariant)(level > 0, void 0, {
4366
4539
  F: __dxlog_file9,
4367
4540
  L: 178,
4368
4541
  S: void 0,
@@ -4401,7 +4574,7 @@ var buildDecorations2 = (view, options, focus) => {
4401
4574
  listLevels.pop();
4402
4575
  };
4403
4576
  const getCurrentListLevel = () => {
4404
- (0, import_invariant3.invariant)(listLevels.length, void 0, {
4577
+ (0, import_invariant4.invariant)(listLevels.length, void 0, {
4405
4578
  F: __dxlog_file9,
4406
4579
  L: 200,
4407
4580
  S: void 0,
@@ -4428,7 +4601,7 @@ var buildDecorations2 = (view, options, focus) => {
4428
4601
  if (options.numberedHeadings?.from !== void 0) {
4429
4602
  headers[level - 1].number++;
4430
4603
  }
4431
- const editing = editingRange(state2, node, focus);
4604
+ const editing = editingRange(state, node, focus2);
4432
4605
  if (editing) {
4433
4606
  break;
4434
4607
  }
@@ -4442,7 +4615,7 @@ var buildDecorations2 = (view, options, focus) => {
4442
4615
  } else {
4443
4616
  const num = headers.slice(from - 1).map((level2) => level2?.number ?? 0).join(".") + " ";
4444
4617
  if (num.length) {
4445
- atomicDeco.add(mark.from, mark.from + len, import_view17.Decoration.replace({
4618
+ atomicDeco.add(mark.from, mark.from + len, import_view19.Decoration.replace({
4446
4619
  widget: new TextWidget(num, theme.heading(level))
4447
4620
  }));
4448
4621
  }
@@ -4460,14 +4633,14 @@ var buildDecorations2 = (view, options, focus) => {
4460
4633
  break;
4461
4634
  }
4462
4635
  case "ListItem": {
4463
- const line = state2.doc.lineAt(node.from);
4636
+ const line = state.doc.lineAt(node.from);
4464
4637
  const list = getCurrentListLevel();
4465
4638
  const width = list.type === "OrderedList" ? orderedListIndentationWidth : bulletListIndentationWidth;
4466
4639
  const offset = ((list.level ?? 0) + 1) * width;
4467
4640
  if (node.from === line.to - 1) {
4468
4641
  return false;
4469
4642
  }
4470
- deco.add(line.from, line.from, import_view17.Decoration.line({
4643
+ deco.add(line.from, line.from, import_view19.Decoration.line({
4471
4644
  class: "cm-list-item",
4472
4645
  attributes: {
4473
4646
  style: `padding-left: ${offset}px; text-indent: -${width}px;`
@@ -4482,17 +4655,17 @@ var buildDecorations2 = (view, options, focus) => {
4482
4655
  break;
4483
4656
  }
4484
4657
  const label = list.type === "OrderedList" ? `${++list.number}.` : Unicode.bulletSmall;
4485
- const line = state2.doc.lineAt(node.from);
4486
- const to = state2.doc.sliceString(node.to, node.to + 1) === " " ? node.to + 1 : node.to;
4487
- atomicDeco.add(line.from, to, import_view17.Decoration.replace({
4658
+ const line = state.doc.lineAt(node.from);
4659
+ const to = state.doc.sliceString(node.to, node.to + 1) === " " ? node.to + 1 : node.to;
4660
+ atomicDeco.add(line.from, to, import_view19.Decoration.replace({
4488
4661
  widget: new TextWidget(label, list.type === "OrderedList" ? "cm-list-mark cm-list-mark-ordered" : "cm-list-mark cm-list-mark-bullet")
4489
4662
  }));
4490
4663
  break;
4491
4664
  }
4492
4665
  case "TaskMarker": {
4493
- const checked = state2.doc.sliceString(node.from + 1, node.to - 1) === "x";
4494
- const line = state2.doc.lineAt(node.from);
4495
- const to = state2.doc.sliceString(node.to, node.to + 1) === " " ? node.to + 1 : node.to;
4666
+ const checked = state.doc.sliceString(node.from + 1, node.to - 1) === "x";
4667
+ const line = state.doc.lineAt(node.from);
4668
+ const to = state.doc.sliceString(node.to, node.to + 1) === " " ? node.to + 1 : node.to;
4496
4669
  atomicDeco.add(line.from, to, checked ? checkedTask : uncheckedTask);
4497
4670
  break;
4498
4671
  }
@@ -4500,7 +4673,7 @@ var buildDecorations2 = (view, options, focus) => {
4500
4673
  // Blockquote > QuoteMark > Paragraph
4501
4674
  //
4502
4675
  case "Blockquote": {
4503
- const editing = editingRange(state2, node, focus);
4676
+ const editing = editingRange(state, node, focus2);
4504
4677
  const quoteMark = node.node.getChild("QuoteMark");
4505
4678
  const paragraph = node.node.getChild("Paragraph");
4506
4679
  if (!editing && quoteMark && paragraph) {
@@ -4521,7 +4694,7 @@ var buildDecorations2 = (view, options, focus) => {
4521
4694
  // CommentBlock
4522
4695
  //
4523
4696
  case "CommentBlock": {
4524
- const editing = editingRange(state2, node, focus);
4697
+ const editing = editingRange(state, node, focus2);
4525
4698
  for (const block of view.viewportLineBlocks) {
4526
4699
  if (block.to < node.from) {
4527
4700
  continue;
@@ -4530,7 +4703,7 @@ var buildDecorations2 = (view, options, focus) => {
4530
4703
  break;
4531
4704
  }
4532
4705
  const isFirst = block.from <= node.from;
4533
- const isLast = block.to >= node.to && /^(\s>)*-->$/.test(state2.doc.sliceString(block.from, block.to));
4706
+ const isLast = block.to >= node.to && /^(\s>)*-->$/.test(state.doc.sliceString(block.from, block.to));
4534
4707
  deco.add(block.from, block.from, isFirst ? commentBlockLineFirst : isLast ? commentBlockLineLast : commentBlockLine);
4535
4708
  if (!editing && (isFirst || isLast)) {
4536
4709
  atomicDeco.add(block.from, block.to, hide);
@@ -4550,9 +4723,9 @@ var buildDecorations2 = (view, options, focus) => {
4550
4723
  break;
4551
4724
  }
4552
4725
  const first = block.from <= node.from;
4553
- const last = block.to >= node.to && /^(\s>)*```$/.test(state2.doc.sliceString(block.from, block.to));
4726
+ const last = block.to >= node.to && /^(\s>)*```$/.test(state.doc.sliceString(block.from, block.to));
4554
4727
  deco.add(block.from, block.from, first ? fencedCodeLineFirst : last ? fencedCodeLineLast : fencedCodeLine);
4555
- const editing = editingRange(state2, node, focus);
4728
+ const editing = editingRange(state, node, focus2);
4556
4729
  if (!editing && (first || last)) {
4557
4730
  atomicDeco.add(block.from, block.to, hide);
4558
4731
  }
@@ -4565,13 +4738,13 @@ var buildDecorations2 = (view, options, focus) => {
4565
4738
  case "Link": {
4566
4739
  const marks = node.node.getChildren("LinkMark");
4567
4740
  const urlNode = node.node.getChild("URL");
4568
- const editing = editingRange(state2, node, focus);
4741
+ const editing = editingRange(state, node, focus2);
4569
4742
  if (urlNode && marks.length >= 2) {
4570
- const url = state2.sliceDoc(urlNode.from, urlNode.to);
4743
+ const url = state.sliceDoc(urlNode.from, urlNode.to);
4571
4744
  if (!editing) {
4572
4745
  atomicDeco.add(node.from, marks[0].to, hide);
4573
4746
  }
4574
- deco.add(marks[0].to, marks[1].from, import_view17.Decoration.mark({
4747
+ deco.add(marks[0].to, marks[1].from, import_view19.Decoration.mark({
4575
4748
  tagName: "a",
4576
4749
  attributes: {
4577
4750
  class: "cm-link",
@@ -4581,7 +4754,7 @@ var buildDecorations2 = (view, options, focus) => {
4581
4754
  }
4582
4755
  }));
4583
4756
  if (!editing) {
4584
- atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view17.Decoration.replace({
4757
+ atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view19.Decoration.replace({
4585
4758
  widget: new LinkButton(url, options.renderLinkButton)
4586
4759
  }) : hide);
4587
4760
  }
@@ -4592,14 +4765,14 @@ var buildDecorations2 = (view, options, focus) => {
4592
4765
  // HR
4593
4766
  //
4594
4767
  case "HorizontalRule": {
4595
- if (!editingRange(state2, node, focus)) {
4768
+ if (!editingRange(state, node, focus2)) {
4596
4769
  deco.add(node.from, node.to, horizontalRule);
4597
4770
  }
4598
4771
  break;
4599
4772
  }
4600
4773
  default: {
4601
4774
  if (autoHideTags.has(node.name)) {
4602
- if (!editingRange(state2, node.node.parent, focus)) {
4775
+ if (!editingRange(state, node.node.parent, focus2)) {
4603
4776
  atomicDeco.add(node.from, node.to, hide);
4604
4777
  }
4605
4778
  }
@@ -4615,7 +4788,7 @@ var buildDecorations2 = (view, options, focus) => {
4615
4788
  }
4616
4789
  }
4617
4790
  };
4618
- const tree = (0, import_language8.syntaxTree)(state2);
4791
+ const tree = (0, import_language8.syntaxTree)(state);
4619
4792
  if (options.numberedHeadings?.from === void 0) {
4620
4793
  for (const { from, to } of view.visibleRanges) {
4621
4794
  tree.iterate({
@@ -4636,10 +4809,10 @@ var buildDecorations2 = (view, options, focus) => {
4636
4809
  atomicDeco: atomicDeco.finish()
4637
4810
  };
4638
4811
  };
4639
- var forceUpdate = import_state13.StateEffect.define();
4812
+ var forceUpdate = import_state16.StateEffect.define();
4640
4813
  var decorateMarkdown = (options = {}) => {
4641
4814
  return [
4642
- import_view17.ViewPlugin.fromClass(class {
4815
+ import_view19.ViewPlugin.fromClass(class {
4643
4816
  constructor(view) {
4644
4817
  ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations2(view, options, view.hasFocus));
4645
4818
  }
@@ -4671,9 +4844,9 @@ var decorateMarkdown = (options = {}) => {
4671
4844
  }
4672
4845
  }, {
4673
4846
  provide: (plugin) => [
4674
- import_view17.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view17.Decoration.none),
4675
- import_view17.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view17.Decoration.none),
4676
- import_view17.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view17.Decoration.none)
4847
+ import_view19.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view19.Decoration.none),
4848
+ import_view19.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view19.Decoration.none),
4849
+ import_view19.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view19.Decoration.none)
4677
4850
  ]
4678
4851
  }),
4679
4852
  image(),
@@ -4683,7 +4856,7 @@ var decorateMarkdown = (options = {}) => {
4683
4856
  ];
4684
4857
  };
4685
4858
  var linkTooltip = (render) => {
4686
- return (0, import_view22.hoverTooltip)((view, pos, side) => {
4859
+ return (0, import_view24.hoverTooltip)((view, pos, side) => {
4687
4860
  const syntax = (0, import_language12.syntaxTree)(view.state).resolveInner(pos, side);
4688
4861
  let link = null;
4689
4862
  for (let i = 0, node = syntax; !link && node && i < 5; node = node.parent, i++) {
@@ -4725,7 +4898,7 @@ var mention = ({ onSearch }) => {
4725
4898
  icons: false,
4726
4899
  override: [
4727
4900
  (context) => {
4728
- import_log7.log.info("completion context", {
4901
+ import_log6.log.info("completion context", {
4729
4902
  context
4730
4903
  }, {
4731
4904
  F: __dxlog_file10,
@@ -4758,7 +4931,7 @@ var EditorInputModes = [
4758
4931
  "vim",
4759
4932
  "vscode"
4760
4933
  ];
4761
- var editorInputMode = (0, import_chunk_GZWIENFM.singleValueFacet)({});
4934
+ var editorInputMode = singleValueFacet({});
4762
4935
  var InputModeExtensions = {
4763
4936
  default: [],
4764
4937
  vscode: [
@@ -4766,7 +4939,7 @@ var InputModeExtensions = {
4766
4939
  editorInputMode.of({
4767
4940
  type: "vscode"
4768
4941
  }),
4769
- import_view23.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
4942
+ import_view25.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
4770
4943
  ],
4771
4944
  vim: [
4772
4945
  // https://github.com/replit/codemirror-vim
@@ -4775,7 +4948,7 @@ var InputModeExtensions = {
4775
4948
  type: "vim",
4776
4949
  noTabster: true
4777
4950
  }),
4778
- import_view23.keymap.of([
4951
+ import_view25.keymap.of([
4779
4952
  {
4780
4953
  key: "Alt-Escape",
4781
4954
  run: (view) => {
@@ -4797,7 +4970,7 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
4797
4970
  let t;
4798
4971
  let idx = 0;
4799
4972
  return [
4800
- import_view24.keymap.of([
4973
+ import_view26.keymap.of([
4801
4974
  {
4802
4975
  // Reset.
4803
4976
  key: "alt-meta-'",
@@ -4853,10 +5026,10 @@ var ToolbarSeparator = () => /* @__PURE__ */ import_react2.default.createElement
4853
5026
  className: "grow"
4854
5027
  });
4855
5028
  var [ToolbarContextProvider, useToolbarContext] = (0, import_react_context.createContext)("Toolbar");
4856
- var ToolbarRoot = ({ children, onAction, classNames, state: state2 }) => {
5029
+ var ToolbarRoot = ({ children, onAction, classNames, state }) => {
4857
5030
  return /* @__PURE__ */ import_react2.default.createElement(ToolbarContextProvider, {
4858
5031
  onAction,
4859
- state: state2
5032
+ state
4860
5033
  }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.ElevationProvider, {
4861
5034
  elevation: "chrome"
4862
5035
  }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.Root, {
@@ -4906,8 +5079,8 @@ var HeadingIcons = {
4906
5079
  };
4907
5080
  var MarkdownHeading = () => {
4908
5081
  const { t } = (0, import_react_ui.useTranslation)(translationKey);
4909
- const { onAction, state: state2 } = useToolbarContext("MarkdownFormatting");
4910
- const blockType = state2 ? state2.blockType : "paragraph";
5082
+ const { onAction, state } = useToolbarContext("MarkdownFormatting");
5083
+ const blockType = state ? state.blockType : "paragraph";
4911
5084
  const header = blockType && /heading(\d)/.exec(blockType);
4912
5085
  const value = header ? header[1] : blockType === "paragraph" || !blockType ? "0" : void 0;
4913
5086
  const HeadingIcon = HeadingIcons[value ?? "0"];
@@ -4971,43 +5144,43 @@ var markdownStyles = [
4971
5144
  {
4972
5145
  type: "strong",
4973
5146
  Icon: import_react.TextB,
4974
- getState: (state2) => !!state2?.strong
5147
+ getState: (state) => !!state?.strong
4975
5148
  },
4976
5149
  {
4977
5150
  type: "emphasis",
4978
5151
  Icon: import_react.TextItalic,
4979
- getState: (state2) => !!state2?.emphasis
5152
+ getState: (state) => !!state?.emphasis
4980
5153
  },
4981
5154
  {
4982
5155
  type: "strikethrough",
4983
5156
  Icon: import_react.TextStrikethrough,
4984
- getState: (state2) => !!state2?.strikethrough
5157
+ getState: (state) => !!state?.strikethrough
4985
5158
  },
4986
5159
  {
4987
5160
  type: "code",
4988
5161
  Icon: import_react.Code,
4989
- getState: (state2) => !!state2?.code
5162
+ getState: (state) => !!state?.code
4990
5163
  },
4991
5164
  {
4992
5165
  type: "link",
4993
5166
  Icon: import_react.Link,
4994
- getState: (state2) => !!state2?.link
5167
+ getState: (state) => !!state?.link
4995
5168
  }
4996
5169
  ];
4997
5170
  var MarkdownStyles = () => {
4998
- const { onAction, state: state2 } = useToolbarContext("MarkdownStyles");
5171
+ const { onAction, state } = useToolbarContext("MarkdownStyles");
4999
5172
  const { t } = (0, import_react_ui.useTranslation)(translationKey);
5000
5173
  return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.ToggleGroup, {
5001
5174
  type: "multiple",
5002
- value: markdownStyles.filter(({ getState }) => state2 && getState(state2)).map(({ type }) => type)
5175
+ value: markdownStyles.filter(({ getState }) => state && getState(state)).map(({ type }) => type)
5003
5176
  }, markdownStyles.map(({ type, getState, Icon: Icon2 }) => /* @__PURE__ */ import_react2.default.createElement(ToolbarToggleButton, {
5004
5177
  key: type,
5005
5178
  value: type,
5006
5179
  Icon: Icon2,
5007
- disabled: state2?.blockType === "codeblock",
5008
- onClick: state2 ? () => onAction?.({
5180
+ disabled: state?.blockType === "codeblock",
5181
+ onClick: state ? () => onAction?.({
5009
5182
  type,
5010
- data: !getState(state2)
5183
+ data: !getState(state)
5011
5184
  }) : void 0
5012
5185
  }, t(`${type} label`))));
5013
5186
  };
@@ -5015,32 +5188,32 @@ var markdownLists = [
5015
5188
  {
5016
5189
  type: "list-bullet",
5017
5190
  Icon: import_react.ListBullets,
5018
- getState: (state2) => state2.listStyle === "bullet"
5191
+ getState: (state) => state.listStyle === "bullet"
5019
5192
  },
5020
5193
  {
5021
5194
  type: "list-ordered",
5022
5195
  Icon: import_react.ListNumbers,
5023
- getState: (state2) => state2.listStyle === "ordered"
5196
+ getState: (state) => state.listStyle === "ordered"
5024
5197
  },
5025
5198
  {
5026
5199
  type: "list-task",
5027
5200
  Icon: import_react.ListChecks,
5028
- getState: (state2) => state2.listStyle === "task"
5201
+ getState: (state) => state.listStyle === "task"
5029
5202
  }
5030
5203
  ];
5031
5204
  var MarkdownLists = () => {
5032
- const { onAction, state: state2 } = useToolbarContext("MarkdownStyles");
5205
+ const { onAction, state } = useToolbarContext("MarkdownStyles");
5033
5206
  const { t } = (0, import_react_ui.useTranslation)(translationKey);
5034
5207
  return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.ToggleGroup, {
5035
5208
  type: "single",
5036
- value: state2?.listStyle ? `list-${state2.listStyle}` : ""
5209
+ value: state?.listStyle ? `list-${state.listStyle}` : ""
5037
5210
  }, markdownLists.map(({ type, getState, Icon: Icon2 }) => /* @__PURE__ */ import_react2.default.createElement(ToolbarToggleButton, {
5038
5211
  key: type,
5039
5212
  value: type,
5040
5213
  Icon: Icon2,
5041
- onClick: state2 ? () => onAction?.({
5214
+ onClick: state ? () => onAction?.({
5042
5215
  type,
5043
- data: !getState(state2)
5216
+ data: !getState(state)
5044
5217
  }) : void 0
5045
5218
  }, t(`${type} label`))));
5046
5219
  };
@@ -5048,24 +5221,24 @@ var markdownBlocks = [
5048
5221
  {
5049
5222
  type: "blockquote",
5050
5223
  Icon: import_react.Quotes,
5051
- getState: (state2) => !!state2?.blockQuote
5224
+ getState: (state) => !!state?.blockQuote
5052
5225
  },
5053
5226
  {
5054
5227
  type: "codeblock",
5055
5228
  Icon: import_react.CodeBlock,
5056
- getState: (state2) => state2.blockType === "codeblock"
5229
+ getState: (state) => state.blockType === "codeblock"
5057
5230
  },
5058
5231
  {
5059
5232
  type: "table",
5060
5233
  Icon: import_react.Table,
5061
- getState: (state2) => state2.blockType === "tablecell",
5062
- disabled: (state2) => !state2.blankLine
5234
+ getState: (state) => state.blockType === "tablecell",
5235
+ disabled: (state) => !state.blankLine
5063
5236
  }
5064
5237
  ];
5065
5238
  var MarkdownBlocks = () => {
5066
- const { onAction, state: state2 } = useToolbarContext("MarkdownStyles");
5239
+ const { onAction, state } = useToolbarContext("MarkdownStyles");
5067
5240
  const { t } = (0, import_react_ui.useTranslation)(translationKey);
5068
- const value = markdownBlocks.find(({ getState }) => state2 && getState(state2));
5241
+ const value = markdownBlocks.find(({ getState }) => state && getState(state));
5069
5242
  return /* @__PURE__ */ import_react2.default.createElement(import_react_ui.Toolbar.ToggleGroup, {
5070
5243
  type: "single",
5071
5244
  value: value?.type ?? ""
@@ -5073,10 +5246,10 @@ var MarkdownBlocks = () => {
5073
5246
  key: type,
5074
5247
  value: type,
5075
5248
  Icon: Icon2,
5076
- disabled: !state2 || disabled?.(state2),
5077
- onClick: state2 ? () => onAction?.({
5249
+ disabled: !state || disabled?.(state),
5250
+ onClick: state ? () => onAction?.({
5078
5251
  type,
5079
- data: !getState(state2)
5252
+ data: !getState(state)
5080
5253
  }) : void 0
5081
5254
  }, t(`${type} label`))));
5082
5255
  };
@@ -5189,12 +5362,12 @@ var MarkdownView = ({ mode }) => {
5189
5362
  })), /* @__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))));
5190
5363
  };
5191
5364
  var MarkdownActions = () => {
5192
- const { onAction, state: state2 } = useToolbarContext("MarkdownActions");
5365
+ const { onAction, state } = useToolbarContext("MarkdownActions");
5193
5366
  const { t } = (0, import_react_ui.useTranslation)(translationKey);
5194
5367
  let commentToolTipKey = "comment label";
5195
- if (state2?.comment) {
5368
+ if (state?.comment) {
5196
5369
  commentToolTipKey = "selection overlaps existing comment label";
5197
- } else if (state2?.selection === false) {
5370
+ } else if (state?.selection === false) {
5198
5371
  commentToolTipKey = "select text to comment label";
5199
5372
  }
5200
5373
  return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(ToolbarButton, {
@@ -5210,7 +5383,7 @@ var MarkdownActions = () => {
5210
5383
  onClick: () => onAction?.({
5211
5384
  type: "comment"
5212
5385
  }),
5213
- disabled: !state2 || state2.comment || !state2.selection
5386
+ disabled: !state || state.comment || !state.selection
5214
5387
  }, t(commentToolTipKey)));
5215
5388
  };
5216
5389
  var Toolbar = {
@@ -5226,14 +5399,14 @@ var margin = "!mt-[1rem]";
5226
5399
  var editorContent = (0, import_react_ui_theme8.mx)(margin, "!mli-auto w-full max-w-[min(50rem,100%-2rem)]");
5227
5400
  var editorFullWidth = (0, import_react_ui_theme8.mx)(margin);
5228
5401
  var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden";
5229
- var editorGutter = import_view25.EditorView.theme({
5402
+ var editorGutter = import_view27.EditorView.theme({
5230
5403
  // Match margin from content.
5231
5404
  ".cm-gutters": {
5232
5405
  marginTop: "16px",
5233
5406
  paddingRight: "1rem"
5234
5407
  }
5235
5408
  });
5236
- var editorMonospace = import_view25.EditorView.theme({
5409
+ var editorMonospace = import_view27.EditorView.theme({
5237
5410
  ".cm-content": {
5238
5411
  fontFamily: fontMono
5239
5412
  }
@@ -5244,20 +5417,20 @@ var useActionHandler = (view) => {
5244
5417
  var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
5245
5418
  var instanceCount = 0;
5246
5419
  var useTextEditor = (props = {}, deps = []) => {
5247
- const { id, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0, import_react7.useMemo)(() => (0, import_util4.getProviderValue)(props), deps ?? []);
5420
+ const { id, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0, import_react7.useMemo)(() => (0, import_util5.getProviderValue)(props), deps ?? []);
5248
5421
  const [instanceId] = (0, import_react7.useState)(() => `text-editor-${++instanceCount}`);
5249
5422
  const [view, setView] = (0, import_react7.useState)();
5250
5423
  const parentRef = (0, import_react7.useRef)(null);
5251
5424
  (0, import_react7.useEffect)(() => {
5252
5425
  let view2;
5253
5426
  if (parentRef.current) {
5254
- (0, import_log8.log)("create", {
5427
+ (0, import_log7.log)("create", {
5255
5428
  id,
5256
5429
  instanceId,
5257
5430
  doc: initialValue?.length ?? 0
5258
5431
  }, {
5259
5432
  F: __dxlog_file11,
5260
- L: 76,
5433
+ L: 75,
5261
5434
  S: void 0,
5262
5435
  C: (f, a) => f(...a)
5263
5436
  });
@@ -5273,27 +5446,27 @@ var useTextEditor = (props = {}, deps = []) => {
5273
5446
  anchor
5274
5447
  };
5275
5448
  }
5276
- const state2 = import_state17.EditorState.create({
5449
+ const state = import_state20.EditorState.create({
5277
5450
  doc: initialValue,
5278
5451
  // selection: initialSelection,
5279
5452
  extensions: [
5280
- id && import_chunk_GZWIENFM.documentId.of(id),
5453
+ id && documentId.of(id),
5281
5454
  extensions,
5282
5455
  // NOTE: This doesn't catch errors in keymap functions.
5283
- import_view26.EditorView.exceptionSink.of((err) => {
5284
- import_log8.log.catch(err, void 0, {
5456
+ import_view28.EditorView.exceptionSink.of((err) => {
5457
+ import_log7.log.catch(err, void 0, {
5285
5458
  F: __dxlog_file11,
5286
- L: 98,
5459
+ L: 97,
5287
5460
  S: void 0,
5288
5461
  C: (f, a) => f(...a)
5289
5462
  });
5290
5463
  })
5291
- ].filter(import_util4.isNotFalsy)
5464
+ ].filter(import_util5.isNotFalsy)
5292
5465
  });
5293
- view2 = new import_view26.EditorView({
5466
+ view2 = new import_view28.EditorView({
5294
5467
  parent: parentRef.current,
5295
- state: state2,
5296
- scrollTo: scrollTo ? import_view26.EditorView.scrollIntoView(scrollTo, {
5468
+ state,
5469
+ scrollTo: scrollTo ? import_view28.EditorView.scrollIntoView(scrollTo, {
5297
5470
  yMargin: 96
5298
5471
  }) : void 0,
5299
5472
  dispatchTransactions: debug ? debugDispatcher : void 0
@@ -5311,11 +5484,11 @@ var useTextEditor = (props = {}, deps = []) => {
5311
5484
  setView(view2);
5312
5485
  }
5313
5486
  return () => {
5314
- (0, import_log8.log)("destroy", {
5487
+ (0, import_log7.log)("destroy", {
5315
5488
  id
5316
5489
  }, {
5317
5490
  F: __dxlog_file11,
5318
- L: 135,
5491
+ L: 134,
5319
5492
  S: void 0,
5320
5493
  C: (f, a) => f(...a)
5321
5494
  });
@@ -5329,19 +5502,19 @@ var useTextEditor = (props = {}, deps = []) => {
5329
5502
  }
5330
5503
  if (scrollTo || selection) {
5331
5504
  if (selection && selection.anchor > view.state.doc.length) {
5332
- import_log8.log.warn("invalid selection", {
5505
+ import_log7.log.warn("invalid selection", {
5333
5506
  length: view.state.doc.length,
5334
5507
  scrollTo,
5335
5508
  selection
5336
5509
  }, {
5337
5510
  F: __dxlog_file11,
5338
- L: 149,
5511
+ L: 148,
5339
5512
  S: void 0,
5340
5513
  C: (f, a) => f(...a)
5341
5514
  });
5342
5515
  return;
5343
5516
  }
5344
- view.dispatch((0, import_chunk_GZWIENFM.createEditorStateTransaction)(view.state, {
5517
+ view.dispatch(createEditorStateTransaction({
5345
5518
  scrollTo,
5346
5519
  selection
5347
5520
  }));
@@ -5411,6 +5584,7 @@ var useTextEditor = (props = {}, deps = []) => {
5411
5584
  awarenessProvider,
5412
5585
  blast,
5413
5586
  callbackWrapper,
5587
+ clientRectsFor,
5414
5588
  command,
5415
5589
  comments,
5416
5590
  commentsState,
@@ -5418,7 +5592,9 @@ var useTextEditor = (props = {}, deps = []) => {
5418
5592
  createBasicExtensions,
5419
5593
  createComment,
5420
5594
  createDataExtensions,
5595
+ createEditorStateStore,
5421
5596
  createEditorStateTransaction,
5597
+ createElement,
5422
5598
  createExternalCommentSync,
5423
5599
  createMarkdownExtensions,
5424
5600
  createThemeExtensions,
@@ -5435,23 +5611,25 @@ var useTextEditor = (props = {}, deps = []) => {
5435
5611
  editorInputMode,
5436
5612
  editorMonospace,
5437
5613
  editorWithToolbarLayout,
5614
+ flattenRect,
5615
+ focus,
5438
5616
  focusEvent,
5617
+ focusField,
5439
5618
  folding,
5440
5619
  formattingEquals,
5441
5620
  formattingKeymap,
5442
5621
  getFormatting,
5443
5622
  image,
5444
- imageUpload,
5445
5623
  insertTable,
5446
5624
  keymap,
5447
5625
  linkTooltip,
5448
5626
  listener,
5449
- localStorageStateStoreAdapter,
5450
5627
  logChanges,
5451
5628
  markdownHighlightStyle,
5452
5629
  markdownTags,
5453
5630
  markdownTagsExtensions,
5454
5631
  mention,
5632
+ overlap,
5455
5633
  preventNewline,
5456
5634
  processAction,
5457
5635
  removeBlockquote,
@@ -5459,17 +5637,19 @@ var useTextEditor = (props = {}, deps = []) => {
5459
5637
  removeLink,
5460
5638
  removeList,
5461
5639
  removeStyle,
5640
+ renderRoot,
5462
5641
  scrollThreadIntoView,
5463
5642
  selectionOverlapsComment,
5643
+ selectionState,
5464
5644
  setBlockquote,
5465
5645
  setComments,
5466
5646
  setHeading,
5467
5647
  setSelection,
5468
5648
  setStyle,
5469
5649
  singleValueFacet,
5470
- state,
5471
5650
  table,
5472
5651
  tags,
5652
+ textRange,
5473
5653
  toggleBlockquote,
5474
5654
  toggleCodeblock,
5475
5655
  toggleEmphasis,
@@ -5486,6 +5666,7 @@ var useTextEditor = (props = {}, deps = []) => {
5486
5666
  useComments,
5487
5667
  useFormattingState,
5488
5668
  useTextEditor,
5489
- useToolbarContext
5669
+ useToolbarContext,
5670
+ wrapWithCatch
5490
5671
  });
5491
5672
  //# sourceMappingURL=index.cjs.map