@dxos/react-ui-editor 0.8.1-main.ba2dec9 → 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.
@@ -64,7 +64,6 @@ __export(node_exports, {
64
64
  createDataExtensions: () => createDataExtensions,
65
65
  createEditorAction: () => createEditorAction,
66
66
  createEditorActionGroup: () => createEditorActionGroup,
67
- createEditorStateStore: () => createEditorStateStore,
68
67
  createEditorStateTransaction: () => createEditorStateTransaction,
69
68
  createElement: () => createElement,
70
69
  createExternalCommentSync: () => createExternalCommentSync,
@@ -208,8 +207,6 @@ var import_util2 = require("@dxos/util");
208
207
  var import_state11 = require("@codemirror/state");
209
208
  var import_view12 = require("@codemirror/view");
210
209
  var import_async4 = require("@dxos/async");
211
- var import_invariant3 = require("@dxos/invariant");
212
- var import_util3 = require("@dxos/util");
213
210
  var import_language = require("@codemirror/language");
214
211
  var import_state12 = require("@codemirror/state");
215
212
  var import_view13 = require("@codemirror/view");
@@ -224,12 +221,13 @@ var import_lodash4 = __toESM(require("lodash.defaultsdeep"));
224
221
  var import_lodash5 = __toESM(require("lodash.merge"));
225
222
  var import_display_name = require("@dxos/display-name");
226
223
  var import_log5 = require("@dxos/log");
227
- var import_util4 = require("@dxos/util");
224
+ var import_util3 = require("@dxos/util");
228
225
  var import_state14 = require("@codemirror/state");
229
226
  var import_view15 = require("@codemirror/view");
230
227
  var import_language3 = require("@codemirror/language");
231
228
  var import_view16 = require("@codemirror/view");
232
229
  var import_react5 = __toESM(require("react"));
230
+ var import_async5 = require("@dxos/async");
233
231
  var import_react_ui3 = require("@dxos/react-ui");
234
232
  var import_view17 = require("@codemirror/view");
235
233
  var import_autocomplete3 = require("@codemirror/autocomplete");
@@ -253,7 +251,7 @@ var import_state16 = require("@codemirror/state");
253
251
  var import_language8 = require("@codemirror/language");
254
252
  var import_state17 = require("@codemirror/state");
255
253
  var import_view20 = require("@codemirror/view");
256
- var import_invariant4 = require("@dxos/invariant");
254
+ var import_invariant3 = require("@dxos/invariant");
257
255
  var import_react_ui_theme7 = require("@dxos/react-ui-theme");
258
256
  var import_language9 = require("@codemirror/language");
259
257
  var import_state18 = require("@codemirror/state");
@@ -281,7 +279,7 @@ var import_view28 = require("@codemirror/view");
281
279
  var import_react_tabster = require("@fluentui/react-tabster");
282
280
  var import_react8 = require("react");
283
281
  var import_log7 = require("@dxos/log");
284
- var import_util5 = require("@dxos/util");
282
+ var import_util4 = require("@dxos/util");
285
283
  var translationKey = "react-ui-editor";
286
284
  var translations_default = [
287
285
  {
@@ -2187,7 +2185,6 @@ var command = (options) => {
2187
2185
  })
2188
2186
  ];
2189
2187
  };
2190
- var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/selection.ts";
2191
2188
  var documentId = singleValueFacet();
2192
2189
  var stateRestoreAnnotation = "dxos.org/cm/state-restore";
2193
2190
  var createEditorStateTransaction = ({ scrollTo, selection }) => {
@@ -2200,34 +2197,10 @@ var createEditorStateTransaction = ({ scrollTo, selection }) => {
2200
2197
  annotations: import_state11.Transaction.userEvent.of(stateRestoreAnnotation)
2201
2198
  };
2202
2199
  };
2203
- var createEditorStateStore = (keyPrefix) => ({
2204
- getState: (id) => {
2205
- (0, import_invariant3.invariant)(id, void 0, {
2206
- F: __dxlog_file6,
2207
- L: 47,
2208
- S: void 0,
2209
- A: [
2210
- "id",
2211
- ""
2212
- ]
2213
- });
2214
- const state = localStorage.getItem(`${keyPrefix}/${id}`);
2215
- return state ? JSON.parse(state) : void 0;
2216
- },
2217
- setState: (id, state) => {
2218
- (0, import_invariant3.invariant)(id, void 0, {
2219
- F: __dxlog_file6,
2220
- L: 53,
2221
- S: void 0,
2222
- A: [
2223
- "id",
2224
- ""
2225
- ]
2226
- });
2227
- localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state));
2228
- }
2229
- });
2230
- var selectionState = ({ getState, setState } = {}) => {
2200
+ var selectionState = (state = {}) => {
2201
+ const setState = (id, selectionState2) => {
2202
+ state[id] = selectionState2;
2203
+ };
2231
2204
  const setStateDebounced = (0, import_async4.debounce)(setState, 1e3);
2232
2205
  return [
2233
2206
  // TODO(burdon): Track scrolling (currently only updates when cursor moves).
@@ -2241,39 +2214,37 @@ var selectionState = ({ getState, setState } = {}) => {
2241
2214
  if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
2242
2215
  return;
2243
2216
  }
2244
- if (setState) {
2245
- const { scrollTop } = view.scrollDOM;
2246
- const pos = view.posAtCoords({
2247
- x: 0,
2248
- y: scrollTop
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
+ }
2249
2230
  });
2250
- if (pos !== null) {
2251
- const { anchor, head } = view.state.selection.main;
2252
- setStateDebounced(id, {
2253
- scrollTo: pos,
2254
- selection: {
2255
- anchor,
2256
- head
2257
- }
2258
- });
2259
- }
2260
2231
  }
2261
2232
  }),
2262
- getState && import_view12.keymap.of([
2233
+ import_view12.keymap.of([
2263
2234
  {
2264
2235
  key: "ctrl-r",
2265
2236
  run: (view) => {
2266
- const state = getState(view.state.facet(documentId));
2267
- if (state) {
2268
- view.dispatch(createEditorStateTransaction(state));
2237
+ const selection = state[view.state.facet(documentId)];
2238
+ if (selection) {
2239
+ view.dispatch(createEditorStateTransaction(selection));
2269
2240
  }
2270
2241
  return true;
2271
2242
  }
2272
2243
  }
2273
2244
  ])
2274
- ].filter(import_util3.isNotFalsy);
2245
+ ];
2275
2246
  };
2276
- var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
2247
+ var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
2277
2248
  var setComments = import_state10.StateEffect.define();
2278
2249
  var setSelection = import_state10.StateEffect.define();
2279
2250
  var setCommentState = import_state10.StateEffect.define();
@@ -2343,7 +2314,7 @@ var commentsDecorations = import_view11.EditorView.decorations.compute([
2343
2314
  const range = comment.range;
2344
2315
  if (!range) {
2345
2316
  import_log4.log.warn("Invalid range:", range, {
2346
- F: __dxlog_file7,
2317
+ F: __dxlog_file6,
2347
2318
  L: 144,
2348
2319
  S: void 0,
2349
2320
  C: (f, a) => f(...a)
@@ -2802,7 +2773,7 @@ var focus = [
2802
2773
  }
2803
2774
  })
2804
2775
  ];
2805
- var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
2776
+ var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
2806
2777
  var preventNewline = import_state13.EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
2807
2778
  var defaultBasicOptions = {
2808
2779
  allowMultipleSelections: true,
@@ -2828,7 +2799,7 @@ var createBasicExtensions = (_props) => {
2828
2799
  // NOTE: Doesn't catch errors in keymap functions.
2829
2800
  import_view14.EditorView.exceptionSink.of((err) => {
2830
2801
  import_log5.log.catch(err, void 0, {
2831
- F: __dxlog_file8,
2802
+ F: __dxlog_file7,
2832
2803
  L: 96,
2833
2804
  S: void 0,
2834
2805
  C: (f, a) => f(...a)
@@ -2874,8 +2845,8 @@ var createBasicExtensions = (_props) => {
2874
2845
  preventDefault: true,
2875
2846
  run: () => true
2876
2847
  }
2877
- ].filter(import_util4.isNotFalsy))
2878
- ].filter(import_util4.isNotFalsy);
2848
+ ].filter(import_util3.isNotFalsy))
2849
+ ].filter(import_util3.isNotFalsy);
2879
2850
  };
2880
2851
  var defaultThemeSlots = {
2881
2852
  editor: {
@@ -2895,7 +2866,7 @@ var createThemeExtensions = ({ themeMode, styles: styles5, syntaxHighlighting: _
2895
2866
  slots.content?.className && import_view14.EditorView.contentAttributes.of({
2896
2867
  class: slots.content.className
2897
2868
  })
2898
- ].filter(import_util4.isNotFalsy);
2869
+ ].filter(import_util3.isNotFalsy);
2899
2870
  };
2900
2871
  var createDataExtensions = ({ id, text, space, identity }) => {
2901
2872
  const extensions = [];
@@ -2904,7 +2875,7 @@ var createDataExtensions = ({ id, text, space, identity }) => {
2904
2875
  }
2905
2876
  if (space && identity) {
2906
2877
  const peerId = identity?.identityKey.toHex();
2907
- const hue = identity?.profile?.data?.hue ?? (0, import_util4.hexToHue)(peerId ?? "0");
2878
+ const hue = identity?.profile?.data?.hue ?? (0, import_util3.hexToHue)(peerId ?? "0");
2908
2879
  extensions.push(awareness(new SpaceAwarenessProvider({
2909
2880
  space,
2910
2881
  channel: `awareness.${id}`,
@@ -2918,38 +2889,76 @@ var createDataExtensions = ({ id, text, space, identity }) => {
2918
2889
  }
2919
2890
  return extensions;
2920
2891
  };
2921
- var folding = (_props = {}) => [
2922
- (0, import_language3.codeFolding)({
2923
- placeholderDOM: () => {
2924
- return document.createElement("span");
2925
- }
2926
- }),
2927
- (0, import_language3.foldGutter)({
2928
- markerDOM: (open) => {
2929
- const el = createElement("div", {
2930
- className: "flex h-full items-center"
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
+ });
2931
2954
  });
2932
- return renderRoot(el, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Icon, {
2933
- icon: "ph--caret-right--regular",
2934
- size: 3,
2935
- classNames: [
2936
- "mx-3 cursor-pointer",
2937
- open && "rotate-90"
2938
- ]
2939
- }));
2940
- }
2941
- }),
2942
- import_view16.EditorView.theme({
2943
- ".cm-foldGutter": {
2944
- opacity: 0.3,
2945
- transition: "opacity 0.3s",
2946
- width: "32px"
2947
- },
2948
- ".cm-foldGutter:hover": {
2949
- opacity: 1
2950
- }
2951
- })
2952
- ];
2955
+ const foldState = {
2956
+ foldedRanges: ranges
2957
+ };
2958
+ setStateDebounced?.(id, foldState);
2959
+ })
2960
+ ];
2961
+ };
2953
2962
  var listener = ({ onFocus, onChange }) => {
2954
2963
  const extensions = [];
2955
2964
  onFocus && extensions.push(import_view17.EditorView.focusChangeEffect.of((_, focusing) => {
@@ -4770,7 +4779,7 @@ var TableWidget = class extends import_view24.WidgetType {
4770
4779
  return !/^mouse/.test(e.type);
4771
4780
  }
4772
4781
  };
4773
- var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/markdown/decorate.ts";
4782
+ var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/markdown/decorate.ts";
4774
4783
  var Unicode = {
4775
4784
  emDash: "\u2014",
4776
4785
  bullet: "\u2022",
@@ -4903,8 +4912,8 @@ var buildDecorations2 = (view, options, focus2) => {
4903
4912
  const { state } = view;
4904
4913
  const headerLevels = [];
4905
4914
  const getHeaderLevels = (node, level) => {
4906
- (0, import_invariant4.invariant)(level > 0, void 0, {
4907
- F: __dxlog_file9,
4915
+ (0, import_invariant3.invariant)(level > 0, void 0, {
4916
+ F: __dxlog_file8,
4908
4917
  L: 178,
4909
4918
  S: void 0,
4910
4919
  A: [
@@ -4942,8 +4951,8 @@ var buildDecorations2 = (view, options, focus2) => {
4942
4951
  listLevels.pop();
4943
4952
  };
4944
4953
  const getCurrentListLevel = () => {
4945
- (0, import_invariant4.invariant)(listLevels.length, void 0, {
4946
- F: __dxlog_file9,
4954
+ (0, import_invariant3.invariant)(listLevels.length, void 0, {
4955
+ F: __dxlog_file8,
4947
4956
  L: 200,
4948
4957
  S: void 0,
4949
4958
  A: [
@@ -5257,7 +5266,7 @@ var linkTooltip = (render) => {
5257
5266
  };
5258
5267
  });
5259
5268
  };
5260
- var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/mention.ts";
5269
+ var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/mention.ts";
5261
5270
  var mention = ({ debug, onSearch }) => {
5262
5271
  return (0, import_autocomplete5.autocompletion)({
5263
5272
  // TODO(burdon): Not working.
@@ -5272,7 +5281,7 @@ var mention = ({ debug, onSearch }) => {
5272
5281
  import_log6.log.info("completion context", {
5273
5282
  context
5274
5283
  }, {
5275
- F: __dxlog_file10,
5284
+ F: __dxlog_file9,
5276
5285
  L: 27,
5277
5286
  S: void 0,
5278
5287
  C: (f, a) => f(...a)
@@ -5390,10 +5399,10 @@ var useActionHandler = (view) => {
5390
5399
  view
5391
5400
  ]);
5392
5401
  };
5393
- var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
5402
+ var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
5394
5403
  var instanceCount = 0;
5395
5404
  var useTextEditor = (props = {}, deps = []) => {
5396
- const { id, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0, import_react8.useMemo)(() => (0, import_util5.getProviderValue)(props), deps ?? []);
5405
+ const { id, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0, import_react8.useMemo)(() => (0, import_util4.getProviderValue)(props), deps ?? []);
5397
5406
  const [instanceId] = (0, import_react8.useState)(() => `text-editor-${++instanceCount}`);
5398
5407
  const [view, setView] = (0, import_react8.useState)();
5399
5408
  const parentRef = (0, import_react8.useRef)(null);
@@ -5405,7 +5414,7 @@ var useTextEditor = (props = {}, deps = []) => {
5405
5414
  instanceId,
5406
5415
  doc: initialValue?.length ?? 0
5407
5416
  }, {
5408
- F: __dxlog_file11,
5417
+ F: __dxlog_file10,
5409
5418
  L: 75,
5410
5419
  S: void 0,
5411
5420
  C: (f, a) => f(...a)
@@ -5431,13 +5440,13 @@ var useTextEditor = (props = {}, deps = []) => {
5431
5440
  // NOTE: This doesn't catch errors in keymap functions.
5432
5441
  import_view28.EditorView.exceptionSink.of((err) => {
5433
5442
  import_log7.log.catch(err, void 0, {
5434
- F: __dxlog_file11,
5443
+ F: __dxlog_file10,
5435
5444
  L: 97,
5436
5445
  S: void 0,
5437
5446
  C: (f, a) => f(...a)
5438
5447
  });
5439
5448
  })
5440
- ].filter(import_util5.isNotFalsy)
5449
+ ].filter(import_util4.isNotFalsy)
5441
5450
  });
5442
5451
  view2 = new import_view28.EditorView({
5443
5452
  parent: parentRef.current,
@@ -5463,7 +5472,7 @@ var useTextEditor = (props = {}, deps = []) => {
5463
5472
  (0, import_log7.log)("destroy", {
5464
5473
  id
5465
5474
  }, {
5466
- F: __dxlog_file11,
5475
+ F: __dxlog_file10,
5467
5476
  L: 134,
5468
5477
  S: void 0,
5469
5478
  C: (f, a) => f(...a)
@@ -5480,7 +5489,7 @@ var useTextEditor = (props = {}, deps = []) => {
5480
5489
  scrollTo,
5481
5490
  selection
5482
5491
  }, {
5483
- F: __dxlog_file11,
5492
+ F: __dxlog_file10,
5484
5493
  L: 143,
5485
5494
  S: void 0,
5486
5495
  C: (f, a) => f(...a)
@@ -5506,7 +5515,7 @@ var useTextEditor = (props = {}, deps = []) => {
5506
5515
  autoFocus,
5507
5516
  view
5508
5517
  ]);
5509
- const focusableGroup = (0, import_react_tabster.useFocusableGroup)({
5518
+ const focusableGroupAttrs = (0, import_react_tabster.useFocusableGroup)({
5510
5519
  tabBehavior: "limited",
5511
5520
  ignoreDefaultKeydown: {
5512
5521
  Escape: view?.state.facet(editorInputMode).noTabster
@@ -5525,15 +5534,14 @@ var useTextEditor = (props = {}, deps = []) => {
5525
5534
  }, [
5526
5535
  view
5527
5536
  ]);
5528
- const focusAttributes = {
5529
- tabIndex: 0,
5530
- ...focusableGroup,
5531
- onKeyUp: handleKeyUp
5532
- };
5533
5537
  return {
5534
5538
  parentRef,
5535
5539
  view,
5536
- focusAttributes
5540
+ focusAttributes: {
5541
+ tabIndex: 0,
5542
+ ...focusableGroupAttrs,
5543
+ onKeyUp: handleKeyUp
5544
+ }
5537
5545
  };
5538
5546
  };
5539
5547
  // Annotate the CommonJS export names for ESM import in node:
@@ -5574,7 +5582,6 @@ var useTextEditor = (props = {}, deps = []) => {
5574
5582
  createDataExtensions,
5575
5583
  createEditorAction,
5576
5584
  createEditorActionGroup,
5577
- createEditorStateStore,
5578
5585
  createEditorStateTransaction,
5579
5586
  createElement,
5580
5587
  createExternalCommentSync,