@dxos/react-ui-editor 0.8.3-staging.0fa589b → 0.8.4-main.28f8d3d
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/chunk-22UMM3QJ.mjs +22 -0
- package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +790 -700
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +1 -1
- package/dist/lib/browser/testing/index.mjs.map +2 -2
- package/dist/lib/browser/types/index.mjs +13 -0
- package/dist/lib/browser/types/index.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-YXYQPV6R.mjs +24 -0
- package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +789 -700
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +1 -1
- package/dist/lib/node-esm/testing/index.mjs.map +2 -2
- package/dist/lib/node-esm/types/index.mjs +14 -0
- package/dist/lib/node-esm/types/index.mjs.map +7 -0
- package/dist/types/src/components/Editor/Editor.d.ts +19 -0
- package/dist/types/src/components/Editor/Editor.d.ts.map +1 -0
- package/dist/types/src/components/Editor/index.d.ts +2 -0
- package/dist/types/src/components/Editor/index.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/util.d.ts +4 -3
- package/dist/types/src/components/EditorToolbar/util.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/view-mode.d.ts +1 -1
- package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
- package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +1 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/extensions/autocomplete.d.ts +1 -1
- package/dist/types/src/extensions/autocomplete.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/automerge.stories.d.ts +28 -28
- package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/defs.d.ts +1 -1
- package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
- package/dist/types/src/extensions/blast.d.ts.map +1 -1
- package/dist/types/src/extensions/command/action.d.ts +1 -1
- package/dist/types/src/extensions/command/action.d.ts.map +1 -1
- package/dist/types/src/extensions/command/command-menu.d.ts +1 -1
- package/dist/types/src/extensions/command/command-menu.d.ts.map +1 -1
- package/dist/types/src/extensions/command/command.d.ts.map +1 -1
- package/dist/types/src/extensions/command/hint.d.ts.map +1 -1
- package/dist/types/src/extensions/command/index.d.ts +1 -1
- package/dist/types/src/extensions/command/index.d.ts.map +1 -1
- package/dist/types/src/extensions/command/state.d.ts +1 -1
- package/dist/types/src/extensions/command/state.d.ts.map +1 -1
- package/dist/types/src/extensions/command/typeahead.d.ts +7 -2
- package/dist/types/src/extensions/command/typeahead.d.ts.map +1 -1
- package/dist/types/src/extensions/command/useCommandMenu.d.ts +1 -1
- package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +1 -1
- package/dist/types/src/extensions/comments.d.ts +1 -1
- package/dist/types/src/extensions/comments.d.ts.map +1 -1
- package/dist/types/src/extensions/dnd.d.ts.map +1 -1
- package/dist/types/src/extensions/factories.d.ts +19 -0
- package/dist/types/src/extensions/factories.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/action.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/formatting.d.ts +1 -1
- package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
- package/dist/types/src/extensions/modes.d.ts +0 -7
- package/dist/types/src/extensions/modes.d.ts.map +1 -1
- package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
- package/dist/types/src/extensions/outliner/selection.d.ts.map +1 -1
- package/dist/types/src/extensions/outliner/tree.d.ts +1 -1
- package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
- package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/stories/Command.stories.d.ts.map +1 -1
- package/dist/types/src/stories/CommandMenu.stories.d.ts +1 -1
- package/dist/types/src/stories/CommandMenu.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
- package/dist/types/src/stories/EditorToolbar.stories.d.ts +1 -1
- package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
- package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
- package/dist/types/src/stories/components/EditorStory.d.ts +2 -2
- package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
- package/dist/types/src/testing/util.d.ts +1 -0
- package/dist/types/src/testing/util.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +28 -29
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/index.d.ts +2 -0
- package/dist/types/src/types/index.d.ts.map +1 -0
- package/dist/types/src/types/types.d.ts +21 -0
- package/dist/types/src/types/types.d.ts.map +1 -0
- package/dist/types/src/util/cursor.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +47 -41
- package/src/components/Editor/Editor.tsx +39 -0
- package/src/components/Editor/index.ts +5 -0
- package/src/components/EditorToolbar/EditorToolbar.tsx +1 -1
- package/src/components/EditorToolbar/blocks.ts +4 -3
- package/src/components/EditorToolbar/formatting.ts +3 -2
- package/src/components/EditorToolbar/headings.ts +2 -1
- package/src/components/EditorToolbar/lists.ts +3 -2
- package/src/components/EditorToolbar/util.ts +6 -5
- package/src/components/EditorToolbar/view-mode.ts +3 -2
- package/src/components/Popover/RefDropdownMenu.tsx +10 -4
- package/src/components/Popover/RefPopover.tsx +4 -4
- package/src/components/index.ts +1 -0
- package/src/extensions/autocomplete.ts +3 -3
- package/src/extensions/automerge/automerge.stories.tsx +8 -6
- package/src/extensions/automerge/automerge.ts +4 -3
- package/src/extensions/automerge/defs.ts +1 -1
- package/src/extensions/automerge/sync.ts +1 -1
- package/src/extensions/automerge/update-automerge.ts +1 -1
- package/src/extensions/awareness/awareness.ts +2 -2
- package/src/extensions/blast.ts +3 -16
- package/src/extensions/command/action.ts +1 -1
- package/src/extensions/command/command-menu.ts +4 -3
- package/src/extensions/command/command.ts +3 -3
- package/src/extensions/command/hint.ts +2 -1
- package/src/extensions/command/index.ts +1 -1
- package/src/extensions/command/placeholder.ts +1 -1
- package/src/extensions/command/state.ts +4 -3
- package/src/extensions/command/typeahead.ts +28 -15
- package/src/extensions/command/useCommandMenu.ts +2 -1
- package/src/extensions/comments.ts +7 -6
- package/src/extensions/dnd.ts +1 -1
- package/src/extensions/factories.ts +28 -8
- package/src/extensions/markdown/action.ts +2 -1
- package/src/extensions/markdown/bundle.ts +1 -1
- package/src/extensions/markdown/changes.ts +1 -1
- package/src/extensions/markdown/decorate.ts +7 -6
- package/src/extensions/markdown/formatting.test.ts +7 -7
- package/src/extensions/markdown/formatting.ts +16 -14
- package/src/extensions/markdown/highlight.ts +1 -1
- package/src/extensions/mention.ts +1 -1
- package/src/extensions/modes.ts +0 -9
- package/src/extensions/outliner/outliner.test.ts +3 -2
- package/src/extensions/outliner/outliner.ts +4 -3
- package/src/extensions/outliner/selection.ts +1 -1
- package/src/extensions/outliner/tree.test.ts +2 -1
- package/src/extensions/outliner/tree.ts +1 -1
- package/src/hooks/useTextEditor.ts +3 -3
- package/src/index.ts +1 -1
- package/src/stories/Command.stories.tsx +6 -5
- package/src/stories/CommandMenu.stories.tsx +7 -6
- package/src/stories/Comments.stories.tsx +3 -2
- package/src/stories/EditorToolbar.stories.tsx +6 -7
- package/src/stories/Experimental.stories.tsx +4 -3
- package/src/stories/Markdown.stories.tsx +3 -2
- package/src/stories/Outliner.stories.tsx +4 -3
- package/src/stories/Preview.stories.tsx +25 -26
- package/src/stories/TextEditor.stories.tsx +16 -15
- package/src/stories/components/EditorStory.tsx +5 -5
- package/src/styles/theme.ts +8 -8
- package/src/testing/util.ts +2 -0
- package/src/translations.ts +4 -2
- package/src/types/index.ts +5 -0
- package/src/types/types.ts +32 -0
- package/src/util/cursor.ts +2 -1
- package/dist/lib/node/index.cjs +0 -7754
- package/dist/lib/node/index.cjs.map +0 -7
- package/dist/lib/node/meta.json +0 -1
- package/dist/lib/node/testing/index.cjs +0 -29
- package/dist/lib/node/testing/index.cjs.map +0 -7
- package/dist/types/src/types.d.ts +0 -14
- package/dist/types/src/types.d.ts.map +0 -1
- package/src/types.ts +0 -23
@@ -1,8 +1,14 @@
|
|
1
1
|
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
2
|
+
import {
|
3
|
+
EditorInputMode,
|
4
|
+
EditorInputModes,
|
5
|
+
EditorViewMode,
|
6
|
+
EditorViewModes
|
7
|
+
} from "./chunk-YXYQPV6R.mjs";
|
2
8
|
|
3
|
-
//
|
9
|
+
// src/translations.ts
|
4
10
|
var translationKey = "react-ui-editor";
|
5
|
-
var
|
11
|
+
var translations = [
|
6
12
|
{
|
7
13
|
"en-US": {
|
8
14
|
[translationKey]: {
|
@@ -35,46 +41,27 @@ var translations_default = [
|
|
35
41
|
}
|
36
42
|
];
|
37
43
|
|
38
|
-
//
|
44
|
+
// src/index.ts
|
39
45
|
import { EditorState as EditorState4 } from "@codemirror/state";
|
40
46
|
import { EditorView as EditorView27, keymap as keymap14 } from "@codemirror/view";
|
41
47
|
import { tags as tags2 } from "@lezer/highlight";
|
42
48
|
import { TextKind } from "@dxos/protocols/proto/dxos/echo/model/text";
|
43
49
|
|
44
|
-
//
|
50
|
+
// src/components/Editor/Editor.tsx
|
45
51
|
import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
|
46
|
-
import {
|
47
|
-
import
|
48
|
-
import {
|
49
|
-
import { ElevationProvider } from "@dxos/react-ui";
|
50
|
-
import { MenuProvider, ToolbarMenu, createGapSeparator, useMenuActions } from "@dxos/react-ui-menu";
|
52
|
+
import React3, { forwardRef, useImperativeHandle } from "react";
|
53
|
+
import { useThemeContext } from "@dxos/react-ui";
|
54
|
+
import { mx as mx6 } from "@dxos/react-ui-theme";
|
51
55
|
|
52
|
-
//
|
53
|
-
import {
|
54
|
-
import {
|
55
|
-
import {
|
56
|
-
|
57
|
-
|
58
|
-
};
|
59
|
-
var createEditorAction = (id, invoke, properties) => {
|
60
|
-
const { label = [
|
61
|
-
`${id} label`,
|
62
|
-
{
|
63
|
-
ns: translationKey
|
64
|
-
}
|
65
|
-
], ...rest } = properties;
|
66
|
-
return createMenuAction(id, invoke, {
|
67
|
-
label,
|
68
|
-
...rest
|
69
|
-
});
|
70
|
-
};
|
71
|
-
var createEditorActionGroup = (id, props, icon) => createMenuItemGroup(id, {
|
72
|
-
icon,
|
73
|
-
iconOnly: true,
|
74
|
-
...props
|
75
|
-
});
|
56
|
+
// src/hooks/useTextEditor.ts
|
57
|
+
import { EditorState as EditorState3 } from "@codemirror/state";
|
58
|
+
import { EditorView as EditorView26 } from "@codemirror/view";
|
59
|
+
import { useFocusableGroup } from "@fluentui/react-tabster";
|
60
|
+
import { useCallback as useCallback3, useEffect as useEffect2, useMemo as useMemo3, useRef as useRef2, useState as useState2 } from "react";
|
61
|
+
import { log as log8 } from "@dxos/log";
|
62
|
+
import { getProviderValue, isNotFalsy as isNotFalsy4 } from "@dxos/util";
|
76
63
|
|
77
|
-
//
|
64
|
+
// src/extensions/annotations.ts
|
78
65
|
import { RangeSetBuilder } from "@codemirror/state";
|
79
66
|
import { Decoration, EditorView, ViewPlugin } from "@codemirror/view";
|
80
67
|
var annotationMark = Decoration.mark({
|
@@ -83,9 +70,7 @@ var annotationMark = Decoration.mark({
|
|
83
70
|
var annotations = ({ match } = {}) => {
|
84
71
|
return [
|
85
72
|
ViewPlugin.fromClass(class {
|
86
|
-
|
87
|
-
this.decorations = Decoration.none;
|
88
|
-
}
|
73
|
+
decorations = Decoration.none;
|
89
74
|
update(update2) {
|
90
75
|
const builder = new RangeSetBuilder();
|
91
76
|
if (match) {
|
@@ -115,7 +100,7 @@ var annotations = ({ match } = {}) => {
|
|
115
100
|
];
|
116
101
|
};
|
117
102
|
|
118
|
-
//
|
103
|
+
// src/extensions/autocomplete.ts
|
119
104
|
import { autocompletion, completionKeymap } from "@codemirror/autocomplete";
|
120
105
|
import { markdownLanguage } from "@codemirror/lang-markdown";
|
121
106
|
import { keymap } from "@codemirror/view";
|
@@ -152,22 +137,179 @@ var autocomplete = ({ activateOnTyping, override, onSearch } = {}) => {
|
|
152
137
|
return extensions;
|
153
138
|
};
|
154
139
|
|
155
|
-
//
|
140
|
+
// src/extensions/automerge/automerge.ts
|
156
141
|
import { next as A3 } from "@automerge/automerge";
|
157
142
|
import { StateField } from "@codemirror/state";
|
158
143
|
import { EditorView as EditorView2, ViewPlugin as ViewPlugin2 } from "@codemirror/view";
|
159
144
|
|
160
|
-
//
|
145
|
+
// src/util/facet.ts
|
146
|
+
import { Facet } from "@codemirror/state";
|
147
|
+
var singleValueFacet = (defaultValue) => Facet.define({
|
148
|
+
// Called immediately.
|
149
|
+
combine: (providers) => {
|
150
|
+
return providers[0] ?? defaultValue;
|
151
|
+
}
|
152
|
+
});
|
153
|
+
|
154
|
+
// src/util/cursor.ts
|
155
|
+
var overlap = (a, b) => a.from <= b.to && a.to >= b.from;
|
156
|
+
var defaultCursorConverter = {
|
157
|
+
toCursor: (position) => position.toString(),
|
158
|
+
fromCursor: (cursor) => parseInt(cursor)
|
159
|
+
};
|
160
|
+
var Cursor = class _Cursor {
|
161
|
+
static converter = singleValueFacet(defaultCursorConverter);
|
162
|
+
static getCursorFromRange = (state, range) => {
|
163
|
+
const cursorConverter2 = state.facet(_Cursor.converter);
|
164
|
+
const from = cursorConverter2.toCursor(range.from);
|
165
|
+
const to = cursorConverter2.toCursor(range.to, -1);
|
166
|
+
return [
|
167
|
+
from,
|
168
|
+
to
|
169
|
+
].join(":");
|
170
|
+
};
|
171
|
+
static getRangeFromCursor = (state, cursor) => {
|
172
|
+
const cursorConverter2 = state.facet(_Cursor.converter);
|
173
|
+
const parts = cursor.split(":");
|
174
|
+
const from = cursorConverter2.fromCursor(parts[0]);
|
175
|
+
const to = cursorConverter2.fromCursor(parts[1]);
|
176
|
+
return from !== void 0 && to !== void 0 ? {
|
177
|
+
from,
|
178
|
+
to
|
179
|
+
} : void 0;
|
180
|
+
};
|
181
|
+
};
|
182
|
+
|
183
|
+
// src/util/debug.ts
|
161
184
|
import { log } from "@dxos/log";
|
185
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/util/debug.ts";
|
186
|
+
var wrapWithCatch = (fn) => {
|
187
|
+
return (...args) => {
|
188
|
+
try {
|
189
|
+
return fn(...args);
|
190
|
+
} catch (err) {
|
191
|
+
log.catch(err, void 0, {
|
192
|
+
F: __dxlog_file,
|
193
|
+
L: 15,
|
194
|
+
S: void 0,
|
195
|
+
C: (f, a) => f(...a)
|
196
|
+
});
|
197
|
+
}
|
198
|
+
};
|
199
|
+
};
|
200
|
+
var callbackWrapper = (fn) => (...args) => {
|
201
|
+
try {
|
202
|
+
return fn(...args);
|
203
|
+
} catch (err) {
|
204
|
+
log.catch(err, void 0, {
|
205
|
+
F: __dxlog_file,
|
206
|
+
L: 29,
|
207
|
+
S: void 0,
|
208
|
+
C: (f, a) => f(...a)
|
209
|
+
});
|
210
|
+
}
|
211
|
+
};
|
212
|
+
var debugDispatcher = (trs, view) => {
|
213
|
+
logChanges(trs);
|
214
|
+
view.update(trs);
|
215
|
+
};
|
216
|
+
var logChanges = (trs) => {
|
217
|
+
const changes = trs.flatMap((tr) => {
|
218
|
+
if (tr.changes.empty) {
|
219
|
+
return void 0;
|
220
|
+
}
|
221
|
+
const changes2 = [];
|
222
|
+
tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => changes2.push(JSON.stringify({
|
223
|
+
fromA,
|
224
|
+
toA,
|
225
|
+
fromB,
|
226
|
+
toB,
|
227
|
+
inserted: inserted.toString()
|
228
|
+
})));
|
229
|
+
return changes2;
|
230
|
+
}).filter(Boolean);
|
231
|
+
if (changes.length) {
|
232
|
+
log("changes", {
|
233
|
+
changes
|
234
|
+
}, {
|
235
|
+
F: __dxlog_file,
|
236
|
+
L: 62,
|
237
|
+
S: void 0,
|
238
|
+
C: (f, a) => f(...a)
|
239
|
+
});
|
240
|
+
}
|
241
|
+
};
|
242
|
+
|
243
|
+
// src/util/dom.ts
|
244
|
+
var flattenRect = (rect, left) => {
|
245
|
+
const x = left ? rect.left : rect.right;
|
246
|
+
return {
|
247
|
+
left: x,
|
248
|
+
right: x,
|
249
|
+
top: rect.top,
|
250
|
+
bottom: rect.bottom
|
251
|
+
};
|
252
|
+
};
|
253
|
+
var scratchRange;
|
254
|
+
var textRange = (node, from, to = from) => {
|
255
|
+
const range = scratchRange || (scratchRange = document.createRange());
|
256
|
+
range.setEnd(node, to);
|
257
|
+
range.setStart(node, from);
|
258
|
+
return range;
|
259
|
+
};
|
260
|
+
var clientRectsFor = (dom) => {
|
261
|
+
if (dom.nodeType === 3) {
|
262
|
+
return textRange(dom, 0, dom.nodeValue.length).getClientRects();
|
263
|
+
} else if (dom.nodeType === 1) {
|
264
|
+
return dom.getClientRects();
|
265
|
+
} else {
|
266
|
+
return [];
|
267
|
+
}
|
268
|
+
};
|
269
|
+
var createElement = (tag, options, children) => {
|
270
|
+
const el = document.createElement(tag);
|
271
|
+
if (options?.className) {
|
272
|
+
el.className = options.className;
|
273
|
+
}
|
274
|
+
if (options?.text) {
|
275
|
+
el.textContent = options.text;
|
276
|
+
}
|
277
|
+
if (children) {
|
278
|
+
el.append(...Array.isArray(children) ? children : [
|
279
|
+
children
|
280
|
+
]);
|
281
|
+
}
|
282
|
+
return el;
|
283
|
+
};
|
284
|
+
|
285
|
+
// src/util/react.tsx
|
286
|
+
import React from "react";
|
287
|
+
import { createRoot } from "react-dom/client";
|
288
|
+
import { ThemeProvider, Tooltip } from "@dxos/react-ui";
|
289
|
+
import { defaultTx } from "@dxos/react-ui-theme";
|
290
|
+
var renderRoot = (root, node) => {
|
291
|
+
createRoot(root).render(/* @__PURE__ */ React.createElement(ThemeProvider, {
|
292
|
+
tx: defaultTx
|
293
|
+
}, node));
|
294
|
+
return root;
|
295
|
+
};
|
296
|
+
var createRenderer = (Component) => (el, props) => {
|
297
|
+
renderRoot(el, /* @__PURE__ */ React.createElement(ThemeProvider, {
|
298
|
+
tx: defaultTx
|
299
|
+
}, /* @__PURE__ */ React.createElement(Tooltip.Provider, null, /* @__PURE__ */ React.createElement(Component, props))));
|
300
|
+
};
|
301
|
+
|
302
|
+
// src/extensions/automerge/cursor.ts
|
303
|
+
import { log as log2 } from "@dxos/log";
|
162
304
|
import { fromCursor, toCursor } from "@dxos/react-client/echo";
|
163
|
-
var
|
305
|
+
var __dxlog_file2 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/automerge/cursor.ts";
|
164
306
|
var cursorConverter = (accessor) => ({
|
165
307
|
toCursor: (pos, assoc) => {
|
166
308
|
try {
|
167
309
|
return toCursor(accessor, pos, assoc);
|
168
310
|
} catch (err) {
|
169
|
-
|
170
|
-
F:
|
311
|
+
log2.catch(err, void 0, {
|
312
|
+
F: __dxlog_file2,
|
171
313
|
L: 15,
|
172
314
|
S: void 0,
|
173
315
|
C: (f, a) => f(...a)
|
@@ -179,8 +321,8 @@ var cursorConverter = (accessor) => ({
|
|
179
321
|
try {
|
180
322
|
return fromCursor(accessor, cursor);
|
181
323
|
} catch (err) {
|
182
|
-
|
183
|
-
F:
|
324
|
+
log2.catch(err, void 0, {
|
325
|
+
F: __dxlog_file2,
|
184
326
|
L: 24,
|
185
327
|
S: void 0,
|
186
328
|
C: (f, a) => f(...a)
|
@@ -190,7 +332,7 @@ var cursorConverter = (accessor) => ({
|
|
190
332
|
}
|
191
333
|
});
|
192
334
|
|
193
|
-
//
|
335
|
+
// src/extensions/automerge/defs.ts
|
194
336
|
import { Annotation, StateEffect } from "@codemirror/state";
|
195
337
|
var getPath = (state, field) => state.field(field).path;
|
196
338
|
var getLastHeads = (state, field) => state.field(field).lastHeads;
|
@@ -203,10 +345,10 @@ var isReconcile = (tr) => {
|
|
203
345
|
return !!tr.annotation(reconcileAnnotation);
|
204
346
|
};
|
205
347
|
|
206
|
-
//
|
348
|
+
// src/extensions/automerge/sync.ts
|
207
349
|
import { next as A2 } from "@automerge/automerge";
|
208
350
|
|
209
|
-
//
|
351
|
+
// src/extensions/automerge/update-automerge.ts
|
210
352
|
import { next as A } from "@automerge/automerge";
|
211
353
|
var updateAutomerge = (field, handle, transactions, state) => {
|
212
354
|
const { lastHeads, path } = state.field(field);
|
@@ -237,7 +379,7 @@ var updateAutomerge = (field, handle, transactions, state) => {
|
|
237
379
|
return newHeads ?? void 0;
|
238
380
|
};
|
239
381
|
|
240
|
-
//
|
382
|
+
// src/extensions/automerge/update-codemirror.ts
|
241
383
|
import { ChangeSet } from "@codemirror/state";
|
242
384
|
var updateCodeMirror = (view, selection, target, patches) => {
|
243
385
|
for (const patch of patches) {
|
@@ -344,8 +486,11 @@ var charPath = (textPath, candidatePath) => {
|
|
344
486
|
return null;
|
345
487
|
};
|
346
488
|
|
347
|
-
//
|
489
|
+
// src/extensions/automerge/sync.ts
|
348
490
|
var Syncer = class {
|
491
|
+
_handle;
|
492
|
+
_state;
|
493
|
+
_pending;
|
349
494
|
// prettier-ignore
|
350
495
|
constructor(_handle, _state) {
|
351
496
|
this._handle = _handle;
|
@@ -388,170 +533,7 @@ var Syncer = class {
|
|
388
533
|
}
|
389
534
|
};
|
390
535
|
|
391
|
-
//
|
392
|
-
import { Facet } from "@codemirror/state";
|
393
|
-
var singleValueFacet = (defaultValue) => Facet.define({
|
394
|
-
// Called immediately.
|
395
|
-
combine: (providers) => {
|
396
|
-
return providers[0] ?? defaultValue;
|
397
|
-
}
|
398
|
-
});
|
399
|
-
|
400
|
-
// packages/ui/react-ui-editor/src/util/cursor.ts
|
401
|
-
var overlap = (a, b) => a.from <= b.to && a.to >= b.from;
|
402
|
-
var defaultCursorConverter = {
|
403
|
-
toCursor: (position) => position.toString(),
|
404
|
-
fromCursor: (cursor) => parseInt(cursor)
|
405
|
-
};
|
406
|
-
var Cursor = class _Cursor {
|
407
|
-
static {
|
408
|
-
this.converter = singleValueFacet(defaultCursorConverter);
|
409
|
-
}
|
410
|
-
static {
|
411
|
-
this.getCursorFromRange = (state, range) => {
|
412
|
-
const cursorConverter2 = state.facet(_Cursor.converter);
|
413
|
-
const from = cursorConverter2.toCursor(range.from);
|
414
|
-
const to = cursorConverter2.toCursor(range.to, -1);
|
415
|
-
return [
|
416
|
-
from,
|
417
|
-
to
|
418
|
-
].join(":");
|
419
|
-
};
|
420
|
-
}
|
421
|
-
static {
|
422
|
-
this.getRangeFromCursor = (state, cursor) => {
|
423
|
-
const cursorConverter2 = state.facet(_Cursor.converter);
|
424
|
-
const parts = cursor.split(":");
|
425
|
-
const from = cursorConverter2.fromCursor(parts[0]);
|
426
|
-
const to = cursorConverter2.fromCursor(parts[1]);
|
427
|
-
return from !== void 0 && to !== void 0 ? {
|
428
|
-
from,
|
429
|
-
to
|
430
|
-
} : void 0;
|
431
|
-
};
|
432
|
-
}
|
433
|
-
};
|
434
|
-
|
435
|
-
// packages/ui/react-ui-editor/src/util/debug.ts
|
436
|
-
import { log as log2 } from "@dxos/log";
|
437
|
-
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/util/debug.ts";
|
438
|
-
var wrapWithCatch = (fn) => {
|
439
|
-
return (...args) => {
|
440
|
-
try {
|
441
|
-
return fn(...args);
|
442
|
-
} catch (err) {
|
443
|
-
log2.catch(err, void 0, {
|
444
|
-
F: __dxlog_file2,
|
445
|
-
L: 15,
|
446
|
-
S: void 0,
|
447
|
-
C: (f, a) => f(...a)
|
448
|
-
});
|
449
|
-
}
|
450
|
-
};
|
451
|
-
};
|
452
|
-
var callbackWrapper = (fn) => (...args) => {
|
453
|
-
try {
|
454
|
-
return fn(...args);
|
455
|
-
} catch (err) {
|
456
|
-
log2.catch(err, void 0, {
|
457
|
-
F: __dxlog_file2,
|
458
|
-
L: 29,
|
459
|
-
S: void 0,
|
460
|
-
C: (f, a) => f(...a)
|
461
|
-
});
|
462
|
-
}
|
463
|
-
};
|
464
|
-
var debugDispatcher = (trs, view) => {
|
465
|
-
logChanges(trs);
|
466
|
-
view.update(trs);
|
467
|
-
};
|
468
|
-
var logChanges = (trs) => {
|
469
|
-
const changes = trs.flatMap((tr) => {
|
470
|
-
if (tr.changes.empty) {
|
471
|
-
return void 0;
|
472
|
-
}
|
473
|
-
const changes2 = [];
|
474
|
-
tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => changes2.push(JSON.stringify({
|
475
|
-
fromA,
|
476
|
-
toA,
|
477
|
-
fromB,
|
478
|
-
toB,
|
479
|
-
inserted: inserted.toString()
|
480
|
-
})));
|
481
|
-
return changes2;
|
482
|
-
}).filter(Boolean);
|
483
|
-
if (changes.length) {
|
484
|
-
log2("changes", {
|
485
|
-
changes
|
486
|
-
}, {
|
487
|
-
F: __dxlog_file2,
|
488
|
-
L: 62,
|
489
|
-
S: void 0,
|
490
|
-
C: (f, a) => f(...a)
|
491
|
-
});
|
492
|
-
}
|
493
|
-
};
|
494
|
-
|
495
|
-
// packages/ui/react-ui-editor/src/util/dom.ts
|
496
|
-
var flattenRect = (rect, left) => {
|
497
|
-
const x = left ? rect.left : rect.right;
|
498
|
-
return {
|
499
|
-
left: x,
|
500
|
-
right: x,
|
501
|
-
top: rect.top,
|
502
|
-
bottom: rect.bottom
|
503
|
-
};
|
504
|
-
};
|
505
|
-
var scratchRange;
|
506
|
-
var textRange = (node, from, to = from) => {
|
507
|
-
const range = scratchRange || (scratchRange = document.createRange());
|
508
|
-
range.setEnd(node, to);
|
509
|
-
range.setStart(node, from);
|
510
|
-
return range;
|
511
|
-
};
|
512
|
-
var clientRectsFor = (dom) => {
|
513
|
-
if (dom.nodeType === 3) {
|
514
|
-
return textRange(dom, 0, dom.nodeValue.length).getClientRects();
|
515
|
-
} else if (dom.nodeType === 1) {
|
516
|
-
return dom.getClientRects();
|
517
|
-
} else {
|
518
|
-
return [];
|
519
|
-
}
|
520
|
-
};
|
521
|
-
var createElement = (tag, options, children) => {
|
522
|
-
const el = document.createElement(tag);
|
523
|
-
if (options?.className) {
|
524
|
-
el.className = options.className;
|
525
|
-
}
|
526
|
-
if (options?.text) {
|
527
|
-
el.textContent = options.text;
|
528
|
-
}
|
529
|
-
if (children) {
|
530
|
-
el.append(...Array.isArray(children) ? children : [
|
531
|
-
children
|
532
|
-
]);
|
533
|
-
}
|
534
|
-
return el;
|
535
|
-
};
|
536
|
-
|
537
|
-
// packages/ui/react-ui-editor/src/util/react.tsx
|
538
|
-
import React from "react";
|
539
|
-
import { createRoot } from "react-dom/client";
|
540
|
-
import { ThemeProvider, Tooltip } from "@dxos/react-ui";
|
541
|
-
import { defaultTx } from "@dxos/react-ui-theme";
|
542
|
-
var renderRoot = (root, node) => {
|
543
|
-
createRoot(root).render(/* @__PURE__ */ React.createElement(ThemeProvider, {
|
544
|
-
tx: defaultTx
|
545
|
-
}, node));
|
546
|
-
return root;
|
547
|
-
};
|
548
|
-
var createRenderer = (Component) => (el, props) => {
|
549
|
-
renderRoot(el, /* @__PURE__ */ React.createElement(ThemeProvider, {
|
550
|
-
tx: defaultTx
|
551
|
-
}, /* @__PURE__ */ React.createElement(Tooltip.Provider, null, /* @__PURE__ */ React.createElement(Component, props))));
|
552
|
-
};
|
553
|
-
|
554
|
-
// packages/ui/react-ui-editor/src/extensions/automerge/automerge.ts
|
536
|
+
// src/extensions/automerge/automerge.ts
|
555
537
|
var automerge = (accessor) => {
|
556
538
|
const syncState = StateField.define({
|
557
539
|
create: () => ({
|
@@ -589,6 +571,7 @@ var automerge = (accessor) => {
|
|
589
571
|
syncState,
|
590
572
|
// Reconcile external updates.
|
591
573
|
ViewPlugin2.fromClass(class {
|
574
|
+
_view;
|
592
575
|
constructor(_view) {
|
593
576
|
this._view = _view;
|
594
577
|
this._handleChange = () => {
|
@@ -599,6 +582,7 @@ var automerge = (accessor) => {
|
|
599
582
|
destroy() {
|
600
583
|
accessor.handle.removeListener("change", this._handleChange);
|
601
584
|
}
|
585
|
+
_handleChange;
|
602
586
|
}),
|
603
587
|
// Reconcile local updates.
|
604
588
|
EditorView2.updateListener.of(({ view, changes }) => {
|
@@ -609,12 +593,12 @@ var automerge = (accessor) => {
|
|
609
593
|
];
|
610
594
|
};
|
611
595
|
|
612
|
-
//
|
596
|
+
// src/extensions/awareness/awareness.ts
|
613
597
|
import { Annotation as Annotation2, RangeSet } from "@codemirror/state";
|
614
598
|
import { Decoration as Decoration2, EditorView as EditorView3, ViewPlugin as ViewPlugin3, WidgetType } from "@codemirror/view";
|
615
599
|
import { Event } from "@dxos/async";
|
616
600
|
import { Context } from "@dxos/context";
|
617
|
-
var __dxlog_file3 = "/
|
601
|
+
var __dxlog_file3 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/awareness/awareness.ts";
|
618
602
|
var dummyProvider = {
|
619
603
|
remoteStateChange: new Event(),
|
620
604
|
open: () => {
|
@@ -637,12 +621,16 @@ var awareness = (provider = dummyProvider) => {
|
|
637
621
|
];
|
638
622
|
};
|
639
623
|
var RemoteSelectionsDecorator = class {
|
624
|
+
_ctx = new Context(void 0, {
|
625
|
+
F: __dxlog_file3,
|
626
|
+
L: 80
|
627
|
+
});
|
628
|
+
_cursorConverter;
|
629
|
+
_provider;
|
630
|
+
_lastAnchor;
|
631
|
+
_lastHead;
|
632
|
+
decorations = RangeSet.of([]);
|
640
633
|
constructor(view) {
|
641
|
-
this._ctx = new Context(void 0, {
|
642
|
-
F: __dxlog_file3,
|
643
|
-
L: 80
|
644
|
-
});
|
645
|
-
this.decorations = RangeSet.of([]);
|
646
634
|
this._cursorConverter = view.state.facet(Cursor.converter);
|
647
635
|
this._provider = view.state.facet(awarenessProvider);
|
648
636
|
this._provider.open();
|
@@ -750,6 +738,8 @@ var RemoteSelectionsDecorator = class {
|
|
750
738
|
}
|
751
739
|
};
|
752
740
|
var RemoteCaretWidget = class extends WidgetType {
|
741
|
+
_name;
|
742
|
+
_color;
|
753
743
|
constructor(_name, _color) {
|
754
744
|
super(), this._name = _name, this._color = _color;
|
755
745
|
}
|
@@ -841,17 +831,24 @@ var styles = EditorView3.theme({
|
|
841
831
|
}
|
842
832
|
});
|
843
833
|
|
844
|
-
//
|
834
|
+
// src/extensions/awareness/awareness-provider.ts
|
845
835
|
import { DeferredTask, Event as Event2, sleep } from "@dxos/async";
|
846
836
|
import { Context as Context2 } from "@dxos/context";
|
847
837
|
import { invariant } from "@dxos/invariant";
|
848
838
|
import { log as log3 } from "@dxos/log";
|
849
|
-
var __dxlog_file4 = "/
|
839
|
+
var __dxlog_file4 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/awareness/awareness-provider.ts";
|
850
840
|
var DEBOUNCE_INTERVAL = 100;
|
851
841
|
var SpaceAwarenessProvider = class {
|
842
|
+
_remoteStates = /* @__PURE__ */ new Map();
|
843
|
+
_space;
|
844
|
+
_channel;
|
845
|
+
_peerId;
|
846
|
+
_info;
|
847
|
+
_ctx;
|
848
|
+
_postTask;
|
849
|
+
_localState;
|
850
|
+
remoteStateChange = new Event2();
|
852
851
|
constructor(params) {
|
853
|
-
this._remoteStates = /* @__PURE__ */ new Map();
|
854
|
-
this.remoteStateChange = new Event2();
|
855
852
|
this._space = params.space;
|
856
853
|
this._channel = params.channel;
|
857
854
|
this._peerId = params.peerId;
|
@@ -948,11 +945,12 @@ var SpaceAwarenessProvider = class {
|
|
948
945
|
}
|
949
946
|
};
|
950
947
|
|
951
|
-
//
|
948
|
+
// src/extensions/blast.ts
|
952
949
|
import { EditorView as EditorView4, keymap as keymap2 } from "@codemirror/view";
|
953
950
|
import defaultsDeep from "lodash.defaultsdeep";
|
951
|
+
import { throttle } from "@dxos/async";
|
954
952
|
import { invariant as invariant2 } from "@dxos/invariant";
|
955
|
-
var __dxlog_file5 = "/
|
953
|
+
var __dxlog_file5 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/blast.ts";
|
956
954
|
var defaultOptions = {
|
957
955
|
effect: 2,
|
958
956
|
maxParticles: 200,
|
@@ -1046,6 +1044,18 @@ var blast = (options = defaultOptions) => {
|
|
1046
1044
|
];
|
1047
1045
|
};
|
1048
1046
|
var Blaster = class {
|
1047
|
+
_node;
|
1048
|
+
_options;
|
1049
|
+
_effect;
|
1050
|
+
_canvas;
|
1051
|
+
_ctx;
|
1052
|
+
_running;
|
1053
|
+
_lastTime;
|
1054
|
+
_shakeTime;
|
1055
|
+
_shakeTimeMax;
|
1056
|
+
_particles;
|
1057
|
+
_particlePointer;
|
1058
|
+
_lastPoint;
|
1049
1059
|
constructor(_node, _options) {
|
1050
1060
|
this._node = _node;
|
1051
1061
|
this._options = _options;
|
@@ -1080,7 +1090,7 @@ var Blaster = class {
|
|
1080
1090
|
initialize() {
|
1081
1091
|
invariant2(!this._canvas && !this._ctx, void 0, {
|
1082
1092
|
F: __dxlog_file5,
|
1083
|
-
L:
|
1093
|
+
L: 142,
|
1084
1094
|
S: this,
|
1085
1095
|
A: [
|
1086
1096
|
"!this._canvas && !this._ctx",
|
@@ -1117,7 +1127,7 @@ var Blaster = class {
|
|
1117
1127
|
start() {
|
1118
1128
|
invariant2(this._canvas && this._ctx, void 0, {
|
1119
1129
|
F: __dxlog_file5,
|
1120
|
-
L:
|
1130
|
+
L: 181,
|
1121
1131
|
S: this,
|
1122
1132
|
A: [
|
1123
1133
|
"this._canvas && this._ctx",
|
@@ -1150,6 +1160,8 @@ var Blaster = class {
|
|
1150
1160
|
this.drawParticles();
|
1151
1161
|
requestAnimationFrame(this.loop.bind(this));
|
1152
1162
|
}
|
1163
|
+
shake;
|
1164
|
+
spawn;
|
1153
1165
|
drawParticles() {
|
1154
1166
|
for (let i = this._particles.length; i--; i > 0) {
|
1155
1167
|
const particle = this._particles[i];
|
@@ -1164,6 +1176,7 @@ var Blaster = class {
|
|
1164
1176
|
}
|
1165
1177
|
};
|
1166
1178
|
var Effect = class {
|
1179
|
+
_options;
|
1167
1180
|
constructor(_options) {
|
1168
1181
|
this._options = _options;
|
1169
1182
|
}
|
@@ -1221,18 +1234,6 @@ var Effect2 = class extends Effect {
|
|
1221
1234
|
ctx.fill();
|
1222
1235
|
}
|
1223
1236
|
};
|
1224
|
-
function throttle(callback, limit) {
|
1225
|
-
let wait = false;
|
1226
|
-
return function(...args) {
|
1227
|
-
if (!wait) {
|
1228
|
-
callback.apply(this, args);
|
1229
|
-
wait = true;
|
1230
|
-
setTimeout(() => {
|
1231
|
-
wait = false;
|
1232
|
-
}, limit);
|
1233
|
-
}
|
1234
|
-
};
|
1235
|
-
}
|
1236
1237
|
var getRGBComponents = (node, color) => {
|
1237
1238
|
if (typeof color === "function") {
|
1238
1239
|
return color();
|
@@ -1258,10 +1259,10 @@ var random = (min, max) => {
|
|
1258
1259
|
return min + ~~(Math.random() * (max - min + 1));
|
1259
1260
|
};
|
1260
1261
|
|
1261
|
-
//
|
1262
|
+
// src/extensions/command/action.ts
|
1262
1263
|
import { StateEffect as StateEffect2 } from "@codemirror/state";
|
1263
1264
|
|
1264
|
-
//
|
1265
|
+
// src/extensions/command/state.ts
|
1265
1266
|
import { StateField as StateField2 } from "@codemirror/state";
|
1266
1267
|
import { showTooltip } from "@codemirror/view";
|
1267
1268
|
var commandConfig = singleValueFacet();
|
@@ -1274,7 +1275,7 @@ var commandState = StateField2.define({
|
|
1274
1275
|
}
|
1275
1276
|
const { renderDialog } = tr.state.facet(commandConfig);
|
1276
1277
|
if (effect.is(openEffect) && renderDialog) {
|
1277
|
-
const { pos, fullWidth } = effect.value;
|
1278
|
+
const { pos, fullWidth: fullWidth2 } = effect.value;
|
1278
1279
|
const tooltip = {
|
1279
1280
|
pos,
|
1280
1281
|
above: false,
|
@@ -1285,7 +1286,7 @@ var commandState = StateField2.define({
|
|
1285
1286
|
const tooltipView = {
|
1286
1287
|
dom: root,
|
1287
1288
|
mount: (view2) => {
|
1288
|
-
if (
|
1289
|
+
if (fullWidth2) {
|
1289
1290
|
const parent = root.parentElement;
|
1290
1291
|
const { paddingLeft, paddingRight } = window.getComputedStyle(parent);
|
1291
1292
|
const widthWithoutPadding = parent.clientWidth - parseFloat(paddingLeft) - parseFloat(paddingRight);
|
@@ -1331,7 +1332,7 @@ var commandState = StateField2.define({
|
|
1331
1332
|
]
|
1332
1333
|
});
|
1333
1334
|
|
1334
|
-
//
|
1335
|
+
// src/extensions/command/action.ts
|
1335
1336
|
var openEffect = StateEffect2.define();
|
1336
1337
|
var closeEffect = StateEffect2.define();
|
1337
1338
|
var openCommand = (view) => {
|
@@ -1371,19 +1372,18 @@ var commandKeyBindings = [
|
|
1371
1372
|
}
|
1372
1373
|
];
|
1373
1374
|
|
1374
|
-
//
|
1375
|
+
// src/extensions/command/command.ts
|
1375
1376
|
import { Prec } from "@codemirror/state";
|
1376
1377
|
import { EditorView as EditorView6, keymap as keymap3 } from "@codemirror/view";
|
1377
1378
|
import { isNonNullable } from "@dxos/util";
|
1378
1379
|
|
1379
|
-
//
|
1380
|
+
// src/extensions/command/hint.ts
|
1380
1381
|
import { RangeSetBuilder as RangeSetBuilder2 } from "@codemirror/state";
|
1381
1382
|
import { Decoration as Decoration3, EditorView as EditorView5, ViewPlugin as ViewPlugin4, WidgetType as WidgetType2 } from "@codemirror/view";
|
1382
1383
|
var hint = ({ delay = 3e3, onHint }) => {
|
1383
1384
|
return ViewPlugin4.fromClass(class {
|
1384
|
-
|
1385
|
-
|
1386
|
-
}
|
1385
|
+
decorations = Decoration3.none;
|
1386
|
+
timeout;
|
1387
1387
|
update(update2) {
|
1388
1388
|
if (this.timeout) {
|
1389
1389
|
clearTimeout(this.timeout);
|
@@ -1422,6 +1422,7 @@ var hint = ({ delay = 3e3, onHint }) => {
|
|
1422
1422
|
});
|
1423
1423
|
};
|
1424
1424
|
var Hint = class extends WidgetType2 {
|
1425
|
+
content;
|
1425
1426
|
constructor(content) {
|
1426
1427
|
super(), this.content = content;
|
1427
1428
|
}
|
@@ -1460,7 +1461,7 @@ var Hint = class extends WidgetType2 {
|
|
1460
1461
|
}
|
1461
1462
|
};
|
1462
1463
|
|
1463
|
-
//
|
1464
|
+
// src/extensions/command/command.ts
|
1464
1465
|
var command = (options = {}) => {
|
1465
1466
|
return [
|
1466
1467
|
Prec.highest(keymap3.of(commandKeyBindings)),
|
@@ -1476,17 +1477,16 @@ var command = (options = {}) => {
|
|
1476
1477
|
].filter(isNonNullable);
|
1477
1478
|
};
|
1478
1479
|
|
1479
|
-
//
|
1480
|
-
import {
|
1481
|
-
import {
|
1480
|
+
// src/extensions/command/command-menu.ts
|
1481
|
+
import { Prec as Prec2, RangeSetBuilder as RangeSetBuilder3, StateEffect as StateEffect3, StateField as StateField3 } from "@codemirror/state";
|
1482
|
+
import { Decoration as Decoration5, EditorView as EditorView8, ViewPlugin as ViewPlugin6, keymap as keymap4 } from "@codemirror/view";
|
1482
1483
|
|
1483
|
-
//
|
1484
|
-
import { Decoration as Decoration4, EditorView as EditorView7,
|
1484
|
+
// src/extensions/command/placeholder.ts
|
1485
|
+
import { Decoration as Decoration4, EditorView as EditorView7, ViewPlugin as ViewPlugin5, WidgetType as WidgetType3 } from "@codemirror/view";
|
1485
1486
|
var placeholder = ({ delay = 3e3, content }) => {
|
1486
1487
|
const plugin = ViewPlugin5.fromClass(class {
|
1487
|
-
|
1488
|
-
|
1489
|
-
}
|
1488
|
+
decorations = Decoration4.none;
|
1489
|
+
timeout;
|
1490
1490
|
update(update2) {
|
1491
1491
|
if (this.timeout) {
|
1492
1492
|
window.clearTimeout(this.timeout);
|
@@ -1528,6 +1528,7 @@ var placeholder = ({ delay = 3e3, content }) => {
|
|
1528
1528
|
] : plugin;
|
1529
1529
|
};
|
1530
1530
|
var Placeholder = class extends WidgetType3 {
|
1531
|
+
content;
|
1531
1532
|
constructor(content) {
|
1532
1533
|
super(), this.content = content;
|
1533
1534
|
}
|
@@ -1562,9 +1563,11 @@ var Placeholder = class extends WidgetType3 {
|
|
1562
1563
|
}
|
1563
1564
|
};
|
1564
1565
|
|
1565
|
-
//
|
1566
|
+
// src/extensions/command/command-menu.ts
|
1566
1567
|
var commandMenu = (options) => {
|
1567
1568
|
const commandMenuPlugin = ViewPlugin6.fromClass(class {
|
1569
|
+
view;
|
1570
|
+
decorations;
|
1568
1571
|
constructor(view) {
|
1569
1572
|
this.view = view;
|
1570
1573
|
this.decorations = Decoration5.none;
|
@@ -1719,11 +1722,15 @@ var commandMenuState = StateField3.define({
|
|
1719
1722
|
}
|
1720
1723
|
});
|
1721
1724
|
|
1722
|
-
//
|
1725
|
+
// src/extensions/command/floating-menu.ts
|
1723
1726
|
import { EditorView as EditorView9, ViewPlugin as ViewPlugin7 } from "@codemirror/view";
|
1724
1727
|
import { addEventListener } from "@dxos/async";
|
1725
1728
|
var floatingMenu = (options = {}) => [
|
1726
1729
|
ViewPlugin7.fromClass(class {
|
1730
|
+
view;
|
1731
|
+
tag;
|
1732
|
+
rafId;
|
1733
|
+
cleanup;
|
1727
1734
|
constructor(view) {
|
1728
1735
|
this.view = view;
|
1729
1736
|
const container = view.scrollDOM;
|
@@ -1805,11 +1812,94 @@ var floatingMenu = (options = {}) => [
|
|
1805
1812
|
width: "2rem",
|
1806
1813
|
height: "2rem"
|
1807
1814
|
}
|
1808
|
-
})
|
1809
|
-
];
|
1815
|
+
})
|
1816
|
+
];
|
1817
|
+
|
1818
|
+
// src/extensions/command/typeahead.ts
|
1819
|
+
import { EditorSelection, Prec as Prec3, RangeSetBuilder as RangeSetBuilder4 } from "@codemirror/state";
|
1820
|
+
import { Decoration as Decoration6, ViewPlugin as ViewPlugin8, keymap as keymap5 } from "@codemirror/view";
|
1821
|
+
var typeahead = ({ onComplete } = {}) => {
|
1822
|
+
let hint2;
|
1823
|
+
const complete = (view) => {
|
1824
|
+
if (!hint2) {
|
1825
|
+
return false;
|
1826
|
+
}
|
1827
|
+
const selection = view.state.selection.main;
|
1828
|
+
view.dispatch({
|
1829
|
+
changes: [
|
1830
|
+
{
|
1831
|
+
from: selection.from,
|
1832
|
+
to: selection.to,
|
1833
|
+
insert: hint2
|
1834
|
+
}
|
1835
|
+
],
|
1836
|
+
selection: EditorSelection.cursor(selection.from + hint2.length)
|
1837
|
+
});
|
1838
|
+
return true;
|
1839
|
+
};
|
1840
|
+
return [
|
1841
|
+
ViewPlugin8.fromClass(class {
|
1842
|
+
decorations = Decoration6.none;
|
1843
|
+
update(update2) {
|
1844
|
+
const builder = new RangeSetBuilder4();
|
1845
|
+
const selection = update2.view.state.selection.main;
|
1846
|
+
const line = update2.view.state.doc.lineAt(selection.from);
|
1847
|
+
if (selection.from === selection.to && selection.from === line.to) {
|
1848
|
+
const str = update2.state.sliceDoc(line.from, selection.from);
|
1849
|
+
hint2 = onComplete?.({
|
1850
|
+
line: str
|
1851
|
+
});
|
1852
|
+
if (hint2) {
|
1853
|
+
builder.add(selection.from, selection.to, Decoration6.widget({
|
1854
|
+
widget: new Hint(hint2)
|
1855
|
+
}));
|
1856
|
+
}
|
1857
|
+
}
|
1858
|
+
this.decorations = builder.finish();
|
1859
|
+
}
|
1860
|
+
}, {
|
1861
|
+
decorations: (v) => v.decorations
|
1862
|
+
}),
|
1863
|
+
// Keys.
|
1864
|
+
Prec3.highest(keymap5.of([
|
1865
|
+
{
|
1866
|
+
key: "Tab",
|
1867
|
+
preventDefault: true,
|
1868
|
+
run: complete
|
1869
|
+
},
|
1870
|
+
{
|
1871
|
+
key: "ArrowRight",
|
1872
|
+
preventDefault: true,
|
1873
|
+
run: complete
|
1874
|
+
}
|
1875
|
+
]))
|
1876
|
+
];
|
1877
|
+
};
|
1878
|
+
var staticCompletion = (completions, options = {}) => ({ line }) => {
|
1879
|
+
if (line.length === 0 && options.default) {
|
1880
|
+
return options.default;
|
1881
|
+
}
|
1882
|
+
const parts = line.split(/\s+/).filter(Boolean);
|
1883
|
+
if (parts.length) {
|
1884
|
+
const str = parts.at(-1);
|
1885
|
+
if (str.length >= (options.minLength ?? 0)) {
|
1886
|
+
for (const completion of completions) {
|
1887
|
+
const match = matchCompletion(completion, str);
|
1888
|
+
if (match) {
|
1889
|
+
return match;
|
1890
|
+
}
|
1891
|
+
}
|
1892
|
+
}
|
1893
|
+
}
|
1894
|
+
};
|
1895
|
+
var matchCompletion = (completion, str, minLength = 0) => {
|
1896
|
+
if (str.length >= minLength && completion.length > str.length && completion.startsWith(str)) {
|
1897
|
+
return completion.slice(str.length);
|
1898
|
+
}
|
1899
|
+
};
|
1810
1900
|
|
1811
|
-
//
|
1812
|
-
import { useCallback, useMemo
|
1901
|
+
// src/extensions/command/useCommandMenu.ts
|
1902
|
+
import { useCallback, useMemo, useRef, useState } from "react";
|
1813
1903
|
var useCommandMenu = ({ viewRef, trigger, placeholder: placeholder3, getMenu }) => {
|
1814
1904
|
const triggerRef = useRef(null);
|
1815
1905
|
const currentRef = useRef(null);
|
@@ -1857,7 +1947,7 @@ var useCommandMenu = ({ viewRef, trigger, placeholder: placeholder3, getMenu })
|
|
1857
1947
|
void item.onSelect?.(view, selection.head);
|
1858
1948
|
}, []);
|
1859
1949
|
const serializedTrigger = Array.isArray(trigger) ? trigger.join(",") : trigger;
|
1860
|
-
const _commandMenu =
|
1950
|
+
const _commandMenu = useMemo(() => {
|
1861
1951
|
return commandMenu({
|
1862
1952
|
trigger,
|
1863
1953
|
placeholder: placeholder3,
|
@@ -1909,106 +1999,23 @@ var useCommandMenu = ({ viewRef, trigger, placeholder: placeholder3, getMenu })
|
|
1909
1999
|
};
|
1910
2000
|
};
|
1911
2001
|
|
1912
|
-
//
|
1913
|
-
import { EditorSelection, Prec as Prec3, RangeSetBuilder as RangeSetBuilder4 } from "@codemirror/state";
|
1914
|
-
import { Decoration as Decoration6, keymap as keymap5, ViewPlugin as ViewPlugin8 } from "@codemirror/view";
|
1915
|
-
var typeahead = ({ onComplete } = {}) => {
|
1916
|
-
let hint2;
|
1917
|
-
const complete = (view) => {
|
1918
|
-
if (!hint2) {
|
1919
|
-
return false;
|
1920
|
-
}
|
1921
|
-
const selection = view.state.selection.main;
|
1922
|
-
view.dispatch({
|
1923
|
-
changes: [
|
1924
|
-
{
|
1925
|
-
from: selection.from,
|
1926
|
-
to: selection.to,
|
1927
|
-
insert: hint2
|
1928
|
-
}
|
1929
|
-
],
|
1930
|
-
selection: EditorSelection.cursor(selection.from + hint2.length)
|
1931
|
-
});
|
1932
|
-
return true;
|
1933
|
-
};
|
1934
|
-
return [
|
1935
|
-
ViewPlugin8.fromClass(class {
|
1936
|
-
constructor() {
|
1937
|
-
this.decorations = Decoration6.none;
|
1938
|
-
}
|
1939
|
-
update(update2) {
|
1940
|
-
const builder = new RangeSetBuilder4();
|
1941
|
-
const selection = update2.view.state.selection.main;
|
1942
|
-
const line = update2.view.state.doc.lineAt(selection.from);
|
1943
|
-
if (selection.from === selection.to && selection.from === line.to) {
|
1944
|
-
const str = update2.state.sliceDoc(line.from, selection.from);
|
1945
|
-
hint2 = onComplete?.({
|
1946
|
-
line: str
|
1947
|
-
});
|
1948
|
-
if (hint2) {
|
1949
|
-
builder.add(selection.from, selection.to, Decoration6.widget({
|
1950
|
-
widget: new Hint(hint2)
|
1951
|
-
}));
|
1952
|
-
}
|
1953
|
-
}
|
1954
|
-
this.decorations = builder.finish();
|
1955
|
-
}
|
1956
|
-
}, {
|
1957
|
-
decorations: (v) => v.decorations
|
1958
|
-
}),
|
1959
|
-
// Keys.
|
1960
|
-
Prec3.highest(keymap5.of([
|
1961
|
-
{
|
1962
|
-
key: "Tab",
|
1963
|
-
preventDefault: true,
|
1964
|
-
run: complete
|
1965
|
-
},
|
1966
|
-
{
|
1967
|
-
key: "ArrowRight",
|
1968
|
-
preventDefault: true,
|
1969
|
-
run: complete
|
1970
|
-
}
|
1971
|
-
]))
|
1972
|
-
];
|
1973
|
-
};
|
1974
|
-
var staticCompletion = (completions, defaultCompletion) => ({ line }) => {
|
1975
|
-
if (line.length === 0 && defaultCompletion) {
|
1976
|
-
return defaultCompletion;
|
1977
|
-
}
|
1978
|
-
const words = line.split(/\s+/).filter(Boolean);
|
1979
|
-
if (words.length) {
|
1980
|
-
const word = words.at(-1);
|
1981
|
-
for (const completion of completions) {
|
1982
|
-
const match = matchCompletion(completion, word);
|
1983
|
-
if (match) {
|
1984
|
-
return match;
|
1985
|
-
}
|
1986
|
-
}
|
1987
|
-
}
|
1988
|
-
};
|
1989
|
-
var matchCompletion = (completion, word) => {
|
1990
|
-
if (completion.length > word.length && completion.startsWith(word)) {
|
1991
|
-
return completion.slice(word.length);
|
1992
|
-
}
|
1993
|
-
};
|
1994
|
-
|
1995
|
-
// packages/ui/react-ui-editor/src/extensions/comments.ts
|
2002
|
+
// src/extensions/comments.ts
|
1996
2003
|
import { invertedEffects } from "@codemirror/commands";
|
1997
2004
|
import { StateEffect as StateEffect4, StateField as StateField4 } from "@codemirror/state";
|
1998
|
-
import {
|
2005
|
+
import { Decoration as Decoration7, EditorView as EditorView11, ViewPlugin as ViewPlugin9, hoverTooltip, keymap as keymap7 } from "@codemirror/view";
|
1999
2006
|
import sortBy from "lodash.sortby";
|
2000
2007
|
import { useEffect } from "react";
|
2001
2008
|
import { debounce as debounce2 } from "@dxos/async";
|
2002
2009
|
import { log as log4 } from "@dxos/log";
|
2003
2010
|
import { isNonNullable as isNonNullable2 } from "@dxos/util";
|
2004
2011
|
|
2005
|
-
//
|
2012
|
+
// src/extensions/selection.ts
|
2006
2013
|
import { Transaction } from "@codemirror/state";
|
2007
2014
|
import { EditorView as EditorView10, keymap as keymap6 } from "@codemirror/view";
|
2008
2015
|
import { debounce } from "@dxos/async";
|
2009
2016
|
import { invariant as invariant3 } from "@dxos/invariant";
|
2010
2017
|
import { isNotFalsy } from "@dxos/util";
|
2011
|
-
var __dxlog_file6 = "/
|
2018
|
+
var __dxlog_file6 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/selection.ts";
|
2012
2019
|
var documentId = singleValueFacet();
|
2013
2020
|
var stateRestoreAnnotation = "dxos.org/cm/state-restore";
|
2014
2021
|
var createEditorStateTransaction = ({ scrollTo, selection }) => {
|
@@ -2095,8 +2102,8 @@ var selectionState = ({ getState, setState } = {}) => {
|
|
2095
2102
|
].filter(isNotFalsy);
|
2096
2103
|
};
|
2097
2104
|
|
2098
|
-
//
|
2099
|
-
var __dxlog_file7 = "/
|
2105
|
+
// src/extensions/comments.ts
|
2106
|
+
var __dxlog_file7 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
|
2100
2107
|
var setComments = StateEffect4.define();
|
2101
2108
|
var setSelection = StateEffect4.define();
|
2102
2109
|
var setCommentState = StateEffect4.define();
|
@@ -2167,7 +2174,7 @@ var commentsDecorations = EditorView11.decorations.compute([
|
|
2167
2174
|
if (!range) {
|
2168
2175
|
log4.warn("Invalid range:", range, {
|
2169
2176
|
F: __dxlog_file7,
|
2170
|
-
L:
|
2177
|
+
L: 136,
|
2171
2178
|
S: void 0,
|
2172
2179
|
C: (f, a) => f(...a)
|
2173
2180
|
});
|
@@ -2482,10 +2489,8 @@ var scrollThreadIntoView = (view, id, center = true) => {
|
|
2482
2489
|
}
|
2483
2490
|
};
|
2484
2491
|
var ExternalCommentSync = class {
|
2492
|
+
unsubscribe;
|
2485
2493
|
constructor(view, id, subscribe, getComments) {
|
2486
|
-
this.destroy = () => {
|
2487
|
-
this.unsubscribe();
|
2488
|
-
};
|
2489
2494
|
const updateComments = () => {
|
2490
2495
|
const comments2 = getComments();
|
2491
2496
|
if (id === view.state.facet(documentId)) {
|
@@ -2499,6 +2504,9 @@ var ExternalCommentSync = class {
|
|
2499
2504
|
};
|
2500
2505
|
this.unsubscribe = subscribe(updateComments);
|
2501
2506
|
}
|
2507
|
+
destroy = () => {
|
2508
|
+
this.unsubscribe();
|
2509
|
+
};
|
2502
2510
|
};
|
2503
2511
|
var createExternalCommentSync = (id, subscribe, getComments) => ViewPlugin9.fromClass(class {
|
2504
2512
|
constructor(view) {
|
@@ -2520,7 +2528,7 @@ var useComments = (view, id, comments2) => {
|
|
2520
2528
|
});
|
2521
2529
|
};
|
2522
2530
|
|
2523
|
-
//
|
2531
|
+
// src/extensions/debug.ts
|
2524
2532
|
import { syntaxTree } from "@codemirror/language";
|
2525
2533
|
import { StateField as StateField5 } from "@codemirror/state";
|
2526
2534
|
var debugNodeLogger = (log9 = console.log) => {
|
@@ -2533,8 +2541,8 @@ var debugNodeLogger = (log9 = console.log) => {
|
|
2533
2541
|
});
|
2534
2542
|
};
|
2535
2543
|
|
2536
|
-
//
|
2537
|
-
import {
|
2544
|
+
// src/extensions/dnd.ts
|
2545
|
+
import { EditorView as EditorView12, dropCursor } from "@codemirror/view";
|
2538
2546
|
var styles3 = EditorView12.theme({
|
2539
2547
|
".cm-dropCursor": {
|
2540
2548
|
borderLeft: "2px solid var(--dx-accentText)",
|
@@ -2569,7 +2577,7 @@ var dropFile = (options = {}) => {
|
|
2569
2577
|
];
|
2570
2578
|
};
|
2571
2579
|
|
2572
|
-
//
|
2580
|
+
// src/extensions/factories.ts
|
2573
2581
|
import { closeBrackets, closeBracketsKeymap } from "@codemirror/autocomplete";
|
2574
2582
|
import { defaultKeymap, history, historyKeymap, indentWithTab, standardKeymap } from "@codemirror/commands";
|
2575
2583
|
import { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from "@codemirror/language";
|
@@ -2583,42 +2591,11 @@ import { generateName } from "@dxos/display-name";
|
|
2583
2591
|
import { log as log5 } from "@dxos/log";
|
2584
2592
|
import { hexToHue, isNotFalsy as isNotFalsy2 } from "@dxos/util";
|
2585
2593
|
|
2586
|
-
//
|
2587
|
-
import { StateEffect as StateEffect5, StateField as StateField6 } from "@codemirror/state";
|
2594
|
+
// src/defaults.ts
|
2588
2595
|
import { EditorView as EditorView13 } from "@codemirror/view";
|
2589
|
-
var focusEffect = StateEffect5.define();
|
2590
|
-
var focusField = StateField6.define({
|
2591
|
-
create: () => false,
|
2592
|
-
update: (value, tr) => {
|
2593
|
-
for (const effect of tr.effects) {
|
2594
|
-
if (effect.is(focusEffect)) {
|
2595
|
-
return effect.value;
|
2596
|
-
}
|
2597
|
-
}
|
2598
|
-
return value;
|
2599
|
-
}
|
2600
|
-
});
|
2601
|
-
var focus = [
|
2602
|
-
focusField,
|
2603
|
-
EditorView13.domEventHandlers({
|
2604
|
-
focus: (event, view) => {
|
2605
|
-
setTimeout(() => view.dispatch({
|
2606
|
-
effects: focusEffect.of(true)
|
2607
|
-
}));
|
2608
|
-
},
|
2609
|
-
blur: (event, view) => {
|
2610
|
-
setTimeout(() => view.dispatch({
|
2611
|
-
effects: focusEffect.of(false)
|
2612
|
-
}));
|
2613
|
-
}
|
2614
|
-
})
|
2615
|
-
];
|
2616
|
-
|
2617
|
-
// packages/ui/react-ui-editor/src/defaults.ts
|
2618
|
-
import { EditorView as EditorView14 } from "@codemirror/view";
|
2619
2596
|
import { mx as mx2 } from "@dxos/react-ui-theme";
|
2620
2597
|
|
2621
|
-
//
|
2598
|
+
// src/styles/markdown.ts
|
2622
2599
|
import { mx } from "@dxos/react-ui-theme";
|
2623
2600
|
var headings = {
|
2624
2601
|
1: "text-4xl",
|
@@ -2637,7 +2614,7 @@ var theme = {
|
|
2637
2614
|
}
|
2638
2615
|
};
|
2639
2616
|
|
2640
|
-
//
|
2617
|
+
// src/styles/tokens.ts
|
2641
2618
|
import { tokens } from "@dxos/react-ui-theme";
|
2642
2619
|
import { get } from "@dxos/util";
|
2643
2620
|
var getToken = (path, defaultValue) => {
|
@@ -2647,7 +2624,7 @@ var getToken = (path, defaultValue) => {
|
|
2647
2624
|
var fontBody = getToken("fontFamily.body");
|
2648
2625
|
var fontMono = getToken("fontFamily.mono");
|
2649
2626
|
|
2650
|
-
//
|
2627
|
+
// src/styles/theme.ts
|
2651
2628
|
var defaultTheme = {
|
2652
2629
|
"&": {},
|
2653
2630
|
"&.cm-focused": {
|
@@ -2682,18 +2659,17 @@ var defaultTheme = {
|
|
2682
2659
|
".cm-gutter": {},
|
2683
2660
|
".cm-gutter.cm-lineNumbers": {
|
2684
2661
|
paddingRight: "4px",
|
2685
|
-
borderRight: "1px solid var(--dx-
|
2662
|
+
borderRight: "1px solid var(--dx-subduedSeparator)"
|
2686
2663
|
},
|
2687
2664
|
".cm-gutter.cm-lineNumbers .cm-gutterElement": {
|
2688
|
-
minWidth: "40px"
|
2689
|
-
alignContent: "center"
|
2665
|
+
minWidth: "40px"
|
2690
2666
|
},
|
2691
2667
|
/**
|
2692
|
-
* Height is set to match the corresponding line.
|
2668
|
+
* Height is set to match the corresponding line (which may have wrapped).
|
2693
2669
|
*/
|
2694
2670
|
".cm-gutterElement": {
|
2695
|
-
|
2696
|
-
|
2671
|
+
fontSize: "12px",
|
2672
|
+
lineHeight: "24px"
|
2697
2673
|
},
|
2698
2674
|
/**
|
2699
2675
|
* Line.
|
@@ -2711,7 +2687,7 @@ var defaultTheme = {
|
|
2711
2687
|
borderLeft: "2px solid var(--dx-cmCursor)"
|
2712
2688
|
},
|
2713
2689
|
".cm-placeholder": {
|
2714
|
-
color: "var(--dx-
|
2690
|
+
color: "var(--dx-placeholder)"
|
2715
2691
|
},
|
2716
2692
|
/**
|
2717
2693
|
* Selection (layer).
|
@@ -2753,7 +2729,7 @@ var defaultTheme = {
|
|
2753
2729
|
* Tooltip.
|
2754
2730
|
*/
|
2755
2731
|
".cm-tooltip": {
|
2756
|
-
background: "var(--dx-
|
2732
|
+
background: "var(--dx-modalSurface)"
|
2757
2733
|
},
|
2758
2734
|
".cm-tooltip-below": {},
|
2759
2735
|
/**
|
@@ -2773,7 +2749,8 @@ var defaultTheme = {
|
|
2773
2749
|
padding: "4px"
|
2774
2750
|
},
|
2775
2751
|
".cm-tooltip.cm-tooltip-autocomplete > ul > li[aria-selected]": {
|
2776
|
-
background: "var(--dx-
|
2752
|
+
background: "var(--dx-accentSurface)",
|
2753
|
+
color: "var(--dx-accentSurfaceText)"
|
2777
2754
|
},
|
2778
2755
|
".cm-tooltip.cm-tooltip-autocomplete > ul > completion-section": {
|
2779
2756
|
paddingLeft: "4px !important",
|
@@ -2827,7 +2804,7 @@ var defaultTheme = {
|
|
2827
2804
|
outline: "1px solid transparent"
|
2828
2805
|
},
|
2829
2806
|
".cm-panel input, .cm-panel button": {
|
2830
|
-
backgroundColor: "var(--dx-
|
2807
|
+
backgroundColor: "var(--dx-inputSurface)"
|
2831
2808
|
},
|
2832
2809
|
".cm-panel input:focus, .cm-panel button:focus": {
|
2833
2810
|
outline: "1px solid var(--dx-neutralFocusIndicator)"
|
@@ -2859,7 +2836,7 @@ var defaultTheme = {
|
|
2859
2836
|
}
|
2860
2837
|
};
|
2861
2838
|
|
2862
|
-
//
|
2839
|
+
// src/defaults.ts
|
2863
2840
|
var editorWidth = "!mli-auto is-full max-is-[min(50rem,100%-4rem)]";
|
2864
2841
|
var editorSlots = {
|
2865
2842
|
scroll: {
|
@@ -2869,13 +2846,13 @@ var editorSlots = {
|
|
2869
2846
|
className: editorWidth
|
2870
2847
|
}
|
2871
2848
|
};
|
2872
|
-
var editorGutter =
|
2849
|
+
var editorGutter = EditorView13.theme({
|
2873
2850
|
".cm-gutters": {
|
2874
2851
|
background: "var(--dx-baseSurface)",
|
2875
2852
|
paddingRight: "1rem"
|
2876
2853
|
}
|
2877
2854
|
});
|
2878
|
-
var editorMonospace =
|
2855
|
+
var editorMonospace = EditorView13.theme({
|
2879
2856
|
".cm-content": {
|
2880
2857
|
fontFamily: fontMono
|
2881
2858
|
}
|
@@ -2883,8 +2860,39 @@ var editorMonospace = EditorView14.theme({
|
|
2883
2860
|
var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden";
|
2884
2861
|
var stackItemContentEditorClassNames = (role) => mx2("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");
|
2885
2862
|
|
2886
|
-
//
|
2887
|
-
|
2863
|
+
// src/extensions/focus.ts
|
2864
|
+
import { StateEffect as StateEffect5, StateField as StateField6 } from "@codemirror/state";
|
2865
|
+
import { EditorView as EditorView14 } from "@codemirror/view";
|
2866
|
+
var focusEffect = StateEffect5.define();
|
2867
|
+
var focusField = StateField6.define({
|
2868
|
+
create: () => false,
|
2869
|
+
update: (value, tr) => {
|
2870
|
+
for (const effect of tr.effects) {
|
2871
|
+
if (effect.is(focusEffect)) {
|
2872
|
+
return effect.value;
|
2873
|
+
}
|
2874
|
+
}
|
2875
|
+
return value;
|
2876
|
+
}
|
2877
|
+
});
|
2878
|
+
var focus = [
|
2879
|
+
focusField,
|
2880
|
+
EditorView14.domEventHandlers({
|
2881
|
+
focus: (event, view) => {
|
2882
|
+
setTimeout(() => view.dispatch({
|
2883
|
+
effects: focusEffect.of(true)
|
2884
|
+
}));
|
2885
|
+
},
|
2886
|
+
blur: (event, view) => {
|
2887
|
+
setTimeout(() => view.dispatch({
|
2888
|
+
effects: focusEffect.of(false)
|
2889
|
+
}));
|
2890
|
+
}
|
2891
|
+
})
|
2892
|
+
];
|
2893
|
+
|
2894
|
+
// src/extensions/factories.ts
|
2895
|
+
var __dxlog_file8 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
|
2888
2896
|
var preventNewline = EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
|
2889
2897
|
var defaultBasicOptions = {
|
2890
2898
|
allowMultipleSelections: true,
|
@@ -2895,7 +2903,7 @@ var defaultBasicOptions = {
|
|
2895
2903
|
history: true,
|
2896
2904
|
keymap: "standard",
|
2897
2905
|
lineWrapping: true,
|
2898
|
-
search:
|
2906
|
+
search: false
|
2899
2907
|
};
|
2900
2908
|
var keymaps = {
|
2901
2909
|
// https://codemirror.net/docs/ref/#commands.standardKeymap
|
@@ -2910,7 +2918,7 @@ var createBasicExtensions = (_props) => {
|
|
2910
2918
|
EditorView15.exceptionSink.of((err) => {
|
2911
2919
|
log5.catch(err, void 0, {
|
2912
2920
|
F: __dxlog_file8,
|
2913
|
-
L:
|
2921
|
+
L: 101,
|
2914
2922
|
S: void 0,
|
2915
2923
|
C: (f, a) => f(...a)
|
2916
2924
|
});
|
@@ -2960,11 +2968,17 @@ var createBasicExtensions = (_props) => {
|
|
2960
2968
|
].filter(isNotFalsy2))
|
2961
2969
|
].filter(isNotFalsy2);
|
2962
2970
|
};
|
2963
|
-
var
|
2971
|
+
var grow = {
|
2964
2972
|
editor: {
|
2965
|
-
className: "
|
2973
|
+
className: "is-full bs-full"
|
2966
2974
|
}
|
2967
2975
|
};
|
2976
|
+
var fullWidth = {
|
2977
|
+
editor: {
|
2978
|
+
className: "is-full"
|
2979
|
+
}
|
2980
|
+
};
|
2981
|
+
var defaultThemeSlots = grow;
|
2968
2982
|
var createThemeExtensions = ({ themeMode, styles: styles4, syntaxHighlighting: _syntaxHighlighting, slots: _slots } = {}) => {
|
2969
2983
|
const slots = defaultsDeep2({}, _slots, defaultThemeSlots);
|
2970
2984
|
return [
|
@@ -2982,6 +2996,11 @@ var createThemeExtensions = ({ themeMode, styles: styles4, syntaxHighlighting: _
|
|
2982
2996
|
constructor(view) {
|
2983
2997
|
view.scrollDOM.classList.add(slots.scroll.className);
|
2984
2998
|
}
|
2999
|
+
}),
|
3000
|
+
slots.scroller?.className && ViewPlugin10.fromClass(class {
|
3001
|
+
constructor(view) {
|
3002
|
+
view.dom.querySelector(".cm-scroller")?.classList.add(...slots.scroller.className.split(" "));
|
3003
|
+
}
|
2985
3004
|
})
|
2986
3005
|
].filter(isNotFalsy2);
|
2987
3006
|
};
|
@@ -3007,7 +3026,7 @@ var createDataExtensions = ({ id, text, space, identity }) => {
|
|
3007
3026
|
return extensions;
|
3008
3027
|
};
|
3009
3028
|
|
3010
|
-
//
|
3029
|
+
// src/extensions/folding.tsx
|
3011
3030
|
import { codeFolding, foldGutter } from "@codemirror/language";
|
3012
3031
|
import { EditorView as EditorView16 } from "@codemirror/view";
|
3013
3032
|
import React2 from "react";
|
@@ -3045,10 +3064,11 @@ var folding = (_props = {}) => [
|
|
3045
3064
|
})
|
3046
3065
|
];
|
3047
3066
|
|
3048
|
-
//
|
3067
|
+
// src/extensions/hashtag.tsx
|
3049
3068
|
import { Decoration as Decoration8, EditorView as EditorView17, MatchDecorator, ViewPlugin as ViewPlugin11, WidgetType as WidgetType4 } from "@codemirror/view";
|
3050
3069
|
import { getHashColor, mx as mx3 } from "@dxos/react-ui-theme";
|
3051
3070
|
var TagWidget = class extends WidgetType4 {
|
3071
|
+
_text;
|
3052
3072
|
constructor(_text) {
|
3053
3073
|
super(), this._text = _text;
|
3054
3074
|
}
|
@@ -3067,6 +3087,7 @@ var tagMatcher = new MatchDecorator({
|
|
3067
3087
|
});
|
3068
3088
|
var hashtag = () => [
|
3069
3089
|
ViewPlugin11.fromClass(class {
|
3090
|
+
tags;
|
3070
3091
|
constructor(view) {
|
3071
3092
|
this.tags = tagMatcher.createDeco(view);
|
3072
3093
|
}
|
@@ -3088,7 +3109,7 @@ var hashtag = () => [
|
|
3088
3109
|
})
|
3089
3110
|
];
|
3090
3111
|
|
3091
|
-
//
|
3112
|
+
// src/extensions/json.ts
|
3092
3113
|
import { json, jsonParseLinter } from "@codemirror/lang-json";
|
3093
3114
|
import { linter } from "@codemirror/lint";
|
3094
3115
|
import Ajv from "ajv";
|
@@ -3133,7 +3154,7 @@ var schemaLinter = (validate) => (view) => {
|
|
3133
3154
|
}
|
3134
3155
|
};
|
3135
3156
|
|
3136
|
-
//
|
3157
|
+
// src/extensions/listener.ts
|
3137
3158
|
import { EditorView as EditorView18 } from "@codemirror/view";
|
3138
3159
|
var listener = ({ onFocus, onChange }) => {
|
3139
3160
|
const extensions = [];
|
@@ -3147,12 +3168,13 @@ var listener = ({ onFocus, onChange }) => {
|
|
3147
3168
|
return extensions;
|
3148
3169
|
};
|
3149
3170
|
|
3150
|
-
//
|
3171
|
+
// src/extensions/markdown/formatting.ts
|
3151
3172
|
import { snippet } from "@codemirror/autocomplete";
|
3152
3173
|
import { syntaxTree as syntaxTree2 } from "@codemirror/language";
|
3153
3174
|
import { EditorSelection as EditorSelection2 } from "@codemirror/state";
|
3154
3175
|
import { EditorView as EditorView19, keymap as keymap9 } from "@codemirror/view";
|
3155
|
-
import { useMemo as
|
3176
|
+
import { useCallback as useCallback2, useMemo as useMemo2 } from "react";
|
3177
|
+
import { debounceAndThrottle } from "@dxos/async";
|
3156
3178
|
var formattingEquals = (a, b) => a.blockType === b.blockType && a.strong === b.strong && a.emphasis === b.emphasis && a.strikethrough === b.strikethrough && a.code === b.code && a.link === b.link && a.listStyle === b.listStyle && a.blockQuote === b.blockQuote;
|
3157
3179
|
var Inline = /* @__PURE__ */ function(Inline2) {
|
3158
3180
|
Inline2[Inline2["Strong"] = 0] = "Strong";
|
@@ -4240,16 +4262,21 @@ var getFormatting = (state) => {
|
|
4240
4262
|
};
|
4241
4263
|
};
|
4242
4264
|
var useFormattingState = (state) => {
|
4243
|
-
|
4265
|
+
const handleUpdate = useCallback2(debounceAndThrottle((update2) => {
|
4244
4266
|
if (update2.docChanged || update2.selectionSet) {
|
4245
4267
|
Object.entries(getFormatting(update2.state)).forEach(([key, active]) => {
|
4246
4268
|
state[key] = active;
|
4247
4269
|
});
|
4248
4270
|
}
|
4249
|
-
}), [
|
4271
|
+
}, 100), [
|
4272
|
+
state
|
4273
|
+
]);
|
4274
|
+
return useMemo2(() => EditorView19.updateListener.of(handleUpdate), [
|
4275
|
+
handleUpdate
|
4276
|
+
]);
|
4250
4277
|
};
|
4251
4278
|
|
4252
|
-
//
|
4279
|
+
// src/extensions/markdown/action.ts
|
4253
4280
|
var processEditorPayload = (view, { type, data }) => {
|
4254
4281
|
let inlineType, listType;
|
4255
4282
|
switch (type) {
|
@@ -4298,19 +4325,19 @@ var processEditorPayload = (view, { type, data }) => {
|
|
4298
4325
|
});
|
4299
4326
|
};
|
4300
4327
|
|
4301
|
-
//
|
4328
|
+
// src/extensions/markdown/bundle.ts
|
4302
4329
|
import { completionKeymap as completionKeymap2 } from "@codemirror/autocomplete";
|
4303
4330
|
import { defaultKeymap as defaultKeymap2, indentWithTab as indentWithTab2 } from "@codemirror/commands";
|
4304
|
-
import { markdownLanguage as markdownLanguage3
|
4331
|
+
import { markdown, markdownLanguage as markdownLanguage3 } from "@codemirror/lang-markdown";
|
4305
4332
|
import { syntaxHighlighting as syntaxHighlighting2 } from "@codemirror/language";
|
4306
4333
|
import { languages } from "@codemirror/language-data";
|
4307
4334
|
import { keymap as keymap10 } from "@codemirror/view";
|
4308
4335
|
import { isNotFalsy as isNotFalsy3 } from "@dxos/util";
|
4309
4336
|
|
4310
|
-
//
|
4337
|
+
// src/extensions/markdown/highlight.ts
|
4311
4338
|
import { markdownLanguage as markdownLanguage2 } from "@codemirror/lang-markdown";
|
4312
4339
|
import { HighlightStyle } from "@codemirror/language";
|
4313
|
-
import {
|
4340
|
+
import { Tag, styleTags, tags } from "@lezer/highlight";
|
4314
4341
|
import { Table } from "@lezer/markdown";
|
4315
4342
|
var markdownTags = {
|
4316
4343
|
Blockquote: Tag.define(),
|
@@ -4486,7 +4513,7 @@ var markdownHighlightStyle = (_options = {}) => {
|
|
4486
4513
|
});
|
4487
4514
|
};
|
4488
4515
|
|
4489
|
-
//
|
4516
|
+
// src/extensions/markdown/bundle.ts
|
4490
4517
|
var createMarkdownExtensions = (options = {}) => {
|
4491
4518
|
return [
|
4492
4519
|
// Main extension.
|
@@ -4521,7 +4548,7 @@ var createMarkdownExtensions = (options = {}) => {
|
|
4521
4548
|
];
|
4522
4549
|
};
|
4523
4550
|
|
4524
|
-
//
|
4551
|
+
// src/extensions/markdown/debug.ts
|
4525
4552
|
import { syntaxTree as syntaxTree3 } from "@codemirror/language";
|
4526
4553
|
import { StateField as StateField7 } from "@codemirror/state";
|
4527
4554
|
var debugTree = (cb) => StateField7.define({
|
@@ -4548,14 +4575,14 @@ var convertTreeToJson = (state) => {
|
|
4548
4575
|
return treeToJson(syntaxTree3(state).cursor());
|
4549
4576
|
};
|
4550
4577
|
|
4551
|
-
//
|
4578
|
+
// src/extensions/markdown/decorate.ts
|
4552
4579
|
import { syntaxTree as syntaxTree7 } from "@codemirror/language";
|
4553
4580
|
import { RangeSetBuilder as RangeSetBuilder6, StateEffect as StateEffect6 } from "@codemirror/state";
|
4554
|
-
import {
|
4581
|
+
import { Decoration as Decoration11, EditorView as EditorView23, ViewPlugin as ViewPlugin13, WidgetType as WidgetType7 } from "@codemirror/view";
|
4555
4582
|
import { invariant as invariant4 } from "@dxos/invariant";
|
4556
4583
|
import { mx as mx4 } from "@dxos/react-ui-theme";
|
4557
4584
|
|
4558
|
-
//
|
4585
|
+
// src/extensions/markdown/changes.ts
|
4559
4586
|
import { syntaxTree as syntaxTree4 } from "@codemirror/language";
|
4560
4587
|
import { Transaction as Transaction2 } from "@codemirror/state";
|
4561
4588
|
import { ViewPlugin as ViewPlugin12 } from "@codemirror/view";
|
@@ -4699,7 +4726,7 @@ var getValidUrl = (str) => {
|
|
4699
4726
|
}
|
4700
4727
|
};
|
4701
4728
|
|
4702
|
-
//
|
4729
|
+
// src/extensions/markdown/image.ts
|
4703
4730
|
import { syntaxTree as syntaxTree5 } from "@codemirror/language";
|
4704
4731
|
import { StateField as StateField8 } from "@codemirror/state";
|
4705
4732
|
import { Decoration as Decoration9, EditorView as EditorView20, WidgetType as WidgetType5 } from "@codemirror/view";
|
@@ -4769,6 +4796,7 @@ var preloadImage = (url) => {
|
|
4769
4796
|
}
|
4770
4797
|
};
|
4771
4798
|
var ImageWidget = class extends WidgetType5 {
|
4799
|
+
_url;
|
4772
4800
|
constructor(_url) {
|
4773
4801
|
super(), this._url = _url;
|
4774
4802
|
}
|
@@ -4788,7 +4816,7 @@ var ImageWidget = class extends WidgetType5 {
|
|
4788
4816
|
}
|
4789
4817
|
};
|
4790
4818
|
|
4791
|
-
//
|
4819
|
+
// src/extensions/markdown/styles.ts
|
4792
4820
|
import { EditorView as EditorView21 } from "@codemirror/view";
|
4793
4821
|
var bulletListIndentationWidth = 24;
|
4794
4822
|
var orderedListIndentationWidth = 36;
|
@@ -4911,7 +4939,7 @@ var formattingStyles = EditorView21.theme({
|
|
4911
4939
|
}
|
4912
4940
|
});
|
4913
4941
|
|
4914
|
-
//
|
4942
|
+
// src/extensions/markdown/table.ts
|
4915
4943
|
import { syntaxTree as syntaxTree6 } from "@codemirror/language";
|
4916
4944
|
import { RangeSetBuilder as RangeSetBuilder5, StateField as StateField9 } from "@codemirror/state";
|
4917
4945
|
import { Decoration as Decoration10, EditorView as EditorView22, WidgetType as WidgetType6 } from "@codemirror/view";
|
@@ -4977,6 +5005,7 @@ var update = (state, _options) => {
|
|
4977
5005
|
return builder.finish();
|
4978
5006
|
};
|
4979
5007
|
var TableWidget = class extends WidgetType6 {
|
5008
|
+
_table;
|
4980
5009
|
constructor(_table) {
|
4981
5010
|
super(), this._table = _table;
|
4982
5011
|
}
|
@@ -5009,8 +5038,8 @@ var TableWidget = class extends WidgetType6 {
|
|
5009
5038
|
}
|
5010
5039
|
};
|
5011
5040
|
|
5012
|
-
//
|
5013
|
-
var __dxlog_file9 = "/
|
5041
|
+
// src/extensions/markdown/decorate.ts
|
5042
|
+
var __dxlog_file9 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/markdown/decorate.ts";
|
5014
5043
|
var Unicode = {
|
5015
5044
|
emDash: "\u2014",
|
5016
5045
|
bullet: "\u2022",
|
@@ -5025,6 +5054,8 @@ var HorizontalRuleWidget = class extends WidgetType7 {
|
|
5025
5054
|
}
|
5026
5055
|
};
|
5027
5056
|
var LinkButton = class extends WidgetType7 {
|
5057
|
+
url;
|
5058
|
+
render;
|
5028
5059
|
constructor(url, render) {
|
5029
5060
|
super(), this.url = url, this.render = render;
|
5030
5061
|
}
|
@@ -5041,6 +5072,7 @@ var LinkButton = class extends WidgetType7 {
|
|
5041
5072
|
}
|
5042
5073
|
};
|
5043
5074
|
var CheckboxWidget = class extends WidgetType7 {
|
5075
|
+
_checked;
|
5044
5076
|
constructor(_checked) {
|
5045
5077
|
super(), this._checked = _checked;
|
5046
5078
|
}
|
@@ -5085,6 +5117,8 @@ var CheckboxWidget = class extends WidgetType7 {
|
|
5085
5117
|
}
|
5086
5118
|
};
|
5087
5119
|
var TextWidget = class extends WidgetType7 {
|
5120
|
+
text;
|
5121
|
+
className;
|
5088
5122
|
constructor(text, className) {
|
5089
5123
|
super(), this.text = text, this.className = className;
|
5090
5124
|
}
|
@@ -5142,7 +5176,7 @@ var buildDecorations2 = (view, options, focus2) => {
|
|
5142
5176
|
const getHeaderLevels = (node, level) => {
|
5143
5177
|
invariant4(level > 0, void 0, {
|
5144
5178
|
F: __dxlog_file9,
|
5145
|
-
L:
|
5179
|
+
L: 180,
|
5146
5180
|
S: void 0,
|
5147
5181
|
A: [
|
5148
5182
|
"level > 0",
|
@@ -5181,7 +5215,7 @@ var buildDecorations2 = (view, options, focus2) => {
|
|
5181
5215
|
const getCurrentListLevel = () => {
|
5182
5216
|
invariant4(listLevels.length, void 0, {
|
5183
5217
|
F: __dxlog_file9,
|
5184
|
-
L:
|
5218
|
+
L: 202,
|
5185
5219
|
S: void 0,
|
5186
5220
|
A: [
|
5187
5221
|
"listLevels.length",
|
@@ -5421,6 +5455,9 @@ var forceUpdate = StateEffect6.define();
|
|
5421
5455
|
var decorateMarkdown = (options = {}) => {
|
5422
5456
|
return [
|
5423
5457
|
ViewPlugin13.fromClass(class {
|
5458
|
+
deco;
|
5459
|
+
atomicDeco;
|
5460
|
+
pendingUpdate;
|
5424
5461
|
constructor(view) {
|
5425
5462
|
({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations2(view, options, view.hasFocus));
|
5426
5463
|
}
|
@@ -5464,7 +5501,7 @@ var decorateMarkdown = (options = {}) => {
|
|
5464
5501
|
];
|
5465
5502
|
};
|
5466
5503
|
|
5467
|
-
//
|
5504
|
+
// src/extensions/markdown/link.ts
|
5468
5505
|
import { syntaxTree as syntaxTree8 } from "@codemirror/language";
|
5469
5506
|
import { hoverTooltip as hoverTooltip2 } from "@codemirror/view";
|
5470
5507
|
import { tooltipContent } from "@dxos/react-ui-theme";
|
@@ -5506,10 +5543,10 @@ var linkTooltip = (renderTooltip) => {
|
|
5506
5543
|
});
|
5507
5544
|
};
|
5508
5545
|
|
5509
|
-
//
|
5546
|
+
// src/extensions/mention.ts
|
5510
5547
|
import { autocompletion as autocompletion2 } from "@codemirror/autocomplete";
|
5511
5548
|
import { log as log6 } from "@dxos/log";
|
5512
|
-
var __dxlog_file10 = "/
|
5549
|
+
var __dxlog_file10 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/mention.ts";
|
5513
5550
|
var mention = ({ debug, onSearch }) => {
|
5514
5551
|
return autocompletion2({
|
5515
5552
|
// TODO(burdon): Not working.
|
@@ -5544,23 +5581,10 @@ var mention = ({ debug, onSearch }) => {
|
|
5544
5581
|
});
|
5545
5582
|
};
|
5546
5583
|
|
5547
|
-
//
|
5584
|
+
// src/extensions/modes.ts
|
5548
5585
|
import { keymap as keymap11 } from "@codemirror/view";
|
5549
5586
|
import { vim } from "@replit/codemirror-vim";
|
5550
5587
|
import { vscodeKeymap } from "@replit/codemirror-vscode-keymap";
|
5551
|
-
import { Schema } from "effect";
|
5552
|
-
var EditorViewModes = [
|
5553
|
-
"preview",
|
5554
|
-
"readonly",
|
5555
|
-
"source"
|
5556
|
-
];
|
5557
|
-
var EditorViewMode = Schema.Union(...EditorViewModes.map((mode) => Schema.Literal(mode)));
|
5558
|
-
var EditorInputModes = [
|
5559
|
-
"default",
|
5560
|
-
"vim",
|
5561
|
-
"vscode"
|
5562
|
-
];
|
5563
|
-
var EditorInputMode = Schema.Union(...EditorInputModes.map((mode) => Schema.Literal(mode)));
|
5564
5588
|
var editorInputMode = singleValueFacet({});
|
5565
5589
|
var InputModeExtensions = {
|
5566
5590
|
default: [],
|
@@ -5590,21 +5614,21 @@ var InputModeExtensions = {
|
|
5590
5614
|
]
|
5591
5615
|
};
|
5592
5616
|
|
5593
|
-
//
|
5617
|
+
// src/extensions/outliner/commands.ts
|
5594
5618
|
import { indentMore } from "@codemirror/commands";
|
5595
5619
|
import { getIndentUnit } from "@codemirror/language";
|
5596
5620
|
import { EditorSelection as EditorSelection3 } from "@codemirror/state";
|
5597
5621
|
import { keymap as keymap12 } from "@codemirror/view";
|
5598
5622
|
|
5599
|
-
//
|
5623
|
+
// src/extensions/outliner/selection.ts
|
5600
5624
|
import { Compartment, Facet as Facet3 } from "@codemirror/state";
|
5601
5625
|
|
5602
|
-
//
|
5626
|
+
// src/extensions/outliner/tree.ts
|
5603
5627
|
import { syntaxTree as syntaxTree9 } from "@codemirror/language";
|
5604
5628
|
import { StateField as StateField10 } from "@codemirror/state";
|
5605
5629
|
import { Facet as Facet2 } from "@codemirror/state";
|
5606
5630
|
import { invariant as invariant5 } from "@dxos/invariant";
|
5607
|
-
var __dxlog_file11 = "/
|
5631
|
+
var __dxlog_file11 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/outliner/tree.ts";
|
5608
5632
|
var itemToJSON = ({ type, index, level, lineRange, contentRange, children }) => {
|
5609
5633
|
return {
|
5610
5634
|
type,
|
@@ -5616,11 +5640,14 @@ var itemToJSON = ({ type, index, level, lineRange, contentRange, children }) =>
|
|
5616
5640
|
};
|
5617
5641
|
};
|
5618
5642
|
var Tree = class {
|
5643
|
+
type = "root";
|
5644
|
+
index = -1;
|
5645
|
+
level = -1;
|
5646
|
+
node;
|
5647
|
+
lineRange;
|
5648
|
+
contentRange;
|
5649
|
+
children = [];
|
5619
5650
|
constructor(node) {
|
5620
|
-
this.type = "root";
|
5621
|
-
this.index = -1;
|
5622
|
-
this.level = -1;
|
5623
|
-
this.children = [];
|
5624
5651
|
this.node = node;
|
5625
5652
|
this.lineRange = {
|
5626
5653
|
from: node.from,
|
@@ -5898,7 +5925,7 @@ var outlinerTree = (options = {}) => {
|
|
5898
5925
|
];
|
5899
5926
|
};
|
5900
5927
|
|
5901
|
-
//
|
5928
|
+
// src/extensions/outliner/selection.ts
|
5902
5929
|
var getSelection = (state) => state.selection.main;
|
5903
5930
|
var selectionEquals = (a, b) => a.length === b.length && a.every((i) => b.includes(i));
|
5904
5931
|
var selectionFacet = Facet3.define({
|
@@ -5928,7 +5955,7 @@ var selectDown = (view) => {
|
|
5928
5955
|
return true;
|
5929
5956
|
};
|
5930
5957
|
|
5931
|
-
//
|
5958
|
+
// src/extensions/outliner/commands.ts
|
5932
5959
|
var indentItemMore = (view) => {
|
5933
5960
|
const pos = getSelection(view.state).from;
|
5934
5961
|
const tree = view.state.facet(treeFacet);
|
@@ -6162,16 +6189,16 @@ var commands = () => keymap12.of([
|
|
6162
6189
|
}
|
6163
6190
|
]);
|
6164
6191
|
|
6165
|
-
//
|
6192
|
+
// src/extensions/outliner/outliner.ts
|
6166
6193
|
import { Prec as Prec4 } from "@codemirror/state";
|
6167
6194
|
import { Decoration as Decoration12, EditorView as EditorView24, ViewPlugin as ViewPlugin15 } from "@codemirror/view";
|
6168
6195
|
import { mx as mx5 } from "@dxos/react-ui-theme";
|
6169
6196
|
|
6170
|
-
//
|
6197
|
+
// src/extensions/outliner/editor.ts
|
6171
6198
|
import { EditorSelection as EditorSelection4, EditorState as EditorState2 } from "@codemirror/state";
|
6172
6199
|
import { ViewPlugin as ViewPlugin14 } from "@codemirror/view";
|
6173
6200
|
import { log as log7 } from "@dxos/log";
|
6174
|
-
var __dxlog_file12 = "/
|
6201
|
+
var __dxlog_file12 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/outliner/editor.ts";
|
6175
6202
|
var LIST_ITEM_REGEX = /^\s*- (\[ \]|\[x\])? /;
|
6176
6203
|
var initialize = () => {
|
6177
6204
|
return ViewPlugin14.fromClass(class {
|
@@ -6356,7 +6383,7 @@ var editor = () => [
|
|
6356
6383
|
})
|
6357
6384
|
];
|
6358
6385
|
|
6359
|
-
//
|
6386
|
+
// src/extensions/outliner/outliner.ts
|
6360
6387
|
var outliner = (options = {}) => [
|
6361
6388
|
// Commands.
|
6362
6389
|
Prec4.highest(commands()),
|
@@ -6381,8 +6408,8 @@ var outliner = (options = {}) => [
|
|
6381
6408
|
];
|
6382
6409
|
var decorations = () => [
|
6383
6410
|
ViewPlugin15.fromClass(class {
|
6411
|
+
decorations = Decoration12.none;
|
6384
6412
|
constructor(view) {
|
6385
|
-
this.decorations = Decoration12.none;
|
6386
6413
|
this.updateDecorations(view.state, view);
|
6387
6414
|
}
|
6388
6415
|
update(update2) {
|
@@ -6448,7 +6475,7 @@ var decorations = () => [
|
|
6448
6475
|
}))
|
6449
6476
|
];
|
6450
6477
|
|
6451
|
-
//
|
6478
|
+
// src/extensions/preview/preview.ts
|
6452
6479
|
import "@dxos/lit-ui/dx-ref-tag.pcss";
|
6453
6480
|
import { syntaxTree as syntaxTree10 } from "@codemirror/language";
|
6454
6481
|
import { RangeSetBuilder as RangeSetBuilder7, StateField as StateField11 } from "@codemirror/state";
|
@@ -6519,6 +6546,8 @@ var buildDecorations3 = (state, options) => {
|
|
6519
6546
|
return builder.finish();
|
6520
6547
|
};
|
6521
6548
|
var PreviewInlineWidget = class extends WidgetType8 {
|
6549
|
+
_options;
|
6550
|
+
_link;
|
6522
6551
|
constructor(_options, _link) {
|
6523
6552
|
super(), this._options = _options, this._link = _link;
|
6524
6553
|
}
|
@@ -6536,6 +6565,8 @@ var PreviewInlineWidget = class extends WidgetType8 {
|
|
6536
6565
|
}
|
6537
6566
|
};
|
6538
6567
|
var PreviewBlockWidget = class extends WidgetType8 {
|
6568
|
+
_options;
|
6569
|
+
_link;
|
6539
6570
|
constructor(_options, _link) {
|
6540
6571
|
super(), this._options = _options, this._link = _link;
|
6541
6572
|
}
|
@@ -6556,7 +6587,7 @@ var PreviewBlockWidget = class extends WidgetType8 {
|
|
6556
6587
|
}
|
6557
6588
|
};
|
6558
6589
|
|
6559
|
-
//
|
6590
|
+
// src/extensions/typewriter.ts
|
6560
6591
|
import { keymap as keymap13 } from "@codemirror/view";
|
6561
6592
|
var defaultItems = [
|
6562
6593
|
"hello world!",
|
@@ -6609,11 +6640,218 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
|
|
6609
6640
|
return true;
|
6610
6641
|
}
|
6611
6642
|
}
|
6612
|
-
])
|
6613
|
-
];
|
6643
|
+
])
|
6644
|
+
];
|
6645
|
+
};
|
6646
|
+
|
6647
|
+
// src/hooks/useTextEditor.ts
|
6648
|
+
var __dxlog_file13 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
|
6649
|
+
var instanceCount = 0;
|
6650
|
+
var useTextEditor = (props = {}, deps = []) => {
|
6651
|
+
const { id, doc, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = useMemo3(() => getProviderValue(props), deps ?? []);
|
6652
|
+
const [instanceId] = useState2(() => `text-editor-${++instanceCount}`);
|
6653
|
+
const [view, setView] = useState2();
|
6654
|
+
const parentRef = useRef2(null);
|
6655
|
+
useEffect2(() => {
|
6656
|
+
let view2;
|
6657
|
+
if (parentRef.current) {
|
6658
|
+
log8("create", {
|
6659
|
+
id,
|
6660
|
+
instanceId,
|
6661
|
+
doc: initialValue?.length ?? 0
|
6662
|
+
}, {
|
6663
|
+
F: __dxlog_file13,
|
6664
|
+
L: 75,
|
6665
|
+
S: void 0,
|
6666
|
+
C: (f, a) => f(...a)
|
6667
|
+
});
|
6668
|
+
let initialSelection;
|
6669
|
+
if (selection?.anchor && initialValue?.length) {
|
6670
|
+
if (selection.anchor <= initialValue.length && (selection?.head ?? 0) <= initialValue.length) {
|
6671
|
+
initialSelection = selection;
|
6672
|
+
}
|
6673
|
+
} else if (moveToEndOfLine && selection === void 0) {
|
6674
|
+
const index = initialValue?.indexOf("\n");
|
6675
|
+
const anchor = !index || index === -1 ? 0 : index;
|
6676
|
+
initialSelection = {
|
6677
|
+
anchor
|
6678
|
+
};
|
6679
|
+
}
|
6680
|
+
const state = EditorState3.create({
|
6681
|
+
doc: doc ?? initialValue,
|
6682
|
+
// selection: initialSelection,
|
6683
|
+
extensions: [
|
6684
|
+
id && documentId.of(id),
|
6685
|
+
extensions,
|
6686
|
+
// NOTE: This doesn't catch errors in keymap functions.
|
6687
|
+
EditorView26.exceptionSink.of((err) => {
|
6688
|
+
log8.catch(err, void 0, {
|
6689
|
+
F: __dxlog_file13,
|
6690
|
+
L: 97,
|
6691
|
+
S: void 0,
|
6692
|
+
C: (f, a) => f(...a)
|
6693
|
+
});
|
6694
|
+
})
|
6695
|
+
].filter(isNotFalsy4)
|
6696
|
+
});
|
6697
|
+
view2 = new EditorView26({
|
6698
|
+
parent: parentRef.current,
|
6699
|
+
state,
|
6700
|
+
scrollTo: scrollTo ? EditorView26.scrollIntoView(scrollTo, {
|
6701
|
+
yMargin: 96
|
6702
|
+
}) : void 0,
|
6703
|
+
dispatchTransactions: debug ? debugDispatcher : void 0
|
6704
|
+
});
|
6705
|
+
if (moveToEndOfLine && !initialSelection) {
|
6706
|
+
const { to } = view2.state.doc.lineAt(0);
|
6707
|
+
if (to) {
|
6708
|
+
view2.dispatch({
|
6709
|
+
selection: {
|
6710
|
+
anchor: to
|
6711
|
+
}
|
6712
|
+
});
|
6713
|
+
}
|
6714
|
+
}
|
6715
|
+
setView(view2);
|
6716
|
+
}
|
6717
|
+
return () => {
|
6718
|
+
log8("destroy", {
|
6719
|
+
id
|
6720
|
+
}, {
|
6721
|
+
F: __dxlog_file13,
|
6722
|
+
L: 134,
|
6723
|
+
S: void 0,
|
6724
|
+
C: (f, a) => f(...a)
|
6725
|
+
});
|
6726
|
+
view2?.destroy();
|
6727
|
+
};
|
6728
|
+
}, deps);
|
6729
|
+
useEffect2(() => {
|
6730
|
+
if (view) {
|
6731
|
+
if (scrollTo || selection) {
|
6732
|
+
if (selection && selection.anchor > view.state.doc.length) {
|
6733
|
+
log8.warn("invalid selection", {
|
6734
|
+
length: view.state.doc.length,
|
6735
|
+
scrollTo,
|
6736
|
+
selection
|
6737
|
+
}, {
|
6738
|
+
F: __dxlog_file13,
|
6739
|
+
L: 143,
|
6740
|
+
S: void 0,
|
6741
|
+
C: (f, a) => f(...a)
|
6742
|
+
});
|
6743
|
+
return;
|
6744
|
+
}
|
6745
|
+
view.dispatch(createEditorStateTransaction({
|
6746
|
+
scrollTo,
|
6747
|
+
selection
|
6748
|
+
}));
|
6749
|
+
}
|
6750
|
+
}
|
6751
|
+
}, [
|
6752
|
+
view,
|
6753
|
+
scrollTo,
|
6754
|
+
selection
|
6755
|
+
]);
|
6756
|
+
useEffect2(() => {
|
6757
|
+
if (view && autoFocus) {
|
6758
|
+
view.focus();
|
6759
|
+
}
|
6760
|
+
}, [
|
6761
|
+
autoFocus,
|
6762
|
+
view
|
6763
|
+
]);
|
6764
|
+
const focusableGroupAttrs = useFocusableGroup({
|
6765
|
+
tabBehavior: "limited",
|
6766
|
+
ignoreDefaultKeydown: {
|
6767
|
+
Escape: view?.state.facet(editorInputMode).noTabster
|
6768
|
+
}
|
6769
|
+
});
|
6770
|
+
const handleKeyUp = useCallback3((event) => {
|
6771
|
+
const { key, target, currentTarget } = event;
|
6772
|
+
if (target === currentTarget) {
|
6773
|
+
switch (key) {
|
6774
|
+
case "Enter": {
|
6775
|
+
view?.focus();
|
6776
|
+
break;
|
6777
|
+
}
|
6778
|
+
}
|
6779
|
+
}
|
6780
|
+
}, [
|
6781
|
+
view
|
6782
|
+
]);
|
6783
|
+
return {
|
6784
|
+
parentRef,
|
6785
|
+
view,
|
6786
|
+
focusAttributes: {
|
6787
|
+
tabIndex: 0,
|
6788
|
+
...focusableGroupAttrs,
|
6789
|
+
onKeyUp: handleKeyUp
|
6790
|
+
}
|
6791
|
+
};
|
6792
|
+
};
|
6793
|
+
|
6794
|
+
// src/components/Editor/Editor.tsx
|
6795
|
+
var Editor = /* @__PURE__ */ forwardRef(({ classNames, id, text, ...props }, forwardedRef) => {
|
6796
|
+
var _effect = _useSignals();
|
6797
|
+
try {
|
6798
|
+
const { themeMode } = useThemeContext();
|
6799
|
+
const { parentRef, focusAttributes, view } = useTextEditor(() => ({
|
6800
|
+
id,
|
6801
|
+
initialValue: text.content,
|
6802
|
+
...props
|
6803
|
+
}), [
|
6804
|
+
id,
|
6805
|
+
text,
|
6806
|
+
themeMode
|
6807
|
+
]);
|
6808
|
+
useImperativeHandle(forwardedRef, () => view, [
|
6809
|
+
view
|
6810
|
+
]);
|
6811
|
+
return /* @__PURE__ */ React3.createElement("div", {
|
6812
|
+
ref: parentRef,
|
6813
|
+
className: mx6(classNames),
|
6814
|
+
...focusAttributes
|
6815
|
+
});
|
6816
|
+
} finally {
|
6817
|
+
_effect.f();
|
6818
|
+
}
|
6819
|
+
});
|
6820
|
+
|
6821
|
+
// src/components/EditorToolbar/EditorToolbar.tsx
|
6822
|
+
import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
|
6823
|
+
import { Rx } from "@effect-rx/rx-react";
|
6824
|
+
import React4, { memo, useMemo as useMemo5 } from "react";
|
6825
|
+
import { rxFromSignal } from "@dxos/app-graph";
|
6826
|
+
import { ElevationProvider } from "@dxos/react-ui";
|
6827
|
+
import { MenuProvider, ToolbarMenu, createGapSeparator, useMenuActions } from "@dxos/react-ui-menu";
|
6828
|
+
|
6829
|
+
// src/components/EditorToolbar/util.ts
|
6830
|
+
import { useMemo as useMemo4 } from "react";
|
6831
|
+
import { live } from "@dxos/live-object";
|
6832
|
+
import { createMenuAction, createMenuItemGroup } from "@dxos/react-ui-menu";
|
6833
|
+
var useEditorToolbarState = (initialState = {}) => {
|
6834
|
+
return useMemo4(() => live(initialState), []);
|
6835
|
+
};
|
6836
|
+
var createEditorAction = (id, invoke, properties) => {
|
6837
|
+
const { label = [
|
6838
|
+
`${id} label`,
|
6839
|
+
{
|
6840
|
+
ns: translationKey
|
6841
|
+
}
|
6842
|
+
], ...rest } = properties;
|
6843
|
+
return createMenuAction(id, invoke, {
|
6844
|
+
label,
|
6845
|
+
...rest
|
6846
|
+
});
|
6614
6847
|
};
|
6848
|
+
var createEditorActionGroup = (id, props, icon) => createMenuItemGroup(id, {
|
6849
|
+
icon,
|
6850
|
+
iconOnly: true,
|
6851
|
+
...props
|
6852
|
+
});
|
6615
6853
|
|
6616
|
-
//
|
6854
|
+
// src/components/EditorToolbar/blocks.ts
|
6617
6855
|
var createBlockGroupAction = (value) => createEditorActionGroup("block", {
|
6618
6856
|
variant: "toggleGroup",
|
6619
6857
|
selectCardinality: "single",
|
@@ -6671,7 +6909,7 @@ var createBlocks = (state, getView) => {
|
|
6671
6909
|
};
|
6672
6910
|
};
|
6673
6911
|
|
6674
|
-
//
|
6912
|
+
// src/components/EditorToolbar/formatting.ts
|
6675
6913
|
var formats = {
|
6676
6914
|
strong: "ph--text-b--regular",
|
6677
6915
|
emphasis: "ph--text-italic--regular",
|
@@ -6723,7 +6961,7 @@ var createFormatting = (state, getView) => {
|
|
6723
6961
|
};
|
6724
6962
|
};
|
6725
6963
|
|
6726
|
-
//
|
6964
|
+
// src/components/EditorToolbar/headings.ts
|
6727
6965
|
var createHeadingGroupAction = (value) => createEditorActionGroup("heading", {
|
6728
6966
|
variant: "dropdownMenu",
|
6729
6967
|
applyActive: true,
|
@@ -6778,7 +7016,7 @@ var createHeadings = (state, getView) => {
|
|
6778
7016
|
};
|
6779
7017
|
};
|
6780
7018
|
|
6781
|
-
//
|
7019
|
+
// src/components/EditorToolbar/image.ts
|
6782
7020
|
var createImageUploadAction = (onImageUpload) => createEditorAction("image", onImageUpload, {
|
6783
7021
|
testId: "editor.toolbar.image",
|
6784
7022
|
icon: "ph--image-square--regular"
|
@@ -6795,7 +7033,7 @@ var createImageUpload = (onImageUpload) => ({
|
|
6795
7033
|
]
|
6796
7034
|
});
|
6797
7035
|
|
6798
|
-
//
|
7036
|
+
// src/components/EditorToolbar/lists.ts
|
6799
7037
|
var listStyles = {
|
6800
7038
|
bullet: "ph--list-bullets--regular",
|
6801
7039
|
ordered: "ph--list-numbers--regular",
|
@@ -6846,7 +7084,7 @@ var createLists = (state, getView) => {
|
|
6846
7084
|
};
|
6847
7085
|
};
|
6848
7086
|
|
6849
|
-
//
|
7087
|
+
// src/components/EditorToolbar/search.ts
|
6850
7088
|
import { openSearchPanel } from "@codemirror/search";
|
6851
7089
|
var createSearchAction = (getView) => createEditorAction("search", () => openSearchPanel(getView()), {
|
6852
7090
|
testId: "editor.toolbar.search",
|
@@ -6864,7 +7102,7 @@ var createSearch = (getView) => ({
|
|
6864
7102
|
]
|
6865
7103
|
});
|
6866
7104
|
|
6867
|
-
//
|
7105
|
+
// src/components/EditorToolbar/view-mode.ts
|
6868
7106
|
var createViewModeGroupAction = (value) => createEditorActionGroup("viewMode", {
|
6869
7107
|
variant: "dropdownMenu",
|
6870
7108
|
applyActive: true,
|
@@ -6910,7 +7148,7 @@ var createViewMode = (state, onViewModeChange) => {
|
|
6910
7148
|
};
|
6911
7149
|
};
|
6912
7150
|
|
6913
|
-
//
|
7151
|
+
// src/components/EditorToolbar/EditorToolbar.tsx
|
6914
7152
|
var createToolbar = ({ getView, state, customActions, ...features }) => {
|
6915
7153
|
return Rx.make((get2) => {
|
6916
7154
|
const nodes = [];
|
@@ -6965,7 +7203,7 @@ var createToolbar = ({ getView, state, customActions, ...features }) => {
|
|
6965
7203
|
});
|
6966
7204
|
};
|
6967
7205
|
var useEditorToolbarActionGraph = (props) => {
|
6968
|
-
const menuCreator =
|
7206
|
+
const menuCreator = useMemo5(() => createToolbar({
|
6969
7207
|
getView: props.getView,
|
6970
7208
|
state: props.state,
|
6971
7209
|
customActions: props.customActions,
|
@@ -6991,15 +7229,15 @@ var useEditorToolbarActionGraph = (props) => {
|
|
6991
7229
|
return useMenuActions(menuCreator);
|
6992
7230
|
};
|
6993
7231
|
var EditorToolbar = /* @__PURE__ */ memo(({ classNames, attendableId, role, ...props }) => {
|
6994
|
-
var _effect =
|
7232
|
+
var _effect = _useSignals2();
|
6995
7233
|
try {
|
6996
7234
|
const menuProps = useEditorToolbarActionGraph(props);
|
6997
|
-
return /* @__PURE__ */
|
7235
|
+
return /* @__PURE__ */ React4.createElement(ElevationProvider, {
|
6998
7236
|
elevation: role === "section" ? "positioned" : "base"
|
6999
|
-
}, /* @__PURE__ */
|
7237
|
+
}, /* @__PURE__ */ React4.createElement(MenuProvider, {
|
7000
7238
|
...menuProps,
|
7001
7239
|
attendableId
|
7002
|
-
}, /* @__PURE__ */
|
7240
|
+
}, /* @__PURE__ */ React4.createElement(ToolbarMenu, {
|
7003
7241
|
classNames,
|
7004
7242
|
textBlockWidth: true
|
7005
7243
|
})));
|
@@ -7008,16 +7246,16 @@ var EditorToolbar = /* @__PURE__ */ memo(({ classNames, attendableId, role, ...p
|
|
7008
7246
|
}
|
7009
7247
|
});
|
7010
7248
|
|
7011
|
-
//
|
7012
|
-
import { useSignals as
|
7013
|
-
import
|
7014
|
-
import { Icon as Icon2, Popover, toLocalizedString, useThemeContext, useTranslation } from "@dxos/react-ui";
|
7249
|
+
// src/components/Popover/CommandMenu.tsx
|
7250
|
+
import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
|
7251
|
+
import React5, { useCallback as useCallback4, useEffect as useEffect3, useRef as useRef3 } from "react";
|
7252
|
+
import { Icon as Icon2, Popover, toLocalizedString, useThemeContext as useThemeContext2, useTranslation } from "@dxos/react-ui";
|
7015
7253
|
var CommandMenu = ({ groups, currentItem, onSelect }) => {
|
7016
|
-
var _effect =
|
7254
|
+
var _effect = _useSignals3();
|
7017
7255
|
try {
|
7018
|
-
const { tx } =
|
7256
|
+
const { tx } = useThemeContext2();
|
7019
7257
|
const groupsWithItems = groups.filter((group) => group.items.length > 0);
|
7020
|
-
return /* @__PURE__ */
|
7258
|
+
return /* @__PURE__ */ React5.createElement(Popover.Portal, null, /* @__PURE__ */ React5.createElement(Popover.Content, {
|
7021
7259
|
align: "start",
|
7022
7260
|
onOpenAutoFocus: (event) => event.preventDefault(),
|
7023
7261
|
classNames: tx("menu.content", "menu--exotic-unfocusable", {
|
@@ -7025,15 +7263,15 @@ var CommandMenu = ({ groups, currentItem, onSelect }) => {
|
|
7025
7263
|
}, [
|
7026
7264
|
"max-h-[300px] overflow-y-auto"
|
7027
7265
|
])
|
7028
|
-
}, /* @__PURE__ */
|
7266
|
+
}, /* @__PURE__ */ React5.createElement(Popover.Viewport, {
|
7029
7267
|
classNames: tx("menu.viewport", "menu__viewport--exotic-unfocusable", {})
|
7030
|
-
}, /* @__PURE__ */
|
7268
|
+
}, /* @__PURE__ */ React5.createElement("ul", null, groupsWithItems.map((group, index) => /* @__PURE__ */ React5.createElement(React5.Fragment, {
|
7031
7269
|
key: group.id
|
7032
|
-
}, /* @__PURE__ */
|
7270
|
+
}, /* @__PURE__ */ React5.createElement(CommandGroup, {
|
7033
7271
|
group,
|
7034
7272
|
currentItem,
|
7035
7273
|
onSelect
|
7036
|
-
}), index < groupsWithItems.length - 1 && /* @__PURE__ */
|
7274
|
+
}), index < groupsWithItems.length - 1 && /* @__PURE__ */ React5.createElement("div", {
|
7037
7275
|
className: tx("menu.separator", "menu__item", {})
|
7038
7276
|
})))))));
|
7039
7277
|
} finally {
|
@@ -7041,13 +7279,13 @@ var CommandMenu = ({ groups, currentItem, onSelect }) => {
|
|
7041
7279
|
}
|
7042
7280
|
};
|
7043
7281
|
var CommandGroup = ({ group, currentItem, onSelect }) => {
|
7044
|
-
var _effect =
|
7282
|
+
var _effect = _useSignals3();
|
7045
7283
|
try {
|
7046
|
-
const { tx } =
|
7284
|
+
const { tx } = useThemeContext2();
|
7047
7285
|
const { t } = useTranslation();
|
7048
|
-
return /* @__PURE__ */
|
7286
|
+
return /* @__PURE__ */ React5.createElement(React5.Fragment, null, group.label && /* @__PURE__ */ React5.createElement("div", {
|
7049
7287
|
className: tx("menu.groupLabel", "menu__group__label", {})
|
7050
|
-
}, /* @__PURE__ */
|
7288
|
+
}, /* @__PURE__ */ React5.createElement("span", null, toLocalizedString(group.label, t))), group.items.map((item) => /* @__PURE__ */ React5.createElement(CommandItem, {
|
7051
7289
|
key: item.id,
|
7052
7290
|
item,
|
7053
7291
|
current: currentItem === item.id,
|
@@ -7058,16 +7296,16 @@ var CommandGroup = ({ group, currentItem, onSelect }) => {
|
|
7058
7296
|
}
|
7059
7297
|
};
|
7060
7298
|
var CommandItem = ({ item, current, onSelect }) => {
|
7061
|
-
var _effect =
|
7299
|
+
var _effect = _useSignals3();
|
7062
7300
|
try {
|
7063
|
-
const ref =
|
7064
|
-
const { tx } =
|
7301
|
+
const ref = useRef3(null);
|
7302
|
+
const { tx } = useThemeContext2();
|
7065
7303
|
const { t } = useTranslation();
|
7066
|
-
const handleSelect =
|
7304
|
+
const handleSelect = useCallback4(() => onSelect(item), [
|
7067
7305
|
item,
|
7068
7306
|
onSelect
|
7069
7307
|
]);
|
7070
|
-
|
7308
|
+
useEffect3(() => {
|
7071
7309
|
if (current && ref.current) {
|
7072
7310
|
ref.current.scrollIntoView({
|
7073
7311
|
behavior: "smooth",
|
@@ -7077,16 +7315,16 @@ var CommandItem = ({ item, current, onSelect }) => {
|
|
7077
7315
|
}, [
|
7078
7316
|
current
|
7079
7317
|
]);
|
7080
|
-
return /* @__PURE__ */
|
7318
|
+
return /* @__PURE__ */ React5.createElement("li", {
|
7081
7319
|
ref,
|
7082
7320
|
className: tx("menu.item", "menu__item--exotic-unfocusable", {}, [
|
7083
7321
|
current && "bg-hoverSurface"
|
7084
7322
|
]),
|
7085
7323
|
onClick: handleSelect
|
7086
|
-
}, item.icon && /* @__PURE__ */
|
7324
|
+
}, item.icon && /* @__PURE__ */ React5.createElement(Icon2, {
|
7087
7325
|
icon: item.icon,
|
7088
7326
|
size: 5
|
7089
|
-
}), /* @__PURE__ */
|
7327
|
+
}), /* @__PURE__ */ React5.createElement("span", {
|
7090
7328
|
className: "grow truncate"
|
7091
7329
|
}, toLocalizedString(item.label, t)));
|
7092
7330
|
} finally {
|
@@ -7273,21 +7511,21 @@ var linkSlashCommands = {
|
|
7273
7511
|
]
|
7274
7512
|
};
|
7275
7513
|
|
7276
|
-
//
|
7277
|
-
import { useSignals as
|
7514
|
+
// src/components/Popover/RefPopover.tsx
|
7515
|
+
import { useSignals as _useSignals4 } from "@preact-signals/safe-react/tracking";
|
7278
7516
|
import { createContext } from "@radix-ui/react-context";
|
7279
|
-
import
|
7517
|
+
import React6, { forwardRef as forwardRef2, useCallback as useCallback5, useEffect as useEffect4, useRef as useRef4, useState as useState3 } from "react";
|
7280
7518
|
import { addEventListener as addEventListener2 } from "@dxos/async";
|
7281
7519
|
import { Popover as Popover2 } from "@dxos/react-ui";
|
7282
7520
|
var customEventOptions = {
|
7283
7521
|
capture: true,
|
7284
7522
|
passive: false
|
7285
7523
|
};
|
7286
|
-
var RefPopover = /* @__PURE__ */
|
7287
|
-
var _effect =
|
7524
|
+
var RefPopover = /* @__PURE__ */ forwardRef2(({ children, open, onOpenChange, modal, onActivate }, ref) => {
|
7525
|
+
var _effect = _useSignals4();
|
7288
7526
|
try {
|
7289
|
-
const [rootRef, setRootRef] =
|
7290
|
-
|
7527
|
+
const [rootRef, setRootRef] = useState3(null);
|
7528
|
+
useEffect4(() => {
|
7291
7529
|
if (!rootRef || !onActivate) {
|
7292
7530
|
return;
|
7293
7531
|
}
|
@@ -7296,13 +7534,13 @@ var RefPopover = /* @__PURE__ */ forwardRef(({ children, open, onOpenChange, mod
|
|
7296
7534
|
rootRef,
|
7297
7535
|
onActivate
|
7298
7536
|
]);
|
7299
|
-
return /* @__PURE__ */
|
7537
|
+
return /* @__PURE__ */ React6.createElement(Popover2.Root, {
|
7300
7538
|
open,
|
7301
7539
|
onOpenChange,
|
7302
7540
|
modal
|
7303
|
-
}, /* @__PURE__ */
|
7541
|
+
}, /* @__PURE__ */ React6.createElement(Popover2.VirtualTrigger, {
|
7304
7542
|
virtualRef: ref
|
7305
|
-
}), /* @__PURE__ */
|
7543
|
+
}), /* @__PURE__ */ React6.createElement("div", {
|
7306
7544
|
role: "none",
|
7307
7545
|
className: "contents",
|
7308
7546
|
ref: setRootRef
|
@@ -7314,12 +7552,12 @@ var RefPopover = /* @__PURE__ */ forwardRef(({ children, open, onOpenChange, mod
|
|
7314
7552
|
var REF_POPOVER = "RefPopover";
|
7315
7553
|
var [RefPopoverContextProvider, useRefPopover] = createContext(REF_POPOVER, {});
|
7316
7554
|
var PreviewProvider = ({ children, onLookup }) => {
|
7317
|
-
var _effect =
|
7555
|
+
var _effect = _useSignals4();
|
7318
7556
|
try {
|
7319
|
-
const trigger =
|
7320
|
-
const [value, setValue] =
|
7321
|
-
const [open, setOpen] =
|
7322
|
-
const handleDxRefTagActivate =
|
7557
|
+
const trigger = useRef4(null);
|
7558
|
+
const [value, setValue] = useState3({});
|
7559
|
+
const [open, setOpen] = useState3(false);
|
7560
|
+
const handleDxRefTagActivate = useCallback5((event) => {
|
7323
7561
|
const { refId, label, trigger: dxTrigger } = event;
|
7324
7562
|
setValue((value2) => ({
|
7325
7563
|
...value2,
|
@@ -7342,11 +7580,11 @@ var PreviewProvider = ({ children, onLookup }) => {
|
|
7342
7580
|
}, [
|
7343
7581
|
onLookup
|
7344
7582
|
]);
|
7345
|
-
return /* @__PURE__ */
|
7583
|
+
return /* @__PURE__ */ React6.createElement(RefPopoverContextProvider, {
|
7346
7584
|
pending: value.pending,
|
7347
7585
|
link: value.link,
|
7348
7586
|
target: value.target
|
7349
|
-
}, /* @__PURE__ */
|
7587
|
+
}, /* @__PURE__ */ React6.createElement(RefPopover, {
|
7350
7588
|
ref: trigger,
|
7351
7589
|
open,
|
7352
7590
|
onOpenChange: setOpen,
|
@@ -7357,10 +7595,10 @@ var PreviewProvider = ({ children, onLookup }) => {
|
|
7357
7595
|
}
|
7358
7596
|
};
|
7359
7597
|
|
7360
|
-
//
|
7361
|
-
import { useSignals as
|
7598
|
+
// src/components/Popover/RefDropdownMenu.tsx
|
7599
|
+
import { useSignals as _useSignals5 } from "@preact-signals/safe-react/tracking";
|
7362
7600
|
import { createContext as createContext2 } from "@radix-ui/react-context";
|
7363
|
-
import
|
7601
|
+
import React7, { useCallback as useCallback6, useEffect as useEffect5, useRef as useRef5, useState as useState4 } from "react";
|
7364
7602
|
import { addEventListener as addEventListener3 } from "@dxos/async";
|
7365
7603
|
import { DropdownMenu } from "@dxos/react-ui";
|
7366
7604
|
var customEventOptions2 = {
|
@@ -7370,13 +7608,13 @@ var customEventOptions2 = {
|
|
7370
7608
|
var REF_DROPDOWN_MENU = "RefDropdownMenu";
|
7371
7609
|
var [RefDropdownMenuContextProvider, useRefDropdownMenu] = createContext2(REF_DROPDOWN_MENU, {});
|
7372
7610
|
var RefDropdownMenuProvider = ({ children, onLookup }) => {
|
7373
|
-
var _effect =
|
7611
|
+
var _effect = _useSignals5();
|
7374
7612
|
try {
|
7375
|
-
const trigger =
|
7376
|
-
const [value, setValue] =
|
7377
|
-
const [rootRef, setRootRef] =
|
7378
|
-
const [open, setOpen] =
|
7379
|
-
const handleDxRefTagActivate =
|
7613
|
+
const trigger = useRef5(null);
|
7614
|
+
const [value, setValue] = useState4({});
|
7615
|
+
const [rootRef, setRootRef] = useState4(null);
|
7616
|
+
const [open, setOpen] = useState4(false);
|
7617
|
+
const handleDxRefTagActivate = useCallback6((event) => {
|
7380
7618
|
const { refId, label, trigger: dxTrigger } = event;
|
7381
7619
|
setValue((value2) => ({
|
7382
7620
|
...value2,
|
@@ -7399,7 +7637,7 @@ var RefDropdownMenuProvider = ({ children, onLookup }) => {
|
|
7399
7637
|
}, [
|
7400
7638
|
onLookup
|
7401
7639
|
]);
|
7402
|
-
|
7640
|
+
useEffect5(() => {
|
7403
7641
|
if (!rootRef) {
|
7404
7642
|
return;
|
7405
7643
|
}
|
@@ -7407,16 +7645,16 @@ var RefDropdownMenuProvider = ({ children, onLookup }) => {
|
|
7407
7645
|
}, [
|
7408
7646
|
rootRef
|
7409
7647
|
]);
|
7410
|
-
return /* @__PURE__ */
|
7648
|
+
return /* @__PURE__ */ React7.createElement(RefDropdownMenuContextProvider, {
|
7411
7649
|
pending: value.pending,
|
7412
7650
|
link: value.link,
|
7413
7651
|
target: value.target
|
7414
|
-
}, /* @__PURE__ */
|
7652
|
+
}, /* @__PURE__ */ React7.createElement(DropdownMenu.Root, {
|
7415
7653
|
open,
|
7416
7654
|
onOpenChange: setOpen
|
7417
|
-
}, /* @__PURE__ */
|
7655
|
+
}, /* @__PURE__ */ React7.createElement(DropdownMenu.VirtualTrigger, {
|
7418
7656
|
virtualRef: trigger
|
7419
|
-
}), /* @__PURE__ */
|
7657
|
+
}), /* @__PURE__ */ React7.createElement("div", {
|
7420
7658
|
role: "none",
|
7421
7659
|
className: "contents",
|
7422
7660
|
ref: setRootRef
|
@@ -7428,162 +7666,10 @@ var RefDropdownMenuProvider = ({ children, onLookup }) => {
|
|
7428
7666
|
var RefDropdownMenu = {
|
7429
7667
|
Provider: RefDropdownMenuProvider
|
7430
7668
|
};
|
7431
|
-
|
7432
|
-
// packages/ui/react-ui-editor/src/hooks/useTextEditor.ts
|
7433
|
-
import { EditorState as EditorState3 } from "@codemirror/state";
|
7434
|
-
import { EditorView as EditorView26 } from "@codemirror/view";
|
7435
|
-
import { useFocusableGroup } from "@fluentui/react-tabster";
|
7436
|
-
import { useCallback as useCallback5, useEffect as useEffect5, useMemo as useMemo5, useRef as useRef5, useState as useState4 } from "react";
|
7437
|
-
import { log as log8 } from "@dxos/log";
|
7438
|
-
import { getProviderValue, isNotFalsy as isNotFalsy4 } from "@dxos/util";
|
7439
|
-
var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
|
7440
|
-
var instanceCount = 0;
|
7441
|
-
var useTextEditor = (props = {}, deps = []) => {
|
7442
|
-
const { id, doc, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = useMemo5(() => getProviderValue(props), deps ?? []);
|
7443
|
-
const [instanceId] = useState4(() => `text-editor-${++instanceCount}`);
|
7444
|
-
const [view, setView] = useState4();
|
7445
|
-
const parentRef = useRef5(null);
|
7446
|
-
useEffect5(() => {
|
7447
|
-
let view2;
|
7448
|
-
if (parentRef.current) {
|
7449
|
-
log8("create", {
|
7450
|
-
id,
|
7451
|
-
instanceId,
|
7452
|
-
doc: initialValue?.length ?? 0
|
7453
|
-
}, {
|
7454
|
-
F: __dxlog_file13,
|
7455
|
-
L: 75,
|
7456
|
-
S: void 0,
|
7457
|
-
C: (f, a) => f(...a)
|
7458
|
-
});
|
7459
|
-
let initialSelection;
|
7460
|
-
if (selection?.anchor && initialValue?.length) {
|
7461
|
-
if (selection.anchor <= initialValue.length && (selection?.head ?? 0) <= initialValue.length) {
|
7462
|
-
initialSelection = selection;
|
7463
|
-
}
|
7464
|
-
} else if (moveToEndOfLine && selection === void 0) {
|
7465
|
-
const index = initialValue?.indexOf("\n");
|
7466
|
-
const anchor = !index || index === -1 ? 0 : index;
|
7467
|
-
initialSelection = {
|
7468
|
-
anchor
|
7469
|
-
};
|
7470
|
-
}
|
7471
|
-
const state = EditorState3.create({
|
7472
|
-
doc: doc ?? initialValue,
|
7473
|
-
// selection: initialSelection,
|
7474
|
-
extensions: [
|
7475
|
-
id && documentId.of(id),
|
7476
|
-
extensions,
|
7477
|
-
// NOTE: This doesn't catch errors in keymap functions.
|
7478
|
-
EditorView26.exceptionSink.of((err) => {
|
7479
|
-
log8.catch(err, void 0, {
|
7480
|
-
F: __dxlog_file13,
|
7481
|
-
L: 97,
|
7482
|
-
S: void 0,
|
7483
|
-
C: (f, a) => f(...a)
|
7484
|
-
});
|
7485
|
-
})
|
7486
|
-
].filter(isNotFalsy4)
|
7487
|
-
});
|
7488
|
-
view2 = new EditorView26({
|
7489
|
-
parent: parentRef.current,
|
7490
|
-
state,
|
7491
|
-
scrollTo: scrollTo ? EditorView26.scrollIntoView(scrollTo, {
|
7492
|
-
yMargin: 96
|
7493
|
-
}) : void 0,
|
7494
|
-
dispatchTransactions: debug ? debugDispatcher : void 0
|
7495
|
-
});
|
7496
|
-
if (moveToEndOfLine && !initialSelection) {
|
7497
|
-
const { to } = view2.state.doc.lineAt(0);
|
7498
|
-
if (to) {
|
7499
|
-
view2.dispatch({
|
7500
|
-
selection: {
|
7501
|
-
anchor: to
|
7502
|
-
}
|
7503
|
-
});
|
7504
|
-
}
|
7505
|
-
}
|
7506
|
-
setView(view2);
|
7507
|
-
}
|
7508
|
-
return () => {
|
7509
|
-
log8("destroy", {
|
7510
|
-
id
|
7511
|
-
}, {
|
7512
|
-
F: __dxlog_file13,
|
7513
|
-
L: 134,
|
7514
|
-
S: void 0,
|
7515
|
-
C: (f, a) => f(...a)
|
7516
|
-
});
|
7517
|
-
view2?.destroy();
|
7518
|
-
};
|
7519
|
-
}, deps);
|
7520
|
-
useEffect5(() => {
|
7521
|
-
if (view) {
|
7522
|
-
if (scrollTo || selection) {
|
7523
|
-
if (selection && selection.anchor > view.state.doc.length) {
|
7524
|
-
log8.warn("invalid selection", {
|
7525
|
-
length: view.state.doc.length,
|
7526
|
-
scrollTo,
|
7527
|
-
selection
|
7528
|
-
}, {
|
7529
|
-
F: __dxlog_file13,
|
7530
|
-
L: 143,
|
7531
|
-
S: void 0,
|
7532
|
-
C: (f, a) => f(...a)
|
7533
|
-
});
|
7534
|
-
return;
|
7535
|
-
}
|
7536
|
-
view.dispatch(createEditorStateTransaction({
|
7537
|
-
scrollTo,
|
7538
|
-
selection
|
7539
|
-
}));
|
7540
|
-
}
|
7541
|
-
}
|
7542
|
-
}, [
|
7543
|
-
view,
|
7544
|
-
scrollTo,
|
7545
|
-
selection
|
7546
|
-
]);
|
7547
|
-
useEffect5(() => {
|
7548
|
-
if (view && autoFocus) {
|
7549
|
-
view.focus();
|
7550
|
-
}
|
7551
|
-
}, [
|
7552
|
-
autoFocus,
|
7553
|
-
view
|
7554
|
-
]);
|
7555
|
-
const focusableGroupAttrs = useFocusableGroup({
|
7556
|
-
tabBehavior: "limited",
|
7557
|
-
ignoreDefaultKeydown: {
|
7558
|
-
Escape: view?.state.facet(editorInputMode).noTabster
|
7559
|
-
}
|
7560
|
-
});
|
7561
|
-
const handleKeyUp = useCallback5((event) => {
|
7562
|
-
const { key, target, currentTarget } = event;
|
7563
|
-
if (target === currentTarget) {
|
7564
|
-
switch (key) {
|
7565
|
-
case "Enter": {
|
7566
|
-
view?.focus();
|
7567
|
-
break;
|
7568
|
-
}
|
7569
|
-
}
|
7570
|
-
}
|
7571
|
-
}, [
|
7572
|
-
view
|
7573
|
-
]);
|
7574
|
-
return {
|
7575
|
-
parentRef,
|
7576
|
-
view,
|
7577
|
-
focusAttributes: {
|
7578
|
-
tabIndex: 0,
|
7579
|
-
...focusableGroupAttrs,
|
7580
|
-
onKeyUp: handleKeyUp
|
7581
|
-
}
|
7582
|
-
};
|
7583
|
-
};
|
7584
7669
|
export {
|
7585
7670
|
CommandMenu,
|
7586
7671
|
Cursor,
|
7672
|
+
Editor,
|
7587
7673
|
EditorInputMode,
|
7588
7674
|
EditorInputModes,
|
7589
7675
|
EditorState4 as EditorState,
|
@@ -7644,6 +7730,7 @@ export {
|
|
7644
7730
|
debugTree,
|
7645
7731
|
decorateMarkdown,
|
7646
7732
|
defaultOptions,
|
7733
|
+
defaultThemeSlots,
|
7647
7734
|
deleteItem,
|
7648
7735
|
documentId,
|
7649
7736
|
dropFile,
|
@@ -7661,6 +7748,7 @@ export {
|
|
7661
7748
|
folding,
|
7662
7749
|
formattingEquals,
|
7663
7750
|
formattingKeymap,
|
7751
|
+
fullWidth,
|
7664
7752
|
getFormatting,
|
7665
7753
|
getItem,
|
7666
7754
|
getLinkRef,
|
@@ -7668,6 +7756,7 @@ export {
|
|
7668
7756
|
getNextItem,
|
7669
7757
|
getPreviousItem,
|
7670
7758
|
getRange,
|
7759
|
+
grow,
|
7671
7760
|
hashtag,
|
7672
7761
|
image,
|
7673
7762
|
indentItemLess,
|
@@ -7725,7 +7814,7 @@ export {
|
|
7725
7814
|
toggleStrong,
|
7726
7815
|
toggleStyle,
|
7727
7816
|
toggleTask,
|
7728
|
-
|
7817
|
+
translations,
|
7729
7818
|
traverse,
|
7730
7819
|
treeFacet,
|
7731
7820
|
typeahead,
|