@dxos/react-ui-editor 0.8.1-staging.5be625a → 0.8.1-staging.9eaf14f

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 (48) hide show
  1. package/dist/lib/browser/index.mjs +276 -140
  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 +310 -178
  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 +276 -140
  8. package/dist/lib/node-esm/index.mjs.map +4 -4
  9. package/dist/lib/node-esm/meta.json +1 -1
  10. package/dist/types/src/InputMode.stories.d.ts +2 -2
  11. package/dist/types/src/TextEditor.stories.d.ts +5 -40
  12. package/dist/types/src/TextEditor.stories.d.ts.map +1 -1
  13. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  14. package/dist/types/src/defaults.d.ts +2 -0
  15. package/dist/types/src/defaults.d.ts.map +1 -1
  16. package/dist/types/src/extensions/command/command.d.ts +4 -2
  17. package/dist/types/src/extensions/command/command.d.ts.map +1 -1
  18. package/dist/types/src/extensions/command/hint.d.ts.map +1 -1
  19. package/dist/types/src/extensions/command/menu.d.ts +12 -0
  20. package/dist/types/src/extensions/command/menu.d.ts.map +1 -0
  21. package/dist/types/src/extensions/command/preview.d.ts +12 -0
  22. package/dist/types/src/extensions/command/preview.d.ts.map +1 -0
  23. package/dist/types/src/extensions/command/state.d.ts.map +1 -1
  24. package/dist/types/src/extensions/comments.d.ts +3 -3
  25. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  26. package/dist/types/src/extensions/factories.d.ts +1 -1
  27. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  28. package/dist/types/src/{styles/stack-item-content-class-names.d.ts → fragments.d.ts} +1 -1
  29. package/dist/types/src/fragments.d.ts.map +1 -0
  30. package/dist/types/src/index.d.ts +0 -1
  31. package/dist/types/src/index.d.ts.map +1 -1
  32. package/dist/types/src/styles/theme.d.ts.map +1 -1
  33. package/package.json +27 -27
  34. package/src/InputMode.stories.tsx +4 -4
  35. package/src/TextEditor.stories.tsx +173 -59
  36. package/src/components/EditorToolbar/EditorToolbar.tsx +4 -5
  37. package/src/defaults.ts +12 -0
  38. package/src/extensions/command/command.ts +21 -2
  39. package/src/extensions/command/hint.ts +3 -0
  40. package/src/extensions/command/menu.ts +100 -0
  41. package/src/extensions/command/preview.ts +79 -0
  42. package/src/extensions/command/state.ts +9 -4
  43. package/src/extensions/comments.ts +6 -10
  44. package/src/extensions/factories.ts +3 -3
  45. package/src/{styles/stack-item-content-class-names.ts → fragments.ts} +3 -1
  46. package/src/index.ts +0 -4
  47. package/src/styles/theme.ts +5 -1
  48. package/dist/types/src/styles/stack-item-content-class-names.d.ts.map +0 -1
@@ -119,7 +119,7 @@ __export(node_exports, {
119
119
  setStyle: () => setStyle,
120
120
  singleValueFacet: () => singleValueFacet,
121
121
  stackItemContentEditorClassNames: () => stackItemContentEditorClassNames,
122
- stackItemContentToolbarClassNames: () => stackItemContentToolbarClassNames,
122
+ stackItemContentToolbarClassNames: () => stackItemContentToolbarClassNames2,
123
123
  table: () => table,
124
124
  tags: () => import_highlight.tags,
125
125
  textRange: () => textRange,
@@ -197,87 +197,91 @@ var import_state8 = require("@codemirror/state");
197
197
  var import_view9 = require("@codemirror/view");
198
198
  var import_state9 = require("@codemirror/state");
199
199
  var import_view10 = require("@codemirror/view");
200
- var import_commands = require("@codemirror/commands");
201
- var import_state10 = require("@codemirror/state");
202
200
  var import_view11 = require("@codemirror/view");
201
+ var import_language = require("@codemirror/language");
202
+ var import_state10 = require("@codemirror/state");
203
+ var import_view12 = require("@codemirror/view");
204
+ var import_commands = require("@codemirror/commands");
205
+ var import_state11 = require("@codemirror/state");
206
+ var import_view13 = require("@codemirror/view");
203
207
  var import_lodash3 = __toESM(require("lodash.sortby"));
204
208
  var import_react4 = require("react");
205
209
  var import_async3 = require("@dxos/async");
206
210
  var import_log4 = require("@dxos/log");
207
211
  var import_util2 = require("@dxos/util");
208
- var import_state11 = require("@codemirror/state");
209
- var import_view12 = require("@codemirror/view");
212
+ var import_state12 = require("@codemirror/state");
213
+ var import_view14 = require("@codemirror/view");
210
214
  var import_async4 = require("@dxos/async");
211
215
  var import_invariant3 = require("@dxos/invariant");
212
216
  var import_util3 = require("@dxos/util");
213
- var import_language = require("@codemirror/language");
214
- var import_state12 = require("@codemirror/state");
215
- var import_view13 = require("@codemirror/view");
217
+ var import_language2 = require("@codemirror/language");
218
+ var import_state13 = require("@codemirror/state");
219
+ var import_view15 = require("@codemirror/view");
216
220
  var import_autocomplete2 = require("@codemirror/autocomplete");
217
221
  var import_commands2 = require("@codemirror/commands");
218
- var import_language2 = require("@codemirror/language");
222
+ var import_language3 = require("@codemirror/language");
219
223
  var import_search = require("@codemirror/search");
220
- var import_state13 = require("@codemirror/state");
224
+ var import_state14 = require("@codemirror/state");
221
225
  var import_theme_one_dark = require("@codemirror/theme-one-dark");
222
- var import_view14 = require("@codemirror/view");
226
+ var import_view16 = require("@codemirror/view");
223
227
  var import_lodash4 = __toESM(require("lodash.defaultsdeep"));
224
228
  var import_lodash5 = __toESM(require("lodash.merge"));
225
229
  var import_display_name = require("@dxos/display-name");
226
230
  var import_log5 = require("@dxos/log");
227
231
  var import_util4 = require("@dxos/util");
228
- var import_state14 = require("@codemirror/state");
229
- var import_view15 = require("@codemirror/view");
230
- var import_language3 = require("@codemirror/language");
231
- var import_view16 = require("@codemirror/view");
232
- var import_react5 = __toESM(require("react"));
233
- var import_react_ui3 = require("@dxos/react-ui");
232
+ var import_state15 = require("@codemirror/state");
234
233
  var import_view17 = require("@codemirror/view");
235
- var import_autocomplete3 = require("@codemirror/autocomplete");
236
234
  var import_language4 = require("@codemirror/language");
237
- var import_state15 = require("@codemirror/state");
238
235
  var import_view18 = require("@codemirror/view");
236
+ var import_react5 = __toESM(require("react"));
237
+ var import_react_ui3 = require("@dxos/react-ui");
238
+ var import_view19 = require("@codemirror/view");
239
+ var import_autocomplete3 = require("@codemirror/autocomplete");
240
+ var import_language5 = require("@codemirror/language");
241
+ var import_state16 = require("@codemirror/state");
242
+ var import_view20 = require("@codemirror/view");
239
243
  var import_react6 = require("react");
240
244
  var import_autocomplete4 = require("@codemirror/autocomplete");
241
245
  var import_commands3 = require("@codemirror/commands");
242
246
  var import_lang_markdown2 = require("@codemirror/lang-markdown");
243
- var import_language5 = require("@codemirror/language");
247
+ var import_language6 = require("@codemirror/language");
244
248
  var import_language_data = require("@codemirror/language-data");
245
249
  var import_lint = require("@codemirror/lint");
246
- var import_view19 = require("@codemirror/view");
250
+ var import_view21 = require("@codemirror/view");
247
251
  var import_lang_markdown3 = require("@codemirror/lang-markdown");
248
- var import_language6 = require("@codemirror/language");
252
+ var import_language7 = require("@codemirror/language");
249
253
  var import_highlight2 = require("@lezer/highlight");
250
254
  var import_markdown = require("@lezer/markdown");
251
- var import_language7 = require("@codemirror/language");
252
- var import_state16 = require("@codemirror/state");
253
255
  var import_language8 = require("@codemirror/language");
254
256
  var import_state17 = require("@codemirror/state");
255
- var import_view20 = require("@codemirror/view");
256
- var import_invariant4 = require("@dxos/invariant");
257
- var import_react_ui_theme7 = require("@dxos/react-ui-theme");
258
257
  var import_language9 = require("@codemirror/language");
259
258
  var import_state18 = require("@codemirror/state");
260
- var import_view21 = require("@codemirror/view");
259
+ var import_view22 = require("@codemirror/view");
260
+ var import_invariant4 = require("@dxos/invariant");
261
+ var import_react_ui_theme7 = require("@dxos/react-ui-theme");
261
262
  var import_language10 = require("@codemirror/language");
262
263
  var import_state19 = require("@codemirror/state");
263
- var import_view22 = require("@codemirror/view");
264
264
  var import_view23 = require("@codemirror/view");
265
265
  var import_language11 = require("@codemirror/language");
266
266
  var import_state20 = require("@codemirror/state");
267
267
  var import_view24 = require("@codemirror/view");
268
- var import_language12 = require("@codemirror/language");
269
268
  var import_view25 = require("@codemirror/view");
269
+ var import_language12 = require("@codemirror/language");
270
+ var import_state21 = require("@codemirror/state");
271
+ var import_view26 = require("@codemirror/view");
272
+ var import_language13 = require("@codemirror/language");
273
+ var import_view27 = require("@codemirror/view");
270
274
  var import_react_ui_theme8 = require("@dxos/react-ui-theme");
271
275
  var import_autocomplete5 = require("@codemirror/autocomplete");
272
276
  var import_log6 = require("@dxos/log");
273
- var import_view26 = require("@codemirror/view");
277
+ var import_view28 = require("@codemirror/view");
274
278
  var import_codemirror_vim = require("@replit/codemirror-vim");
275
279
  var import_codemirror_vscode_keymap = require("@replit/codemirror-vscode-keymap");
276
280
  var import_echo_schema = require("@dxos/echo-schema");
277
- var import_view27 = require("@codemirror/view");
281
+ var import_view29 = require("@codemirror/view");
278
282
  var import_react7 = require("react");
279
- var import_state21 = require("@codemirror/state");
280
- var import_view28 = require("@codemirror/view");
283
+ var import_state22 = require("@codemirror/state");
284
+ var import_view30 = require("@codemirror/view");
281
285
  var import_react_tabster = require("@fluentui/react-tabster");
282
286
  var import_react8 = require("react");
283
287
  var import_log7 = require("@dxos/log");
@@ -564,7 +568,6 @@ var createViewMode = (state) => {
564
568
  ]
565
569
  };
566
570
  };
567
- var stackItemContentEditorClassNames = (role) => (0, import_react_ui_theme2.mx)("dx-focus-ring-inset data-[toolbar=disabled]:pbs-2 attention-surface", role === "section" ? "[&_.cm-scroller]:overflow-hidden [&_.cm-scroller]:min-bs-24" : "min-bs-0");
568
571
  var stackItemContentToolbarClassNames = (role) => (0, import_react_ui_theme2.mx)("attention-surface is-full border-be !border-separator", role === "section" && "sticky block-start-0 z-[1] -mbe-px min-is-0");
569
572
  var createToolbar = ({ state, customActions, ...features }) => {
570
573
  const nodes = [];
@@ -701,6 +704,10 @@ var defaultTheme = {
701
704
  background: "transparent"
702
705
  },
703
706
  ".cm-gutter": {},
707
+ ".cm-gutter.cm-lineNumbers": {
708
+ paddingRight: "4px",
709
+ borderRight: "1px solid var(--dx-separator)"
710
+ },
704
711
  ".cm-gutter.cm-lineNumbers .cm-gutterElement": {
705
712
  minWidth: "40px",
706
713
  alignContent: "center"
@@ -710,7 +717,7 @@ var defaultTheme = {
710
717
  */
711
718
  ".cm-gutterElement": {
712
719
  alignItems: "center",
713
- fontSize: "16px"
720
+ fontSize: "12px"
714
721
  },
715
722
  /**
716
723
  * Line.
@@ -883,6 +890,8 @@ var editorMonospace = import_view2.EditorView.theme({
883
890
  }
884
891
  });
885
892
  var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden";
893
+ var stackItemContentEditorClassNames = (role) => (0, import_react_ui_theme3.mx)("attention-surface dx-focus-ring-inset data-[toolbar=disabled]:pbs-2", role === "section" ? "[&_.cm-scroller]:overflow-hidden [&_.cm-scroller]:min-bs-24" : "min-bs-0");
894
+ var stackItemContentToolbarClassNames2 = (role) => (0, import_react_ui_theme3.mx)("attention-surface is-full border-be !border-separator", role === "section" && "sticky block-start-0 z-[1] -mbe-px min-is-0");
886
895
  var singleValueFacet = (defaultValue) => import_state3.Facet.define({
887
896
  // Called immediately.
888
897
  combine: (providers) => {
@@ -2042,18 +2051,19 @@ var commandState = import_state9.StateField.define({
2042
2051
  const widthWithoutPadding = parent.clientWidth - parseFloat(paddingLeft) - parseFloat(paddingRight);
2043
2052
  dom.style.width = `${widthWithoutPadding}px`;
2044
2053
  }
2045
- options.onRender(dom, (action) => {
2054
+ options.onRenderDialog(dom, (action) => {
2046
2055
  view2.dispatch({
2047
2056
  effects: closeEffect.of(null)
2048
2057
  });
2049
2058
  if (action?.insert?.length) {
2059
+ const text = action.insert + "\n";
2050
2060
  view2.dispatch({
2051
2061
  changes: {
2052
2062
  from: pos,
2053
- insert: action.insert
2063
+ insert: text
2054
2064
  },
2055
2065
  selection: {
2056
- anchor: pos + action.insert.length
2066
+ anchor: pos + text.length
2057
2067
  }
2058
2068
  });
2059
2069
  }
@@ -2177,14 +2187,139 @@ var hintViewPlugin = ({ onHint }) => import_view9.ViewPlugin.fromClass(class {
2177
2187
  import_view9.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view9.Decoration.none)
2178
2188
  ]
2179
2189
  });
2190
+ var floatingMenu = (options) => import_view11.ViewPlugin.fromClass(class {
2191
+ constructor(view) {
2192
+ this.rafId = null;
2193
+ this.view = view;
2194
+ const container = view.scrollDOM;
2195
+ if (getComputedStyle(container).position === "static") {
2196
+ container.style.position = "relative";
2197
+ }
2198
+ this.button = document.createElement("div");
2199
+ this.button.style.position = "absolute";
2200
+ this.button.style.zIndex = "10";
2201
+ this.button.style.display = "none";
2202
+ options.onRenderMenu(this.button, () => {
2203
+ openCommand(view);
2204
+ });
2205
+ container.appendChild(this.button);
2206
+ container.addEventListener("scroll", this.scheduleUpdate);
2207
+ this.scheduleUpdate();
2208
+ }
2209
+ update(update2) {
2210
+ if (update2.transactions.some((tr) => tr.effects.some((effect) => effect.is(openEffect)))) {
2211
+ this.button.style.display = "none";
2212
+ } else if (update2.transactions.some((tr) => tr.effects.some((effect) => effect.is(closeEffect)))) {
2213
+ this.button.style.display = "block";
2214
+ } else if (update2.selectionSet || update2.viewportChanged || update2.docChanged || update2.geometryChanged) {
2215
+ this.scheduleUpdate();
2216
+ }
2217
+ }
2218
+ scheduleUpdate() {
2219
+ if (this.rafId != null) {
2220
+ cancelAnimationFrame(this.rafId);
2221
+ }
2222
+ this.rafId = requestAnimationFrame(() => this.updateButtonPosition());
2223
+ }
2224
+ updateButtonPosition() {
2225
+ const pos = this.view.state.selection.main.head;
2226
+ const lineBlock = this.view.lineBlockAt(pos);
2227
+ const domInfo = this.view.domAtPos(lineBlock.from);
2228
+ let node = domInfo.node;
2229
+ while (node && !(node instanceof HTMLElement)) {
2230
+ node = node.parentNode;
2231
+ }
2232
+ if (!node) {
2233
+ this.button.style.display = "none";
2234
+ return;
2235
+ }
2236
+ const lineRect = node.getBoundingClientRect();
2237
+ const containerRect = this.view.scrollDOM.getBoundingClientRect();
2238
+ const offsetTop = lineRect.top - containerRect.top + this.view.scrollDOM.scrollTop;
2239
+ const offsetLeft = this.view.scrollDOM.clientWidth + this.view.scrollDOM.scrollLeft - lineRect.x;
2240
+ this.button.style.top = `${offsetTop}px`;
2241
+ this.button.style.left = `${offsetLeft}px`;
2242
+ this.button.style.display = "block";
2243
+ }
2244
+ destroy() {
2245
+ this.button.remove();
2246
+ if (this.rafId != null) {
2247
+ cancelAnimationFrame(this.rafId);
2248
+ }
2249
+ }
2250
+ });
2251
+ var preview = (options) => {
2252
+ return [
2253
+ import_state10.StateField.define({
2254
+ create: (state) => buildDecorations(state, options),
2255
+ update: (_, tr) => buildDecorations(tr.state, options),
2256
+ // TODO(burdon): Make atomic.
2257
+ provide: (field) => import_view12.EditorView.decorations.from(field)
2258
+ })
2259
+ ];
2260
+ };
2261
+ var buildDecorations = (state, options) => {
2262
+ const builder = new import_state10.RangeSetBuilder();
2263
+ (0, import_language.syntaxTree)(state).iterate({
2264
+ enter: (node) => {
2265
+ if (node.name === "Link") {
2266
+ const urlNode = node.node.getChild("URL");
2267
+ if (urlNode) {
2268
+ const text = state.sliceDoc(node.from + 1, urlNode.from - 2);
2269
+ const url = state.sliceDoc(urlNode.from, urlNode.to);
2270
+ builder.add(node.from, node.to, import_view12.Decoration.replace({
2271
+ block: true,
2272
+ widget: new PreviewWidget(options.onRenderPreview, url, text)
2273
+ }));
2274
+ }
2275
+ }
2276
+ }
2277
+ });
2278
+ return builder.finish();
2279
+ };
2280
+ var PreviewWidget = class extends import_view12.WidgetType {
2281
+ constructor(_onRenderPreview, _url, _text) {
2282
+ super();
2283
+ this._onRenderPreview = _onRenderPreview;
2284
+ this._url = _url;
2285
+ this._text = _text;
2286
+ }
2287
+ eq(other) {
2288
+ return this._url === other._url;
2289
+ }
2290
+ toDOM(view) {
2291
+ const root = document.createElement("div");
2292
+ root.classList.add("cm-preview");
2293
+ this._onRenderPreview(root, {
2294
+ url: this._url,
2295
+ text: this._text
2296
+ });
2297
+ return root;
2298
+ }
2299
+ };
2180
2300
  var command = (options) => {
2181
2301
  return [
2182
2302
  commandConfig.of(options),
2183
2303
  commandState,
2184
2304
  import_view8.keymap.of(commandKeyBindings),
2305
+ preview(options),
2306
+ floatingMenu(options),
2185
2307
  hintViewPlugin(options),
2186
2308
  import_view8.EditorView.focusChangeEffect.of((_, focusing) => {
2187
2309
  return focusing ? closeEffect.of(null) : null;
2310
+ }),
2311
+ import_view8.EditorView.theme({
2312
+ ".cm-tooltip": {
2313
+ background: "transparent"
2314
+ },
2315
+ ".cm-preview": {
2316
+ marginLeft: "-1rem",
2317
+ marginRight: "-1rem",
2318
+ padding: "1rem",
2319
+ borderRadius: "1rem",
2320
+ background: "var(--dx-modalSurface)",
2321
+ border: "1px solid var(--dx-separator)"
2322
+ }
2188
2323
  })
2189
2324
  ];
2190
2325
  };
@@ -2195,10 +2330,10 @@ var createEditorStateTransaction = ({ scrollTo, selection }) => {
2195
2330
  return {
2196
2331
  selection,
2197
2332
  scrollIntoView: !scrollTo,
2198
- effects: scrollTo ? import_view12.EditorView.scrollIntoView(scrollTo, {
2333
+ effects: scrollTo ? import_view14.EditorView.scrollIntoView(scrollTo, {
2199
2334
  yMargin: 96
2200
2335
  }) : void 0,
2201
- annotations: import_state11.Transaction.userEvent.of(stateRestoreAnnotation)
2336
+ annotations: import_state12.Transaction.userEvent.of(stateRestoreAnnotation)
2202
2337
  };
2203
2338
  };
2204
2339
  var createEditorStateStore = (keyPrefix) => ({
@@ -2237,7 +2372,7 @@ var selectionState = ({ getState, setState } = {}) => {
2237
2372
  // setStateDebounced(id, {});
2238
2373
  // },
2239
2374
  // }),
2240
- import_view12.EditorView.updateListener.of(({ view, transactions }) => {
2375
+ import_view14.EditorView.updateListener.of(({ view, transactions }) => {
2241
2376
  const id = view.state.facet(documentId);
2242
2377
  if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
2243
2378
  return;
@@ -2260,7 +2395,7 @@ var selectionState = ({ getState, setState } = {}) => {
2260
2395
  }
2261
2396
  }
2262
2397
  }),
2263
- getState && import_view12.keymap.of([
2398
+ getState && import_view14.keymap.of([
2264
2399
  {
2265
2400
  key: "ctrl-r",
2266
2401
  run: (view) => {
@@ -2275,10 +2410,10 @@ var selectionState = ({ getState, setState } = {}) => {
2275
2410
  ].filter(import_util3.isNotFalsy);
2276
2411
  };
2277
2412
  var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
2278
- var setComments = import_state10.StateEffect.define();
2279
- var setSelection = import_state10.StateEffect.define();
2280
- var setCommentState = import_state10.StateEffect.define();
2281
- var commentsState = import_state10.StateField.define({
2413
+ var setComments = import_state11.StateEffect.define();
2414
+ var setSelection = import_state11.StateEffect.define();
2415
+ var setCommentState = import_state11.StateEffect.define();
2416
+ var commentsState = import_state11.StateField.define({
2282
2417
  create: (state) => ({
2283
2418
  id: state.facet(documentId),
2284
2419
  comments: [],
@@ -2316,7 +2451,7 @@ var commentsState = import_state10.StateField.define({
2316
2451
  return value;
2317
2452
  }
2318
2453
  });
2319
- var styles3 = import_view11.EditorView.theme({
2454
+ var styles3 = import_view13.EditorView.theme({
2320
2455
  ".cm-comment, .cm-comment-current": {
2321
2456
  margin: "0 -3px",
2322
2457
  padding: "3px",
@@ -2329,14 +2464,14 @@ var styles3 = import_view11.EditorView.theme({
2329
2464
  textDecoration: "underline"
2330
2465
  }
2331
2466
  });
2332
- var createCommentMark = (id, isCurrent) => import_view11.Decoration.mark({
2467
+ var createCommentMark = (id, isCurrent) => import_view13.Decoration.mark({
2333
2468
  class: isCurrent ? "cm-comment-current" : "cm-comment",
2334
2469
  attributes: {
2335
2470
  "data-testid": "cm-comment",
2336
2471
  "data-comment-id": id
2337
2472
  }
2338
2473
  });
2339
- var commentsDecorations = import_view11.EditorView.decorations.compute([
2474
+ var commentsDecorations = import_view13.EditorView.decorations.compute([
2340
2475
  commentsState
2341
2476
  ], (state) => {
2342
2477
  const { selection: { current }, comments: comments2 } = state.field(commentsState);
@@ -2356,10 +2491,10 @@ var commentsDecorations = import_view11.EditorView.decorations.compute([
2356
2491
  const mark = createCommentMark(comment.comment.id, comment.comment.id === current);
2357
2492
  return mark.range(range.from, range.to);
2358
2493
  }).filter(import_util2.isNonNullable);
2359
- return import_view11.Decoration.set(decorations);
2494
+ return import_view13.Decoration.set(decorations);
2360
2495
  });
2361
- var commentClickedEffect = import_state10.StateEffect.define();
2362
- var handleCommentClick = import_view11.EditorView.domEventHandlers({
2496
+ var commentClickedEffect = import_state11.StateEffect.define();
2497
+ var handleCommentClick = import_view13.EditorView.domEventHandlers({
2363
2498
  click: (event, view) => {
2364
2499
  let target = event.target;
2365
2500
  const editorRoot = view.dom;
@@ -2398,7 +2533,7 @@ var trackPastedComments = (onUpdate) => {
2398
2533
  }
2399
2534
  };
2400
2535
  return [
2401
- import_view11.EditorView.domEventHandlers({
2536
+ import_view13.EditorView.domEventHandlers({
2402
2537
  cut: handleTrack,
2403
2538
  copy: handleTrack
2404
2539
  }),
@@ -2420,7 +2555,7 @@ var trackPastedComments = (onUpdate) => {
2420
2555
  return effects;
2421
2556
  }),
2422
2557
  // Handle paste or the undo of comment deletion.
2423
- import_view11.EditorView.updateListener.of((update2) => {
2558
+ import_view13.EditorView.updateListener.of((update2) => {
2424
2559
  const restore = [];
2425
2560
  for (let i = 0; i < update2.transactions.length; i++) {
2426
2561
  const tr = update2.transactions[i];
@@ -2476,7 +2611,7 @@ var mapTrackedComment = (comment, changes) => ({
2476
2611
  from: changes.mapPos(comment.from, 1),
2477
2612
  to: changes.mapPos(comment.to, 1)
2478
2613
  });
2479
- var restoreCommentEffect = import_state10.StateEffect.define({
2614
+ var restoreCommentEffect = import_state11.StateEffect.define({
2480
2615
  map: mapTrackedComment
2481
2616
  });
2482
2617
  var createComment2 = (view) => {
@@ -2521,7 +2656,7 @@ var comments = (options = {}) => {
2521
2656
  //
2522
2657
  // Keymap.
2523
2658
  //
2524
- options.onCreate && import_view11.keymap.of([
2659
+ options.onCreate && import_view13.keymap.of([
2525
2660
  {
2526
2661
  key: shortcut,
2527
2662
  run: callbackWrapper(createComment2)
@@ -2531,7 +2666,7 @@ var comments = (options = {}) => {
2531
2666
  // Hover tooltip (for key shortcut hints, etc.)
2532
2667
  // TODO(burdon): Factor out to generic hints extension for current selection/line.
2533
2668
  //
2534
- options.onHover && (0, import_view11.hoverTooltip)((view, pos) => {
2669
+ options.onHover && (0, import_view13.hoverTooltip)((view, pos) => {
2535
2670
  const selection = view.state.selection.main;
2536
2671
  if (selection && pos >= selection.from && pos <= selection.to) {
2537
2672
  return {
@@ -2560,7 +2695,7 @@ var comments = (options = {}) => {
2560
2695
  //
2561
2696
  // Track deleted ranges and update ranges for decorations.
2562
2697
  //
2563
- import_view11.EditorView.updateListener.of(({ view, state, changes }) => {
2698
+ import_view13.EditorView.updateListener.of(({ view, state, changes }) => {
2564
2699
  let mod = false;
2565
2700
  const { comments: comments2, ...value } = state.field(commentsState);
2566
2701
  changes.iterChanges((from, to, from2, to2) => {
@@ -2592,7 +2727,7 @@ var comments = (options = {}) => {
2592
2727
  //
2593
2728
  // Track selection/proximity.
2594
2729
  //
2595
- import_view11.EditorView.updateListener.of(({ view, state }) => {
2730
+ import_view13.EditorView.updateListener.of(({ view, state }) => {
2596
2731
  let min = Infinity;
2597
2732
  const { selection: { current, closest }, comments: comments2 } = state.field(commentsState);
2598
2733
  const { head } = state.selection.main;
@@ -2646,7 +2781,7 @@ var scrollThreadIntoView = (view, id, center = true) => {
2646
2781
  anchor: range.from
2647
2782
  } : void 0,
2648
2783
  effects: [
2649
- needsScroll ? import_view11.EditorView.scrollIntoView(range.from, center ? {
2784
+ needsScroll ? import_view13.EditorView.scrollIntoView(range.from, center ? {
2650
2785
  y: "center"
2651
2786
  } : void 0) : [],
2652
2787
  needsSelectionUpdate ? setSelection.of({
@@ -2692,13 +2827,13 @@ var ExternalCommentSync = class {
2692
2827
  this.unsubscribe = subscribe(updateComments);
2693
2828
  }
2694
2829
  };
2695
- var createExternalCommentSync = (id, subscribe, getComments) => import_view11.ViewPlugin.fromClass(class {
2830
+ var createExternalCommentSync = (id, subscribe, getComments) => import_view13.ViewPlugin.fromClass(class {
2696
2831
  constructor(view) {
2697
2832
  return new ExternalCommentSync(view, id, subscribe, getComments);
2698
2833
  }
2699
2834
  });
2700
2835
  var useCommentState = (state) => {
2701
- return (0, import_react4.useMemo)(() => import_view11.EditorView.updateListener.of((update2) => {
2836
+ return (0, import_react4.useMemo)(() => import_view13.EditorView.updateListener.of((update2) => {
2702
2837
  if (update2.docChanged || update2.selectionSet) {
2703
2838
  state.comment = selectionOverlapsComment(update2.state);
2704
2839
  state.selection = hasActiveSelection(update2.state);
@@ -2722,7 +2857,7 @@ var useComments = (view, id, comments2) => {
2722
2857
  });
2723
2858
  };
2724
2859
  var useCommentClickListener = (onCommentClick) => {
2725
- return (0, import_react4.useMemo)(() => import_view11.EditorView.updateListener.of((update2) => {
2860
+ return (0, import_react4.useMemo)(() => import_view13.EditorView.updateListener.of((update2) => {
2726
2861
  update2.transactions.forEach((transaction) => {
2727
2862
  transaction.effects.forEach((effect) => {
2728
2863
  if (effect.is(commentClickedEffect)) {
@@ -2735,15 +2870,15 @@ var useCommentClickListener = (onCommentClick) => {
2735
2870
  ]);
2736
2871
  };
2737
2872
  var debugNodeLogger = (log8 = console.log) => {
2738
- const logTokens = (state) => (0, import_language.syntaxTree)(state).iterate({
2873
+ const logTokens = (state) => (0, import_language2.syntaxTree)(state).iterate({
2739
2874
  enter: (node) => log8(node.type)
2740
2875
  });
2741
- return import_state12.StateField.define({
2876
+ return import_state13.StateField.define({
2742
2877
  create: (state) => logTokens(state),
2743
2878
  update: (_, tr) => logTokens(tr.state)
2744
2879
  });
2745
2880
  };
2746
- var styles4 = import_view13.EditorView.theme({
2881
+ var styles4 = import_view15.EditorView.theme({
2747
2882
  ".cm-dropCursor": {
2748
2883
  borderLeft: "2px solid var(--dx-accentText)",
2749
2884
  color: "var(--dx-accentText)",
@@ -2756,8 +2891,8 @@ var styles4 = import_view13.EditorView.theme({
2756
2891
  var dropFile = (options = {}) => {
2757
2892
  return [
2758
2893
  styles4,
2759
- (0, import_view13.dropCursor)(),
2760
- import_view13.EditorView.domEventHandlers({
2894
+ (0, import_view15.dropCursor)(),
2895
+ import_view15.EditorView.domEventHandlers({
2761
2896
  drop: (event, view) => {
2762
2897
  event.preventDefault();
2763
2898
  const files = event.dataTransfer?.files;
@@ -2776,8 +2911,8 @@ var dropFile = (options = {}) => {
2776
2911
  })
2777
2912
  ];
2778
2913
  };
2779
- var focusEffect = import_state14.StateEffect.define();
2780
- var focusField = import_state14.StateField.define({
2914
+ var focusEffect = import_state15.StateEffect.define();
2915
+ var focusField = import_state15.StateField.define({
2781
2916
  create: () => false,
2782
2917
  update: (value, tr) => {
2783
2918
  for (const effect of tr.effects) {
@@ -2790,7 +2925,7 @@ var focusField = import_state14.StateField.define({
2790
2925
  });
2791
2926
  var focus = [
2792
2927
  focusField,
2793
- import_view15.EditorView.domEventHandlers({
2928
+ import_view17.EditorView.domEventHandlers({
2794
2929
  focus: (event, view) => {
2795
2930
  setTimeout(() => view.dispatch({
2796
2931
  effects: focusEffect.of(true)
@@ -2804,13 +2939,12 @@ var focus = [
2804
2939
  })
2805
2940
  ];
2806
2941
  var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
2807
- var preventNewline = import_state13.EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
2942
+ var preventNewline = import_state14.EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
2808
2943
  var defaultBasicOptions = {
2809
2944
  allowMultipleSelections: true,
2810
2945
  bracketMatching: true,
2811
2946
  closeBrackets: true,
2812
2947
  drawSelection: true,
2813
- editable: true,
2814
2948
  focus: true,
2815
2949
  history: true,
2816
2950
  keymap: "standard",
@@ -2827,35 +2961,33 @@ var createBasicExtensions = (_props) => {
2827
2961
  const props = (0, import_lodash4.default)({}, _props, defaultBasicOptions);
2828
2962
  return [
2829
2963
  // NOTE: Doesn't catch errors in keymap functions.
2830
- import_view14.EditorView.exceptionSink.of((err) => {
2964
+ import_view16.EditorView.exceptionSink.of((err) => {
2831
2965
  import_log5.log.catch(err, void 0, {
2832
2966
  F: __dxlog_file8,
2833
- L: 97,
2967
+ L: 96,
2834
2968
  S: void 0,
2835
2969
  C: (f, a) => f(...a)
2836
2970
  });
2837
2971
  }),
2838
- props.allowMultipleSelections && import_state13.EditorState.allowMultipleSelections.of(true),
2839
- props.bracketMatching && (0, import_language2.bracketMatching)(),
2972
+ props.allowMultipleSelections && import_state14.EditorState.allowMultipleSelections.of(true),
2973
+ props.bracketMatching && (0, import_language3.bracketMatching)(),
2840
2974
  props.closeBrackets && (0, import_autocomplete2.closeBrackets)(),
2841
- props.dropCursor && (0, import_view14.dropCursor)(),
2842
- props.drawSelection && (0, import_view14.drawSelection)({
2975
+ props.dropCursor && (0, import_view16.dropCursor)(),
2976
+ props.drawSelection && (0, import_view16.drawSelection)({
2843
2977
  cursorBlinkRate: 1200
2844
2978
  }),
2979
+ props.editable !== void 0 && import_view16.EditorView.editable.of(props.editable),
2845
2980
  props.focus && focus,
2846
- props.highlightActiveLine && (0, import_view14.highlightActiveLine)(),
2981
+ props.highlightActiveLine && (0, import_view16.highlightActiveLine)(),
2847
2982
  props.history && (0, import_commands2.history)(),
2848
- props.lineNumbers && (0, import_view14.lineNumbers)(),
2849
- props.lineWrapping && import_view14.EditorView.lineWrapping,
2850
- props.placeholder && (0, import_view14.placeholder)(props.placeholder),
2851
- props.readonly && [
2852
- import_state13.EditorState.readOnly.of(true),
2853
- import_view14.EditorView.editable.of(false)
2854
- ],
2855
- props.scrollPastEnd && (0, import_view14.scrollPastEnd)(),
2856
- props.tabSize && import_state13.EditorState.tabSize.of(props.tabSize),
2983
+ props.lineNumbers && (0, import_view16.lineNumbers)(),
2984
+ props.lineWrapping && import_view16.EditorView.lineWrapping,
2985
+ props.placeholder && (0, import_view16.placeholder)(props.placeholder),
2986
+ props.readOnly !== void 0 && import_state14.EditorState.readOnly.of(props.readOnly),
2987
+ props.scrollPastEnd && (0, import_view16.scrollPastEnd)(),
2988
+ props.tabSize && import_state14.EditorState.tabSize.of(props.tabSize),
2857
2989
  // https://codemirror.net/docs/ref/#view.KeyBinding
2858
- import_view14.keymap.of([
2990
+ import_view16.keymap.of([
2859
2991
  ...(props.keymap && keymaps[props.keymap]) ?? [],
2860
2992
  // NOTE: Tabs are also configured by markdown extension.
2861
2993
  // https://codemirror.net/docs/ref/#commands.indentWithTab
@@ -2886,14 +3018,14 @@ var defaultThemeSlots = {
2886
3018
  var createThemeExtensions = ({ themeMode, styles: styles5, syntaxHighlighting: _syntaxHighlighting, slots: _slots } = {}) => {
2887
3019
  const slots = (0, import_lodash4.default)({}, _slots, defaultThemeSlots);
2888
3020
  return [
2889
- import_view14.EditorView.darkTheme.of(themeMode === "dark"),
2890
- import_view14.EditorView.baseTheme(styles5 ? (0, import_lodash5.default)({}, defaultTheme, styles5) : defaultTheme),
3021
+ import_view16.EditorView.darkTheme.of(themeMode === "dark"),
3022
+ import_view16.EditorView.baseTheme(styles5 ? (0, import_lodash5.default)({}, defaultTheme, styles5) : defaultTheme),
2891
3023
  // https://github.com/codemirror/theme-one-dark
2892
- _syntaxHighlighting && (themeMode === "dark" ? (0, import_language2.syntaxHighlighting)(import_theme_one_dark.oneDarkHighlightStyle) : (0, import_language2.syntaxHighlighting)(import_language2.defaultHighlightStyle)),
2893
- slots.editor?.className && import_view14.EditorView.editorAttributes.of({
3024
+ _syntaxHighlighting && (themeMode === "dark" ? (0, import_language3.syntaxHighlighting)(import_theme_one_dark.oneDarkHighlightStyle) : (0, import_language3.syntaxHighlighting)(import_language3.defaultHighlightStyle)),
3025
+ slots.editor?.className && import_view16.EditorView.editorAttributes.of({
2894
3026
  class: slots.editor.className
2895
3027
  }),
2896
- slots.content?.className && import_view14.EditorView.contentAttributes.of({
3028
+ slots.content?.className && import_view16.EditorView.contentAttributes.of({
2897
3029
  class: slots.content.className
2898
3030
  })
2899
3031
  ].filter(import_util4.isNotFalsy);
@@ -2920,12 +3052,12 @@ var createDataExtensions = ({ id, text, space, identity }) => {
2920
3052
  return extensions;
2921
3053
  };
2922
3054
  var folding = (_props = {}) => [
2923
- (0, import_language3.codeFolding)({
3055
+ (0, import_language4.codeFolding)({
2924
3056
  placeholderDOM: () => {
2925
3057
  return document.createElement("span");
2926
3058
  }
2927
3059
  }),
2928
- (0, import_language3.foldGutter)({
3060
+ (0, import_language4.foldGutter)({
2929
3061
  markerDOM: (open) => {
2930
3062
  const el = createElement("div", {
2931
3063
  className: "flex h-full items-center"
@@ -2940,7 +3072,7 @@ var folding = (_props = {}) => [
2940
3072
  }));
2941
3073
  }
2942
3074
  }),
2943
- import_view16.EditorView.theme({
3075
+ import_view18.EditorView.theme({
2944
3076
  ".cm-foldGutter": {
2945
3077
  opacity: 0.3,
2946
3078
  transition: "opacity 0.3s",
@@ -2953,11 +3085,11 @@ var folding = (_props = {}) => [
2953
3085
  ];
2954
3086
  var listener = ({ onFocus, onChange }) => {
2955
3087
  const extensions = [];
2956
- onFocus && extensions.push(import_view17.EditorView.focusChangeEffect.of((_, focusing) => {
3088
+ onFocus && extensions.push(import_view19.EditorView.focusChangeEffect.of((_, focusing) => {
2957
3089
  onFocus(focusing);
2958
3090
  return null;
2959
3091
  }));
2960
- onChange && extensions.push(import_view17.EditorView.updateListener.of((update2) => {
3092
+ onChange && extensions.push(import_view19.EditorView.updateListener.of((update2) => {
2961
3093
  onChange(update2.state.doc.toString(), update2.state.facet(documentId));
2962
3094
  }));
2963
3095
  return extensions;
@@ -2983,7 +3115,7 @@ var setHeading = (level) => {
2983
3115
  let prevBlock = -1;
2984
3116
  for (const range of ranges) {
2985
3117
  let sawBlock = false;
2986
- (0, import_language4.syntaxTree)(state).iterate({
3118
+ (0, import_language5.syntaxTree)(state).iterate({
2987
3119
  from: range.from,
2988
3120
  to: range.to,
2989
3121
  enter: (node) => {
@@ -3080,7 +3212,7 @@ var setStyle = (type, enable) => {
3080
3212
  to: range.head + found + marker.length
3081
3213
  }
3082
3214
  ],
3083
- range: import_state15.EditorSelection.cursor(range.from - marker.length)
3215
+ range: import_state16.EditorSelection.cursor(range.from - marker.length)
3084
3216
  };
3085
3217
  }
3086
3218
  }
@@ -3092,7 +3224,7 @@ var setStyle = (type, enable) => {
3092
3224
  let startCovered = false;
3093
3225
  let endCovered = false;
3094
3226
  let { from, to } = range;
3095
- (0, import_language4.syntaxTree)(state).iterate({
3227
+ (0, import_language5.syntaxTree)(state).iterate({
3096
3228
  from,
3097
3229
  to,
3098
3230
  enter: (node) => {
@@ -3208,13 +3340,13 @@ var setStyle = (type, enable) => {
3208
3340
  from: range.head,
3209
3341
  insert: marker + marker
3210
3342
  },
3211
- range: import_state15.EditorSelection.cursor(range.head + marker.length)
3343
+ range: import_state16.EditorSelection.cursor(range.head + marker.length)
3212
3344
  };
3213
3345
  }
3214
3346
  const changeSet = state.changes(changes2.concat(changesAtEnd));
3215
3347
  return {
3216
3348
  changes: changeSet,
3217
- range: range.empty && !changeSet.empty ? import_state15.EditorSelection.cursor(range.head + marker.length) : import_state15.EditorSelection.range(changeSet.mapPos(range.from, 1), changeSet.mapPos(range.to, -1))
3349
+ range: range.empty && !changeSet.empty ? import_state16.EditorSelection.cursor(range.head + marker.length) : import_state16.EditorSelection.range(changeSet.mapPos(range.from, 1), changeSet.mapPos(range.to, -1))
3218
3350
  };
3219
3351
  });
3220
3352
  dispatch(state.update(changes, {
@@ -3295,7 +3427,7 @@ var insertTable = (view) => {
3295
3427
  snippets.table(view, null, from, from);
3296
3428
  };
3297
3429
  var removeLinkInner = (from, to, changes, state) => {
3298
- (0, import_language4.syntaxTree)(state).iterate({
3430
+ (0, import_language5.syntaxTree)(state).iterate({
3299
3431
  from,
3300
3432
  to,
3301
3433
  enter: (node) => {
@@ -3340,7 +3472,7 @@ var addLink = ({ url, image: image2 } = {}) => {
3340
3472
  let { from, to } = range;
3341
3473
  const cutStyles = [];
3342
3474
  let okay = null;
3343
- (0, import_language4.syntaxTree)(state).iterate({
3475
+ (0, import_language5.syntaxTree)(state).iterate({
3344
3476
  from,
3345
3477
  to,
3346
3478
  enter: (node) => {
@@ -3414,7 +3546,7 @@ var addLink = ({ url, image: image2 } = {}) => {
3414
3546
  const changeSet = state.changes(changes2.concat(changesAfter));
3415
3547
  return {
3416
3548
  changes: changeSet,
3417
- range: import_state15.EditorSelection.cursor(changeSet.mapPos(to, 1) - cursorOffset - (url ? url.length + 2 : 0))
3549
+ range: import_state16.EditorSelection.cursor(changeSet.mapPos(to, 1) - cursorOffset - (url ? url.length + 2 : 0))
3418
3550
  };
3419
3551
  });
3420
3552
  if (changes.changes.empty) {
@@ -3435,7 +3567,7 @@ var addList = (type) => {
3435
3567
  let parentColumn = null;
3436
3568
  const blocks = [];
3437
3569
  for (const { from, to } of state.selection.ranges) {
3438
- (0, import_language4.syntaxTree)(state).iterate({
3570
+ (0, import_language5.syntaxTree)(state).iterate({
3439
3571
  from,
3440
3572
  to,
3441
3573
  enter: (node) => {
@@ -3570,7 +3702,7 @@ var removeList = (type) => {
3570
3702
  const stack = [];
3571
3703
  const targetNodeType = type === 0 ? "OrderedList" : type === 1 ? "BulletList" : "TaskList";
3572
3704
  for (const { from, to } of state.selection.ranges) {
3573
- (0, import_language4.syntaxTree)(state).iterate({
3705
+ (0, import_language5.syntaxTree)(state).iterate({
3574
3706
  from,
3575
3707
  to,
3576
3708
  enter: (node) => {
@@ -3657,7 +3789,7 @@ var setBlockquote = (enable) => {
3657
3789
  let lastBlock = -1;
3658
3790
  for (const { from, to } of state.selection.ranges) {
3659
3791
  const sawBlock = false;
3660
- (0, import_language4.syntaxTree)(state).iterate({
3792
+ (0, import_language5.syntaxTree)(state).iterate({
3661
3793
  from,
3662
3794
  to,
3663
3795
  enter: (node) => {
@@ -3747,7 +3879,7 @@ var addCodeblock = (target) => {
3747
3879
  for (const { from, to } of selection.ranges) {
3748
3880
  let blockFrom = from;
3749
3881
  let blockTo = to;
3750
- (0, import_language4.syntaxTree)(state).iterate({
3882
+ (0, import_language5.syntaxTree)(state).iterate({
3751
3883
  from,
3752
3884
  to,
3753
3885
  enter: (node) => {
@@ -3798,7 +3930,7 @@ var removeCodeblock = ({ state, dispatch }) => {
3798
3930
  let lastBlock = -1;
3799
3931
  const changes = [];
3800
3932
  for (const { from, to } of state.selection.ranges) {
3801
- (0, import_language4.syntaxTree)(state).iterate({
3933
+ (0, import_language5.syntaxTree)(state).iterate({
3802
3934
  from,
3803
3935
  to,
3804
3936
  enter: (node) => {
@@ -3848,7 +3980,7 @@ var toggleCodeblock = (target) => {
3848
3980
  };
3849
3981
  var formattingKeymap = (_options = {}) => {
3850
3982
  return [
3851
- import_view18.keymap.of([
3983
+ import_view20.keymap.of([
3852
3984
  {
3853
3985
  key: "meta-b",
3854
3986
  run: toggleStrong
@@ -3960,7 +4092,7 @@ var getFormatting = (state) => {
3960
4092
  }
3961
4093
  }
3962
4094
  }
3963
- (0, import_language4.syntaxTree)(state).iterate({
4095
+ (0, import_language5.syntaxTree)(state).iterate({
3964
4096
  from: range.from,
3965
4097
  to: range.to,
3966
4098
  enter: (node) => {
@@ -4049,7 +4181,7 @@ var getFormatting = (state) => {
4049
4181
  };
4050
4182
  };
4051
4183
  var useFormattingState = (state) => {
4052
- return (0, import_react6.useMemo)(() => import_view18.EditorView.updateListener.of((update2) => {
4184
+ return (0, import_react6.useMemo)(() => import_view20.EditorView.updateListener.of((update2) => {
4053
4185
  if (update2.docChanged || update2.selectionSet) {
4054
4186
  Object.entries(getFormatting(update2.state)).forEach(([key, active]) => {
4055
4187
  state[key] = active;
@@ -4136,7 +4268,7 @@ var markdownTagsExtensions = [
4136
4268
  }
4137
4269
  ];
4138
4270
  var markdownHighlightStyle = (_options = {}) => {
4139
- return import_language6.HighlightStyle.define([
4271
+ return import_language7.HighlightStyle.define([
4140
4272
  {
4141
4273
  tag: [
4142
4274
  import_highlight2.tags.keyword,
@@ -4300,8 +4432,8 @@ var createMarkdownExtensions = ({ themeMode } = {}) => {
4300
4432
  ]
4301
4433
  }),
4302
4434
  // Custom styles.
4303
- (0, import_language5.syntaxHighlighting)(markdownHighlightStyle()),
4304
- import_view19.keymap.of([
4435
+ (0, import_language6.syntaxHighlighting)(markdownHighlightStyle()),
4436
+ import_view21.keymap.of([
4305
4437
  // https://codemirror.net/docs/ref/#commands.indentWithTab
4306
4438
  import_commands3.indentWithTab,
4307
4439
  // https://codemirror.net/docs/ref/#commands.defaultKeymap
@@ -4311,7 +4443,7 @@ var createMarkdownExtensions = ({ themeMode } = {}) => {
4311
4443
  ])
4312
4444
  ];
4313
4445
  };
4314
- var debugTree = (cb) => import_state16.StateField.define({
4446
+ var debugTree = (cb) => import_state17.StateField.define({
4315
4447
  create: (state) => cb(convertTreeToJson(state)),
4316
4448
  update: (value, tr) => cb(convertTreeToJson(tr.state))
4317
4449
  });
@@ -4332,15 +4464,15 @@ var convertTreeToJson = (state) => {
4332
4464
  }
4333
4465
  return node;
4334
4466
  };
4335
- return treeToJson((0, import_language7.syntaxTree)(state).cursor());
4467
+ return treeToJson((0, import_language8.syntaxTree)(state).cursor());
4336
4468
  };
4337
4469
  var adjustChanges = () => {
4338
- return import_view21.ViewPlugin.fromClass(class {
4470
+ return import_view23.ViewPlugin.fromClass(class {
4339
4471
  update(update2) {
4340
- const tree = (0, import_language9.syntaxTree)(update2.state);
4472
+ const tree = (0, import_language10.syntaxTree)(update2.state);
4341
4473
  const adjustments = [];
4342
4474
  for (const tr of update2.transactions) {
4343
- const event = tr.annotation(import_state18.Transaction.userEvent);
4475
+ const event = tr.annotation(import_state19.Transaction.userEvent);
4344
4476
  switch (event) {
4345
4477
  //
4346
4478
  // Enter
@@ -4475,9 +4607,9 @@ var getValidUrl = (str) => {
4475
4607
  };
4476
4608
  var image = (_options = {}) => {
4477
4609
  return [
4478
- import_state19.StateField.define({
4610
+ import_state20.StateField.define({
4479
4611
  create: (state) => {
4480
- return import_view22.Decoration.set(buildDecorations(0, state.doc.length, state));
4612
+ return import_view24.Decoration.set(buildDecorations2(0, state.doc.length, state));
4481
4613
  },
4482
4614
  update: (value, tr) => {
4483
4615
  if (!tr.docChanged && !tr.selection) {
@@ -4497,10 +4629,10 @@ var image = (_options = {}) => {
4497
4629
  filterFrom: from,
4498
4630
  filterTo: to,
4499
4631
  filter: () => false,
4500
- add: buildDecorations(from, to, tr.state)
4632
+ add: buildDecorations2(from, to, tr.state)
4501
4633
  });
4502
4634
  },
4503
- provide: (field) => import_view22.EditorView.decorations.from(field)
4635
+ provide: (field) => import_view24.EditorView.decorations.from(field)
4504
4636
  })
4505
4637
  ];
4506
4638
  };
@@ -4512,10 +4644,10 @@ var preloadImage = (url) => {
4512
4644
  preloaded.add(url);
4513
4645
  }
4514
4646
  };
4515
- var buildDecorations = (from, to, state) => {
4647
+ var buildDecorations2 = (from, to, state) => {
4516
4648
  const decorations = [];
4517
4649
  const cursor = state.selection.main.head;
4518
- (0, import_language10.syntaxTree)(state).iterate({
4650
+ (0, import_language11.syntaxTree)(state).iterate({
4519
4651
  enter: (node) => {
4520
4652
  if (node.name === "Image") {
4521
4653
  const urlNode = node.node.getChild("URL");
@@ -4526,7 +4658,7 @@ var buildDecorations = (from, to, state) => {
4526
4658
  return;
4527
4659
  }
4528
4660
  preloadImage(url);
4529
- decorations.push(import_view22.Decoration.replace({
4661
+ decorations.push(import_view24.Decoration.replace({
4530
4662
  block: true,
4531
4663
  widget: new ImageWidget(url)
4532
4664
  }).range(hide2 ? node.from : node.to, node.to));
@@ -4538,7 +4670,7 @@ var buildDecorations = (from, to, state) => {
4538
4670
  });
4539
4671
  return decorations;
4540
4672
  };
4541
- var ImageWidget = class extends import_view22.WidgetType {
4673
+ var ImageWidget = class extends import_view24.WidgetType {
4542
4674
  constructor(_url) {
4543
4675
  super();
4544
4676
  this._url = _url;
@@ -4560,7 +4692,7 @@ var ImageWidget = class extends import_view22.WidgetType {
4560
4692
  };
4561
4693
  var bulletListIndentationWidth = 24;
4562
4694
  var orderedListIndentationWidth = 36;
4563
- var formattingStyles = import_view23.EditorView.theme({
4695
+ var formattingStyles = import_view25.EditorView.theme({
4564
4696
  /**
4565
4697
  * Horizontal rule.
4566
4698
  */
@@ -4678,14 +4810,14 @@ var formattingStyles = import_view23.EditorView.theme({
4678
4810
  }
4679
4811
  });
4680
4812
  var table = (options = {}) => {
4681
- return import_state20.StateField.define({
4813
+ return import_state21.StateField.define({
4682
4814
  create: (state) => update(state, options),
4683
4815
  update: (_, tr) => update(tr.state, options),
4684
- provide: (field) => import_view24.EditorView.decorations.from(field)
4816
+ provide: (field) => import_view26.EditorView.decorations.from(field)
4685
4817
  });
4686
4818
  };
4687
4819
  var update = (state, _options) => {
4688
- const builder = new import_state20.RangeSetBuilder();
4820
+ const builder = new import_state21.RangeSetBuilder();
4689
4821
  const cursor = state.selection.main.head;
4690
4822
  const tables = [];
4691
4823
  const getTable = () => tables[tables.length - 1];
@@ -4693,7 +4825,7 @@ var update = (state, _options) => {
4693
4825
  const table2 = getTable();
4694
4826
  return table2.rows?.[table2.rows.length - 1];
4695
4827
  };
4696
- (0, import_language11.syntaxTree)(state).iterate({
4828
+ (0, import_language12.syntaxTree)(state).iterate({
4697
4829
  enter: (node) => {
4698
4830
  switch (node.name) {
4699
4831
  case "Table": {
@@ -4726,19 +4858,19 @@ var update = (state, _options) => {
4726
4858
  tables.forEach((table2) => {
4727
4859
  const replace = state.readOnly || cursor < table2.from || cursor > table2.to;
4728
4860
  if (replace) {
4729
- builder.add(table2.from, table2.to, import_view24.Decoration.replace({
4861
+ builder.add(table2.from, table2.to, import_view26.Decoration.replace({
4730
4862
  block: true,
4731
4863
  widget: new TableWidget(table2)
4732
4864
  }));
4733
4865
  } else {
4734
- builder.add(table2.from, table2.to, import_view24.Decoration.mark({
4866
+ builder.add(table2.from, table2.to, import_view26.Decoration.mark({
4735
4867
  class: "cm-table"
4736
4868
  }));
4737
4869
  }
4738
4870
  });
4739
4871
  return builder.finish();
4740
4872
  };
4741
- var TableWidget = class extends import_view24.WidgetType {
4873
+ var TableWidget = class extends import_view26.WidgetType {
4742
4874
  constructor(_table) {
4743
4875
  super();
4744
4876
  this._table = _table;
@@ -4778,14 +4910,14 @@ var Unicode = {
4778
4910
  bulletSmall: "\u2219",
4779
4911
  bulletSquare: "\u2B1D"
4780
4912
  };
4781
- var HorizontalRuleWidget = class extends import_view20.WidgetType {
4913
+ var HorizontalRuleWidget = class extends import_view22.WidgetType {
4782
4914
  toDOM() {
4783
4915
  const el = document.createElement("span");
4784
4916
  el.className = "cm-hr";
4785
4917
  return el;
4786
4918
  }
4787
4919
  };
4788
- var LinkButton = class extends import_view20.WidgetType {
4920
+ var LinkButton = class extends import_view22.WidgetType {
4789
4921
  constructor(url, render) {
4790
4922
  super();
4791
4923
  this.url = url;
@@ -4801,7 +4933,7 @@ var LinkButton = class extends import_view20.WidgetType {
4801
4933
  return el;
4802
4934
  }
4803
4935
  };
4804
- var CheckboxWidget = class extends import_view20.WidgetType {
4936
+ var CheckboxWidget = class extends import_view22.WidgetType {
4805
4937
  constructor(_checked) {
4806
4938
  super();
4807
4939
  this._checked = _checked;
@@ -4846,7 +4978,7 @@ var CheckboxWidget = class extends import_view20.WidgetType {
4846
4978
  return false;
4847
4979
  }
4848
4980
  };
4849
- var TextWidget = class extends import_view20.WidgetType {
4981
+ var TextWidget = class extends import_view22.WidgetType {
4850
4982
  constructor(text, className) {
4851
4983
  super();
4852
4984
  this.text = text;
@@ -4861,29 +4993,29 @@ var TextWidget = class extends import_view20.WidgetType {
4861
4993
  return el;
4862
4994
  }
4863
4995
  };
4864
- var hide = import_view20.Decoration.replace({});
4865
- var blockQuote = import_view20.Decoration.line({
4996
+ var hide = import_view22.Decoration.replace({});
4997
+ var blockQuote = import_view22.Decoration.line({
4866
4998
  class: (0, import_react_ui_theme7.mx)("cm-blockquote")
4867
4999
  });
4868
- var fencedCodeLine = import_view20.Decoration.line({
5000
+ var fencedCodeLine = import_view22.Decoration.line({
4869
5001
  class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line")
4870
5002
  });
4871
- var fencedCodeLineFirst = import_view20.Decoration.line({
5003
+ var fencedCodeLineFirst = import_view22.Decoration.line({
4872
5004
  class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line", "cm-codeblock-first")
4873
5005
  });
4874
- var fencedCodeLineLast = import_view20.Decoration.line({
5006
+ var fencedCodeLineLast = import_view22.Decoration.line({
4875
5007
  class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line", "cm-codeblock-last")
4876
5008
  });
4877
5009
  var commentBlockLine = fencedCodeLine;
4878
5010
  var commentBlockLineFirst = fencedCodeLineFirst;
4879
5011
  var commentBlockLineLast = fencedCodeLineLast;
4880
- var horizontalRule = import_view20.Decoration.replace({
5012
+ var horizontalRule = import_view22.Decoration.replace({
4881
5013
  widget: new HorizontalRuleWidget()
4882
5014
  });
4883
- var checkedTask = import_view20.Decoration.replace({
5015
+ var checkedTask = import_view22.Decoration.replace({
4884
5016
  widget: new CheckboxWidget(true)
4885
5017
  });
4886
- var uncheckedTask = import_view20.Decoration.replace({
5018
+ var uncheckedTask = import_view22.Decoration.replace({
4887
5019
  widget: new CheckboxWidget(false)
4888
5020
  });
4889
5021
  var editingRange = (state, range, focus2) => {
@@ -4898,9 +5030,9 @@ var autoHideTags = /* @__PURE__ */ new Set([
4898
5030
  "SubscriptMark",
4899
5031
  "SuperscriptMark"
4900
5032
  ]);
4901
- var buildDecorations2 = (view, options, focus2) => {
4902
- const deco = new import_state17.RangeSetBuilder();
4903
- const atomicDeco = new import_state17.RangeSetBuilder();
5033
+ var buildDecorations3 = (view, options, focus2) => {
5034
+ const deco = new import_state18.RangeSetBuilder();
5035
+ const atomicDeco = new import_state18.RangeSetBuilder();
4904
5036
  const { state } = view;
4905
5037
  const headerLevels = [];
4906
5038
  const getHeaderLevels = (node, level) => {
@@ -4987,7 +5119,7 @@ var buildDecorations2 = (view, options, focus2) => {
4987
5119
  } else {
4988
5120
  const num = headers.slice(from - 1).map((level2) => level2?.number ?? 0).join(".") + " ";
4989
5121
  if (num.length) {
4990
- atomicDeco.add(mark.from, mark.from + len, import_view20.Decoration.replace({
5122
+ atomicDeco.add(mark.from, mark.from + len, import_view22.Decoration.replace({
4991
5123
  widget: new TextWidget(num, theme.heading(level))
4992
5124
  }));
4993
5125
  }
@@ -5012,7 +5144,7 @@ var buildDecorations2 = (view, options, focus2) => {
5012
5144
  if (node.from === line.to - 1) {
5013
5145
  return false;
5014
5146
  }
5015
- deco.add(line.from, line.from, import_view20.Decoration.line({
5147
+ deco.add(line.from, line.from, import_view22.Decoration.line({
5016
5148
  class: "cm-list-item",
5017
5149
  attributes: {
5018
5150
  style: `padding-left: ${offset}px; text-indent: -${width}px;`
@@ -5029,7 +5161,7 @@ var buildDecorations2 = (view, options, focus2) => {
5029
5161
  const label = list.type === "OrderedList" ? `${++list.number}.` : Unicode.bulletSmall;
5030
5162
  const line = state.doc.lineAt(node.from);
5031
5163
  const to = state.doc.sliceString(node.to, node.to + 1) === " " ? node.to + 1 : node.to;
5032
- atomicDeco.add(line.from, to, import_view20.Decoration.replace({
5164
+ atomicDeco.add(line.from, to, import_view22.Decoration.replace({
5033
5165
  widget: new TextWidget(label, list.type === "OrderedList" ? "cm-list-mark cm-list-mark-ordered" : "cm-list-mark cm-list-mark-bullet")
5034
5166
  }));
5035
5167
  break;
@@ -5116,7 +5248,7 @@ var buildDecorations2 = (view, options, focus2) => {
5116
5248
  if (!editing) {
5117
5249
  atomicDeco.add(node.from, marks[0].to, hide);
5118
5250
  }
5119
- deco.add(marks[0].to, marks[1].from, import_view20.Decoration.mark({
5251
+ deco.add(marks[0].to, marks[1].from, import_view22.Decoration.mark({
5120
5252
  tagName: "a",
5121
5253
  attributes: {
5122
5254
  class: "cm-link",
@@ -5126,7 +5258,7 @@ var buildDecorations2 = (view, options, focus2) => {
5126
5258
  }
5127
5259
  }));
5128
5260
  if (!editing) {
5129
- atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view20.Decoration.replace({
5261
+ atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view22.Decoration.replace({
5130
5262
  widget: new LinkButton(url, options.renderLinkButton)
5131
5263
  }) : hide);
5132
5264
  }
@@ -5160,7 +5292,7 @@ var buildDecorations2 = (view, options, focus2) => {
5160
5292
  }
5161
5293
  }
5162
5294
  };
5163
- const tree = (0, import_language8.syntaxTree)(state);
5295
+ const tree = (0, import_language9.syntaxTree)(state);
5164
5296
  if (options.numberedHeadings?.from === void 0) {
5165
5297
  for (const { from, to } of view.visibleRanges) {
5166
5298
  tree.iterate({
@@ -5181,16 +5313,16 @@ var buildDecorations2 = (view, options, focus2) => {
5181
5313
  atomicDeco: atomicDeco.finish()
5182
5314
  };
5183
5315
  };
5184
- var forceUpdate = import_state17.StateEffect.define();
5316
+ var forceUpdate = import_state18.StateEffect.define();
5185
5317
  var decorateMarkdown = (options = {}) => {
5186
5318
  return [
5187
- import_view20.ViewPlugin.fromClass(class {
5319
+ import_view22.ViewPlugin.fromClass(class {
5188
5320
  constructor(view) {
5189
- ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations2(view, options, view.hasFocus));
5321
+ ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations3(view, options, view.hasFocus));
5190
5322
  }
5191
5323
  update(update2) {
5192
5324
  if (update2.docChanged || update2.viewportChanged || update2.focusChanged || update2.transactions.some((tr) => tr.effects.some((effect) => effect.is(forceUpdate))) || update2.selectionSet && !options.selectionChangeDelay) {
5193
- ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations2(update2.view, options, update2.view.hasFocus));
5325
+ ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations3(update2.view, options, update2.view.hasFocus));
5194
5326
  this.clearUpdate();
5195
5327
  } else if (update2.selectionSet) {
5196
5328
  this.scheduleUpdate(update2.view);
@@ -5216,9 +5348,9 @@ var decorateMarkdown = (options = {}) => {
5216
5348
  }
5217
5349
  }, {
5218
5350
  provide: (plugin) => [
5219
- import_view20.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view20.Decoration.none),
5220
- import_view20.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view20.Decoration.none),
5221
- import_view20.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view20.Decoration.none)
5351
+ import_view22.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view22.Decoration.none),
5352
+ import_view22.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view22.Decoration.none),
5353
+ import_view22.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view22.Decoration.none)
5222
5354
  ]
5223
5355
  }),
5224
5356
  image(),
@@ -5228,8 +5360,8 @@ var decorateMarkdown = (options = {}) => {
5228
5360
  ];
5229
5361
  };
5230
5362
  var linkTooltip = (render) => {
5231
- return (0, import_view25.hoverTooltip)((view, pos, side) => {
5232
- const syntax = (0, import_language12.syntaxTree)(view.state).resolveInner(pos, side);
5363
+ return (0, import_view27.hoverTooltip)((view, pos, side) => {
5364
+ const syntax = (0, import_language13.syntaxTree)(view.state).resolveInner(pos, side);
5233
5365
  let link = null;
5234
5366
  for (let i = 0, node = syntax; !link && node && i < 5; node = node.parent, i++) {
5235
5367
  link = node.name === "Link" ? node : null;
@@ -5312,7 +5444,7 @@ var InputModeExtensions = {
5312
5444
  editorInputMode.of({
5313
5445
  type: "vscode"
5314
5446
  }),
5315
- import_view26.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5447
+ import_view28.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5316
5448
  ],
5317
5449
  vim: [
5318
5450
  // https://github.com/replit/codemirror-vim
@@ -5321,7 +5453,7 @@ var InputModeExtensions = {
5321
5453
  type: "vim",
5322
5454
  noTabster: true
5323
5455
  }),
5324
- import_view26.keymap.of([
5456
+ import_view28.keymap.of([
5325
5457
  {
5326
5458
  key: "Alt-Escape",
5327
5459
  run: (view) => {
@@ -5341,7 +5473,7 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
5341
5473
  let t;
5342
5474
  let idx = 0;
5343
5475
  return [
5344
- import_view27.keymap.of([
5476
+ import_view29.keymap.of([
5345
5477
  {
5346
5478
  // Reset.
5347
5479
  key: "alt-meta-'",
@@ -5423,14 +5555,14 @@ var useTextEditor = (props = {}, deps = []) => {
5423
5555
  anchor
5424
5556
  };
5425
5557
  }
5426
- const state = import_state21.EditorState.create({
5558
+ const state = import_state22.EditorState.create({
5427
5559
  doc: initialValue,
5428
5560
  // selection: initialSelection,
5429
5561
  extensions: [
5430
5562
  id && documentId.of(id),
5431
5563
  extensions,
5432
5564
  // NOTE: This doesn't catch errors in keymap functions.
5433
- import_view28.EditorView.exceptionSink.of((err) => {
5565
+ import_view30.EditorView.exceptionSink.of((err) => {
5434
5566
  import_log7.log.catch(err, void 0, {
5435
5567
  F: __dxlog_file11,
5436
5568
  L: 97,
@@ -5440,10 +5572,10 @@ var useTextEditor = (props = {}, deps = []) => {
5440
5572
  })
5441
5573
  ].filter(import_util5.isNotFalsy)
5442
5574
  });
5443
- view2 = new import_view28.EditorView({
5575
+ view2 = new import_view30.EditorView({
5444
5576
  parent: parentRef.current,
5445
5577
  state,
5446
- scrollTo: scrollTo ? import_view28.EditorView.scrollIntoView(scrollTo, {
5578
+ scrollTo: scrollTo ? import_view30.EditorView.scrollIntoView(scrollTo, {
5447
5579
  yMargin: 96
5448
5580
  }) : void 0,
5449
5581
  dispatchTransactions: debug ? debugDispatcher : void 0