@dxos/react-ui-editor 0.8.1-staging.391c573 → 0.8.1-staging.97aedb1

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 (55) hide show
  1. package/dist/lib/browser/index.mjs +383 -255
  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 +415 -290
  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 +383 -255
  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 +2 -1
  27. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  28. package/dist/types/src/extensions/folding.d.ts +2 -8
  29. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  30. package/dist/types/src/extensions/selection.d.ts +6 -1
  31. package/dist/types/src/extensions/selection.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/index.d.ts +0 -1
  35. package/dist/types/src/index.d.ts.map +1 -1
  36. package/dist/types/src/styles/theme.d.ts.map +1 -1
  37. package/package.json +27 -27
  38. package/src/InputMode.stories.tsx +4 -4
  39. package/src/TextEditor.stories.tsx +183 -61
  40. package/src/components/EditorToolbar/EditorToolbar.tsx +4 -5
  41. package/src/defaults.ts +12 -0
  42. package/src/extensions/command/command.ts +21 -2
  43. package/src/extensions/command/hint.ts +3 -0
  44. package/src/extensions/command/menu.ts +100 -0
  45. package/src/extensions/command/preview.ts +79 -0
  46. package/src/extensions/command/state.ts +9 -4
  47. package/src/extensions/comments.ts +6 -10
  48. package/src/extensions/factories.ts +4 -3
  49. package/src/extensions/folding.tsx +30 -73
  50. package/src/extensions/selection.ts +41 -21
  51. package/src/{styles/stack-item-content-class-names.ts → fragments.ts} +4 -2
  52. package/src/index.ts +0 -4
  53. package/src/styles/theme.ts +6 -1
  54. package/src/util/debug.ts +1 -1
  55. package/dist/types/src/styles/stack-item-content-class-names.d.ts.map +0 -1
@@ -64,6 +64,7 @@ __export(node_exports, {
64
64
  createDataExtensions: () => createDataExtensions,
65
65
  createEditorAction: () => createEditorAction,
66
66
  createEditorActionGroup: () => createEditorActionGroup,
67
+ createEditorStateStore: () => createEditorStateStore,
67
68
  createEditorStateTransaction: () => createEditorStateTransaction,
68
69
  createElement: () => createElement,
69
70
  createExternalCommentSync: () => createExternalCommentSync,
@@ -118,7 +119,7 @@ __export(node_exports, {
118
119
  setStyle: () => setStyle,
119
120
  singleValueFacet: () => singleValueFacet,
120
121
  stackItemContentEditorClassNames: () => stackItemContentEditorClassNames,
121
- stackItemContentToolbarClassNames: () => stackItemContentToolbarClassNames,
122
+ stackItemContentToolbarClassNames: () => stackItemContentToolbarClassNames2,
122
123
  table: () => table,
123
124
  tags: () => import_highlight.tags,
124
125
  textRange: () => textRange,
@@ -196,90 +197,95 @@ var import_state8 = require("@codemirror/state");
196
197
  var import_view9 = require("@codemirror/view");
197
198
  var import_state9 = require("@codemirror/state");
198
199
  var import_view10 = require("@codemirror/view");
199
- var import_commands = require("@codemirror/commands");
200
- var import_state10 = require("@codemirror/state");
201
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");
202
207
  var import_lodash3 = __toESM(require("lodash.sortby"));
203
208
  var import_react4 = require("react");
204
209
  var import_async3 = require("@dxos/async");
205
210
  var import_log4 = require("@dxos/log");
206
211
  var import_util2 = require("@dxos/util");
207
- var import_state11 = require("@codemirror/state");
208
- var import_view12 = require("@codemirror/view");
209
- var import_async4 = require("@dxos/async");
210
- var import_language = require("@codemirror/language");
211
212
  var import_state12 = require("@codemirror/state");
212
- var import_view13 = require("@codemirror/view");
213
+ var import_view14 = require("@codemirror/view");
214
+ var import_async4 = require("@dxos/async");
215
+ var import_invariant3 = require("@dxos/invariant");
216
+ var import_util3 = require("@dxos/util");
217
+ var import_language2 = require("@codemirror/language");
218
+ var import_state13 = require("@codemirror/state");
219
+ var import_view15 = require("@codemirror/view");
213
220
  var import_autocomplete2 = require("@codemirror/autocomplete");
214
221
  var import_commands2 = require("@codemirror/commands");
215
- var import_language2 = require("@codemirror/language");
222
+ var import_language3 = require("@codemirror/language");
216
223
  var import_search = require("@codemirror/search");
217
- var import_state13 = require("@codemirror/state");
224
+ var import_state14 = require("@codemirror/state");
218
225
  var import_theme_one_dark = require("@codemirror/theme-one-dark");
219
- var import_view14 = require("@codemirror/view");
226
+ var import_view16 = require("@codemirror/view");
220
227
  var import_lodash4 = __toESM(require("lodash.defaultsdeep"));
221
228
  var import_lodash5 = __toESM(require("lodash.merge"));
222
229
  var import_display_name = require("@dxos/display-name");
223
230
  var import_log5 = require("@dxos/log");
224
- var import_util3 = require("@dxos/util");
225
- var import_state14 = require("@codemirror/state");
226
- var import_view15 = require("@codemirror/view");
227
- var import_language3 = require("@codemirror/language");
228
- var import_view16 = require("@codemirror/view");
229
- var import_react5 = __toESM(require("react"));
230
- var import_async5 = require("@dxos/async");
231
- var import_react_ui3 = require("@dxos/react-ui");
231
+ var import_util4 = require("@dxos/util");
232
+ var import_state15 = require("@codemirror/state");
232
233
  var import_view17 = require("@codemirror/view");
233
- var import_autocomplete3 = require("@codemirror/autocomplete");
234
234
  var import_language4 = require("@codemirror/language");
235
- var import_state15 = require("@codemirror/state");
236
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");
237
243
  var import_react6 = require("react");
238
244
  var import_autocomplete4 = require("@codemirror/autocomplete");
239
245
  var import_commands3 = require("@codemirror/commands");
240
246
  var import_lang_markdown2 = require("@codemirror/lang-markdown");
241
- var import_language5 = require("@codemirror/language");
247
+ var import_language6 = require("@codemirror/language");
242
248
  var import_language_data = require("@codemirror/language-data");
243
249
  var import_lint = require("@codemirror/lint");
244
- var import_view19 = require("@codemirror/view");
250
+ var import_view21 = require("@codemirror/view");
245
251
  var import_lang_markdown3 = require("@codemirror/lang-markdown");
246
- var import_language6 = require("@codemirror/language");
252
+ var import_language7 = require("@codemirror/language");
247
253
  var import_highlight2 = require("@lezer/highlight");
248
254
  var import_markdown = require("@lezer/markdown");
249
- var import_language7 = require("@codemirror/language");
250
- var import_state16 = require("@codemirror/state");
251
255
  var import_language8 = require("@codemirror/language");
252
256
  var import_state17 = require("@codemirror/state");
253
- var import_view20 = require("@codemirror/view");
254
- var import_invariant3 = require("@dxos/invariant");
255
- var import_react_ui_theme7 = require("@dxos/react-ui-theme");
256
257
  var import_language9 = require("@codemirror/language");
257
258
  var import_state18 = require("@codemirror/state");
258
- 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");
259
262
  var import_language10 = require("@codemirror/language");
260
263
  var import_state19 = require("@codemirror/state");
261
- var import_view22 = require("@codemirror/view");
262
264
  var import_view23 = require("@codemirror/view");
263
265
  var import_language11 = require("@codemirror/language");
264
266
  var import_state20 = require("@codemirror/state");
265
267
  var import_view24 = require("@codemirror/view");
266
- var import_language12 = require("@codemirror/language");
267
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");
268
274
  var import_react_ui_theme8 = require("@dxos/react-ui-theme");
269
275
  var import_autocomplete5 = require("@codemirror/autocomplete");
270
276
  var import_log6 = require("@dxos/log");
271
- var import_view26 = require("@codemirror/view");
277
+ var import_view28 = require("@codemirror/view");
272
278
  var import_codemirror_vim = require("@replit/codemirror-vim");
273
279
  var import_codemirror_vscode_keymap = require("@replit/codemirror-vscode-keymap");
274
280
  var import_echo_schema = require("@dxos/echo-schema");
275
- var import_view27 = require("@codemirror/view");
281
+ var import_view29 = require("@codemirror/view");
276
282
  var import_react7 = require("react");
277
- var import_state21 = require("@codemirror/state");
278
- var import_view28 = require("@codemirror/view");
283
+ var import_state22 = require("@codemirror/state");
284
+ var import_view30 = require("@codemirror/view");
279
285
  var import_react_tabster = require("@fluentui/react-tabster");
280
286
  var import_react8 = require("react");
281
287
  var import_log7 = require("@dxos/log");
282
- var import_util4 = require("@dxos/util");
288
+ var import_util5 = require("@dxos/util");
283
289
  var translationKey = "react-ui-editor";
284
290
  var translations_default = [
285
291
  {
@@ -562,7 +568,6 @@ var createViewMode = (state) => {
562
568
  ]
563
569
  };
564
570
  };
565
- 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");
566
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");
567
572
  var createToolbar = ({ state, customActions, ...features }) => {
568
573
  const nodes = [];
@@ -699,6 +704,10 @@ var defaultTheme = {
699
704
  background: "transparent"
700
705
  },
701
706
  ".cm-gutter": {},
707
+ ".cm-gutter.cm-lineNumbers": {
708
+ paddingRight: "4px",
709
+ borderRight: "1px solid var(--dx-separator)"
710
+ },
702
711
  ".cm-gutter.cm-lineNumbers .cm-gutterElement": {
703
712
  minWidth: "40px",
704
713
  alignContent: "center"
@@ -708,7 +717,7 @@ var defaultTheme = {
708
717
  */
709
718
  ".cm-gutterElement": {
710
719
  alignItems: "center",
711
- fontSize: "16px"
720
+ fontSize: "12px"
712
721
  },
713
722
  /**
714
723
  * Line.
@@ -754,6 +763,7 @@ var defaultTheme = {
754
763
  ".cm-link": {
755
764
  textDecorationLine: "underline",
756
765
  textDecorationThickness: "1px",
766
+ textDecorationColor: "var(--dx-separator)",
757
767
  textUnderlineOffset: "2px",
758
768
  borderRadius: ".125rem"
759
769
  },
@@ -880,6 +890,8 @@ var editorMonospace = import_view2.EditorView.theme({
880
890
  }
881
891
  });
882
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");
883
895
  var singleValueFacet = (defaultValue) => import_state3.Facet.define({
884
896
  // Called immediately.
885
897
  combine: (providers) => {
@@ -966,7 +978,7 @@ var logChanges = (trs) => {
966
978
  return changes2;
967
979
  }).filter(Boolean);
968
980
  if (changes.length) {
969
- import_log.log.info("changes", {
981
+ (0, import_log.log)("changes", {
970
982
  changes
971
983
  }, {
972
984
  F: __dxlog_file,
@@ -2039,18 +2051,19 @@ var commandState = import_state9.StateField.define({
2039
2051
  const widthWithoutPadding = parent.clientWidth - parseFloat(paddingLeft) - parseFloat(paddingRight);
2040
2052
  dom.style.width = `${widthWithoutPadding}px`;
2041
2053
  }
2042
- options.onRender(dom, (action) => {
2054
+ options.onRenderDialog(dom, (action) => {
2043
2055
  view2.dispatch({
2044
2056
  effects: closeEffect.of(null)
2045
2057
  });
2046
2058
  if (action?.insert?.length) {
2059
+ const text = action.insert + "\n";
2047
2060
  view2.dispatch({
2048
2061
  changes: {
2049
2062
  from: pos,
2050
- insert: action.insert
2063
+ insert: text
2051
2064
  },
2052
2065
  selection: {
2053
- anchor: pos + action.insert.length
2066
+ anchor: pos + text.length
2054
2067
  }
2055
2068
  });
2056
2069
  }
@@ -2174,33 +2187,183 @@ var hintViewPlugin = ({ onHint }) => import_view9.ViewPlugin.fromClass(class {
2174
2187
  import_view9.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view9.Decoration.none)
2175
2188
  ]
2176
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
+ };
2177
2300
  var command = (options) => {
2178
2301
  return [
2179
2302
  commandConfig.of(options),
2180
2303
  commandState,
2181
2304
  import_view8.keymap.of(commandKeyBindings),
2305
+ preview(options),
2306
+ floatingMenu(options),
2182
2307
  hintViewPlugin(options),
2183
2308
  import_view8.EditorView.focusChangeEffect.of((_, focusing) => {
2184
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
+ }
2185
2323
  })
2186
2324
  ];
2187
2325
  };
2326
+ var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/selection.ts";
2188
2327
  var documentId = singleValueFacet();
2189
2328
  var stateRestoreAnnotation = "dxos.org/cm/state-restore";
2190
2329
  var createEditorStateTransaction = ({ scrollTo, selection }) => {
2191
2330
  return {
2192
2331
  selection,
2193
2332
  scrollIntoView: !scrollTo,
2194
- effects: scrollTo ? import_view12.EditorView.scrollIntoView(scrollTo, {
2333
+ effects: scrollTo ? import_view14.EditorView.scrollIntoView(scrollTo, {
2195
2334
  yMargin: 96
2196
2335
  }) : void 0,
2197
- annotations: import_state11.Transaction.userEvent.of(stateRestoreAnnotation)
2336
+ annotations: import_state12.Transaction.userEvent.of(stateRestoreAnnotation)
2198
2337
  };
2199
2338
  };
2200
- var selectionState = (state = {}) => {
2201
- const setState = (id, selectionState2) => {
2202
- state[id] = selectionState2;
2203
- };
2339
+ var createEditorStateStore = (keyPrefix) => ({
2340
+ getState: (id) => {
2341
+ (0, import_invariant3.invariant)(id, void 0, {
2342
+ F: __dxlog_file6,
2343
+ L: 47,
2344
+ S: void 0,
2345
+ A: [
2346
+ "id",
2347
+ ""
2348
+ ]
2349
+ });
2350
+ const state = localStorage.getItem(`${keyPrefix}/${id}`);
2351
+ return state ? JSON.parse(state) : void 0;
2352
+ },
2353
+ setState: (id, state) => {
2354
+ (0, import_invariant3.invariant)(id, void 0, {
2355
+ F: __dxlog_file6,
2356
+ L: 53,
2357
+ S: void 0,
2358
+ A: [
2359
+ "id",
2360
+ ""
2361
+ ]
2362
+ });
2363
+ localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state));
2364
+ }
2365
+ });
2366
+ var selectionState = ({ getState, setState } = {}) => {
2204
2367
  const setStateDebounced = (0, import_async4.debounce)(setState, 1e3);
2205
2368
  return [
2206
2369
  // TODO(burdon): Track scrolling (currently only updates when cursor moves).
@@ -2209,46 +2372,48 @@ var selectionState = (state = {}) => {
2209
2372
  // setStateDebounced(id, {});
2210
2373
  // },
2211
2374
  // }),
2212
- import_view12.EditorView.updateListener.of(({ view, transactions }) => {
2375
+ import_view14.EditorView.updateListener.of(({ view, transactions }) => {
2213
2376
  const id = view.state.facet(documentId);
2214
2377
  if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
2215
2378
  return;
2216
2379
  }
2217
- const { scrollTop } = view.scrollDOM;
2218
- const pos = view.posAtCoords({
2219
- x: 0,
2220
- y: scrollTop
2221
- });
2222
- if (pos !== null) {
2223
- const { anchor, head } = view.state.selection.main;
2224
- setStateDebounced(id, {
2225
- scrollTo: pos,
2226
- selection: {
2227
- anchor,
2228
- head
2229
- }
2380
+ if (setState) {
2381
+ const { scrollTop } = view.scrollDOM;
2382
+ const pos = view.posAtCoords({
2383
+ x: 0,
2384
+ y: scrollTop
2230
2385
  });
2386
+ if (pos !== null) {
2387
+ const { anchor, head } = view.state.selection.main;
2388
+ setStateDebounced(id, {
2389
+ scrollTo: pos,
2390
+ selection: {
2391
+ anchor,
2392
+ head
2393
+ }
2394
+ });
2395
+ }
2231
2396
  }
2232
2397
  }),
2233
- import_view12.keymap.of([
2398
+ getState && import_view14.keymap.of([
2234
2399
  {
2235
2400
  key: "ctrl-r",
2236
2401
  run: (view) => {
2237
- const selection = state[view.state.facet(documentId)];
2238
- if (selection) {
2239
- view.dispatch(createEditorStateTransaction(selection));
2402
+ const state = getState(view.state.facet(documentId));
2403
+ if (state) {
2404
+ view.dispatch(createEditorStateTransaction(state));
2240
2405
  }
2241
2406
  return true;
2242
2407
  }
2243
2408
  }
2244
2409
  ])
2245
- ];
2410
+ ].filter(import_util3.isNotFalsy);
2246
2411
  };
2247
- var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
2248
- var setComments = import_state10.StateEffect.define();
2249
- var setSelection = import_state10.StateEffect.define();
2250
- var setCommentState = import_state10.StateEffect.define();
2251
- var commentsState = import_state10.StateField.define({
2412
+ var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
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({
2252
2417
  create: (state) => ({
2253
2418
  id: state.facet(documentId),
2254
2419
  comments: [],
@@ -2286,7 +2451,7 @@ var commentsState = import_state10.StateField.define({
2286
2451
  return value;
2287
2452
  }
2288
2453
  });
2289
- var styles3 = import_view11.EditorView.theme({
2454
+ var styles3 = import_view13.EditorView.theme({
2290
2455
  ".cm-comment, .cm-comment-current": {
2291
2456
  margin: "0 -3px",
2292
2457
  padding: "3px",
@@ -2299,14 +2464,14 @@ var styles3 = import_view11.EditorView.theme({
2299
2464
  textDecoration: "underline"
2300
2465
  }
2301
2466
  });
2302
- var createCommentMark = (id, isCurrent) => import_view11.Decoration.mark({
2467
+ var createCommentMark = (id, isCurrent) => import_view13.Decoration.mark({
2303
2468
  class: isCurrent ? "cm-comment-current" : "cm-comment",
2304
2469
  attributes: {
2305
2470
  "data-testid": "cm-comment",
2306
2471
  "data-comment-id": id
2307
2472
  }
2308
2473
  });
2309
- var commentsDecorations = import_view11.EditorView.decorations.compute([
2474
+ var commentsDecorations = import_view13.EditorView.decorations.compute([
2310
2475
  commentsState
2311
2476
  ], (state) => {
2312
2477
  const { selection: { current }, comments: comments2 } = state.field(commentsState);
@@ -2314,7 +2479,7 @@ var commentsDecorations = import_view11.EditorView.decorations.compute([
2314
2479
  const range = comment.range;
2315
2480
  if (!range) {
2316
2481
  import_log4.log.warn("Invalid range:", range, {
2317
- F: __dxlog_file6,
2482
+ F: __dxlog_file7,
2318
2483
  L: 144,
2319
2484
  S: void 0,
2320
2485
  C: (f, a) => f(...a)
@@ -2326,10 +2491,10 @@ var commentsDecorations = import_view11.EditorView.decorations.compute([
2326
2491
  const mark = createCommentMark(comment.comment.id, comment.comment.id === current);
2327
2492
  return mark.range(range.from, range.to);
2328
2493
  }).filter(import_util2.isNonNullable);
2329
- return import_view11.Decoration.set(decorations);
2494
+ return import_view13.Decoration.set(decorations);
2330
2495
  });
2331
- var commentClickedEffect = import_state10.StateEffect.define();
2332
- var handleCommentClick = import_view11.EditorView.domEventHandlers({
2496
+ var commentClickedEffect = import_state11.StateEffect.define();
2497
+ var handleCommentClick = import_view13.EditorView.domEventHandlers({
2333
2498
  click: (event, view) => {
2334
2499
  let target = event.target;
2335
2500
  const editorRoot = view.dom;
@@ -2368,7 +2533,7 @@ var trackPastedComments = (onUpdate) => {
2368
2533
  }
2369
2534
  };
2370
2535
  return [
2371
- import_view11.EditorView.domEventHandlers({
2536
+ import_view13.EditorView.domEventHandlers({
2372
2537
  cut: handleTrack,
2373
2538
  copy: handleTrack
2374
2539
  }),
@@ -2390,7 +2555,7 @@ var trackPastedComments = (onUpdate) => {
2390
2555
  return effects;
2391
2556
  }),
2392
2557
  // Handle paste or the undo of comment deletion.
2393
- import_view11.EditorView.updateListener.of((update2) => {
2558
+ import_view13.EditorView.updateListener.of((update2) => {
2394
2559
  const restore = [];
2395
2560
  for (let i = 0; i < update2.transactions.length; i++) {
2396
2561
  const tr = update2.transactions[i];
@@ -2446,7 +2611,7 @@ var mapTrackedComment = (comment, changes) => ({
2446
2611
  from: changes.mapPos(comment.from, 1),
2447
2612
  to: changes.mapPos(comment.to, 1)
2448
2613
  });
2449
- var restoreCommentEffect = import_state10.StateEffect.define({
2614
+ var restoreCommentEffect = import_state11.StateEffect.define({
2450
2615
  map: mapTrackedComment
2451
2616
  });
2452
2617
  var createComment2 = (view) => {
@@ -2491,7 +2656,7 @@ var comments = (options = {}) => {
2491
2656
  //
2492
2657
  // Keymap.
2493
2658
  //
2494
- options.onCreate && import_view11.keymap.of([
2659
+ options.onCreate && import_view13.keymap.of([
2495
2660
  {
2496
2661
  key: shortcut,
2497
2662
  run: callbackWrapper(createComment2)
@@ -2501,7 +2666,7 @@ var comments = (options = {}) => {
2501
2666
  // Hover tooltip (for key shortcut hints, etc.)
2502
2667
  // TODO(burdon): Factor out to generic hints extension for current selection/line.
2503
2668
  //
2504
- options.onHover && (0, import_view11.hoverTooltip)((view, pos) => {
2669
+ options.onHover && (0, import_view13.hoverTooltip)((view, pos) => {
2505
2670
  const selection = view.state.selection.main;
2506
2671
  if (selection && pos >= selection.from && pos <= selection.to) {
2507
2672
  return {
@@ -2530,7 +2695,7 @@ var comments = (options = {}) => {
2530
2695
  //
2531
2696
  // Track deleted ranges and update ranges for decorations.
2532
2697
  //
2533
- import_view11.EditorView.updateListener.of(({ view, state, changes }) => {
2698
+ import_view13.EditorView.updateListener.of(({ view, state, changes }) => {
2534
2699
  let mod = false;
2535
2700
  const { comments: comments2, ...value } = state.field(commentsState);
2536
2701
  changes.iterChanges((from, to, from2, to2) => {
@@ -2562,7 +2727,7 @@ var comments = (options = {}) => {
2562
2727
  //
2563
2728
  // Track selection/proximity.
2564
2729
  //
2565
- import_view11.EditorView.updateListener.of(({ view, state }) => {
2730
+ import_view13.EditorView.updateListener.of(({ view, state }) => {
2566
2731
  let min = Infinity;
2567
2732
  const { selection: { current, closest }, comments: comments2 } = state.field(commentsState);
2568
2733
  const { head } = state.selection.main;
@@ -2616,7 +2781,7 @@ var scrollThreadIntoView = (view, id, center = true) => {
2616
2781
  anchor: range.from
2617
2782
  } : void 0,
2618
2783
  effects: [
2619
- needsScroll ? import_view11.EditorView.scrollIntoView(range.from, center ? {
2784
+ needsScroll ? import_view13.EditorView.scrollIntoView(range.from, center ? {
2620
2785
  y: "center"
2621
2786
  } : void 0) : [],
2622
2787
  needsSelectionUpdate ? setSelection.of({
@@ -2662,13 +2827,13 @@ var ExternalCommentSync = class {
2662
2827
  this.unsubscribe = subscribe(updateComments);
2663
2828
  }
2664
2829
  };
2665
- var createExternalCommentSync = (id, subscribe, getComments) => import_view11.ViewPlugin.fromClass(class {
2830
+ var createExternalCommentSync = (id, subscribe, getComments) => import_view13.ViewPlugin.fromClass(class {
2666
2831
  constructor(view) {
2667
2832
  return new ExternalCommentSync(view, id, subscribe, getComments);
2668
2833
  }
2669
2834
  });
2670
2835
  var useCommentState = (state) => {
2671
- return (0, import_react4.useMemo)(() => import_view11.EditorView.updateListener.of((update2) => {
2836
+ return (0, import_react4.useMemo)(() => import_view13.EditorView.updateListener.of((update2) => {
2672
2837
  if (update2.docChanged || update2.selectionSet) {
2673
2838
  state.comment = selectionOverlapsComment(update2.state);
2674
2839
  state.selection = hasActiveSelection(update2.state);
@@ -2692,7 +2857,7 @@ var useComments = (view, id, comments2) => {
2692
2857
  });
2693
2858
  };
2694
2859
  var useCommentClickListener = (onCommentClick) => {
2695
- return (0, import_react4.useMemo)(() => import_view11.EditorView.updateListener.of((update2) => {
2860
+ return (0, import_react4.useMemo)(() => import_view13.EditorView.updateListener.of((update2) => {
2696
2861
  update2.transactions.forEach((transaction) => {
2697
2862
  transaction.effects.forEach((effect) => {
2698
2863
  if (effect.is(commentClickedEffect)) {
@@ -2705,15 +2870,15 @@ var useCommentClickListener = (onCommentClick) => {
2705
2870
  ]);
2706
2871
  };
2707
2872
  var debugNodeLogger = (log8 = console.log) => {
2708
- const logTokens = (state) => (0, import_language.syntaxTree)(state).iterate({
2873
+ const logTokens = (state) => (0, import_language2.syntaxTree)(state).iterate({
2709
2874
  enter: (node) => log8(node.type)
2710
2875
  });
2711
- return import_state12.StateField.define({
2876
+ return import_state13.StateField.define({
2712
2877
  create: (state) => logTokens(state),
2713
2878
  update: (_, tr) => logTokens(tr.state)
2714
2879
  });
2715
2880
  };
2716
- var styles4 = import_view13.EditorView.theme({
2881
+ var styles4 = import_view15.EditorView.theme({
2717
2882
  ".cm-dropCursor": {
2718
2883
  borderLeft: "2px solid var(--dx-accentText)",
2719
2884
  color: "var(--dx-accentText)",
@@ -2726,8 +2891,8 @@ var styles4 = import_view13.EditorView.theme({
2726
2891
  var dropFile = (options = {}) => {
2727
2892
  return [
2728
2893
  styles4,
2729
- (0, import_view13.dropCursor)(),
2730
- import_view13.EditorView.domEventHandlers({
2894
+ (0, import_view15.dropCursor)(),
2895
+ import_view15.EditorView.domEventHandlers({
2731
2896
  drop: (event, view) => {
2732
2897
  event.preventDefault();
2733
2898
  const files = event.dataTransfer?.files;
@@ -2746,8 +2911,8 @@ var dropFile = (options = {}) => {
2746
2911
  })
2747
2912
  ];
2748
2913
  };
2749
- var focusEffect = import_state14.StateEffect.define();
2750
- var focusField = import_state14.StateField.define({
2914
+ var focusEffect = import_state15.StateEffect.define();
2915
+ var focusField = import_state15.StateField.define({
2751
2916
  create: () => false,
2752
2917
  update: (value, tr) => {
2753
2918
  for (const effect of tr.effects) {
@@ -2760,7 +2925,7 @@ var focusField = import_state14.StateField.define({
2760
2925
  });
2761
2926
  var focus = [
2762
2927
  focusField,
2763
- import_view15.EditorView.domEventHandlers({
2928
+ import_view17.EditorView.domEventHandlers({
2764
2929
  focus: (event, view) => {
2765
2930
  setTimeout(() => view.dispatch({
2766
2931
  effects: focusEffect.of(true)
@@ -2773,14 +2938,13 @@ var focus = [
2773
2938
  }
2774
2939
  })
2775
2940
  ];
2776
- var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
2777
- var preventNewline = import_state13.EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
2941
+ var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
2942
+ var preventNewline = import_state14.EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
2778
2943
  var defaultBasicOptions = {
2779
2944
  allowMultipleSelections: true,
2780
2945
  bracketMatching: true,
2781
2946
  closeBrackets: true,
2782
2947
  drawSelection: true,
2783
- editable: true,
2784
2948
  focus: true,
2785
2949
  history: true,
2786
2950
  keymap: "standard",
@@ -2797,35 +2961,33 @@ var createBasicExtensions = (_props) => {
2797
2961
  const props = (0, import_lodash4.default)({}, _props, defaultBasicOptions);
2798
2962
  return [
2799
2963
  // NOTE: Doesn't catch errors in keymap functions.
2800
- import_view14.EditorView.exceptionSink.of((err) => {
2964
+ import_view16.EditorView.exceptionSink.of((err) => {
2801
2965
  import_log5.log.catch(err, void 0, {
2802
- F: __dxlog_file7,
2966
+ F: __dxlog_file8,
2803
2967
  L: 96,
2804
2968
  S: void 0,
2805
2969
  C: (f, a) => f(...a)
2806
2970
  });
2807
2971
  }),
2808
- props.allowMultipleSelections && import_state13.EditorState.allowMultipleSelections.of(true),
2809
- props.bracketMatching && (0, import_language2.bracketMatching)(),
2972
+ props.allowMultipleSelections && import_state14.EditorState.allowMultipleSelections.of(true),
2973
+ props.bracketMatching && (0, import_language3.bracketMatching)(),
2810
2974
  props.closeBrackets && (0, import_autocomplete2.closeBrackets)(),
2811
- props.dropCursor && (0, import_view14.dropCursor)(),
2812
- props.drawSelection && (0, import_view14.drawSelection)({
2975
+ props.dropCursor && (0, import_view16.dropCursor)(),
2976
+ props.drawSelection && (0, import_view16.drawSelection)({
2813
2977
  cursorBlinkRate: 1200
2814
2978
  }),
2979
+ props.editable !== void 0 && import_view16.EditorView.editable.of(props.editable),
2815
2980
  props.focus && focus,
2816
- props.highlightActiveLine && (0, import_view14.highlightActiveLine)(),
2981
+ props.highlightActiveLine && (0, import_view16.highlightActiveLine)(),
2817
2982
  props.history && (0, import_commands2.history)(),
2818
- props.lineNumbers && (0, import_view14.lineNumbers)(),
2819
- props.lineWrapping && import_view14.EditorView.lineWrapping,
2820
- props.placeholder && (0, import_view14.placeholder)(props.placeholder),
2821
- props.readonly && [
2822
- import_state13.EditorState.readOnly.of(true),
2823
- import_view14.EditorView.editable.of(false)
2824
- ],
2825
- props.scrollPastEnd && (0, import_view14.scrollPastEnd)(),
2826
- 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),
2827
2989
  // https://codemirror.net/docs/ref/#view.KeyBinding
2828
- import_view14.keymap.of([
2990
+ import_view16.keymap.of([
2829
2991
  ...(props.keymap && keymaps[props.keymap]) ?? [],
2830
2992
  // NOTE: Tabs are also configured by markdown extension.
2831
2993
  // https://codemirror.net/docs/ref/#commands.indentWithTab
@@ -2845,8 +3007,8 @@ var createBasicExtensions = (_props) => {
2845
3007
  preventDefault: true,
2846
3008
  run: () => true
2847
3009
  }
2848
- ].filter(import_util3.isNotFalsy))
2849
- ].filter(import_util3.isNotFalsy);
3010
+ ].filter(import_util4.isNotFalsy))
3011
+ ].filter(import_util4.isNotFalsy);
2850
3012
  };
2851
3013
  var defaultThemeSlots = {
2852
3014
  editor: {
@@ -2856,17 +3018,17 @@ var defaultThemeSlots = {
2856
3018
  var createThemeExtensions = ({ themeMode, styles: styles5, syntaxHighlighting: _syntaxHighlighting, slots: _slots } = {}) => {
2857
3019
  const slots = (0, import_lodash4.default)({}, _slots, defaultThemeSlots);
2858
3020
  return [
2859
- import_view14.EditorView.darkTheme.of(themeMode === "dark"),
2860
- 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),
2861
3023
  // https://github.com/codemirror/theme-one-dark
2862
- _syntaxHighlighting && (themeMode === "dark" ? (0, import_language2.syntaxHighlighting)(import_theme_one_dark.oneDarkHighlightStyle) : (0, import_language2.syntaxHighlighting)(import_language2.defaultHighlightStyle)),
2863
- 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({
2864
3026
  class: slots.editor.className
2865
3027
  }),
2866
- slots.content?.className && import_view14.EditorView.contentAttributes.of({
3028
+ slots.content?.className && import_view16.EditorView.contentAttributes.of({
2867
3029
  class: slots.content.className
2868
3030
  })
2869
- ].filter(import_util3.isNotFalsy);
3031
+ ].filter(import_util4.isNotFalsy);
2870
3032
  };
2871
3033
  var createDataExtensions = ({ id, text, space, identity }) => {
2872
3034
  const extensions = [];
@@ -2875,7 +3037,7 @@ var createDataExtensions = ({ id, text, space, identity }) => {
2875
3037
  }
2876
3038
  if (space && identity) {
2877
3039
  const peerId = identity?.identityKey.toHex();
2878
- const hue = identity?.profile?.data?.hue ?? (0, import_util3.hexToHue)(peerId ?? "0");
3040
+ const hue = identity?.profile?.data?.hue ?? (0, import_util4.hexToHue)(peerId ?? "0");
2879
3041
  extensions.push(awareness(new SpaceAwarenessProvider({
2880
3042
  space,
2881
3043
  channel: `awareness.${id}`,
@@ -2889,83 +3051,45 @@ var createDataExtensions = ({ id, text, space, identity }) => {
2889
3051
  }
2890
3052
  return extensions;
2891
3053
  };
2892
- var folding = (state = {}) => {
2893
- const setState = (id, foldState) => {
2894
- state[id] = foldState;
2895
- };
2896
- const setStateDebounced = (0, import_async5.debounce)(setState, 1e3);
2897
- let initialized = false;
2898
- return [
2899
- (0, import_language3.codeFolding)({
2900
- placeholderDOM: () => {
2901
- return document.createElement("span");
2902
- }
2903
- }),
2904
- (0, import_language3.foldGutter)({
2905
- markerDOM: (open) => {
2906
- const el = createElement("div", {
2907
- className: "flex h-full items-center"
2908
- });
2909
- return renderRoot(el, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Icon, {
2910
- icon: "ph--caret-right--regular",
2911
- size: 3,
2912
- classNames: [
2913
- "mx-3 cursor-pointer",
2914
- open && "rotate-90"
2915
- ]
2916
- }));
2917
- }
2918
- }),
2919
- import_view16.EditorView.theme({
2920
- ".cm-foldGutter": {
2921
- opacity: 0.3,
2922
- transition: "opacity 0.3s",
2923
- width: "32px"
2924
- },
2925
- ".cm-foldGutter:hover": {
2926
- opacity: 1
2927
- }
2928
- }),
2929
- import_view16.EditorView.updateListener.of(({ view }) => {
2930
- const id = view.state.facet(documentId);
2931
- if (!id) {
2932
- return;
2933
- }
2934
- if (!initialized) {
2935
- initialized = true;
2936
- const foldState2 = state[id];
2937
- if (foldState2?.foldedRanges?.length) {
2938
- view.dispatch({
2939
- effects: foldState2.foldedRanges.map((range) => import_language3.foldEffect.of({
2940
- from: range.from,
2941
- to: range.to
2942
- }))
2943
- });
2944
- }
2945
- return;
2946
- }
2947
- const decorations = (0, import_language3.foldedRanges)(view.state);
2948
- const ranges = [];
2949
- decorations.between(0, view.state.doc.length, (from, to) => {
2950
- ranges.push({
2951
- from,
2952
- to
2953
- });
3054
+ var folding = (_props = {}) => [
3055
+ (0, import_language4.codeFolding)({
3056
+ placeholderDOM: () => {
3057
+ return document.createElement("span");
3058
+ }
3059
+ }),
3060
+ (0, import_language4.foldGutter)({
3061
+ markerDOM: (open) => {
3062
+ const el = createElement("div", {
3063
+ className: "flex h-full items-center"
2954
3064
  });
2955
- const foldState = {
2956
- foldedRanges: ranges
2957
- };
2958
- setStateDebounced?.(id, foldState);
2959
- })
2960
- ];
2961
- };
3065
+ return renderRoot(el, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Icon, {
3066
+ icon: "ph--caret-right--regular",
3067
+ size: 3,
3068
+ classNames: [
3069
+ "mx-3 cursor-pointer",
3070
+ open && "rotate-90"
3071
+ ]
3072
+ }));
3073
+ }
3074
+ }),
3075
+ import_view18.EditorView.theme({
3076
+ ".cm-foldGutter": {
3077
+ opacity: 0.3,
3078
+ transition: "opacity 0.3s",
3079
+ width: "32px"
3080
+ },
3081
+ ".cm-foldGutter:hover": {
3082
+ opacity: 1
3083
+ }
3084
+ })
3085
+ ];
2962
3086
  var listener = ({ onFocus, onChange }) => {
2963
3087
  const extensions = [];
2964
- onFocus && extensions.push(import_view17.EditorView.focusChangeEffect.of((_, focusing) => {
3088
+ onFocus && extensions.push(import_view19.EditorView.focusChangeEffect.of((_, focusing) => {
2965
3089
  onFocus(focusing);
2966
3090
  return null;
2967
3091
  }));
2968
- onChange && extensions.push(import_view17.EditorView.updateListener.of((update2) => {
3092
+ onChange && extensions.push(import_view19.EditorView.updateListener.of((update2) => {
2969
3093
  onChange(update2.state.doc.toString(), update2.state.facet(documentId));
2970
3094
  }));
2971
3095
  return extensions;
@@ -2991,7 +3115,7 @@ var setHeading = (level) => {
2991
3115
  let prevBlock = -1;
2992
3116
  for (const range of ranges) {
2993
3117
  let sawBlock = false;
2994
- (0, import_language4.syntaxTree)(state).iterate({
3118
+ (0, import_language5.syntaxTree)(state).iterate({
2995
3119
  from: range.from,
2996
3120
  to: range.to,
2997
3121
  enter: (node) => {
@@ -3088,7 +3212,7 @@ var setStyle = (type, enable) => {
3088
3212
  to: range.head + found + marker.length
3089
3213
  }
3090
3214
  ],
3091
- range: import_state15.EditorSelection.cursor(range.from - marker.length)
3215
+ range: import_state16.EditorSelection.cursor(range.from - marker.length)
3092
3216
  };
3093
3217
  }
3094
3218
  }
@@ -3100,7 +3224,7 @@ var setStyle = (type, enable) => {
3100
3224
  let startCovered = false;
3101
3225
  let endCovered = false;
3102
3226
  let { from, to } = range;
3103
- (0, import_language4.syntaxTree)(state).iterate({
3227
+ (0, import_language5.syntaxTree)(state).iterate({
3104
3228
  from,
3105
3229
  to,
3106
3230
  enter: (node) => {
@@ -3216,13 +3340,13 @@ var setStyle = (type, enable) => {
3216
3340
  from: range.head,
3217
3341
  insert: marker + marker
3218
3342
  },
3219
- range: import_state15.EditorSelection.cursor(range.head + marker.length)
3343
+ range: import_state16.EditorSelection.cursor(range.head + marker.length)
3220
3344
  };
3221
3345
  }
3222
3346
  const changeSet = state.changes(changes2.concat(changesAtEnd));
3223
3347
  return {
3224
3348
  changes: changeSet,
3225
- 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))
3226
3350
  };
3227
3351
  });
3228
3352
  dispatch(state.update(changes, {
@@ -3303,7 +3427,7 @@ var insertTable = (view) => {
3303
3427
  snippets.table(view, null, from, from);
3304
3428
  };
3305
3429
  var removeLinkInner = (from, to, changes, state) => {
3306
- (0, import_language4.syntaxTree)(state).iterate({
3430
+ (0, import_language5.syntaxTree)(state).iterate({
3307
3431
  from,
3308
3432
  to,
3309
3433
  enter: (node) => {
@@ -3348,7 +3472,7 @@ var addLink = ({ url, image: image2 } = {}) => {
3348
3472
  let { from, to } = range;
3349
3473
  const cutStyles = [];
3350
3474
  let okay = null;
3351
- (0, import_language4.syntaxTree)(state).iterate({
3475
+ (0, import_language5.syntaxTree)(state).iterate({
3352
3476
  from,
3353
3477
  to,
3354
3478
  enter: (node) => {
@@ -3422,7 +3546,7 @@ var addLink = ({ url, image: image2 } = {}) => {
3422
3546
  const changeSet = state.changes(changes2.concat(changesAfter));
3423
3547
  return {
3424
3548
  changes: changeSet,
3425
- 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))
3426
3550
  };
3427
3551
  });
3428
3552
  if (changes.changes.empty) {
@@ -3443,7 +3567,7 @@ var addList = (type) => {
3443
3567
  let parentColumn = null;
3444
3568
  const blocks = [];
3445
3569
  for (const { from, to } of state.selection.ranges) {
3446
- (0, import_language4.syntaxTree)(state).iterate({
3570
+ (0, import_language5.syntaxTree)(state).iterate({
3447
3571
  from,
3448
3572
  to,
3449
3573
  enter: (node) => {
@@ -3578,7 +3702,7 @@ var removeList = (type) => {
3578
3702
  const stack = [];
3579
3703
  const targetNodeType = type === 0 ? "OrderedList" : type === 1 ? "BulletList" : "TaskList";
3580
3704
  for (const { from, to } of state.selection.ranges) {
3581
- (0, import_language4.syntaxTree)(state).iterate({
3705
+ (0, import_language5.syntaxTree)(state).iterate({
3582
3706
  from,
3583
3707
  to,
3584
3708
  enter: (node) => {
@@ -3665,7 +3789,7 @@ var setBlockquote = (enable) => {
3665
3789
  let lastBlock = -1;
3666
3790
  for (const { from, to } of state.selection.ranges) {
3667
3791
  const sawBlock = false;
3668
- (0, import_language4.syntaxTree)(state).iterate({
3792
+ (0, import_language5.syntaxTree)(state).iterate({
3669
3793
  from,
3670
3794
  to,
3671
3795
  enter: (node) => {
@@ -3755,7 +3879,7 @@ var addCodeblock = (target) => {
3755
3879
  for (const { from, to } of selection.ranges) {
3756
3880
  let blockFrom = from;
3757
3881
  let blockTo = to;
3758
- (0, import_language4.syntaxTree)(state).iterate({
3882
+ (0, import_language5.syntaxTree)(state).iterate({
3759
3883
  from,
3760
3884
  to,
3761
3885
  enter: (node) => {
@@ -3806,7 +3930,7 @@ var removeCodeblock = ({ state, dispatch }) => {
3806
3930
  let lastBlock = -1;
3807
3931
  const changes = [];
3808
3932
  for (const { from, to } of state.selection.ranges) {
3809
- (0, import_language4.syntaxTree)(state).iterate({
3933
+ (0, import_language5.syntaxTree)(state).iterate({
3810
3934
  from,
3811
3935
  to,
3812
3936
  enter: (node) => {
@@ -3856,7 +3980,7 @@ var toggleCodeblock = (target) => {
3856
3980
  };
3857
3981
  var formattingKeymap = (_options = {}) => {
3858
3982
  return [
3859
- import_view18.keymap.of([
3983
+ import_view20.keymap.of([
3860
3984
  {
3861
3985
  key: "meta-b",
3862
3986
  run: toggleStrong
@@ -3968,7 +4092,7 @@ var getFormatting = (state) => {
3968
4092
  }
3969
4093
  }
3970
4094
  }
3971
- (0, import_language4.syntaxTree)(state).iterate({
4095
+ (0, import_language5.syntaxTree)(state).iterate({
3972
4096
  from: range.from,
3973
4097
  to: range.to,
3974
4098
  enter: (node) => {
@@ -4057,7 +4181,7 @@ var getFormatting = (state) => {
4057
4181
  };
4058
4182
  };
4059
4183
  var useFormattingState = (state) => {
4060
- return (0, import_react6.useMemo)(() => import_view18.EditorView.updateListener.of((update2) => {
4184
+ return (0, import_react6.useMemo)(() => import_view20.EditorView.updateListener.of((update2) => {
4061
4185
  if (update2.docChanged || update2.selectionSet) {
4062
4186
  Object.entries(getFormatting(update2.state)).forEach(([key, active]) => {
4063
4187
  state[key] = active;
@@ -4144,7 +4268,7 @@ var markdownTagsExtensions = [
4144
4268
  }
4145
4269
  ];
4146
4270
  var markdownHighlightStyle = (_options = {}) => {
4147
- return import_language6.HighlightStyle.define([
4271
+ return import_language7.HighlightStyle.define([
4148
4272
  {
4149
4273
  tag: [
4150
4274
  import_highlight2.tags.keyword,
@@ -4308,8 +4432,8 @@ var createMarkdownExtensions = ({ themeMode } = {}) => {
4308
4432
  ]
4309
4433
  }),
4310
4434
  // Custom styles.
4311
- (0, import_language5.syntaxHighlighting)(markdownHighlightStyle()),
4312
- import_view19.keymap.of([
4435
+ (0, import_language6.syntaxHighlighting)(markdownHighlightStyle()),
4436
+ import_view21.keymap.of([
4313
4437
  // https://codemirror.net/docs/ref/#commands.indentWithTab
4314
4438
  import_commands3.indentWithTab,
4315
4439
  // https://codemirror.net/docs/ref/#commands.defaultKeymap
@@ -4319,7 +4443,7 @@ var createMarkdownExtensions = ({ themeMode } = {}) => {
4319
4443
  ])
4320
4444
  ];
4321
4445
  };
4322
- var debugTree = (cb) => import_state16.StateField.define({
4446
+ var debugTree = (cb) => import_state17.StateField.define({
4323
4447
  create: (state) => cb(convertTreeToJson(state)),
4324
4448
  update: (value, tr) => cb(convertTreeToJson(tr.state))
4325
4449
  });
@@ -4340,15 +4464,15 @@ var convertTreeToJson = (state) => {
4340
4464
  }
4341
4465
  return node;
4342
4466
  };
4343
- return treeToJson((0, import_language7.syntaxTree)(state).cursor());
4467
+ return treeToJson((0, import_language8.syntaxTree)(state).cursor());
4344
4468
  };
4345
4469
  var adjustChanges = () => {
4346
- return import_view21.ViewPlugin.fromClass(class {
4470
+ return import_view23.ViewPlugin.fromClass(class {
4347
4471
  update(update2) {
4348
- const tree = (0, import_language9.syntaxTree)(update2.state);
4472
+ const tree = (0, import_language10.syntaxTree)(update2.state);
4349
4473
  const adjustments = [];
4350
4474
  for (const tr of update2.transactions) {
4351
- const event = tr.annotation(import_state18.Transaction.userEvent);
4475
+ const event = tr.annotation(import_state19.Transaction.userEvent);
4352
4476
  switch (event) {
4353
4477
  //
4354
4478
  // Enter
@@ -4483,9 +4607,9 @@ var getValidUrl = (str) => {
4483
4607
  };
4484
4608
  var image = (_options = {}) => {
4485
4609
  return [
4486
- import_state19.StateField.define({
4610
+ import_state20.StateField.define({
4487
4611
  create: (state) => {
4488
- return import_view22.Decoration.set(buildDecorations(0, state.doc.length, state));
4612
+ return import_view24.Decoration.set(buildDecorations2(0, state.doc.length, state));
4489
4613
  },
4490
4614
  update: (value, tr) => {
4491
4615
  if (!tr.docChanged && !tr.selection) {
@@ -4505,10 +4629,10 @@ var image = (_options = {}) => {
4505
4629
  filterFrom: from,
4506
4630
  filterTo: to,
4507
4631
  filter: () => false,
4508
- add: buildDecorations(from, to, tr.state)
4632
+ add: buildDecorations2(from, to, tr.state)
4509
4633
  });
4510
4634
  },
4511
- provide: (field) => import_view22.EditorView.decorations.from(field)
4635
+ provide: (field) => import_view24.EditorView.decorations.from(field)
4512
4636
  })
4513
4637
  ];
4514
4638
  };
@@ -4520,10 +4644,10 @@ var preloadImage = (url) => {
4520
4644
  preloaded.add(url);
4521
4645
  }
4522
4646
  };
4523
- var buildDecorations = (from, to, state) => {
4647
+ var buildDecorations2 = (from, to, state) => {
4524
4648
  const decorations = [];
4525
4649
  const cursor = state.selection.main.head;
4526
- (0, import_language10.syntaxTree)(state).iterate({
4650
+ (0, import_language11.syntaxTree)(state).iterate({
4527
4651
  enter: (node) => {
4528
4652
  if (node.name === "Image") {
4529
4653
  const urlNode = node.node.getChild("URL");
@@ -4534,7 +4658,7 @@ var buildDecorations = (from, to, state) => {
4534
4658
  return;
4535
4659
  }
4536
4660
  preloadImage(url);
4537
- decorations.push(import_view22.Decoration.replace({
4661
+ decorations.push(import_view24.Decoration.replace({
4538
4662
  block: true,
4539
4663
  widget: new ImageWidget(url)
4540
4664
  }).range(hide2 ? node.from : node.to, node.to));
@@ -4546,7 +4670,7 @@ var buildDecorations = (from, to, state) => {
4546
4670
  });
4547
4671
  return decorations;
4548
4672
  };
4549
- var ImageWidget = class extends import_view22.WidgetType {
4673
+ var ImageWidget = class extends import_view24.WidgetType {
4550
4674
  constructor(_url) {
4551
4675
  super();
4552
4676
  this._url = _url;
@@ -4568,7 +4692,7 @@ var ImageWidget = class extends import_view22.WidgetType {
4568
4692
  };
4569
4693
  var bulletListIndentationWidth = 24;
4570
4694
  var orderedListIndentationWidth = 36;
4571
- var formattingStyles = import_view23.EditorView.theme({
4695
+ var formattingStyles = import_view25.EditorView.theme({
4572
4696
  /**
4573
4697
  * Horizontal rule.
4574
4698
  */
@@ -4686,14 +4810,14 @@ var formattingStyles = import_view23.EditorView.theme({
4686
4810
  }
4687
4811
  });
4688
4812
  var table = (options = {}) => {
4689
- return import_state20.StateField.define({
4813
+ return import_state21.StateField.define({
4690
4814
  create: (state) => update(state, options),
4691
4815
  update: (_, tr) => update(tr.state, options),
4692
- provide: (field) => import_view24.EditorView.decorations.from(field)
4816
+ provide: (field) => import_view26.EditorView.decorations.from(field)
4693
4817
  });
4694
4818
  };
4695
4819
  var update = (state, _options) => {
4696
- const builder = new import_state20.RangeSetBuilder();
4820
+ const builder = new import_state21.RangeSetBuilder();
4697
4821
  const cursor = state.selection.main.head;
4698
4822
  const tables = [];
4699
4823
  const getTable = () => tables[tables.length - 1];
@@ -4701,7 +4825,7 @@ var update = (state, _options) => {
4701
4825
  const table2 = getTable();
4702
4826
  return table2.rows?.[table2.rows.length - 1];
4703
4827
  };
4704
- (0, import_language11.syntaxTree)(state).iterate({
4828
+ (0, import_language12.syntaxTree)(state).iterate({
4705
4829
  enter: (node) => {
4706
4830
  switch (node.name) {
4707
4831
  case "Table": {
@@ -4734,19 +4858,19 @@ var update = (state, _options) => {
4734
4858
  tables.forEach((table2) => {
4735
4859
  const replace = state.readOnly || cursor < table2.from || cursor > table2.to;
4736
4860
  if (replace) {
4737
- builder.add(table2.from, table2.to, import_view24.Decoration.replace({
4861
+ builder.add(table2.from, table2.to, import_view26.Decoration.replace({
4738
4862
  block: true,
4739
4863
  widget: new TableWidget(table2)
4740
4864
  }));
4741
4865
  } else {
4742
- builder.add(table2.from, table2.to, import_view24.Decoration.mark({
4866
+ builder.add(table2.from, table2.to, import_view26.Decoration.mark({
4743
4867
  class: "cm-table"
4744
4868
  }));
4745
4869
  }
4746
4870
  });
4747
4871
  return builder.finish();
4748
4872
  };
4749
- var TableWidget = class extends import_view24.WidgetType {
4873
+ var TableWidget = class extends import_view26.WidgetType {
4750
4874
  constructor(_table) {
4751
4875
  super();
4752
4876
  this._table = _table;
@@ -4779,21 +4903,21 @@ var TableWidget = class extends import_view24.WidgetType {
4779
4903
  return !/^mouse/.test(e.type);
4780
4904
  }
4781
4905
  };
4782
- var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/markdown/decorate.ts";
4906
+ var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/markdown/decorate.ts";
4783
4907
  var Unicode = {
4784
4908
  emDash: "\u2014",
4785
4909
  bullet: "\u2022",
4786
4910
  bulletSmall: "\u2219",
4787
4911
  bulletSquare: "\u2B1D"
4788
4912
  };
4789
- var HorizontalRuleWidget = class extends import_view20.WidgetType {
4913
+ var HorizontalRuleWidget = class extends import_view22.WidgetType {
4790
4914
  toDOM() {
4791
4915
  const el = document.createElement("span");
4792
4916
  el.className = "cm-hr";
4793
4917
  return el;
4794
4918
  }
4795
4919
  };
4796
- var LinkButton = class extends import_view20.WidgetType {
4920
+ var LinkButton = class extends import_view22.WidgetType {
4797
4921
  constructor(url, render) {
4798
4922
  super();
4799
4923
  this.url = url;
@@ -4809,7 +4933,7 @@ var LinkButton = class extends import_view20.WidgetType {
4809
4933
  return el;
4810
4934
  }
4811
4935
  };
4812
- var CheckboxWidget = class extends import_view20.WidgetType {
4936
+ var CheckboxWidget = class extends import_view22.WidgetType {
4813
4937
  constructor(_checked) {
4814
4938
  super();
4815
4939
  this._checked = _checked;
@@ -4854,7 +4978,7 @@ var CheckboxWidget = class extends import_view20.WidgetType {
4854
4978
  return false;
4855
4979
  }
4856
4980
  };
4857
- var TextWidget = class extends import_view20.WidgetType {
4981
+ var TextWidget = class extends import_view22.WidgetType {
4858
4982
  constructor(text, className) {
4859
4983
  super();
4860
4984
  this.text = text;
@@ -4869,29 +4993,29 @@ var TextWidget = class extends import_view20.WidgetType {
4869
4993
  return el;
4870
4994
  }
4871
4995
  };
4872
- var hide = import_view20.Decoration.replace({});
4873
- var blockQuote = import_view20.Decoration.line({
4996
+ var hide = import_view22.Decoration.replace({});
4997
+ var blockQuote = import_view22.Decoration.line({
4874
4998
  class: (0, import_react_ui_theme7.mx)("cm-blockquote")
4875
4999
  });
4876
- var fencedCodeLine = import_view20.Decoration.line({
5000
+ var fencedCodeLine = import_view22.Decoration.line({
4877
5001
  class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line")
4878
5002
  });
4879
- var fencedCodeLineFirst = import_view20.Decoration.line({
5003
+ var fencedCodeLineFirst = import_view22.Decoration.line({
4880
5004
  class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line", "cm-codeblock-first")
4881
5005
  });
4882
- var fencedCodeLineLast = import_view20.Decoration.line({
5006
+ var fencedCodeLineLast = import_view22.Decoration.line({
4883
5007
  class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line", "cm-codeblock-last")
4884
5008
  });
4885
5009
  var commentBlockLine = fencedCodeLine;
4886
5010
  var commentBlockLineFirst = fencedCodeLineFirst;
4887
5011
  var commentBlockLineLast = fencedCodeLineLast;
4888
- var horizontalRule = import_view20.Decoration.replace({
5012
+ var horizontalRule = import_view22.Decoration.replace({
4889
5013
  widget: new HorizontalRuleWidget()
4890
5014
  });
4891
- var checkedTask = import_view20.Decoration.replace({
5015
+ var checkedTask = import_view22.Decoration.replace({
4892
5016
  widget: new CheckboxWidget(true)
4893
5017
  });
4894
- var uncheckedTask = import_view20.Decoration.replace({
5018
+ var uncheckedTask = import_view22.Decoration.replace({
4895
5019
  widget: new CheckboxWidget(false)
4896
5020
  });
4897
5021
  var editingRange = (state, range, focus2) => {
@@ -4906,14 +5030,14 @@ var autoHideTags = /* @__PURE__ */ new Set([
4906
5030
  "SubscriptMark",
4907
5031
  "SuperscriptMark"
4908
5032
  ]);
4909
- var buildDecorations2 = (view, options, focus2) => {
4910
- const deco = new import_state17.RangeSetBuilder();
4911
- 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();
4912
5036
  const { state } = view;
4913
5037
  const headerLevels = [];
4914
5038
  const getHeaderLevels = (node, level) => {
4915
- (0, import_invariant3.invariant)(level > 0, void 0, {
4916
- F: __dxlog_file8,
5039
+ (0, import_invariant4.invariant)(level > 0, void 0, {
5040
+ F: __dxlog_file9,
4917
5041
  L: 178,
4918
5042
  S: void 0,
4919
5043
  A: [
@@ -4951,8 +5075,8 @@ var buildDecorations2 = (view, options, focus2) => {
4951
5075
  listLevels.pop();
4952
5076
  };
4953
5077
  const getCurrentListLevel = () => {
4954
- (0, import_invariant3.invariant)(listLevels.length, void 0, {
4955
- F: __dxlog_file8,
5078
+ (0, import_invariant4.invariant)(listLevels.length, void 0, {
5079
+ F: __dxlog_file9,
4956
5080
  L: 200,
4957
5081
  S: void 0,
4958
5082
  A: [
@@ -4995,7 +5119,7 @@ var buildDecorations2 = (view, options, focus2) => {
4995
5119
  } else {
4996
5120
  const num = headers.slice(from - 1).map((level2) => level2?.number ?? 0).join(".") + " ";
4997
5121
  if (num.length) {
4998
- atomicDeco.add(mark.from, mark.from + len, import_view20.Decoration.replace({
5122
+ atomicDeco.add(mark.from, mark.from + len, import_view22.Decoration.replace({
4999
5123
  widget: new TextWidget(num, theme.heading(level))
5000
5124
  }));
5001
5125
  }
@@ -5020,7 +5144,7 @@ var buildDecorations2 = (view, options, focus2) => {
5020
5144
  if (node.from === line.to - 1) {
5021
5145
  return false;
5022
5146
  }
5023
- deco.add(line.from, line.from, import_view20.Decoration.line({
5147
+ deco.add(line.from, line.from, import_view22.Decoration.line({
5024
5148
  class: "cm-list-item",
5025
5149
  attributes: {
5026
5150
  style: `padding-left: ${offset}px; text-indent: -${width}px;`
@@ -5037,7 +5161,7 @@ var buildDecorations2 = (view, options, focus2) => {
5037
5161
  const label = list.type === "OrderedList" ? `${++list.number}.` : Unicode.bulletSmall;
5038
5162
  const line = state.doc.lineAt(node.from);
5039
5163
  const to = state.doc.sliceString(node.to, node.to + 1) === " " ? node.to + 1 : node.to;
5040
- atomicDeco.add(line.from, to, import_view20.Decoration.replace({
5164
+ atomicDeco.add(line.from, to, import_view22.Decoration.replace({
5041
5165
  widget: new TextWidget(label, list.type === "OrderedList" ? "cm-list-mark cm-list-mark-ordered" : "cm-list-mark cm-list-mark-bullet")
5042
5166
  }));
5043
5167
  break;
@@ -5124,7 +5248,7 @@ var buildDecorations2 = (view, options, focus2) => {
5124
5248
  if (!editing) {
5125
5249
  atomicDeco.add(node.from, marks[0].to, hide);
5126
5250
  }
5127
- 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({
5128
5252
  tagName: "a",
5129
5253
  attributes: {
5130
5254
  class: "cm-link",
@@ -5134,7 +5258,7 @@ var buildDecorations2 = (view, options, focus2) => {
5134
5258
  }
5135
5259
  }));
5136
5260
  if (!editing) {
5137
- 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({
5138
5262
  widget: new LinkButton(url, options.renderLinkButton)
5139
5263
  }) : hide);
5140
5264
  }
@@ -5168,7 +5292,7 @@ var buildDecorations2 = (view, options, focus2) => {
5168
5292
  }
5169
5293
  }
5170
5294
  };
5171
- const tree = (0, import_language8.syntaxTree)(state);
5295
+ const tree = (0, import_language9.syntaxTree)(state);
5172
5296
  if (options.numberedHeadings?.from === void 0) {
5173
5297
  for (const { from, to } of view.visibleRanges) {
5174
5298
  tree.iterate({
@@ -5189,16 +5313,16 @@ var buildDecorations2 = (view, options, focus2) => {
5189
5313
  atomicDeco: atomicDeco.finish()
5190
5314
  };
5191
5315
  };
5192
- var forceUpdate = import_state17.StateEffect.define();
5316
+ var forceUpdate = import_state18.StateEffect.define();
5193
5317
  var decorateMarkdown = (options = {}) => {
5194
5318
  return [
5195
- import_view20.ViewPlugin.fromClass(class {
5319
+ import_view22.ViewPlugin.fromClass(class {
5196
5320
  constructor(view) {
5197
- ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations2(view, options, view.hasFocus));
5321
+ ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations3(view, options, view.hasFocus));
5198
5322
  }
5199
5323
  update(update2) {
5200
5324
  if (update2.docChanged || update2.viewportChanged || update2.focusChanged || update2.transactions.some((tr) => tr.effects.some((effect) => effect.is(forceUpdate))) || update2.selectionSet && !options.selectionChangeDelay) {
5201
- ({ 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));
5202
5326
  this.clearUpdate();
5203
5327
  } else if (update2.selectionSet) {
5204
5328
  this.scheduleUpdate(update2.view);
@@ -5224,9 +5348,9 @@ var decorateMarkdown = (options = {}) => {
5224
5348
  }
5225
5349
  }, {
5226
5350
  provide: (plugin) => [
5227
- import_view20.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view20.Decoration.none),
5228
- import_view20.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view20.Decoration.none),
5229
- 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)
5230
5354
  ]
5231
5355
  }),
5232
5356
  image(),
@@ -5236,8 +5360,8 @@ var decorateMarkdown = (options = {}) => {
5236
5360
  ];
5237
5361
  };
5238
5362
  var linkTooltip = (render) => {
5239
- return (0, import_view25.hoverTooltip)((view, pos, side) => {
5240
- 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);
5241
5365
  let link = null;
5242
5366
  for (let i = 0, node = syntax; !link && node && i < 5; node = node.parent, i++) {
5243
5367
  link = node.name === "Link" ? node : null;
@@ -5266,7 +5390,7 @@ var linkTooltip = (render) => {
5266
5390
  };
5267
5391
  });
5268
5392
  };
5269
- var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/mention.ts";
5393
+ var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/mention.ts";
5270
5394
  var mention = ({ debug, onSearch }) => {
5271
5395
  return (0, import_autocomplete5.autocompletion)({
5272
5396
  // TODO(burdon): Not working.
@@ -5281,7 +5405,7 @@ var mention = ({ debug, onSearch }) => {
5281
5405
  import_log6.log.info("completion context", {
5282
5406
  context
5283
5407
  }, {
5284
- F: __dxlog_file9,
5408
+ F: __dxlog_file10,
5285
5409
  L: 27,
5286
5410
  S: void 0,
5287
5411
  C: (f, a) => f(...a)
@@ -5320,7 +5444,7 @@ var InputModeExtensions = {
5320
5444
  editorInputMode.of({
5321
5445
  type: "vscode"
5322
5446
  }),
5323
- import_view26.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5447
+ import_view28.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5324
5448
  ],
5325
5449
  vim: [
5326
5450
  // https://github.com/replit/codemirror-vim
@@ -5329,7 +5453,7 @@ var InputModeExtensions = {
5329
5453
  type: "vim",
5330
5454
  noTabster: true
5331
5455
  }),
5332
- import_view26.keymap.of([
5456
+ import_view28.keymap.of([
5333
5457
  {
5334
5458
  key: "Alt-Escape",
5335
5459
  run: (view) => {
@@ -5349,7 +5473,7 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
5349
5473
  let t;
5350
5474
  let idx = 0;
5351
5475
  return [
5352
- import_view27.keymap.of([
5476
+ import_view29.keymap.of([
5353
5477
  {
5354
5478
  // Reset.
5355
5479
  key: "alt-meta-'",
@@ -5399,10 +5523,10 @@ var useActionHandler = (view) => {
5399
5523
  view
5400
5524
  ]);
5401
5525
  };
5402
- var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
5526
+ var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
5403
5527
  var instanceCount = 0;
5404
5528
  var useTextEditor = (props = {}, deps = []) => {
5405
- const { id, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0, import_react8.useMemo)(() => (0, import_util4.getProviderValue)(props), deps ?? []);
5529
+ const { id, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0, import_react8.useMemo)(() => (0, import_util5.getProviderValue)(props), deps ?? []);
5406
5530
  const [instanceId] = (0, import_react8.useState)(() => `text-editor-${++instanceCount}`);
5407
5531
  const [view, setView] = (0, import_react8.useState)();
5408
5532
  const parentRef = (0, import_react8.useRef)(null);
@@ -5414,7 +5538,7 @@ var useTextEditor = (props = {}, deps = []) => {
5414
5538
  instanceId,
5415
5539
  doc: initialValue?.length ?? 0
5416
5540
  }, {
5417
- F: __dxlog_file10,
5541
+ F: __dxlog_file11,
5418
5542
  L: 75,
5419
5543
  S: void 0,
5420
5544
  C: (f, a) => f(...a)
@@ -5431,27 +5555,27 @@ var useTextEditor = (props = {}, deps = []) => {
5431
5555
  anchor
5432
5556
  };
5433
5557
  }
5434
- const state = import_state21.EditorState.create({
5558
+ const state = import_state22.EditorState.create({
5435
5559
  doc: initialValue,
5436
5560
  // selection: initialSelection,
5437
5561
  extensions: [
5438
5562
  id && documentId.of(id),
5439
5563
  extensions,
5440
5564
  // NOTE: This doesn't catch errors in keymap functions.
5441
- import_view28.EditorView.exceptionSink.of((err) => {
5565
+ import_view30.EditorView.exceptionSink.of((err) => {
5442
5566
  import_log7.log.catch(err, void 0, {
5443
- F: __dxlog_file10,
5567
+ F: __dxlog_file11,
5444
5568
  L: 97,
5445
5569
  S: void 0,
5446
5570
  C: (f, a) => f(...a)
5447
5571
  });
5448
5572
  })
5449
- ].filter(import_util4.isNotFalsy)
5573
+ ].filter(import_util5.isNotFalsy)
5450
5574
  });
5451
- view2 = new import_view28.EditorView({
5575
+ view2 = new import_view30.EditorView({
5452
5576
  parent: parentRef.current,
5453
5577
  state,
5454
- scrollTo: scrollTo ? import_view28.EditorView.scrollIntoView(scrollTo, {
5578
+ scrollTo: scrollTo ? import_view30.EditorView.scrollIntoView(scrollTo, {
5455
5579
  yMargin: 96
5456
5580
  }) : void 0,
5457
5581
  dispatchTransactions: debug ? debugDispatcher : void 0
@@ -5472,7 +5596,7 @@ var useTextEditor = (props = {}, deps = []) => {
5472
5596
  (0, import_log7.log)("destroy", {
5473
5597
  id
5474
5598
  }, {
5475
- F: __dxlog_file10,
5599
+ F: __dxlog_file11,
5476
5600
  L: 134,
5477
5601
  S: void 0,
5478
5602
  C: (f, a) => f(...a)
@@ -5489,7 +5613,7 @@ var useTextEditor = (props = {}, deps = []) => {
5489
5613
  scrollTo,
5490
5614
  selection
5491
5615
  }, {
5492
- F: __dxlog_file10,
5616
+ F: __dxlog_file11,
5493
5617
  L: 143,
5494
5618
  S: void 0,
5495
5619
  C: (f, a) => f(...a)
@@ -5582,6 +5706,7 @@ var useTextEditor = (props = {}, deps = []) => {
5582
5706
  createDataExtensions,
5583
5707
  createEditorAction,
5584
5708
  createEditorActionGroup,
5709
+ createEditorStateStore,
5585
5710
  createEditorStateTransaction,
5586
5711
  createElement,
5587
5712
  createExternalCommentSync,