@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.
- package/dist/lib/browser/index.mjs +122 -114
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +123 -116
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +122 -114
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/TextEditor.stories.d.ts.map +1 -1
- package/dist/types/src/extensions/folding.d.ts +8 -2
- package/dist/types/src/extensions/folding.d.ts.map +1 -1
- package/dist/types/src/extensions/selection.d.ts +1 -6
- package/dist/types/src/extensions/selection.d.ts.map +1 -1
- package/dist/types/src/hooks/useTextEditor.d.ts +3 -3
- package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
- package/package.json +28 -28
- package/src/TextEditor.stories.tsx +2 -10
- package/src/extensions/folding.tsx +73 -30
- package/src/extensions/selection.ts +21 -41
- package/src/hooks/useTextEditor.ts +17 -8
@@ -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
|
2074
|
-
|
2075
|
-
|
2076
|
-
|
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
|
-
|
2115
|
-
|
2116
|
-
|
2117
|
-
|
2118
|
-
|
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
|
-
|
2103
|
+
keymap4.of([
|
2133
2104
|
{
|
2134
2105
|
key: "ctrl-r",
|
2135
2106
|
run: (view) => {
|
2136
|
-
const
|
2137
|
-
if (
|
2138
|
-
view.dispatch(createEditorStateTransaction(
|
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
|
-
]
|
2115
|
+
];
|
2145
2116
|
};
|
2146
2117
|
|
2147
2118
|
// packages/ui/react-ui-editor/src/extensions/comments.ts
|
2148
|
-
var
|
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:
|
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
|
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
|
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:
|
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(
|
2777
|
-
].filter(
|
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(
|
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 = (
|
2827
|
-
|
2828
|
-
|
2829
|
-
|
2830
|
-
|
2831
|
-
|
2832
|
-
|
2833
|
-
|
2834
|
-
|
2835
|
-
|
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
|
-
|
2838
|
-
|
2839
|
-
|
2840
|
-
|
2841
|
-
|
2842
|
-
|
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
|
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
|
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
|
-
|
4872
|
-
F:
|
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
|
-
|
4911
|
-
F:
|
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
|
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:
|
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
|
5387
|
-
var
|
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:
|
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:
|
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(
|
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:
|
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:
|
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
|
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,
|