@dxos/react-ui-editor 0.8.2-main.fbd8ed0 → 0.8.2-staging.7ac8446
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/index.mjs +5088 -5521
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +4915 -5354
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +5088 -5521
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/{components/EditorToolbar/EditorToolbar.stories.d.ts → InputMode.stories.d.ts} +7 -3
- package/dist/types/src/InputMode.stories.d.ts.map +1 -0
- package/dist/types/src/{stories/TextEditorBasic.stories.d.ts → TextEditor.stories.d.ts} +35 -5
- package/dist/types/src/TextEditor.stories.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +1 -1
- package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/blocks.d.ts +3 -4
- package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/comment.d.ts +3 -4
- package/dist/types/src/components/EditorToolbar/comment.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/formatting.d.ts +3 -4
- package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/headings.d.ts +3 -4
- package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/lists.d.ts +3 -4
- package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/util.d.ts +20 -14
- package/dist/types/src/components/EditorToolbar/util.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/{view-mode.d.ts → viewMode.d.ts} +4 -5
- package/dist/types/src/components/EditorToolbar/viewMode.d.ts.map +1 -0
- package/dist/types/src/defaults.d.ts +0 -1
- package/dist/types/src/defaults.d.ts.map +1 -1
- package/dist/types/src/extensions/annotations.d.ts.map +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.map +1 -1
- package/dist/types/src/extensions/automerge/cursor.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 +1 -1
- package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/update-codemirror.d.ts +1 -1
- package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +1 -1
- package/dist/types/src/extensions/awareness/awareness.d.ts.map +1 -1
- package/dist/types/src/extensions/blast.d.ts.map +1 -1
- package/dist/types/src/extensions/command/command.d.ts +10 -5
- package/dist/types/src/extensions/command/command.d.ts.map +1 -1
- package/dist/types/src/extensions/command/hint.d.ts +2 -4
- package/dist/types/src/extensions/command/hint.d.ts.map +1 -1
- package/dist/types/src/extensions/command/index.d.ts +0 -1
- package/dist/types/src/extensions/command/index.d.ts.map +1 -1
- package/dist/types/src/extensions/command/menu.d.ts +2 -7
- package/dist/types/src/extensions/command/menu.d.ts.map +1 -1
- package/dist/types/src/extensions/command/preview.d.ts +12 -0
- package/dist/types/src/extensions/command/preview.d.ts.map +1 -0
- package/dist/types/src/extensions/command/state.d.ts +11 -9
- package/dist/types/src/extensions/command/state.d.ts.map +1 -1
- package/dist/types/src/extensions/comments.d.ts +7 -9
- package/dist/types/src/extensions/comments.d.ts.map +1 -1
- package/dist/types/src/extensions/debug.d.ts.map +1 -1
- package/dist/types/src/extensions/dnd.d.ts.map +1 -1
- package/dist/types/src/extensions/factories.d.ts.map +1 -1
- package/dist/types/src/extensions/folding.d.ts.map +1 -1
- package/dist/types/src/extensions/index.d.ts +0 -1
- package/dist/types/src/extensions/index.d.ts.map +1 -1
- package/dist/types/src/extensions/listener.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/debug.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/decorate.d.ts +1 -5
- package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/formatting.d.ts +3 -3
- package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/index.d.ts +0 -1
- package/dist/types/src/extensions/markdown/index.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/link.d.ts +1 -4
- package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/table.d.ts.map +1 -1
- package/dist/types/src/extensions/mention.d.ts.map +1 -1
- package/dist/types/src/extensions/modes.d.ts +5 -5
- package/dist/types/src/extensions/modes.d.ts.map +1 -1
- package/dist/types/src/extensions/selection.d.ts.map +1 -1
- package/dist/types/src/extensions/typewriter.d.ts.map +1 -1
- package/dist/types/src/fragments.d.ts +3 -0
- package/dist/types/src/fragments.d.ts.map +1 -0
- package/dist/types/src/hooks/index.d.ts +1 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useActionHandler.d.ts +4 -0
- package/dist/types/src/hooks/useActionHandler.d.ts.map +1 -0
- package/dist/types/src/hooks/useTextEditor.d.ts +1 -2
- package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
- package/dist/types/src/styles/theme.d.ts.map +1 -1
- package/dist/types/src/types.d.ts +0 -5
- package/dist/types/src/types.d.ts.map +1 -1
- package/dist/types/src/util/cursor.d.ts.map +1 -1
- package/dist/types/src/util/debug.d.ts.map +1 -1
- package/dist/types/src/util/dom.d.ts.map +1 -1
- package/dist/types/src/util/facet.d.ts.map +1 -1
- package/dist/types/src/util/react.d.ts +1 -6
- package/dist/types/src/util/react.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +27 -37
- package/src/InputMode.stories.tsx +124 -0
- package/src/TextEditor.stories.tsx +856 -0
- package/src/components/EditorToolbar/EditorToolbar.tsx +34 -33
- package/src/components/EditorToolbar/blocks.ts +6 -27
- package/src/components/EditorToolbar/comment.ts +4 -11
- package/src/components/EditorToolbar/formatting.ts +7 -34
- package/src/components/EditorToolbar/headings.ts +8 -9
- package/src/components/EditorToolbar/lists.ts +7 -26
- package/src/components/EditorToolbar/util.ts +17 -17
- package/src/components/EditorToolbar/{view-mode.ts → viewMode.ts} +8 -9
- package/src/defaults.ts +3 -5
- package/src/extensions/automerge/automerge.stories.tsx +17 -11
- package/src/extensions/automerge/automerge.test.tsx +4 -4
- package/src/extensions/automerge/automerge.ts +2 -2
- package/src/extensions/automerge/defs.ts +2 -1
- package/src/extensions/automerge/sync.ts +4 -4
- package/src/extensions/automerge/update-automerge.ts +1 -1
- package/src/extensions/automerge/update-codemirror.ts +4 -3
- package/src/extensions/command/command.ts +27 -9
- package/src/extensions/command/hint.ts +30 -33
- package/src/extensions/command/index.ts +0 -1
- package/src/extensions/command/menu.ts +8 -11
- package/src/extensions/command/preview.ts +79 -0
- package/src/extensions/command/state.ts +61 -41
- package/src/extensions/comments.ts +9 -9
- package/src/extensions/folding.tsx +1 -1
- package/src/extensions/index.ts +0 -1
- package/src/extensions/markdown/changes.ts +2 -3
- package/src/extensions/markdown/decorate.ts +10 -12
- package/src/extensions/markdown/formatting.ts +6 -6
- package/src/extensions/markdown/image.ts +11 -12
- package/src/extensions/markdown/index.ts +0 -1
- package/src/extensions/markdown/link.ts +24 -33
- package/src/extensions/markdown/styles.ts +2 -2
- package/src/extensions/modes.ts +6 -5
- package/src/fragments.ts +19 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useActionHandler.ts +12 -0
- package/src/hooks/useTextEditor.ts +3 -4
- package/src/styles/theme.ts +0 -3
- package/src/types.ts +0 -7
- package/src/util/react.tsx +2 -20
- package/dist/lib/browser/testing/index.mjs +0 -67
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/node/testing/index.cjs +0 -101
- package/dist/lib/node/testing/index.cjs.map +0 -7
- package/dist/lib/node-esm/testing/index.mjs +0 -69
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
- package/dist/types/src/components/EditorToolbar/EditorToolbar.stories.d.ts.map +0 -1
- package/dist/types/src/components/EditorToolbar/image.d.ts +0 -16
- package/dist/types/src/components/EditorToolbar/image.d.ts.map +0 -1
- package/dist/types/src/components/EditorToolbar/search.d.ts +0 -17
- package/dist/types/src/components/EditorToolbar/search.d.ts.map +0 -1
- package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +0 -1
- package/dist/types/src/extensions/command/action.d.ts +0 -17
- package/dist/types/src/extensions/command/action.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/outliner.d.ts +0 -12
- package/dist/types/src/extensions/markdown/outliner.d.ts.map +0 -1
- package/dist/types/src/extensions/preview/index.d.ts +0 -2
- package/dist/types/src/extensions/preview/index.d.ts.map +0 -1
- package/dist/types/src/extensions/preview/preview.d.ts +0 -39
- package/dist/types/src/extensions/preview/preview.d.ts.map +0 -1
- package/dist/types/src/stories/TextEditorBasic.stories.d.ts.map +0 -1
- package/dist/types/src/stories/TextEditorComments.stories.d.ts +0 -13
- package/dist/types/src/stories/TextEditorComments.stories.d.ts.map +0 -1
- package/dist/types/src/stories/TextEditorPreview.stories.d.ts +0 -13
- package/dist/types/src/stories/TextEditorPreview.stories.d.ts.map +0 -1
- package/dist/types/src/stories/TextEditorSpecial.stories.d.ts +0 -19
- package/dist/types/src/stories/TextEditorSpecial.stories.d.ts.map +0 -1
- package/dist/types/src/stories/story-utils.d.ts +0 -53
- package/dist/types/src/stories/story-utils.d.ts.map +0 -1
- package/dist/types/src/testing/RefPopover.d.ts +0 -21
- package/dist/types/src/testing/RefPopover.d.ts.map +0 -1
- package/dist/types/src/testing/index.d.ts +0 -2
- package/dist/types/src/testing/index.d.ts.map +0 -1
- package/src/components/EditorToolbar/EditorToolbar.stories.tsx +0 -90
- package/src/components/EditorToolbar/image.ts +0 -16
- package/src/components/EditorToolbar/search.ts +0 -19
- package/src/extensions/command/action.ts +0 -49
- package/src/extensions/markdown/outliner.ts +0 -235
- package/src/extensions/preview/index.ts +0 -5
- package/src/extensions/preview/preview.ts +0 -271
- package/src/stories/TextEditorBasic.stories.tsx +0 -333
- package/src/stories/TextEditorComments.stories.tsx +0 -99
- package/src/stories/TextEditorPreview.stories.tsx +0 -239
- package/src/stories/TextEditorSpecial.stories.tsx +0 -107
- package/src/stories/story-utils.tsx +0 -327
- package/src/testing/RefPopover.tsx +0 -74
- package/src/testing/index.ts +0 -5
@@ -15,7 +15,6 @@ import { image } from './image';
|
|
15
15
|
import { formattingStyles, bulletListIndentationWidth, orderedListIndentationWidth } from './styles';
|
16
16
|
import { table } from './table';
|
17
17
|
import { theme, type HeadingLevel } from '../../styles';
|
18
|
-
import { type RenderCallback } from '../../types';
|
19
18
|
import { wrapWithCatch } from '../../util';
|
20
19
|
|
21
20
|
/**
|
@@ -46,7 +45,7 @@ class HorizontalRuleWidget extends WidgetType {
|
|
46
45
|
class LinkButton extends WidgetType {
|
47
46
|
constructor(
|
48
47
|
private readonly url: string,
|
49
|
-
private readonly render:
|
48
|
+
private readonly render: (el: HTMLElement, url: string) => void,
|
50
49
|
) {
|
51
50
|
super();
|
52
51
|
}
|
@@ -58,7 +57,7 @@ class LinkButton extends WidgetType {
|
|
58
57
|
// TODO(burdon): Create icon and link directly without react?
|
59
58
|
override toDOM(view: EditorView) {
|
60
59
|
const el = document.createElement('span');
|
61
|
-
this.render(el,
|
60
|
+
this.render(el, this.url);
|
62
61
|
return el;
|
63
62
|
}
|
64
63
|
}
|
@@ -129,10 +128,10 @@ class TextWidget extends WidgetType {
|
|
129
128
|
}
|
130
129
|
|
131
130
|
const hide = Decoration.replace({});
|
132
|
-
const blockQuote = Decoration.line({ class: 'cm-blockquote' });
|
133
|
-
const fencedCodeLine = Decoration.line({ class: 'cm-code cm-codeblock-line' });
|
134
|
-
const fencedCodeLineFirst = Decoration.line({ class: mx('cm-code cm-codeblock-line', 'cm-codeblock-
|
135
|
-
const fencedCodeLineLast = Decoration.line({ class: mx('cm-code cm-codeblock-line', 'cm-codeblock-
|
131
|
+
const blockQuote = Decoration.line({ class: mx('cm-blockquote') });
|
132
|
+
const fencedCodeLine = Decoration.line({ class: mx('cm-code cm-codeblock-line') });
|
133
|
+
const fencedCodeLineFirst = Decoration.line({ class: mx('cm-code cm-codeblock-line', 'cm-codeblock-first') });
|
134
|
+
const fencedCodeLineLast = Decoration.line({ class: mx('cm-code cm-codeblock-line', 'cm-codeblock-last') });
|
136
135
|
const commentBlockLine = fencedCodeLine;
|
137
136
|
const commentBlockLineFirst = fencedCodeLineFirst;
|
138
137
|
const commentBlockLineLast = fencedCodeLineLast;
|
@@ -277,7 +276,7 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
277
276
|
// Set indentation.
|
278
277
|
const list = getCurrentListLevel();
|
279
278
|
const width = list.type === 'OrderedList' ? orderedListIndentationWidth : bulletListIndentationWidth;
|
280
|
-
const offset = (
|
279
|
+
const offset = ((list.level ?? 0) + 1) * width;
|
281
280
|
if (node.from === line.to - 1) {
|
282
281
|
// Abort if only the hyphen is typed.
|
283
282
|
return false;
|
@@ -285,6 +284,7 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
285
284
|
|
286
285
|
// Add line decoration for the continuation indent.
|
287
286
|
// TODO(burdon): Bug if indentation is more than one indentation unit (e.g., 4 spaces) from the previous line.
|
287
|
+
|
288
288
|
deco.add(
|
289
289
|
line.from,
|
290
290
|
line.from,
|
@@ -405,7 +405,7 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
405
405
|
}
|
406
406
|
|
407
407
|
const first = block.from <= node.from;
|
408
|
-
const last = block.to >= node.to &&
|
408
|
+
const last = block.to >= node.to && /^(\s>)*```$/.test(state.doc.sliceString(block.from, block.to));
|
409
409
|
deco.add(block.from, block.from, first ? fencedCodeLineFirst : last ? fencedCodeLineLast : fencedCodeLine);
|
410
410
|
|
411
411
|
const editing = editingRange(state, node, focus);
|
@@ -519,9 +519,7 @@ export interface DecorateOptions {
|
|
519
519
|
*/
|
520
520
|
selectionChangeDelay?: number;
|
521
521
|
numberedHeadings?: { from: number; to?: number };
|
522
|
-
renderLinkButton?:
|
523
|
-
// TODO(burdon): Additional padding for each line.
|
524
|
-
listPaddingLeft?: number;
|
522
|
+
renderLinkButton?: (el: Element, url: string) => void;
|
525
523
|
}
|
526
524
|
|
527
525
|
export const decorateMarkdown = (options: DecorateOptions = {}) => {
|
@@ -5,19 +5,19 @@
|
|
5
5
|
import { snippet } from '@codemirror/autocomplete';
|
6
6
|
import { syntaxTree } from '@codemirror/language';
|
7
7
|
import {
|
8
|
-
type ChangeSpec,
|
9
|
-
EditorSelection,
|
10
8
|
type Extension,
|
11
|
-
type EditorState,
|
12
|
-
type Line,
|
13
9
|
type StateCommand,
|
10
|
+
type EditorState,
|
11
|
+
type ChangeSpec,
|
14
12
|
type Text,
|
13
|
+
EditorSelection,
|
14
|
+
type Line,
|
15
15
|
} from '@codemirror/state';
|
16
16
|
import { EditorView, keymap } from '@codemirror/view';
|
17
17
|
import { type SyntaxNodeRef, type SyntaxNode } from '@lezer/common';
|
18
18
|
import { useMemo } from 'react';
|
19
19
|
|
20
|
-
import { type
|
20
|
+
import { type ReactiveObject } from '@dxos/live-object';
|
21
21
|
|
22
22
|
import { type EditorToolbarState } from '../../components';
|
23
23
|
|
@@ -1250,7 +1250,7 @@ export const getFormatting = (state: EditorState): Formatting => {
|
|
1250
1250
|
/**
|
1251
1251
|
* Hook provides an extension to compute the current formatting state.
|
1252
1252
|
*/
|
1253
|
-
export const useFormattingState = (state:
|
1253
|
+
export const useFormattingState = (state: ReactiveObject<EditorToolbarState>): Extension => {
|
1254
1254
|
return useMemo(
|
1255
1255
|
() =>
|
1256
1256
|
EditorView.updateListener.of((update) => {
|
@@ -51,6 +51,16 @@ export const image = (_options: ImageOptions = {}): Extension => {
|
|
51
51
|
];
|
52
52
|
};
|
53
53
|
|
54
|
+
const preloaded = new Set<string>();
|
55
|
+
|
56
|
+
const preloadImage = (url: string) => {
|
57
|
+
if (!preloaded.has(url)) {
|
58
|
+
const img = document.createElement('img');
|
59
|
+
img.src = url;
|
60
|
+
preloaded.add(url);
|
61
|
+
}
|
62
|
+
};
|
63
|
+
|
54
64
|
const buildDecorations = (from: number, to: number, state: EditorState) => {
|
55
65
|
const decorations: Range<Decoration>[] = [];
|
56
66
|
const cursor = state.selection.main.head;
|
@@ -84,23 +94,13 @@ const buildDecorations = (from: number, to: number, state: EditorState) => {
|
|
84
94
|
return decorations;
|
85
95
|
};
|
86
96
|
|
87
|
-
const preloaded = new Set<string>();
|
88
|
-
|
89
|
-
const preloadImage = (url: string) => {
|
90
|
-
if (!preloaded.has(url)) {
|
91
|
-
const img = document.createElement('img');
|
92
|
-
img.src = url;
|
93
|
-
preloaded.add(url);
|
94
|
-
}
|
95
|
-
};
|
96
|
-
|
97
97
|
class ImageWidget extends WidgetType {
|
98
98
|
constructor(readonly _url: string) {
|
99
99
|
super();
|
100
100
|
}
|
101
101
|
|
102
102
|
override eq(other: this) {
|
103
|
-
return this._url === other._url;
|
103
|
+
return this._url === (other as any as ImageWidget)._url;
|
104
104
|
}
|
105
105
|
|
106
106
|
override toDOM(view: EditorView) {
|
@@ -113,7 +113,6 @@ class ImageWidget extends WidgetType {
|
|
113
113
|
} else {
|
114
114
|
img.classList.add('cm-loaded-image');
|
115
115
|
}
|
116
|
-
|
117
116
|
return img;
|
118
117
|
}
|
119
118
|
}
|
@@ -9,39 +9,30 @@ import { type SyntaxNode } from '@lezer/common';
|
|
9
9
|
|
10
10
|
import { tooltipContent } from '@dxos/react-ui-theme';
|
11
11
|
|
12
|
-
|
12
|
+
export const linkTooltip = (render: (el: HTMLElement, url: string) => void) => {
|
13
|
+
return hoverTooltip((view, pos, side) => {
|
14
|
+
const syntax = syntaxTree(view.state).resolveInner(pos, side);
|
15
|
+
let link = null;
|
16
|
+
for (let i = 0, node: SyntaxNode | null = syntax; !link && node && i < 5; node = node.parent, i++) {
|
17
|
+
link = node.name === 'Link' ? node : null;
|
18
|
+
}
|
13
19
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
let link = null;
|
19
|
-
for (let i = 0, node: SyntaxNode | null = syntax; !link && node && i < 5; node = node.parent, i++) {
|
20
|
-
link = node.name === 'Link' ? node : null;
|
21
|
-
}
|
20
|
+
const url = link && link.getChild('URL');
|
21
|
+
if (!url || !link) {
|
22
|
+
return null;
|
23
|
+
}
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
el.className = tooltipContent({});
|
37
|
-
renderTooltip(el, { url: urlText }, view);
|
38
|
-
return { dom: el, offset: { x: 0, y: 4 } };
|
39
|
-
},
|
40
|
-
};
|
41
|
-
},
|
42
|
-
{
|
43
|
-
// NOTE: 0 = default of 300ms.
|
44
|
-
hoverTime: 1,
|
45
|
-
},
|
46
|
-
);
|
25
|
+
const urlText = view.state.sliceDoc(url.from, url.to);
|
26
|
+
return {
|
27
|
+
pos: link.from,
|
28
|
+
end: link.to,
|
29
|
+
above: true,
|
30
|
+
create: () => {
|
31
|
+
const el = document.createElement('div');
|
32
|
+
el.className = tooltipContent({}, 'pli-2 plb-1');
|
33
|
+
render(el, urlText);
|
34
|
+
return { dom: el, offset: { x: 0, y: 4 } };
|
35
|
+
},
|
36
|
+
};
|
37
|
+
});
|
47
38
|
};
|
@@ -59,11 +59,11 @@ export const formattingStyles = EditorView.theme({
|
|
59
59
|
background: 'var(--dx-cmCodeblock)',
|
60
60
|
paddingInline: '1rem !important',
|
61
61
|
},
|
62
|
-
'& .cm-codeblock-
|
62
|
+
'& .cm-codeblock-first': {
|
63
63
|
borderTopLeftRadius: '.25rem',
|
64
64
|
borderTopRightRadius: '.25rem',
|
65
65
|
},
|
66
|
-
'& .cm-codeblock-
|
66
|
+
'& .cm-codeblock-last': {
|
67
67
|
borderBottomLeftRadius: '.25rem',
|
68
68
|
borderBottomRightRadius: '.25rem',
|
69
69
|
},
|
package/src/extensions/modes.ts
CHANGED
@@ -6,17 +6,18 @@ import { type Extension } from '@codemirror/state';
|
|
6
6
|
import { keymap } from '@codemirror/view';
|
7
7
|
import { vim } from '@replit/codemirror-vim';
|
8
8
|
import { vscodeKeymap } from '@replit/codemirror-vscode-keymap';
|
9
|
-
|
9
|
+
|
10
|
+
import { S } from '@dxos/echo-schema';
|
10
11
|
|
11
12
|
import { singleValueFacet } from '../util';
|
12
13
|
|
13
14
|
export const EditorViewModes = ['preview', 'readonly', 'source'] as const;
|
14
|
-
export const EditorViewMode =
|
15
|
-
export type EditorViewMode =
|
15
|
+
export const EditorViewMode = S.Union(...EditorViewModes.map((mode) => S.Literal(mode)));
|
16
|
+
export type EditorViewMode = S.Schema.Type<typeof EditorViewMode>;
|
16
17
|
|
17
18
|
export const EditorInputModes = ['default', 'vim', 'vscode'] as const;
|
18
|
-
export const EditorInputMode =
|
19
|
-
export type EditorInputMode =
|
19
|
+
export const EditorInputMode = S.Union(...EditorInputModes.map((mode) => S.Literal(mode)));
|
20
|
+
export type EditorInputMode = S.Schema.Type<typeof EditorInputMode>;
|
20
21
|
|
21
22
|
export type EditorInputConfig = {
|
22
23
|
type?: string;
|
package/src/fragments.ts
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
//
|
2
|
+
// Copyright 2025 DXOS.org
|
3
|
+
//
|
4
|
+
|
5
|
+
import { mx } from '@dxos/react-ui-theme';
|
6
|
+
|
7
|
+
// TODO(burdon): Move this to a common plugin.
|
8
|
+
|
9
|
+
export const stackItemContentEditorClassNames = (role?: string) =>
|
10
|
+
mx(
|
11
|
+
'attention-surface dx-focus-ring-inset data-[toolbar=disabled]:pbs-2',
|
12
|
+
role === 'section' ? '[&_.cm-scroller]:overflow-hidden [&_.cm-scroller]:min-bs-24' : 'min-bs-0',
|
13
|
+
);
|
14
|
+
|
15
|
+
export const stackItemContentToolbarClassNames = (role?: string) =>
|
16
|
+
mx(
|
17
|
+
'attention-surface is-full border-be !border-separator',
|
18
|
+
role === 'section' && 'sticky block-start-0 z-[1] -mbe-px min-is-0',
|
19
|
+
);
|
package/src/hooks/index.ts
CHANGED
@@ -0,0 +1,12 @@
|
|
1
|
+
//
|
2
|
+
// Copyright 2024 DXOS.org
|
3
|
+
//
|
4
|
+
|
5
|
+
import { type EditorView } from '@codemirror/view';
|
6
|
+
import { useCallback } from 'react';
|
7
|
+
|
8
|
+
import { type EditorAction, processEditorPayload } from '../extensions';
|
9
|
+
|
10
|
+
export const useActionHandler = (view?: EditorView | null) => {
|
11
|
+
return useCallback((action: EditorAction) => view && processEditorPayload(view, action.properties), [view]);
|
12
|
+
};
|
@@ -2,7 +2,7 @@
|
|
2
2
|
// Copyright 2024 DXOS.org
|
3
3
|
//
|
4
4
|
|
5
|
-
import { EditorState, type EditorStateConfig
|
5
|
+
import { EditorState, type EditorStateConfig } from '@codemirror/state';
|
6
6
|
import { EditorView } from '@codemirror/view';
|
7
7
|
import { useFocusableGroup, type TabsterTypes } from '@fluentui/react-tabster';
|
8
8
|
import {
|
@@ -43,7 +43,6 @@ export type CursorInfo = {
|
|
43
43
|
|
44
44
|
export type UseTextEditorProps = Pick<EditorStateConfig, 'extensions'> & {
|
45
45
|
id?: string;
|
46
|
-
doc?: Text;
|
47
46
|
initialValue?: string;
|
48
47
|
className?: string;
|
49
48
|
autoFocus?: boolean;
|
@@ -62,7 +61,7 @@ export const useTextEditor = (
|
|
62
61
|
props: MaybeProvider<UseTextEditorProps> = {},
|
63
62
|
deps: DependencyList = [],
|
64
63
|
): UseTextEditor => {
|
65
|
-
const { id,
|
64
|
+
const { id, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } =
|
66
65
|
useMemo<UseTextEditorProps>(() => getProviderValue(props), deps ?? []);
|
67
66
|
|
68
67
|
// NOTE: Increments by 2 in strict mode.
|
@@ -88,7 +87,7 @@ export const useTextEditor = (
|
|
88
87
|
|
89
88
|
// https://codemirror.net/docs/ref/#state.EditorStateConfig
|
90
89
|
const state = EditorState.create({
|
91
|
-
doc:
|
90
|
+
doc: initialValue,
|
92
91
|
// selection: initialSelection,
|
93
92
|
extensions: [
|
94
93
|
id && documentId.of(id),
|
package/src/styles/theme.ts
CHANGED
@@ -119,9 +119,6 @@ export const defaultTheme: ThemeStyles = {
|
|
119
119
|
'.cm-selectionBackground': {
|
120
120
|
background: 'var(--dx-cmSelection)',
|
121
121
|
},
|
122
|
-
'&.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground': {
|
123
|
-
background: 'var(--dx-cmFocusedSelection)',
|
124
|
-
},
|
125
122
|
|
126
123
|
/**
|
127
124
|
* Search.
|
package/src/types.ts
CHANGED
@@ -2,8 +2,6 @@
|
|
2
2
|
// Copyright 2024 DXOS.org
|
3
3
|
//
|
4
4
|
|
5
|
-
import { type EditorView } from '@codemirror/view';
|
6
|
-
|
7
5
|
// Runtime data structure.
|
8
6
|
export type Range = {
|
9
7
|
from: number;
|
@@ -16,8 +14,3 @@ export type Comment = {
|
|
16
14
|
id: string;
|
17
15
|
cursor?: string;
|
18
16
|
};
|
19
|
-
|
20
|
-
/**
|
21
|
-
* Callback that renders into a DOM element within the editor.
|
22
|
-
*/
|
23
|
-
export type RenderCallback<Props extends object> = (el: HTMLElement, props: Props, view: EditorView) => void;
|
package/src/util/react.tsx
CHANGED
@@ -2,14 +2,12 @@
|
|
2
2
|
// Copyright 2024 DXOS.org
|
3
3
|
//
|
4
4
|
|
5
|
-
import React, { type
|
5
|
+
import React, { type ReactNode } from 'react';
|
6
6
|
import { createRoot } from 'react-dom/client';
|
7
7
|
|
8
|
-
import { ThemeProvider
|
8
|
+
import { ThemeProvider } from '@dxos/react-ui';
|
9
9
|
import { defaultTx } from '@dxos/react-ui-theme';
|
10
10
|
|
11
|
-
import { type RenderCallback } from '../types';
|
12
|
-
|
13
11
|
// TODO(burdon): Factor out.
|
14
12
|
|
15
13
|
export type ElementOptions = {
|
@@ -34,19 +32,3 @@ export const renderRoot = <T extends Element>(root: T, node: ReactNode): T => {
|
|
34
32
|
createRoot(root).render(<ThemeProvider tx={defaultTx}>{node}</ThemeProvider>);
|
35
33
|
return root;
|
36
34
|
};
|
37
|
-
|
38
|
-
/**
|
39
|
-
* Utility to create a renderer for a React component.
|
40
|
-
*/
|
41
|
-
export const createRenderer =
|
42
|
-
<Props extends object>(Component: FC<Props>): RenderCallback<Props> =>
|
43
|
-
(el, props) => {
|
44
|
-
renderRoot(
|
45
|
-
el,
|
46
|
-
<ThemeProvider tx={defaultTx}>
|
47
|
-
<Tooltip.Provider>
|
48
|
-
<Component {...props} />
|
49
|
-
</Tooltip.Provider>
|
50
|
-
</ThemeProvider>,
|
51
|
-
);
|
52
|
-
};
|
@@ -1,67 +0,0 @@
|
|
1
|
-
// packages/ui/react-ui-editor/src/testing/RefPopover.tsx
|
2
|
-
import { createContext } from "@radix-ui/react-context";
|
3
|
-
import React, { useRef, useState, useEffect, useCallback } from "react";
|
4
|
-
import { addEventListener } from "@dxos/async";
|
5
|
-
import { Popover } from "@dxos/react-ui";
|
6
|
-
var customEventOptions = {
|
7
|
-
capture: true,
|
8
|
-
passive: false
|
9
|
-
};
|
10
|
-
var REF_POPOVER = "RefPopover";
|
11
|
-
var [RefPopoverContextProvider, useRefPopover] = createContext(REF_POPOVER, {});
|
12
|
-
var RefPopoverProvider = ({ children, onLookup }) => {
|
13
|
-
const trigger = useRef(null);
|
14
|
-
const [value, setValue] = useState({});
|
15
|
-
const [rootRef, setRootRef] = useState(null);
|
16
|
-
const [open, setOpen] = useState(false);
|
17
|
-
const handleDxRefTagActivate = useCallback((event) => {
|
18
|
-
const { ref, label, trigger: dxTrigger } = event;
|
19
|
-
setValue((value2) => ({
|
20
|
-
...value2,
|
21
|
-
link: {
|
22
|
-
label,
|
23
|
-
ref
|
24
|
-
},
|
25
|
-
pending: true
|
26
|
-
}));
|
27
|
-
trigger.current = dxTrigger;
|
28
|
-
queueMicrotask(() => setOpen(true));
|
29
|
-
void onLookup?.({
|
30
|
-
label,
|
31
|
-
ref
|
32
|
-
}).then((target) => setValue((value2) => ({
|
33
|
-
...value2,
|
34
|
-
target: target ?? void 0,
|
35
|
-
pending: false
|
36
|
-
})));
|
37
|
-
}, [
|
38
|
-
onLookup
|
39
|
-
]);
|
40
|
-
useEffect(() => {
|
41
|
-
return rootRef ? addEventListener(rootRef, "dx-ref-tag-activate", handleDxRefTagActivate, customEventOptions) : void 0;
|
42
|
-
}, [
|
43
|
-
rootRef
|
44
|
-
]);
|
45
|
-
return /* @__PURE__ */ React.createElement(RefPopoverContextProvider, {
|
46
|
-
pending: value.pending,
|
47
|
-
link: value.link,
|
48
|
-
target: value.target
|
49
|
-
}, /* @__PURE__ */ React.createElement(Popover.Root, {
|
50
|
-
open,
|
51
|
-
onOpenChange: setOpen
|
52
|
-
}, /* @__PURE__ */ React.createElement(Popover.VirtualTrigger, {
|
53
|
-
virtualRef: trigger
|
54
|
-
}), /* @__PURE__ */ React.createElement("div", {
|
55
|
-
role: "none",
|
56
|
-
className: "contents",
|
57
|
-
ref: setRootRef
|
58
|
-
}, children)));
|
59
|
-
};
|
60
|
-
var RefPopover = {
|
61
|
-
Provider: RefPopoverProvider
|
62
|
-
};
|
63
|
-
export {
|
64
|
-
RefPopover,
|
65
|
-
useRefPopover
|
66
|
-
};
|
67
|
-
//# sourceMappingURL=index.mjs.map
|
@@ -1,7 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"version": 3,
|
3
|
-
"sources": ["../../../../src/testing/RefPopover.tsx"],
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, useRef, useState, useEffect, useCallback, type RefObject } from 'react';\n\nimport { addEventListener } from '@dxos/async';\nimport { type DxRefTag, type DxRefTagActivate } from '@dxos/lit-ui';\nimport { Popover } from '@dxos/react-ui';\n\nimport { type PreviewLinkRef, type PreviewLinkTarget, type PreviewLookup } from '../extensions';\n\nconst customEventOptions = { capture: true, passive: false };\n\n// Create a context for the dxn value.\ntype RefPopoverValue = Partial<{ link: PreviewLinkRef; target: PreviewLinkTarget; pending: boolean }>;\nconst REF_POPOVER = 'RefPopover';\nconst [RefPopoverContextProvider, useRefPopover] = createContext<RefPopoverValue>(REF_POPOVER, {});\n\ntype RefPopoverProviderProps = PropsWithChildren<{ onLookup?: PreviewLookup }>;\n\nconst RefPopoverProvider = ({ children, onLookup }: RefPopoverProviderProps) => {\n const trigger = useRef<DxRefTag | null>(null);\n const [value, setValue] = useState<RefPopoverValue>({});\n const [rootRef, setRootRef] = useState<HTMLDivElement | null>(null);\n const [open, setOpen] = useState(false);\n\n const handleDxRefTagActivate = useCallback(\n (event: DxRefTagActivate) => {\n const { ref, label, trigger: dxTrigger } = event;\n setValue((value) => ({\n ...value,\n link: { label, ref },\n pending: true,\n }));\n trigger.current = dxTrigger;\n queueMicrotask(() => setOpen(true));\n void onLookup?.({ label, ref }).then((target) =>\n setValue((value) => ({\n ...value,\n target: target ?? undefined,\n pending: false,\n })),\n );\n },\n [onLookup],\n );\n\n useEffect(() => {\n return rootRef\n ? addEventListener(rootRef, 'dx-ref-tag-activate', handleDxRefTagActivate, customEventOptions)\n : undefined;\n }, [rootRef]);\n\n return (\n <RefPopoverContextProvider pending={value.pending} link={value.link} target={value.target}>\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.VirtualTrigger virtualRef={trigger as unknown as RefObject<HTMLButtonElement>} />\n <div role='none' className='contents' ref={setRootRef}>\n {children}\n </div>\n </Popover.Root>\n </RefPopoverContextProvider>\n );\n};\n\nexport const RefPopover = {\n Provider: RefPopoverProvider,\n};\n\nexport { useRefPopover };\n\nexport type { RefPopoverProviderProps, RefPopoverValue };\n"],
|
5
|
-
"mappings": ";AAIA,SAASA,qBAAqB;AAC9B,OAAOC,SAAiCC,QAAQC,UAAUC,WAAWC,mBAAmC;AAExG,SAASC,wBAAwB;AAEjC,SAASC,eAAe;AAIxB,IAAMC,qBAAqB;EAAEC,SAAS;EAAMC,SAAS;AAAM;AAI3D,IAAMC,cAAc;AACpB,IAAM,CAACC,2BAA2BC,aAAAA,IAAiBC,cAA+BH,aAAa,CAAC,CAAA;AAIhG,IAAMI,qBAAqB,CAAC,EAAEC,UAAUC,SAAQ,MAA2B;AACzE,QAAMC,UAAUC,OAAwB,IAAA;AACxC,QAAM,CAACC,OAAOC,QAAAA,IAAYC,SAA0B,CAAC,CAAA;AACrD,QAAM,CAACC,SAASC,UAAAA,IAAcF,SAAgC,IAAA;AAC9D,QAAM,CAACG,MAAMC,OAAAA,IAAWJ,SAAS,KAAA;AAEjC,QAAMK,yBAAyBC,YAC7B,CAACC,UAAAA;AACC,UAAM,EAAEC,KAAKC,OAAOb,SAASc,UAAS,IAAKH;AAC3CR,aAAS,CAACD,YAAW;MACnB,GAAGA;MACHa,MAAM;QAAEF;QAAOD;MAAI;MACnBI,SAAS;IACX,EAAA;AACAhB,YAAQiB,UAAUH;AAClBI,mBAAe,MAAMV,QAAQ,IAAA,CAAA;AAC7B,SAAKT,WAAW;MAAEc;MAAOD;IAAI,CAAA,EAAGO,KAAK,CAACC,WACpCjB,SAAS,CAACD,YAAW;MACnB,GAAGA;MACHkB,QAAQA,UAAUC;MAClBL,SAAS;IACX,EAAA,CAAA;EAEJ,GACA;IAACjB;GAAS;AAGZuB,YAAU,MAAA;AACR,WAAOjB,UACHkB,iBAAiBlB,SAAS,uBAAuBI,wBAAwBnB,kBAAAA,IACzE+B;EACN,GAAG;IAAChB;GAAQ;AAEZ,SACE,sBAAA,cAACX,2BAAAA;IAA0BsB,SAASd,MAAMc;IAASD,MAAMb,MAAMa;IAAMK,QAAQlB,MAAMkB;KACjF,sBAAA,cAACI,QAAQC,MAAI;IAAClB;IAAYmB,cAAclB;KACtC,sBAAA,cAACgB,QAAQG,gBAAc;IAACC,YAAY5B;MACpC,sBAAA,cAAC6B,OAAAA;IAAIC,MAAK;IAAOC,WAAU;IAAWnB,KAAKN;KACxCR,QAAAA,CAAAA,CAAAA;AAKX;AAEO,IAAMkC,aAAa;EACxBC,UAAUpC;AACZ;",
|
6
|
-
"names": ["createContext", "React", "useRef", "useState", "useEffect", "useCallback", "addEventListener", "Popover", "customEventOptions", "capture", "passive", "REF_POPOVER", "RefPopoverContextProvider", "useRefPopover", "createContext", "RefPopoverProvider", "children", "onLookup", "trigger", "useRef", "value", "setValue", "useState", "rootRef", "setRootRef", "open", "setOpen", "handleDxRefTagActivate", "useCallback", "event", "ref", "label", "dxTrigger", "link", "pending", "current", "queueMicrotask", "then", "target", "undefined", "useEffect", "addEventListener", "Popover", "Root", "onOpenChange", "VirtualTrigger", "virtualRef", "div", "role", "className", "RefPopover", "Provider"]
|
7
|
-
}
|
@@ -1,101 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __create = Object.create;
|
3
|
-
var __defProp = Object.defineProperty;
|
4
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
8
|
-
var __export = (target, all) => {
|
9
|
-
for (var name in all)
|
10
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
11
|
-
};
|
12
|
-
var __copyProps = (to, from, except, desc) => {
|
13
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
14
|
-
for (let key of __getOwnPropNames(from))
|
15
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
16
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
17
|
-
}
|
18
|
-
return to;
|
19
|
-
};
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
21
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
22
|
-
// file that has been converted to a CommonJS file using a Babel-
|
23
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
24
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
25
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
26
|
-
mod
|
27
|
-
));
|
28
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
29
|
-
var testing_exports = {};
|
30
|
-
__export(testing_exports, {
|
31
|
-
RefPopover: () => RefPopover,
|
32
|
-
useRefPopover: () => useRefPopover
|
33
|
-
});
|
34
|
-
module.exports = __toCommonJS(testing_exports);
|
35
|
-
var import_react_context = require("@radix-ui/react-context");
|
36
|
-
var import_react = __toESM(require("react"));
|
37
|
-
var import_async = require("@dxos/async");
|
38
|
-
var import_react_ui = require("@dxos/react-ui");
|
39
|
-
var customEventOptions = {
|
40
|
-
capture: true,
|
41
|
-
passive: false
|
42
|
-
};
|
43
|
-
var REF_POPOVER = "RefPopover";
|
44
|
-
var [RefPopoverContextProvider, useRefPopover] = (0, import_react_context.createContext)(REF_POPOVER, {});
|
45
|
-
var RefPopoverProvider = ({ children, onLookup }) => {
|
46
|
-
const trigger = (0, import_react.useRef)(null);
|
47
|
-
const [value, setValue] = (0, import_react.useState)({});
|
48
|
-
const [rootRef, setRootRef] = (0, import_react.useState)(null);
|
49
|
-
const [open, setOpen] = (0, import_react.useState)(false);
|
50
|
-
const handleDxRefTagActivate = (0, import_react.useCallback)((event) => {
|
51
|
-
const { ref, label, trigger: dxTrigger } = event;
|
52
|
-
setValue((value2) => ({
|
53
|
-
...value2,
|
54
|
-
link: {
|
55
|
-
label,
|
56
|
-
ref
|
57
|
-
},
|
58
|
-
pending: true
|
59
|
-
}));
|
60
|
-
trigger.current = dxTrigger;
|
61
|
-
queueMicrotask(() => setOpen(true));
|
62
|
-
void onLookup?.({
|
63
|
-
label,
|
64
|
-
ref
|
65
|
-
}).then((target) => setValue((value2) => ({
|
66
|
-
...value2,
|
67
|
-
target: target ?? void 0,
|
68
|
-
pending: false
|
69
|
-
})));
|
70
|
-
}, [
|
71
|
-
onLookup
|
72
|
-
]);
|
73
|
-
(0, import_react.useEffect)(() => {
|
74
|
-
return rootRef ? (0, import_async.addEventListener)(rootRef, "dx-ref-tag-activate", handleDxRefTagActivate, customEventOptions) : void 0;
|
75
|
-
}, [
|
76
|
-
rootRef
|
77
|
-
]);
|
78
|
-
return /* @__PURE__ */ import_react.default.createElement(RefPopoverContextProvider, {
|
79
|
-
pending: value.pending,
|
80
|
-
link: value.link,
|
81
|
-
target: value.target
|
82
|
-
}, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Popover.Root, {
|
83
|
-
open,
|
84
|
-
onOpenChange: setOpen
|
85
|
-
}, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Popover.VirtualTrigger, {
|
86
|
-
virtualRef: trigger
|
87
|
-
}), /* @__PURE__ */ import_react.default.createElement("div", {
|
88
|
-
role: "none",
|
89
|
-
className: "contents",
|
90
|
-
ref: setRootRef
|
91
|
-
}, children)));
|
92
|
-
};
|
93
|
-
var RefPopover = {
|
94
|
-
Provider: RefPopoverProvider
|
95
|
-
};
|
96
|
-
// Annotate the CommonJS export names for ESM import in node:
|
97
|
-
0 && (module.exports = {
|
98
|
-
RefPopover,
|
99
|
-
useRefPopover
|
100
|
-
});
|
101
|
-
//# sourceMappingURL=index.cjs.map
|
@@ -1,7 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"version": 3,
|
3
|
-
"sources": ["../../../../src/testing/RefPopover.tsx"],
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, useRef, useState, useEffect, useCallback, type RefObject } from 'react';\n\nimport { addEventListener } from '@dxos/async';\nimport { type DxRefTag, type DxRefTagActivate } from '@dxos/lit-ui';\nimport { Popover } from '@dxos/react-ui';\n\nimport { type PreviewLinkRef, type PreviewLinkTarget, type PreviewLookup } from '../extensions';\n\nconst customEventOptions = { capture: true, passive: false };\n\n// Create a context for the dxn value.\ntype RefPopoverValue = Partial<{ link: PreviewLinkRef; target: PreviewLinkTarget; pending: boolean }>;\nconst REF_POPOVER = 'RefPopover';\nconst [RefPopoverContextProvider, useRefPopover] = createContext<RefPopoverValue>(REF_POPOVER, {});\n\ntype RefPopoverProviderProps = PropsWithChildren<{ onLookup?: PreviewLookup }>;\n\nconst RefPopoverProvider = ({ children, onLookup }: RefPopoverProviderProps) => {\n const trigger = useRef<DxRefTag | null>(null);\n const [value, setValue] = useState<RefPopoverValue>({});\n const [rootRef, setRootRef] = useState<HTMLDivElement | null>(null);\n const [open, setOpen] = useState(false);\n\n const handleDxRefTagActivate = useCallback(\n (event: DxRefTagActivate) => {\n const { ref, label, trigger: dxTrigger } = event;\n setValue((value) => ({\n ...value,\n link: { label, ref },\n pending: true,\n }));\n trigger.current = dxTrigger;\n queueMicrotask(() => setOpen(true));\n void onLookup?.({ label, ref }).then((target) =>\n setValue((value) => ({\n ...value,\n target: target ?? undefined,\n pending: false,\n })),\n );\n },\n [onLookup],\n );\n\n useEffect(() => {\n return rootRef\n ? addEventListener(rootRef, 'dx-ref-tag-activate', handleDxRefTagActivate, customEventOptions)\n : undefined;\n }, [rootRef]);\n\n return (\n <RefPopoverContextProvider pending={value.pending} link={value.link} target={value.target}>\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.VirtualTrigger virtualRef={trigger as unknown as RefObject<HTMLButtonElement>} />\n <div role='none' className='contents' ref={setRootRef}>\n {children}\n </div>\n </Popover.Root>\n </RefPopoverContextProvider>\n );\n};\n\nexport const RefPopover = {\n Provider: RefPopoverProvider,\n};\n\nexport { useRefPopover };\n\nexport type { RefPopoverProviderProps, RefPopoverValue };\n"],
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,2BAA8B;AAC9B,mBAAwG;AAExG,mBAAiC;AAEjC,sBAAwB;AAIxB,IAAMA,qBAAqB;EAAEC,SAAS;EAAMC,SAAS;AAAM;AAI3D,IAAMC,cAAc;AACpB,IAAM,CAACC,2BAA2BC,aAAAA,QAAiBC,oCAA+BH,aAAa,CAAC,CAAA;AAIhG,IAAMI,qBAAqB,CAAC,EAAEC,UAAUC,SAAQ,MAA2B;AACzE,QAAMC,cAAUC,qBAAwB,IAAA;AACxC,QAAM,CAACC,OAAOC,QAAAA,QAAYC,uBAA0B,CAAC,CAAA;AACrD,QAAM,CAACC,SAASC,UAAAA,QAAcF,uBAAgC,IAAA;AAC9D,QAAM,CAACG,MAAMC,OAAAA,QAAWJ,uBAAS,KAAA;AAEjC,QAAMK,6BAAyBC,0BAC7B,CAACC,UAAAA;AACC,UAAM,EAAEC,KAAKC,OAAOb,SAASc,UAAS,IAAKH;AAC3CR,aAAS,CAACD,YAAW;MACnB,GAAGA;MACHa,MAAM;QAAEF;QAAOD;MAAI;MACnBI,SAAS;IACX,EAAA;AACAhB,YAAQiB,UAAUH;AAClBI,mBAAe,MAAMV,QAAQ,IAAA,CAAA;AAC7B,SAAKT,WAAW;MAAEc;MAAOD;IAAI,CAAA,EAAGO,KAAK,CAACC,WACpCjB,SAAS,CAACD,YAAW;MACnB,GAAGA;MACHkB,QAAQA,UAAUC;MAClBL,SAAS;IACX,EAAA,CAAA;EAEJ,GACA;IAACjB;GAAS;AAGZuB,8BAAU,MAAA;AACR,WAAOjB,cACHkB,+BAAiBlB,SAAS,uBAAuBI,wBAAwBnB,kBAAAA,IACzE+B;EACN,GAAG;IAAChB;GAAQ;AAEZ,SACE,6BAAAmB,QAAA,cAAC9B,2BAAAA;IAA0BsB,SAASd,MAAMc;IAASD,MAAMb,MAAMa;IAAMK,QAAQlB,MAAMkB;KACjF,6BAAAI,QAAA,cAACC,wBAAQC,MAAI;IAACnB;IAAYoB,cAAcnB;KACtC,6BAAAgB,QAAA,cAACC,wBAAQG,gBAAc;IAACC,YAAY7B;MACpC,6BAAAwB,QAAA,cAACM,OAAAA;IAAIC,MAAK;IAAOC,WAAU;IAAWpB,KAAKN;KACxCR,QAAAA,CAAAA,CAAAA;AAKX;AAEO,IAAMmC,aAAa;EACxBC,UAAUrC;AACZ;",
|
6
|
-
"names": ["customEventOptions", "capture", "passive", "REF_POPOVER", "RefPopoverContextProvider", "useRefPopover", "createContext", "RefPopoverProvider", "children", "onLookup", "trigger", "useRef", "value", "setValue", "useState", "rootRef", "setRootRef", "open", "setOpen", "handleDxRefTagActivate", "useCallback", "event", "ref", "label", "dxTrigger", "link", "pending", "current", "queueMicrotask", "then", "target", "undefined", "useEffect", "addEventListener", "React", "Popover", "Root", "onOpenChange", "VirtualTrigger", "virtualRef", "div", "role", "className", "RefPopover", "Provider"]
|
7
|
-
}
|