@dxos/react-ui-editor 0.8.1-main.ae460ac → 0.8.1-staging.31c3ee1

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 (56) hide show
  1. package/dist/lib/browser/index.mjs +283 -147
  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 +317 -185
  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 +283 -147
  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 +4 -3
  11. package/dist/types/src/InputMode.stories.d.ts.map +1 -1
  12. package/dist/types/src/TextEditor.stories.d.ts +38 -72
  13. package/dist/types/src/TextEditor.stories.d.ts.map +1 -1
  14. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +2 -1
  15. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  16. package/dist/types/src/defaults.d.ts +2 -0
  17. package/dist/types/src/defaults.d.ts.map +1 -1
  18. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +4 -3
  19. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  20. package/dist/types/src/extensions/command/command.d.ts +4 -2
  21. package/dist/types/src/extensions/command/command.d.ts.map +1 -1
  22. package/dist/types/src/extensions/command/hint.d.ts.map +1 -1
  23. package/dist/types/src/extensions/command/menu.d.ts +12 -0
  24. package/dist/types/src/extensions/command/menu.d.ts.map +1 -0
  25. package/dist/types/src/extensions/command/preview.d.ts +12 -0
  26. package/dist/types/src/extensions/command/preview.d.ts.map +1 -0
  27. package/dist/types/src/extensions/command/state.d.ts.map +1 -1
  28. package/dist/types/src/extensions/comments.d.ts +3 -3
  29. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  30. package/dist/types/src/extensions/factories.d.ts +2 -1
  31. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  32. package/dist/types/src/{styles/stack-item-content-class-names.d.ts → fragments.d.ts} +1 -1
  33. package/dist/types/src/fragments.d.ts.map +1 -0
  34. package/dist/types/src/hooks/useTextEditor.d.ts +3 -3
  35. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  36. package/dist/types/src/index.d.ts +0 -1
  37. package/dist/types/src/index.d.ts.map +1 -1
  38. package/dist/types/src/styles/theme.d.ts.map +1 -1
  39. package/package.json +28 -28
  40. package/src/InputMode.stories.tsx +4 -4
  41. package/src/TextEditor.stories.tsx +173 -59
  42. package/src/components/EditorToolbar/EditorToolbar.tsx +4 -5
  43. package/src/defaults.ts +12 -0
  44. package/src/extensions/command/command.ts +21 -2
  45. package/src/extensions/command/hint.ts +3 -0
  46. package/src/extensions/command/menu.ts +100 -0
  47. package/src/extensions/command/preview.ts +79 -0
  48. package/src/extensions/command/state.ts +9 -4
  49. package/src/extensions/comments.ts +6 -10
  50. package/src/extensions/factories.ts +4 -3
  51. package/src/{styles/stack-item-content-class-names.ts → fragments.ts} +4 -2
  52. package/src/hooks/useTextEditor.ts +17 -8
  53. package/src/index.ts +0 -4
  54. package/src/styles/theme.ts +6 -1
  55. package/src/util/debug.ts +1 -1
  56. 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 === "article" ? "min-bs-0" : "[&_.cm-scroller]:overflow-hidden [&_.cm-scroller]:min-bs-24");
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.
@@ -756,6 +763,7 @@ var defaultTheme = {
756
763
  ".cm-link": {
757
764
  textDecorationLine: "underline",
758
765
  textDecorationThickness: "1px",
766
+ textDecorationColor: "var(--dx-separator)",
759
767
  textUnderlineOffset: "2px",
760
768
  borderRadius: ".125rem"
761
769
  },
@@ -882,6 +890,8 @@ var editorMonospace = import_view2.EditorView.theme({
882
890
  }
883
891
  });
884
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");
885
895
  var singleValueFacet = (defaultValue) => import_state3.Facet.define({
886
896
  // Called immediately.
887
897
  combine: (providers) => {
@@ -968,7 +978,7 @@ var logChanges = (trs) => {
968
978
  return changes2;
969
979
  }).filter(Boolean);
970
980
  if (changes.length) {
971
- import_log.log.info("changes", {
981
+ (0, import_log.log)("changes", {
972
982
  changes
973
983
  }, {
974
984
  F: __dxlog_file,
@@ -2041,18 +2051,19 @@ var commandState = import_state9.StateField.define({
2041
2051
  const widthWithoutPadding = parent.clientWidth - parseFloat(paddingLeft) - parseFloat(paddingRight);
2042
2052
  dom.style.width = `${widthWithoutPadding}px`;
2043
2053
  }
2044
- options.onRender(dom, (action) => {
2054
+ options.onRenderDialog(dom, (action) => {
2045
2055
  view2.dispatch({
2046
2056
  effects: closeEffect.of(null)
2047
2057
  });
2048
2058
  if (action?.insert?.length) {
2059
+ const text = action.insert + "\n";
2049
2060
  view2.dispatch({
2050
2061
  changes: {
2051
2062
  from: pos,
2052
- insert: action.insert
2063
+ insert: text
2053
2064
  },
2054
2065
  selection: {
2055
- anchor: pos + action.insert.length
2066
+ anchor: pos + text.length
2056
2067
  }
2057
2068
  });
2058
2069
  }
@@ -2176,14 +2187,139 @@ var hintViewPlugin = ({ onHint }) => import_view9.ViewPlugin.fromClass(class {
2176
2187
  import_view9.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view9.Decoration.none)
2177
2188
  ]
2178
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
+ };
2179
2300
  var command = (options) => {
2180
2301
  return [
2181
2302
  commandConfig.of(options),
2182
2303
  commandState,
2183
2304
  import_view8.keymap.of(commandKeyBindings),
2305
+ preview(options),
2306
+ floatingMenu(options),
2184
2307
  hintViewPlugin(options),
2185
2308
  import_view8.EditorView.focusChangeEffect.of((_, focusing) => {
2186
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
+ }
2187
2323
  })
2188
2324
  ];
2189
2325
  };
@@ -2194,10 +2330,10 @@ var createEditorStateTransaction = ({ scrollTo, selection }) => {
2194
2330
  return {
2195
2331
  selection,
2196
2332
  scrollIntoView: !scrollTo,
2197
- effects: scrollTo ? import_view12.EditorView.scrollIntoView(scrollTo, {
2333
+ effects: scrollTo ? import_view14.EditorView.scrollIntoView(scrollTo, {
2198
2334
  yMargin: 96
2199
2335
  }) : void 0,
2200
- annotations: import_state11.Transaction.userEvent.of(stateRestoreAnnotation)
2336
+ annotations: import_state12.Transaction.userEvent.of(stateRestoreAnnotation)
2201
2337
  };
2202
2338
  };
2203
2339
  var createEditorStateStore = (keyPrefix) => ({
@@ -2236,7 +2372,7 @@ var selectionState = ({ getState, setState } = {}) => {
2236
2372
  // setStateDebounced(id, {});
2237
2373
  // },
2238
2374
  // }),
2239
- import_view12.EditorView.updateListener.of(({ view, transactions }) => {
2375
+ import_view14.EditorView.updateListener.of(({ view, transactions }) => {
2240
2376
  const id = view.state.facet(documentId);
2241
2377
  if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
2242
2378
  return;
@@ -2259,7 +2395,7 @@ var selectionState = ({ getState, setState } = {}) => {
2259
2395
  }
2260
2396
  }
2261
2397
  }),
2262
- getState && import_view12.keymap.of([
2398
+ getState && import_view14.keymap.of([
2263
2399
  {
2264
2400
  key: "ctrl-r",
2265
2401
  run: (view) => {
@@ -2274,10 +2410,10 @@ var selectionState = ({ getState, setState } = {}) => {
2274
2410
  ].filter(import_util3.isNotFalsy);
2275
2411
  };
2276
2412
  var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
2277
- var setComments = import_state10.StateEffect.define();
2278
- var setSelection = import_state10.StateEffect.define();
2279
- var setCommentState = import_state10.StateEffect.define();
2280
- 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({
2281
2417
  create: (state) => ({
2282
2418
  id: state.facet(documentId),
2283
2419
  comments: [],
@@ -2315,7 +2451,7 @@ var commentsState = import_state10.StateField.define({
2315
2451
  return value;
2316
2452
  }
2317
2453
  });
2318
- var styles3 = import_view11.EditorView.theme({
2454
+ var styles3 = import_view13.EditorView.theme({
2319
2455
  ".cm-comment, .cm-comment-current": {
2320
2456
  margin: "0 -3px",
2321
2457
  padding: "3px",
@@ -2328,14 +2464,14 @@ var styles3 = import_view11.EditorView.theme({
2328
2464
  textDecoration: "underline"
2329
2465
  }
2330
2466
  });
2331
- var createCommentMark = (id, isCurrent) => import_view11.Decoration.mark({
2467
+ var createCommentMark = (id, isCurrent) => import_view13.Decoration.mark({
2332
2468
  class: isCurrent ? "cm-comment-current" : "cm-comment",
2333
2469
  attributes: {
2334
2470
  "data-testid": "cm-comment",
2335
2471
  "data-comment-id": id
2336
2472
  }
2337
2473
  });
2338
- var commentsDecorations = import_view11.EditorView.decorations.compute([
2474
+ var commentsDecorations = import_view13.EditorView.decorations.compute([
2339
2475
  commentsState
2340
2476
  ], (state) => {
2341
2477
  const { selection: { current }, comments: comments2 } = state.field(commentsState);
@@ -2355,10 +2491,10 @@ var commentsDecorations = import_view11.EditorView.decorations.compute([
2355
2491
  const mark = createCommentMark(comment.comment.id, comment.comment.id === current);
2356
2492
  return mark.range(range.from, range.to);
2357
2493
  }).filter(import_util2.isNonNullable);
2358
- return import_view11.Decoration.set(decorations);
2494
+ return import_view13.Decoration.set(decorations);
2359
2495
  });
2360
- var commentClickedEffect = import_state10.StateEffect.define();
2361
- var handleCommentClick = import_view11.EditorView.domEventHandlers({
2496
+ var commentClickedEffect = import_state11.StateEffect.define();
2497
+ var handleCommentClick = import_view13.EditorView.domEventHandlers({
2362
2498
  click: (event, view) => {
2363
2499
  let target = event.target;
2364
2500
  const editorRoot = view.dom;
@@ -2397,7 +2533,7 @@ var trackPastedComments = (onUpdate) => {
2397
2533
  }
2398
2534
  };
2399
2535
  return [
2400
- import_view11.EditorView.domEventHandlers({
2536
+ import_view13.EditorView.domEventHandlers({
2401
2537
  cut: handleTrack,
2402
2538
  copy: handleTrack
2403
2539
  }),
@@ -2419,7 +2555,7 @@ var trackPastedComments = (onUpdate) => {
2419
2555
  return effects;
2420
2556
  }),
2421
2557
  // Handle paste or the undo of comment deletion.
2422
- import_view11.EditorView.updateListener.of((update2) => {
2558
+ import_view13.EditorView.updateListener.of((update2) => {
2423
2559
  const restore = [];
2424
2560
  for (let i = 0; i < update2.transactions.length; i++) {
2425
2561
  const tr = update2.transactions[i];
@@ -2475,7 +2611,7 @@ var mapTrackedComment = (comment, changes) => ({
2475
2611
  from: changes.mapPos(comment.from, 1),
2476
2612
  to: changes.mapPos(comment.to, 1)
2477
2613
  });
2478
- var restoreCommentEffect = import_state10.StateEffect.define({
2614
+ var restoreCommentEffect = import_state11.StateEffect.define({
2479
2615
  map: mapTrackedComment
2480
2616
  });
2481
2617
  var createComment2 = (view) => {
@@ -2520,7 +2656,7 @@ var comments = (options = {}) => {
2520
2656
  //
2521
2657
  // Keymap.
2522
2658
  //
2523
- options.onCreate && import_view11.keymap.of([
2659
+ options.onCreate && import_view13.keymap.of([
2524
2660
  {
2525
2661
  key: shortcut,
2526
2662
  run: callbackWrapper(createComment2)
@@ -2530,7 +2666,7 @@ var comments = (options = {}) => {
2530
2666
  // Hover tooltip (for key shortcut hints, etc.)
2531
2667
  // TODO(burdon): Factor out to generic hints extension for current selection/line.
2532
2668
  //
2533
- options.onHover && (0, import_view11.hoverTooltip)((view, pos) => {
2669
+ options.onHover && (0, import_view13.hoverTooltip)((view, pos) => {
2534
2670
  const selection = view.state.selection.main;
2535
2671
  if (selection && pos >= selection.from && pos <= selection.to) {
2536
2672
  return {
@@ -2559,7 +2695,7 @@ var comments = (options = {}) => {
2559
2695
  //
2560
2696
  // Track deleted ranges and update ranges for decorations.
2561
2697
  //
2562
- import_view11.EditorView.updateListener.of(({ view, state, changes }) => {
2698
+ import_view13.EditorView.updateListener.of(({ view, state, changes }) => {
2563
2699
  let mod = false;
2564
2700
  const { comments: comments2, ...value } = state.field(commentsState);
2565
2701
  changes.iterChanges((from, to, from2, to2) => {
@@ -2591,7 +2727,7 @@ var comments = (options = {}) => {
2591
2727
  //
2592
2728
  // Track selection/proximity.
2593
2729
  //
2594
- import_view11.EditorView.updateListener.of(({ view, state }) => {
2730
+ import_view13.EditorView.updateListener.of(({ view, state }) => {
2595
2731
  let min = Infinity;
2596
2732
  const { selection: { current, closest }, comments: comments2 } = state.field(commentsState);
2597
2733
  const { head } = state.selection.main;
@@ -2645,7 +2781,7 @@ var scrollThreadIntoView = (view, id, center = true) => {
2645
2781
  anchor: range.from
2646
2782
  } : void 0,
2647
2783
  effects: [
2648
- needsScroll ? import_view11.EditorView.scrollIntoView(range.from, center ? {
2784
+ needsScroll ? import_view13.EditorView.scrollIntoView(range.from, center ? {
2649
2785
  y: "center"
2650
2786
  } : void 0) : [],
2651
2787
  needsSelectionUpdate ? setSelection.of({
@@ -2691,13 +2827,13 @@ var ExternalCommentSync = class {
2691
2827
  this.unsubscribe = subscribe(updateComments);
2692
2828
  }
2693
2829
  };
2694
- var createExternalCommentSync = (id, subscribe, getComments) => import_view11.ViewPlugin.fromClass(class {
2830
+ var createExternalCommentSync = (id, subscribe, getComments) => import_view13.ViewPlugin.fromClass(class {
2695
2831
  constructor(view) {
2696
2832
  return new ExternalCommentSync(view, id, subscribe, getComments);
2697
2833
  }
2698
2834
  });
2699
2835
  var useCommentState = (state) => {
2700
- return (0, import_react4.useMemo)(() => import_view11.EditorView.updateListener.of((update2) => {
2836
+ return (0, import_react4.useMemo)(() => import_view13.EditorView.updateListener.of((update2) => {
2701
2837
  if (update2.docChanged || update2.selectionSet) {
2702
2838
  state.comment = selectionOverlapsComment(update2.state);
2703
2839
  state.selection = hasActiveSelection(update2.state);
@@ -2721,7 +2857,7 @@ var useComments = (view, id, comments2) => {
2721
2857
  });
2722
2858
  };
2723
2859
  var useCommentClickListener = (onCommentClick) => {
2724
- return (0, import_react4.useMemo)(() => import_view11.EditorView.updateListener.of((update2) => {
2860
+ return (0, import_react4.useMemo)(() => import_view13.EditorView.updateListener.of((update2) => {
2725
2861
  update2.transactions.forEach((transaction) => {
2726
2862
  transaction.effects.forEach((effect) => {
2727
2863
  if (effect.is(commentClickedEffect)) {
@@ -2734,15 +2870,15 @@ var useCommentClickListener = (onCommentClick) => {
2734
2870
  ]);
2735
2871
  };
2736
2872
  var debugNodeLogger = (log8 = console.log) => {
2737
- const logTokens = (state) => (0, import_language.syntaxTree)(state).iterate({
2873
+ const logTokens = (state) => (0, import_language2.syntaxTree)(state).iterate({
2738
2874
  enter: (node) => log8(node.type)
2739
2875
  });
2740
- return import_state12.StateField.define({
2876
+ return import_state13.StateField.define({
2741
2877
  create: (state) => logTokens(state),
2742
2878
  update: (_, tr) => logTokens(tr.state)
2743
2879
  });
2744
2880
  };
2745
- var styles4 = import_view13.EditorView.theme({
2881
+ var styles4 = import_view15.EditorView.theme({
2746
2882
  ".cm-dropCursor": {
2747
2883
  borderLeft: "2px solid var(--dx-accentText)",
2748
2884
  color: "var(--dx-accentText)",
@@ -2755,8 +2891,8 @@ var styles4 = import_view13.EditorView.theme({
2755
2891
  var dropFile = (options = {}) => {
2756
2892
  return [
2757
2893
  styles4,
2758
- (0, import_view13.dropCursor)(),
2759
- import_view13.EditorView.domEventHandlers({
2894
+ (0, import_view15.dropCursor)(),
2895
+ import_view15.EditorView.domEventHandlers({
2760
2896
  drop: (event, view) => {
2761
2897
  event.preventDefault();
2762
2898
  const files = event.dataTransfer?.files;
@@ -2775,8 +2911,8 @@ var dropFile = (options = {}) => {
2775
2911
  })
2776
2912
  ];
2777
2913
  };
2778
- var focusEffect = import_state14.StateEffect.define();
2779
- var focusField = import_state14.StateField.define({
2914
+ var focusEffect = import_state15.StateEffect.define();
2915
+ var focusField = import_state15.StateField.define({
2780
2916
  create: () => false,
2781
2917
  update: (value, tr) => {
2782
2918
  for (const effect of tr.effects) {
@@ -2789,7 +2925,7 @@ var focusField = import_state14.StateField.define({
2789
2925
  });
2790
2926
  var focus = [
2791
2927
  focusField,
2792
- import_view15.EditorView.domEventHandlers({
2928
+ import_view17.EditorView.domEventHandlers({
2793
2929
  focus: (event, view) => {
2794
2930
  setTimeout(() => view.dispatch({
2795
2931
  effects: focusEffect.of(true)
@@ -2803,13 +2939,12 @@ var focus = [
2803
2939
  })
2804
2940
  ];
2805
2941
  var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
2806
- 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);
2807
2943
  var defaultBasicOptions = {
2808
2944
  allowMultipleSelections: true,
2809
2945
  bracketMatching: true,
2810
2946
  closeBrackets: true,
2811
2947
  drawSelection: true,
2812
- editable: true,
2813
2948
  focus: true,
2814
2949
  history: true,
2815
2950
  keymap: "standard",
@@ -2826,7 +2961,7 @@ var createBasicExtensions = (_props) => {
2826
2961
  const props = (0, import_lodash4.default)({}, _props, defaultBasicOptions);
2827
2962
  return [
2828
2963
  // NOTE: Doesn't catch errors in keymap functions.
2829
- import_view14.EditorView.exceptionSink.of((err) => {
2964
+ import_view16.EditorView.exceptionSink.of((err) => {
2830
2965
  import_log5.log.catch(err, void 0, {
2831
2966
  F: __dxlog_file8,
2832
2967
  L: 96,
@@ -2834,27 +2969,25 @@ var createBasicExtensions = (_props) => {
2834
2969
  C: (f, a) => f(...a)
2835
2970
  });
2836
2971
  }),
2837
- props.allowMultipleSelections && import_state13.EditorState.allowMultipleSelections.of(true),
2838
- props.bracketMatching && (0, import_language2.bracketMatching)(),
2972
+ props.allowMultipleSelections && import_state14.EditorState.allowMultipleSelections.of(true),
2973
+ props.bracketMatching && (0, import_language3.bracketMatching)(),
2839
2974
  props.closeBrackets && (0, import_autocomplete2.closeBrackets)(),
2840
- props.dropCursor && (0, import_view14.dropCursor)(),
2841
- props.drawSelection && (0, import_view14.drawSelection)({
2975
+ props.dropCursor && (0, import_view16.dropCursor)(),
2976
+ props.drawSelection && (0, import_view16.drawSelection)({
2842
2977
  cursorBlinkRate: 1200
2843
2978
  }),
2979
+ props.editable !== void 0 && import_view16.EditorView.editable.of(props.editable),
2844
2980
  props.focus && focus,
2845
- props.highlightActiveLine && (0, import_view14.highlightActiveLine)(),
2981
+ props.highlightActiveLine && (0, import_view16.highlightActiveLine)(),
2846
2982
  props.history && (0, import_commands2.history)(),
2847
- props.lineNumbers && (0, import_view14.lineNumbers)(),
2848
- props.lineWrapping && import_view14.EditorView.lineWrapping,
2849
- props.placeholder && (0, import_view14.placeholder)(props.placeholder),
2850
- props.readonly && [
2851
- import_state13.EditorState.readOnly.of(true),
2852
- import_view14.EditorView.editable.of(false)
2853
- ],
2854
- props.scrollPastEnd && (0, import_view14.scrollPastEnd)(),
2855
- 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),
2856
2989
  // https://codemirror.net/docs/ref/#view.KeyBinding
2857
- import_view14.keymap.of([
2990
+ import_view16.keymap.of([
2858
2991
  ...(props.keymap && keymaps[props.keymap]) ?? [],
2859
2992
  // NOTE: Tabs are also configured by markdown extension.
2860
2993
  // https://codemirror.net/docs/ref/#commands.indentWithTab
@@ -2885,14 +3018,14 @@ var defaultThemeSlots = {
2885
3018
  var createThemeExtensions = ({ themeMode, styles: styles5, syntaxHighlighting: _syntaxHighlighting, slots: _slots } = {}) => {
2886
3019
  const slots = (0, import_lodash4.default)({}, _slots, defaultThemeSlots);
2887
3020
  return [
2888
- import_view14.EditorView.darkTheme.of(themeMode === "dark"),
2889
- 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),
2890
3023
  // https://github.com/codemirror/theme-one-dark
2891
- _syntaxHighlighting && (themeMode === "dark" ? (0, import_language2.syntaxHighlighting)(import_theme_one_dark.oneDarkHighlightStyle) : (0, import_language2.syntaxHighlighting)(import_language2.defaultHighlightStyle)),
2892
- 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({
2893
3026
  class: slots.editor.className
2894
3027
  }),
2895
- slots.content?.className && import_view14.EditorView.contentAttributes.of({
3028
+ slots.content?.className && import_view16.EditorView.contentAttributes.of({
2896
3029
  class: slots.content.className
2897
3030
  })
2898
3031
  ].filter(import_util4.isNotFalsy);
@@ -2919,12 +3052,12 @@ var createDataExtensions = ({ id, text, space, identity }) => {
2919
3052
  return extensions;
2920
3053
  };
2921
3054
  var folding = (_props = {}) => [
2922
- (0, import_language3.codeFolding)({
3055
+ (0, import_language4.codeFolding)({
2923
3056
  placeholderDOM: () => {
2924
3057
  return document.createElement("span");
2925
3058
  }
2926
3059
  }),
2927
- (0, import_language3.foldGutter)({
3060
+ (0, import_language4.foldGutter)({
2928
3061
  markerDOM: (open) => {
2929
3062
  const el = createElement("div", {
2930
3063
  className: "flex h-full items-center"
@@ -2939,7 +3072,7 @@ var folding = (_props = {}) => [
2939
3072
  }));
2940
3073
  }
2941
3074
  }),
2942
- import_view16.EditorView.theme({
3075
+ import_view18.EditorView.theme({
2943
3076
  ".cm-foldGutter": {
2944
3077
  opacity: 0.3,
2945
3078
  transition: "opacity 0.3s",
@@ -2952,11 +3085,11 @@ var folding = (_props = {}) => [
2952
3085
  ];
2953
3086
  var listener = ({ onFocus, onChange }) => {
2954
3087
  const extensions = [];
2955
- onFocus && extensions.push(import_view17.EditorView.focusChangeEffect.of((_, focusing) => {
3088
+ onFocus && extensions.push(import_view19.EditorView.focusChangeEffect.of((_, focusing) => {
2956
3089
  onFocus(focusing);
2957
3090
  return null;
2958
3091
  }));
2959
- onChange && extensions.push(import_view17.EditorView.updateListener.of((update2) => {
3092
+ onChange && extensions.push(import_view19.EditorView.updateListener.of((update2) => {
2960
3093
  onChange(update2.state.doc.toString(), update2.state.facet(documentId));
2961
3094
  }));
2962
3095
  return extensions;
@@ -2982,7 +3115,7 @@ var setHeading = (level) => {
2982
3115
  let prevBlock = -1;
2983
3116
  for (const range of ranges) {
2984
3117
  let sawBlock = false;
2985
- (0, import_language4.syntaxTree)(state).iterate({
3118
+ (0, import_language5.syntaxTree)(state).iterate({
2986
3119
  from: range.from,
2987
3120
  to: range.to,
2988
3121
  enter: (node) => {
@@ -3079,7 +3212,7 @@ var setStyle = (type, enable) => {
3079
3212
  to: range.head + found + marker.length
3080
3213
  }
3081
3214
  ],
3082
- range: import_state15.EditorSelection.cursor(range.from - marker.length)
3215
+ range: import_state16.EditorSelection.cursor(range.from - marker.length)
3083
3216
  };
3084
3217
  }
3085
3218
  }
@@ -3091,7 +3224,7 @@ var setStyle = (type, enable) => {
3091
3224
  let startCovered = false;
3092
3225
  let endCovered = false;
3093
3226
  let { from, to } = range;
3094
- (0, import_language4.syntaxTree)(state).iterate({
3227
+ (0, import_language5.syntaxTree)(state).iterate({
3095
3228
  from,
3096
3229
  to,
3097
3230
  enter: (node) => {
@@ -3207,13 +3340,13 @@ var setStyle = (type, enable) => {
3207
3340
  from: range.head,
3208
3341
  insert: marker + marker
3209
3342
  },
3210
- range: import_state15.EditorSelection.cursor(range.head + marker.length)
3343
+ range: import_state16.EditorSelection.cursor(range.head + marker.length)
3211
3344
  };
3212
3345
  }
3213
3346
  const changeSet = state.changes(changes2.concat(changesAtEnd));
3214
3347
  return {
3215
3348
  changes: changeSet,
3216
- 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))
3217
3350
  };
3218
3351
  });
3219
3352
  dispatch(state.update(changes, {
@@ -3294,7 +3427,7 @@ var insertTable = (view) => {
3294
3427
  snippets.table(view, null, from, from);
3295
3428
  };
3296
3429
  var removeLinkInner = (from, to, changes, state) => {
3297
- (0, import_language4.syntaxTree)(state).iterate({
3430
+ (0, import_language5.syntaxTree)(state).iterate({
3298
3431
  from,
3299
3432
  to,
3300
3433
  enter: (node) => {
@@ -3339,7 +3472,7 @@ var addLink = ({ url, image: image2 } = {}) => {
3339
3472
  let { from, to } = range;
3340
3473
  const cutStyles = [];
3341
3474
  let okay = null;
3342
- (0, import_language4.syntaxTree)(state).iterate({
3475
+ (0, import_language5.syntaxTree)(state).iterate({
3343
3476
  from,
3344
3477
  to,
3345
3478
  enter: (node) => {
@@ -3413,7 +3546,7 @@ var addLink = ({ url, image: image2 } = {}) => {
3413
3546
  const changeSet = state.changes(changes2.concat(changesAfter));
3414
3547
  return {
3415
3548
  changes: changeSet,
3416
- 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))
3417
3550
  };
3418
3551
  });
3419
3552
  if (changes.changes.empty) {
@@ -3434,7 +3567,7 @@ var addList = (type) => {
3434
3567
  let parentColumn = null;
3435
3568
  const blocks = [];
3436
3569
  for (const { from, to } of state.selection.ranges) {
3437
- (0, import_language4.syntaxTree)(state).iterate({
3570
+ (0, import_language5.syntaxTree)(state).iterate({
3438
3571
  from,
3439
3572
  to,
3440
3573
  enter: (node) => {
@@ -3569,7 +3702,7 @@ var removeList = (type) => {
3569
3702
  const stack = [];
3570
3703
  const targetNodeType = type === 0 ? "OrderedList" : type === 1 ? "BulletList" : "TaskList";
3571
3704
  for (const { from, to } of state.selection.ranges) {
3572
- (0, import_language4.syntaxTree)(state).iterate({
3705
+ (0, import_language5.syntaxTree)(state).iterate({
3573
3706
  from,
3574
3707
  to,
3575
3708
  enter: (node) => {
@@ -3656,7 +3789,7 @@ var setBlockquote = (enable) => {
3656
3789
  let lastBlock = -1;
3657
3790
  for (const { from, to } of state.selection.ranges) {
3658
3791
  const sawBlock = false;
3659
- (0, import_language4.syntaxTree)(state).iterate({
3792
+ (0, import_language5.syntaxTree)(state).iterate({
3660
3793
  from,
3661
3794
  to,
3662
3795
  enter: (node) => {
@@ -3746,7 +3879,7 @@ var addCodeblock = (target) => {
3746
3879
  for (const { from, to } of selection.ranges) {
3747
3880
  let blockFrom = from;
3748
3881
  let blockTo = to;
3749
- (0, import_language4.syntaxTree)(state).iterate({
3882
+ (0, import_language5.syntaxTree)(state).iterate({
3750
3883
  from,
3751
3884
  to,
3752
3885
  enter: (node) => {
@@ -3797,7 +3930,7 @@ var removeCodeblock = ({ state, dispatch }) => {
3797
3930
  let lastBlock = -1;
3798
3931
  const changes = [];
3799
3932
  for (const { from, to } of state.selection.ranges) {
3800
- (0, import_language4.syntaxTree)(state).iterate({
3933
+ (0, import_language5.syntaxTree)(state).iterate({
3801
3934
  from,
3802
3935
  to,
3803
3936
  enter: (node) => {
@@ -3847,7 +3980,7 @@ var toggleCodeblock = (target) => {
3847
3980
  };
3848
3981
  var formattingKeymap = (_options = {}) => {
3849
3982
  return [
3850
- import_view18.keymap.of([
3983
+ import_view20.keymap.of([
3851
3984
  {
3852
3985
  key: "meta-b",
3853
3986
  run: toggleStrong
@@ -3959,7 +4092,7 @@ var getFormatting = (state) => {
3959
4092
  }
3960
4093
  }
3961
4094
  }
3962
- (0, import_language4.syntaxTree)(state).iterate({
4095
+ (0, import_language5.syntaxTree)(state).iterate({
3963
4096
  from: range.from,
3964
4097
  to: range.to,
3965
4098
  enter: (node) => {
@@ -4048,7 +4181,7 @@ var getFormatting = (state) => {
4048
4181
  };
4049
4182
  };
4050
4183
  var useFormattingState = (state) => {
4051
- return (0, import_react6.useMemo)(() => import_view18.EditorView.updateListener.of((update2) => {
4184
+ return (0, import_react6.useMemo)(() => import_view20.EditorView.updateListener.of((update2) => {
4052
4185
  if (update2.docChanged || update2.selectionSet) {
4053
4186
  Object.entries(getFormatting(update2.state)).forEach(([key, active]) => {
4054
4187
  state[key] = active;
@@ -4135,7 +4268,7 @@ var markdownTagsExtensions = [
4135
4268
  }
4136
4269
  ];
4137
4270
  var markdownHighlightStyle = (_options = {}) => {
4138
- return import_language6.HighlightStyle.define([
4271
+ return import_language7.HighlightStyle.define([
4139
4272
  {
4140
4273
  tag: [
4141
4274
  import_highlight2.tags.keyword,
@@ -4299,8 +4432,8 @@ var createMarkdownExtensions = ({ themeMode } = {}) => {
4299
4432
  ]
4300
4433
  }),
4301
4434
  // Custom styles.
4302
- (0, import_language5.syntaxHighlighting)(markdownHighlightStyle()),
4303
- import_view19.keymap.of([
4435
+ (0, import_language6.syntaxHighlighting)(markdownHighlightStyle()),
4436
+ import_view21.keymap.of([
4304
4437
  // https://codemirror.net/docs/ref/#commands.indentWithTab
4305
4438
  import_commands3.indentWithTab,
4306
4439
  // https://codemirror.net/docs/ref/#commands.defaultKeymap
@@ -4310,7 +4443,7 @@ var createMarkdownExtensions = ({ themeMode } = {}) => {
4310
4443
  ])
4311
4444
  ];
4312
4445
  };
4313
- var debugTree = (cb) => import_state16.StateField.define({
4446
+ var debugTree = (cb) => import_state17.StateField.define({
4314
4447
  create: (state) => cb(convertTreeToJson(state)),
4315
4448
  update: (value, tr) => cb(convertTreeToJson(tr.state))
4316
4449
  });
@@ -4331,15 +4464,15 @@ var convertTreeToJson = (state) => {
4331
4464
  }
4332
4465
  return node;
4333
4466
  };
4334
- return treeToJson((0, import_language7.syntaxTree)(state).cursor());
4467
+ return treeToJson((0, import_language8.syntaxTree)(state).cursor());
4335
4468
  };
4336
4469
  var adjustChanges = () => {
4337
- return import_view21.ViewPlugin.fromClass(class {
4470
+ return import_view23.ViewPlugin.fromClass(class {
4338
4471
  update(update2) {
4339
- const tree = (0, import_language9.syntaxTree)(update2.state);
4472
+ const tree = (0, import_language10.syntaxTree)(update2.state);
4340
4473
  const adjustments = [];
4341
4474
  for (const tr of update2.transactions) {
4342
- const event = tr.annotation(import_state18.Transaction.userEvent);
4475
+ const event = tr.annotation(import_state19.Transaction.userEvent);
4343
4476
  switch (event) {
4344
4477
  //
4345
4478
  // Enter
@@ -4474,9 +4607,9 @@ var getValidUrl = (str) => {
4474
4607
  };
4475
4608
  var image = (_options = {}) => {
4476
4609
  return [
4477
- import_state19.StateField.define({
4610
+ import_state20.StateField.define({
4478
4611
  create: (state) => {
4479
- return import_view22.Decoration.set(buildDecorations(0, state.doc.length, state));
4612
+ return import_view24.Decoration.set(buildDecorations2(0, state.doc.length, state));
4480
4613
  },
4481
4614
  update: (value, tr) => {
4482
4615
  if (!tr.docChanged && !tr.selection) {
@@ -4496,10 +4629,10 @@ var image = (_options = {}) => {
4496
4629
  filterFrom: from,
4497
4630
  filterTo: to,
4498
4631
  filter: () => false,
4499
- add: buildDecorations(from, to, tr.state)
4632
+ add: buildDecorations2(from, to, tr.state)
4500
4633
  });
4501
4634
  },
4502
- provide: (field) => import_view22.EditorView.decorations.from(field)
4635
+ provide: (field) => import_view24.EditorView.decorations.from(field)
4503
4636
  })
4504
4637
  ];
4505
4638
  };
@@ -4511,10 +4644,10 @@ var preloadImage = (url) => {
4511
4644
  preloaded.add(url);
4512
4645
  }
4513
4646
  };
4514
- var buildDecorations = (from, to, state) => {
4647
+ var buildDecorations2 = (from, to, state) => {
4515
4648
  const decorations = [];
4516
4649
  const cursor = state.selection.main.head;
4517
- (0, import_language10.syntaxTree)(state).iterate({
4650
+ (0, import_language11.syntaxTree)(state).iterate({
4518
4651
  enter: (node) => {
4519
4652
  if (node.name === "Image") {
4520
4653
  const urlNode = node.node.getChild("URL");
@@ -4525,7 +4658,7 @@ var buildDecorations = (from, to, state) => {
4525
4658
  return;
4526
4659
  }
4527
4660
  preloadImage(url);
4528
- decorations.push(import_view22.Decoration.replace({
4661
+ decorations.push(import_view24.Decoration.replace({
4529
4662
  block: true,
4530
4663
  widget: new ImageWidget(url)
4531
4664
  }).range(hide2 ? node.from : node.to, node.to));
@@ -4537,7 +4670,7 @@ var buildDecorations = (from, to, state) => {
4537
4670
  });
4538
4671
  return decorations;
4539
4672
  };
4540
- var ImageWidget = class extends import_view22.WidgetType {
4673
+ var ImageWidget = class extends import_view24.WidgetType {
4541
4674
  constructor(_url) {
4542
4675
  super();
4543
4676
  this._url = _url;
@@ -4559,7 +4692,7 @@ var ImageWidget = class extends import_view22.WidgetType {
4559
4692
  };
4560
4693
  var bulletListIndentationWidth = 24;
4561
4694
  var orderedListIndentationWidth = 36;
4562
- var formattingStyles = import_view23.EditorView.theme({
4695
+ var formattingStyles = import_view25.EditorView.theme({
4563
4696
  /**
4564
4697
  * Horizontal rule.
4565
4698
  */
@@ -4677,14 +4810,14 @@ var formattingStyles = import_view23.EditorView.theme({
4677
4810
  }
4678
4811
  });
4679
4812
  var table = (options = {}) => {
4680
- return import_state20.StateField.define({
4813
+ return import_state21.StateField.define({
4681
4814
  create: (state) => update(state, options),
4682
4815
  update: (_, tr) => update(tr.state, options),
4683
- provide: (field) => import_view24.EditorView.decorations.from(field)
4816
+ provide: (field) => import_view26.EditorView.decorations.from(field)
4684
4817
  });
4685
4818
  };
4686
4819
  var update = (state, _options) => {
4687
- const builder = new import_state20.RangeSetBuilder();
4820
+ const builder = new import_state21.RangeSetBuilder();
4688
4821
  const cursor = state.selection.main.head;
4689
4822
  const tables = [];
4690
4823
  const getTable = () => tables[tables.length - 1];
@@ -4692,7 +4825,7 @@ var update = (state, _options) => {
4692
4825
  const table2 = getTable();
4693
4826
  return table2.rows?.[table2.rows.length - 1];
4694
4827
  };
4695
- (0, import_language11.syntaxTree)(state).iterate({
4828
+ (0, import_language12.syntaxTree)(state).iterate({
4696
4829
  enter: (node) => {
4697
4830
  switch (node.name) {
4698
4831
  case "Table": {
@@ -4725,19 +4858,19 @@ var update = (state, _options) => {
4725
4858
  tables.forEach((table2) => {
4726
4859
  const replace = state.readOnly || cursor < table2.from || cursor > table2.to;
4727
4860
  if (replace) {
4728
- builder.add(table2.from, table2.to, import_view24.Decoration.replace({
4861
+ builder.add(table2.from, table2.to, import_view26.Decoration.replace({
4729
4862
  block: true,
4730
4863
  widget: new TableWidget(table2)
4731
4864
  }));
4732
4865
  } else {
4733
- builder.add(table2.from, table2.to, import_view24.Decoration.mark({
4866
+ builder.add(table2.from, table2.to, import_view26.Decoration.mark({
4734
4867
  class: "cm-table"
4735
4868
  }));
4736
4869
  }
4737
4870
  });
4738
4871
  return builder.finish();
4739
4872
  };
4740
- var TableWidget = class extends import_view24.WidgetType {
4873
+ var TableWidget = class extends import_view26.WidgetType {
4741
4874
  constructor(_table) {
4742
4875
  super();
4743
4876
  this._table = _table;
@@ -4777,14 +4910,14 @@ var Unicode = {
4777
4910
  bulletSmall: "\u2219",
4778
4911
  bulletSquare: "\u2B1D"
4779
4912
  };
4780
- var HorizontalRuleWidget = class extends import_view20.WidgetType {
4913
+ var HorizontalRuleWidget = class extends import_view22.WidgetType {
4781
4914
  toDOM() {
4782
4915
  const el = document.createElement("span");
4783
4916
  el.className = "cm-hr";
4784
4917
  return el;
4785
4918
  }
4786
4919
  };
4787
- var LinkButton = class extends import_view20.WidgetType {
4920
+ var LinkButton = class extends import_view22.WidgetType {
4788
4921
  constructor(url, render) {
4789
4922
  super();
4790
4923
  this.url = url;
@@ -4800,7 +4933,7 @@ var LinkButton = class extends import_view20.WidgetType {
4800
4933
  return el;
4801
4934
  }
4802
4935
  };
4803
- var CheckboxWidget = class extends import_view20.WidgetType {
4936
+ var CheckboxWidget = class extends import_view22.WidgetType {
4804
4937
  constructor(_checked) {
4805
4938
  super();
4806
4939
  this._checked = _checked;
@@ -4845,7 +4978,7 @@ var CheckboxWidget = class extends import_view20.WidgetType {
4845
4978
  return false;
4846
4979
  }
4847
4980
  };
4848
- var TextWidget = class extends import_view20.WidgetType {
4981
+ var TextWidget = class extends import_view22.WidgetType {
4849
4982
  constructor(text, className) {
4850
4983
  super();
4851
4984
  this.text = text;
@@ -4860,29 +4993,29 @@ var TextWidget = class extends import_view20.WidgetType {
4860
4993
  return el;
4861
4994
  }
4862
4995
  };
4863
- var hide = import_view20.Decoration.replace({});
4864
- var blockQuote = import_view20.Decoration.line({
4996
+ var hide = import_view22.Decoration.replace({});
4997
+ var blockQuote = import_view22.Decoration.line({
4865
4998
  class: (0, import_react_ui_theme7.mx)("cm-blockquote")
4866
4999
  });
4867
- var fencedCodeLine = import_view20.Decoration.line({
5000
+ var fencedCodeLine = import_view22.Decoration.line({
4868
5001
  class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line")
4869
5002
  });
4870
- var fencedCodeLineFirst = import_view20.Decoration.line({
5003
+ var fencedCodeLineFirst = import_view22.Decoration.line({
4871
5004
  class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line", "cm-codeblock-first")
4872
5005
  });
4873
- var fencedCodeLineLast = import_view20.Decoration.line({
5006
+ var fencedCodeLineLast = import_view22.Decoration.line({
4874
5007
  class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line", "cm-codeblock-last")
4875
5008
  });
4876
5009
  var commentBlockLine = fencedCodeLine;
4877
5010
  var commentBlockLineFirst = fencedCodeLineFirst;
4878
5011
  var commentBlockLineLast = fencedCodeLineLast;
4879
- var horizontalRule = import_view20.Decoration.replace({
5012
+ var horizontalRule = import_view22.Decoration.replace({
4880
5013
  widget: new HorizontalRuleWidget()
4881
5014
  });
4882
- var checkedTask = import_view20.Decoration.replace({
5015
+ var checkedTask = import_view22.Decoration.replace({
4883
5016
  widget: new CheckboxWidget(true)
4884
5017
  });
4885
- var uncheckedTask = import_view20.Decoration.replace({
5018
+ var uncheckedTask = import_view22.Decoration.replace({
4886
5019
  widget: new CheckboxWidget(false)
4887
5020
  });
4888
5021
  var editingRange = (state, range, focus2) => {
@@ -4897,9 +5030,9 @@ var autoHideTags = /* @__PURE__ */ new Set([
4897
5030
  "SubscriptMark",
4898
5031
  "SuperscriptMark"
4899
5032
  ]);
4900
- var buildDecorations2 = (view, options, focus2) => {
4901
- const deco = new import_state17.RangeSetBuilder();
4902
- 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();
4903
5036
  const { state } = view;
4904
5037
  const headerLevels = [];
4905
5038
  const getHeaderLevels = (node, level) => {
@@ -4986,7 +5119,7 @@ var buildDecorations2 = (view, options, focus2) => {
4986
5119
  } else {
4987
5120
  const num = headers.slice(from - 1).map((level2) => level2?.number ?? 0).join(".") + " ";
4988
5121
  if (num.length) {
4989
- atomicDeco.add(mark.from, mark.from + len, import_view20.Decoration.replace({
5122
+ atomicDeco.add(mark.from, mark.from + len, import_view22.Decoration.replace({
4990
5123
  widget: new TextWidget(num, theme.heading(level))
4991
5124
  }));
4992
5125
  }
@@ -5011,7 +5144,7 @@ var buildDecorations2 = (view, options, focus2) => {
5011
5144
  if (node.from === line.to - 1) {
5012
5145
  return false;
5013
5146
  }
5014
- deco.add(line.from, line.from, import_view20.Decoration.line({
5147
+ deco.add(line.from, line.from, import_view22.Decoration.line({
5015
5148
  class: "cm-list-item",
5016
5149
  attributes: {
5017
5150
  style: `padding-left: ${offset}px; text-indent: -${width}px;`
@@ -5028,7 +5161,7 @@ var buildDecorations2 = (view, options, focus2) => {
5028
5161
  const label = list.type === "OrderedList" ? `${++list.number}.` : Unicode.bulletSmall;
5029
5162
  const line = state.doc.lineAt(node.from);
5030
5163
  const to = state.doc.sliceString(node.to, node.to + 1) === " " ? node.to + 1 : node.to;
5031
- atomicDeco.add(line.from, to, import_view20.Decoration.replace({
5164
+ atomicDeco.add(line.from, to, import_view22.Decoration.replace({
5032
5165
  widget: new TextWidget(label, list.type === "OrderedList" ? "cm-list-mark cm-list-mark-ordered" : "cm-list-mark cm-list-mark-bullet")
5033
5166
  }));
5034
5167
  break;
@@ -5115,7 +5248,7 @@ var buildDecorations2 = (view, options, focus2) => {
5115
5248
  if (!editing) {
5116
5249
  atomicDeco.add(node.from, marks[0].to, hide);
5117
5250
  }
5118
- 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({
5119
5252
  tagName: "a",
5120
5253
  attributes: {
5121
5254
  class: "cm-link",
@@ -5125,7 +5258,7 @@ var buildDecorations2 = (view, options, focus2) => {
5125
5258
  }
5126
5259
  }));
5127
5260
  if (!editing) {
5128
- 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({
5129
5262
  widget: new LinkButton(url, options.renderLinkButton)
5130
5263
  }) : hide);
5131
5264
  }
@@ -5159,7 +5292,7 @@ var buildDecorations2 = (view, options, focus2) => {
5159
5292
  }
5160
5293
  }
5161
5294
  };
5162
- const tree = (0, import_language8.syntaxTree)(state);
5295
+ const tree = (0, import_language9.syntaxTree)(state);
5163
5296
  if (options.numberedHeadings?.from === void 0) {
5164
5297
  for (const { from, to } of view.visibleRanges) {
5165
5298
  tree.iterate({
@@ -5180,16 +5313,16 @@ var buildDecorations2 = (view, options, focus2) => {
5180
5313
  atomicDeco: atomicDeco.finish()
5181
5314
  };
5182
5315
  };
5183
- var forceUpdate = import_state17.StateEffect.define();
5316
+ var forceUpdate = import_state18.StateEffect.define();
5184
5317
  var decorateMarkdown = (options = {}) => {
5185
5318
  return [
5186
- import_view20.ViewPlugin.fromClass(class {
5319
+ import_view22.ViewPlugin.fromClass(class {
5187
5320
  constructor(view) {
5188
- ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations2(view, options, view.hasFocus));
5321
+ ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations3(view, options, view.hasFocus));
5189
5322
  }
5190
5323
  update(update2) {
5191
5324
  if (update2.docChanged || update2.viewportChanged || update2.focusChanged || update2.transactions.some((tr) => tr.effects.some((effect) => effect.is(forceUpdate))) || update2.selectionSet && !options.selectionChangeDelay) {
5192
- ({ 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));
5193
5326
  this.clearUpdate();
5194
5327
  } else if (update2.selectionSet) {
5195
5328
  this.scheduleUpdate(update2.view);
@@ -5215,9 +5348,9 @@ var decorateMarkdown = (options = {}) => {
5215
5348
  }
5216
5349
  }, {
5217
5350
  provide: (plugin) => [
5218
- import_view20.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view20.Decoration.none),
5219
- import_view20.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view20.Decoration.none),
5220
- 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)
5221
5354
  ]
5222
5355
  }),
5223
5356
  image(),
@@ -5227,8 +5360,8 @@ var decorateMarkdown = (options = {}) => {
5227
5360
  ];
5228
5361
  };
5229
5362
  var linkTooltip = (render) => {
5230
- return (0, import_view25.hoverTooltip)((view, pos, side) => {
5231
- 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);
5232
5365
  let link = null;
5233
5366
  for (let i = 0, node = syntax; !link && node && i < 5; node = node.parent, i++) {
5234
5367
  link = node.name === "Link" ? node : null;
@@ -5311,7 +5444,7 @@ var InputModeExtensions = {
5311
5444
  editorInputMode.of({
5312
5445
  type: "vscode"
5313
5446
  }),
5314
- import_view26.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5447
+ import_view28.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5315
5448
  ],
5316
5449
  vim: [
5317
5450
  // https://github.com/replit/codemirror-vim
@@ -5320,7 +5453,7 @@ var InputModeExtensions = {
5320
5453
  type: "vim",
5321
5454
  noTabster: true
5322
5455
  }),
5323
- import_view26.keymap.of([
5456
+ import_view28.keymap.of([
5324
5457
  {
5325
5458
  key: "Alt-Escape",
5326
5459
  run: (view) => {
@@ -5340,7 +5473,7 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
5340
5473
  let t;
5341
5474
  let idx = 0;
5342
5475
  return [
5343
- import_view27.keymap.of([
5476
+ import_view29.keymap.of([
5344
5477
  {
5345
5478
  // Reset.
5346
5479
  key: "alt-meta-'",
@@ -5422,14 +5555,14 @@ var useTextEditor = (props = {}, deps = []) => {
5422
5555
  anchor
5423
5556
  };
5424
5557
  }
5425
- const state = import_state21.EditorState.create({
5558
+ const state = import_state22.EditorState.create({
5426
5559
  doc: initialValue,
5427
5560
  // selection: initialSelection,
5428
5561
  extensions: [
5429
5562
  id && documentId.of(id),
5430
5563
  extensions,
5431
5564
  // NOTE: This doesn't catch errors in keymap functions.
5432
- import_view28.EditorView.exceptionSink.of((err) => {
5565
+ import_view30.EditorView.exceptionSink.of((err) => {
5433
5566
  import_log7.log.catch(err, void 0, {
5434
5567
  F: __dxlog_file11,
5435
5568
  L: 97,
@@ -5439,10 +5572,10 @@ var useTextEditor = (props = {}, deps = []) => {
5439
5572
  })
5440
5573
  ].filter(import_util5.isNotFalsy)
5441
5574
  });
5442
- view2 = new import_view28.EditorView({
5575
+ view2 = new import_view30.EditorView({
5443
5576
  parent: parentRef.current,
5444
5577
  state,
5445
- scrollTo: scrollTo ? import_view28.EditorView.scrollIntoView(scrollTo, {
5578
+ scrollTo: scrollTo ? import_view30.EditorView.scrollIntoView(scrollTo, {
5446
5579
  yMargin: 96
5447
5580
  }) : void 0,
5448
5581
  dispatchTransactions: debug ? debugDispatcher : void 0
@@ -5506,7 +5639,7 @@ var useTextEditor = (props = {}, deps = []) => {
5506
5639
  autoFocus,
5507
5640
  view
5508
5641
  ]);
5509
- const focusableGroup = (0, import_react_tabster.useFocusableGroup)({
5642
+ const focusableGroupAttrs = (0, import_react_tabster.useFocusableGroup)({
5510
5643
  tabBehavior: "limited",
5511
5644
  ignoreDefaultKeydown: {
5512
5645
  Escape: view?.state.facet(editorInputMode).noTabster
@@ -5525,15 +5658,14 @@ var useTextEditor = (props = {}, deps = []) => {
5525
5658
  }, [
5526
5659
  view
5527
5660
  ]);
5528
- const focusAttributes = {
5529
- tabIndex: 0,
5530
- ...focusableGroup,
5531
- onKeyUp: handleKeyUp
5532
- };
5533
5661
  return {
5534
5662
  parentRef,
5535
5663
  view,
5536
- focusAttributes
5664
+ focusAttributes: {
5665
+ tabIndex: 0,
5666
+ ...focusableGroupAttrs,
5667
+ onKeyUp: handleKeyUp
5668
+ }
5537
5669
  };
5538
5670
  };
5539
5671
  // Annotate the CommonJS export names for ESM import in node: