@dxos/react-ui-editor 0.8.1-main.ae460ac → 0.8.1-staging.391c573

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.
@@ -2055,9 +2055,6 @@ import { isNonNullable } from "@dxos/util";
2055
2055
  import { Transaction } from "@codemirror/state";
2056
2056
  import { EditorView as EditorView8, keymap as keymap4 } from "@codemirror/view";
2057
2057
  import { debounce } from "@dxos/async";
2058
- import { invariant as invariant3 } from "@dxos/invariant";
2059
- import { isNotFalsy as isNotFalsy2 } from "@dxos/util";
2060
- var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/selection.ts";
2061
2058
  var documentId = singleValueFacet();
2062
2059
  var stateRestoreAnnotation = "dxos.org/cm/state-restore";
2063
2060
  var createEditorStateTransaction = ({ scrollTo, selection }) => {
@@ -2070,34 +2067,10 @@ var createEditorStateTransaction = ({ scrollTo, selection }) => {
2070
2067
  annotations: Transaction.userEvent.of(stateRestoreAnnotation)
2071
2068
  };
2072
2069
  };
2073
- var createEditorStateStore = (keyPrefix) => ({
2074
- getState: (id) => {
2075
- invariant3(id, void 0, {
2076
- F: __dxlog_file6,
2077
- L: 47,
2078
- S: void 0,
2079
- A: [
2080
- "id",
2081
- ""
2082
- ]
2083
- });
2084
- const state = localStorage.getItem(`${keyPrefix}/${id}`);
2085
- return state ? JSON.parse(state) : void 0;
2086
- },
2087
- setState: (id, state) => {
2088
- invariant3(id, void 0, {
2089
- F: __dxlog_file6,
2090
- L: 53,
2091
- S: void 0,
2092
- A: [
2093
- "id",
2094
- ""
2095
- ]
2096
- });
2097
- localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state));
2098
- }
2099
- });
2100
- var selectionState = ({ getState, setState } = {}) => {
2070
+ var selectionState = (state = {}) => {
2071
+ const setState = (id, selectionState2) => {
2072
+ state[id] = selectionState2;
2073
+ };
2101
2074
  const setStateDebounced = debounce(setState, 1e3);
2102
2075
  return [
2103
2076
  // TODO(burdon): Track scrolling (currently only updates when cursor moves).
@@ -2111,41 +2084,39 @@ var selectionState = ({ getState, setState } = {}) => {
2111
2084
  if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
2112
2085
  return;
2113
2086
  }
2114
- if (setState) {
2115
- const { scrollTop } = view.scrollDOM;
2116
- const pos = view.posAtCoords({
2117
- x: 0,
2118
- y: scrollTop
2087
+ const { scrollTop } = view.scrollDOM;
2088
+ const pos = view.posAtCoords({
2089
+ x: 0,
2090
+ y: scrollTop
2091
+ });
2092
+ if (pos !== null) {
2093
+ const { anchor, head } = view.state.selection.main;
2094
+ setStateDebounced(id, {
2095
+ scrollTo: pos,
2096
+ selection: {
2097
+ anchor,
2098
+ head
2099
+ }
2119
2100
  });
2120
- if (pos !== null) {
2121
- const { anchor, head } = view.state.selection.main;
2122
- setStateDebounced(id, {
2123
- scrollTo: pos,
2124
- selection: {
2125
- anchor,
2126
- head
2127
- }
2128
- });
2129
- }
2130
2101
  }
2131
2102
  }),
2132
- getState && keymap4.of([
2103
+ keymap4.of([
2133
2104
  {
2134
2105
  key: "ctrl-r",
2135
2106
  run: (view) => {
2136
- const state = getState(view.state.facet(documentId));
2137
- if (state) {
2138
- view.dispatch(createEditorStateTransaction(state));
2107
+ const selection = state[view.state.facet(documentId)];
2108
+ if (selection) {
2109
+ view.dispatch(createEditorStateTransaction(selection));
2139
2110
  }
2140
2111
  return true;
2141
2112
  }
2142
2113
  }
2143
2114
  ])
2144
- ].filter(isNotFalsy2);
2115
+ ];
2145
2116
  };
2146
2117
 
2147
2118
  // packages/ui/react-ui-editor/src/extensions/comments.ts
2148
- var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
2119
+ var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
2149
2120
  var setComments = StateEffect3.define();
2150
2121
  var setSelection = StateEffect3.define();
2151
2122
  var setCommentState = StateEffect3.define();
@@ -2215,7 +2186,7 @@ var commentsDecorations = EditorView9.decorations.compute([
2215
2186
  const range = comment.range;
2216
2187
  if (!range) {
2217
2188
  log4.warn("Invalid range:", range, {
2218
- F: __dxlog_file7,
2189
+ F: __dxlog_file6,
2219
2190
  L: 144,
2220
2191
  S: void 0,
2221
2192
  C: (f, a) => f(...a)
@@ -2667,7 +2638,7 @@ import defaultsDeep2 from "lodash.defaultsdeep";
2667
2638
  import merge from "lodash.merge";
2668
2639
  import { generateName } from "@dxos/display-name";
2669
2640
  import { log as log5 } from "@dxos/log";
2670
- import { hexToHue, isNotFalsy as isNotFalsy3 } from "@dxos/util";
2641
+ import { hexToHue, isNotFalsy as isNotFalsy2 } from "@dxos/util";
2671
2642
 
2672
2643
  // packages/ui/react-ui-editor/src/extensions/focus.ts
2673
2644
  import { StateEffect as StateEffect4, StateField as StateField6 } from "@codemirror/state";
@@ -2701,7 +2672,7 @@ var focus = [
2701
2672
  ];
2702
2673
 
2703
2674
  // packages/ui/react-ui-editor/src/extensions/factories.ts
2704
- var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
2675
+ var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
2705
2676
  var preventNewline = EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
2706
2677
  var defaultBasicOptions = {
2707
2678
  allowMultipleSelections: true,
@@ -2727,7 +2698,7 @@ var createBasicExtensions = (_props) => {
2727
2698
  // NOTE: Doesn't catch errors in keymap functions.
2728
2699
  EditorView12.exceptionSink.of((err) => {
2729
2700
  log5.catch(err, void 0, {
2730
- F: __dxlog_file8,
2701
+ F: __dxlog_file7,
2731
2702
  L: 96,
2732
2703
  S: void 0,
2733
2704
  C: (f, a) => f(...a)
@@ -2773,8 +2744,8 @@ var createBasicExtensions = (_props) => {
2773
2744
  preventDefault: true,
2774
2745
  run: () => true
2775
2746
  }
2776
- ].filter(isNotFalsy3))
2777
- ].filter(isNotFalsy3);
2747
+ ].filter(isNotFalsy2))
2748
+ ].filter(isNotFalsy2);
2778
2749
  };
2779
2750
  var defaultThemeSlots = {
2780
2751
  editor: {
@@ -2794,7 +2765,7 @@ var createThemeExtensions = ({ themeMode, styles: styles5, syntaxHighlighting: _
2794
2765
  slots.content?.className && EditorView12.contentAttributes.of({
2795
2766
  class: slots.content.className
2796
2767
  })
2797
- ].filter(isNotFalsy3);
2768
+ ].filter(isNotFalsy2);
2798
2769
  };
2799
2770
  var createDataExtensions = ({ id, text, space, identity }) => {
2800
2771
  const extensions = [];
@@ -2819,42 +2790,81 @@ var createDataExtensions = ({ id, text, space, identity }) => {
2819
2790
  };
2820
2791
 
2821
2792
  // packages/ui/react-ui-editor/src/extensions/folding.tsx
2822
- import { codeFolding, foldGutter } from "@codemirror/language";
2793
+ import { codeFolding, foldGutter, foldedRanges, foldEffect } from "@codemirror/language";
2823
2794
  import { EditorView as EditorView13 } from "@codemirror/view";
2824
2795
  import React3 from "react";
2796
+ import { debounce as debounce3 } from "@dxos/async";
2825
2797
  import { Icon } from "@dxos/react-ui";
2826
- var folding = (_props = {}) => [
2827
- codeFolding({
2828
- placeholderDOM: () => {
2829
- return document.createElement("span");
2830
- }
2831
- }),
2832
- foldGutter({
2833
- markerDOM: (open) => {
2834
- const el = createElement("div", {
2835
- className: "flex h-full items-center"
2798
+ var folding = (state = {}) => {
2799
+ const setState = (id, foldState) => {
2800
+ state[id] = foldState;
2801
+ };
2802
+ const setStateDebounced = debounce3(setState, 1e3);
2803
+ let initialized = false;
2804
+ return [
2805
+ codeFolding({
2806
+ placeholderDOM: () => {
2807
+ return document.createElement("span");
2808
+ }
2809
+ }),
2810
+ foldGutter({
2811
+ markerDOM: (open) => {
2812
+ const el = createElement("div", {
2813
+ className: "flex h-full items-center"
2814
+ });
2815
+ return renderRoot(el, /* @__PURE__ */ React3.createElement(Icon, {
2816
+ icon: "ph--caret-right--regular",
2817
+ size: 3,
2818
+ classNames: [
2819
+ "mx-3 cursor-pointer",
2820
+ open && "rotate-90"
2821
+ ]
2822
+ }));
2823
+ }
2824
+ }),
2825
+ EditorView13.theme({
2826
+ ".cm-foldGutter": {
2827
+ opacity: 0.3,
2828
+ transition: "opacity 0.3s",
2829
+ width: "32px"
2830
+ },
2831
+ ".cm-foldGutter:hover": {
2832
+ opacity: 1
2833
+ }
2834
+ }),
2835
+ EditorView13.updateListener.of(({ view }) => {
2836
+ const id = view.state.facet(documentId);
2837
+ if (!id) {
2838
+ return;
2839
+ }
2840
+ if (!initialized) {
2841
+ initialized = true;
2842
+ const foldState2 = state[id];
2843
+ if (foldState2?.foldedRanges?.length) {
2844
+ view.dispatch({
2845
+ effects: foldState2.foldedRanges.map((range) => foldEffect.of({
2846
+ from: range.from,
2847
+ to: range.to
2848
+ }))
2849
+ });
2850
+ }
2851
+ return;
2852
+ }
2853
+ const decorations = foldedRanges(view.state);
2854
+ const ranges = [];
2855
+ decorations.between(0, view.state.doc.length, (from, to) => {
2856
+ ranges.push({
2857
+ from,
2858
+ to
2859
+ });
2836
2860
  });
2837
- return renderRoot(el, /* @__PURE__ */ React3.createElement(Icon, {
2838
- icon: "ph--caret-right--regular",
2839
- size: 3,
2840
- classNames: [
2841
- "mx-3 cursor-pointer",
2842
- open && "rotate-90"
2843
- ]
2844
- }));
2845
- }
2846
- }),
2847
- EditorView13.theme({
2848
- ".cm-foldGutter": {
2849
- opacity: 0.3,
2850
- transition: "opacity 0.3s",
2851
- width: "32px"
2852
- },
2853
- ".cm-foldGutter:hover": {
2854
- opacity: 1
2855
- }
2856
- })
2857
- ];
2861
+ const foldState = {
2862
+ foldedRanges: ranges
2863
+ };
2864
+ setStateDebounced?.(id, foldState);
2865
+ })
2866
+ ];
2867
+ };
2858
2868
 
2859
2869
  // packages/ui/react-ui-editor/src/extensions/listener.ts
2860
2870
  import { EditorView as EditorView14 } from "@codemirror/view";
@@ -4276,7 +4286,7 @@ var convertTreeToJson = (state) => {
4276
4286
  import { syntaxTree as syntaxTree7 } from "@codemirror/language";
4277
4287
  import { RangeSetBuilder as RangeSetBuilder3, StateEffect as StateEffect5 } from "@codemirror/state";
4278
4288
  import { EditorView as EditorView19, Decoration as Decoration7, WidgetType as WidgetType5, ViewPlugin as ViewPlugin6 } from "@codemirror/view";
4279
- import { invariant as invariant4 } from "@dxos/invariant";
4289
+ import { invariant as invariant3 } from "@dxos/invariant";
4280
4290
  import { mx as mx4 } from "@dxos/react-ui-theme";
4281
4291
 
4282
4292
  // packages/ui/react-ui-editor/src/extensions/markdown/changes.ts
@@ -4735,7 +4745,7 @@ var TableWidget = class extends WidgetType4 {
4735
4745
  };
4736
4746
 
4737
4747
  // packages/ui/react-ui-editor/src/extensions/markdown/decorate.ts
4738
- var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/markdown/decorate.ts";
4748
+ var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/markdown/decorate.ts";
4739
4749
  var Unicode = {
4740
4750
  emDash: "\u2014",
4741
4751
  bullet: "\u2022",
@@ -4868,8 +4878,8 @@ var buildDecorations2 = (view, options, focus2) => {
4868
4878
  const { state } = view;
4869
4879
  const headerLevels = [];
4870
4880
  const getHeaderLevels = (node, level) => {
4871
- invariant4(level > 0, void 0, {
4872
- F: __dxlog_file9,
4881
+ invariant3(level > 0, void 0, {
4882
+ F: __dxlog_file8,
4873
4883
  L: 178,
4874
4884
  S: void 0,
4875
4885
  A: [
@@ -4907,8 +4917,8 @@ var buildDecorations2 = (view, options, focus2) => {
4907
4917
  listLevels.pop();
4908
4918
  };
4909
4919
  const getCurrentListLevel = () => {
4910
- invariant4(listLevels.length, void 0, {
4911
- F: __dxlog_file9,
4920
+ invariant3(listLevels.length, void 0, {
4921
+ F: __dxlog_file8,
4912
4922
  L: 200,
4913
4923
  S: void 0,
4914
4924
  A: [
@@ -5231,7 +5241,7 @@ var linkTooltip = (render) => {
5231
5241
  // packages/ui/react-ui-editor/src/extensions/mention.ts
5232
5242
  import { autocompletion as autocompletion2 } from "@codemirror/autocomplete";
5233
5243
  import { log as log6 } from "@dxos/log";
5234
- var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/mention.ts";
5244
+ var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/mention.ts";
5235
5245
  var mention = ({ debug, onSearch }) => {
5236
5246
  return autocompletion2({
5237
5247
  // TODO(burdon): Not working.
@@ -5246,7 +5256,7 @@ var mention = ({ debug, onSearch }) => {
5246
5256
  log6.info("completion context", {
5247
5257
  context
5248
5258
  }, {
5249
- F: __dxlog_file10,
5259
+ F: __dxlog_file9,
5250
5260
  L: 27,
5251
5261
  S: void 0,
5252
5262
  C: (f, a) => f(...a)
@@ -5383,8 +5393,8 @@ import { EditorView as EditorView20 } from "@codemirror/view";
5383
5393
  import { useFocusableGroup } from "@fluentui/react-tabster";
5384
5394
  import { useCallback as useCallback3, useEffect as useEffect2, useMemo as useMemo4, useRef, useState } from "react";
5385
5395
  import { log as log7 } from "@dxos/log";
5386
- import { getProviderValue, isNotFalsy as isNotFalsy4 } from "@dxos/util";
5387
- var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
5396
+ import { getProviderValue, isNotFalsy as isNotFalsy3 } from "@dxos/util";
5397
+ var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
5388
5398
  var instanceCount = 0;
5389
5399
  var useTextEditor = (props = {}, deps = []) => {
5390
5400
  const { id, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = useMemo4(() => getProviderValue(props), deps ?? []);
@@ -5399,7 +5409,7 @@ var useTextEditor = (props = {}, deps = []) => {
5399
5409
  instanceId,
5400
5410
  doc: initialValue?.length ?? 0
5401
5411
  }, {
5402
- F: __dxlog_file11,
5412
+ F: __dxlog_file10,
5403
5413
  L: 75,
5404
5414
  S: void 0,
5405
5415
  C: (f, a) => f(...a)
@@ -5425,13 +5435,13 @@ var useTextEditor = (props = {}, deps = []) => {
5425
5435
  // NOTE: This doesn't catch errors in keymap functions.
5426
5436
  EditorView20.exceptionSink.of((err) => {
5427
5437
  log7.catch(err, void 0, {
5428
- F: __dxlog_file11,
5438
+ F: __dxlog_file10,
5429
5439
  L: 97,
5430
5440
  S: void 0,
5431
5441
  C: (f, a) => f(...a)
5432
5442
  });
5433
5443
  })
5434
- ].filter(isNotFalsy4)
5444
+ ].filter(isNotFalsy3)
5435
5445
  });
5436
5446
  view2 = new EditorView20({
5437
5447
  parent: parentRef.current,
@@ -5457,7 +5467,7 @@ var useTextEditor = (props = {}, deps = []) => {
5457
5467
  log7("destroy", {
5458
5468
  id
5459
5469
  }, {
5460
- F: __dxlog_file11,
5470
+ F: __dxlog_file10,
5461
5471
  L: 134,
5462
5472
  S: void 0,
5463
5473
  C: (f, a) => f(...a)
@@ -5474,7 +5484,7 @@ var useTextEditor = (props = {}, deps = []) => {
5474
5484
  scrollTo,
5475
5485
  selection
5476
5486
  }, {
5477
- F: __dxlog_file11,
5487
+ F: __dxlog_file10,
5478
5488
  L: 143,
5479
5489
  S: void 0,
5480
5490
  C: (f, a) => f(...a)
@@ -5500,7 +5510,7 @@ var useTextEditor = (props = {}, deps = []) => {
5500
5510
  autoFocus,
5501
5511
  view
5502
5512
  ]);
5503
- const focusableGroup = useFocusableGroup({
5513
+ const focusableGroupAttrs = useFocusableGroup({
5504
5514
  tabBehavior: "limited",
5505
5515
  ignoreDefaultKeydown: {
5506
5516
  Escape: view?.state.facet(editorInputMode).noTabster
@@ -5519,15 +5529,14 @@ var useTextEditor = (props = {}, deps = []) => {
5519
5529
  }, [
5520
5530
  view
5521
5531
  ]);
5522
- const focusAttributes = {
5523
- tabIndex: 0,
5524
- ...focusableGroup,
5525
- onKeyUp: handleKeyUp
5526
- };
5527
5532
  return {
5528
5533
  parentRef,
5529
5534
  view,
5530
- focusAttributes
5535
+ focusAttributes: {
5536
+ tabIndex: 0,
5537
+ ...focusableGroupAttrs,
5538
+ onKeyUp: handleKeyUp
5539
+ }
5531
5540
  };
5532
5541
  };
5533
5542
  export {
@@ -5567,7 +5576,6 @@ export {
5567
5576
  createDataExtensions,
5568
5577
  createEditorAction,
5569
5578
  createEditorActionGroup,
5570
- createEditorStateStore,
5571
5579
  createEditorStateTransaction,
5572
5580
  createElement,
5573
5581
  createExternalCommentSync,