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