@dxos/react-ui-editor 0.8.4-main.5ad4a44 → 0.8.4-main.66e292d
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 +2979 -2478
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +2979 -2478
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/components/Editor/Editor.d.ts +37 -21
- package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
- package/dist/types/src/components/Editor/Editor.stories.d.ts +20 -0
- package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -0
- package/dist/types/src/components/EditorContent/EditorContent.d.ts +29 -0
- package/dist/types/src/components/EditorContent/EditorContent.d.ts.map +1 -0
- package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts +26 -0
- package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts.map +1 -0
- package/dist/types/src/components/EditorContent/controller.d.ts +10 -0
- package/dist/types/src/components/EditorContent/controller.d.ts.map +1 -0
- package/dist/types/src/components/EditorContent/index.d.ts +3 -0
- package/dist/types/src/components/EditorContent/index.d.ts.map +1 -0
- package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts +36 -0
- package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -0
- package/dist/types/src/components/EditorMenuProvider/index.d.ts +7 -0
- package/dist/types/src/components/EditorMenuProvider/index.d.ts.map +1 -0
- package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts +4 -0
- package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -0
- package/dist/types/src/components/EditorMenuProvider/menu.d.ts +28 -0
- package/dist/types/src/components/EditorMenuProvider/menu.d.ts.map +1 -0
- package/dist/types/src/components/EditorMenuProvider/popover.d.ts +47 -0
- package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -0
- package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts +34 -0
- package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -0
- package/dist/types/src/components/EditorMenuProvider/util.d.ts +8 -0
- package/dist/types/src/components/EditorMenuProvider/util.d.ts.map +1 -0
- package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +16 -0
- package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -0
- package/dist/types/src/components/EditorPreviewProvider/index.d.ts +2 -0
- package/dist/types/src/components/EditorPreviewProvider/index.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +26 -2
- package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/actions.d.ts +39 -0
- package/dist/types/src/components/EditorToolbar/actions.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/blocks.d.ts +3 -3
- package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/formatting.d.ts +3 -3
- package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/headings.d.ts +3 -3
- package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/index.d.ts +2 -1
- package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts +11 -0
- package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/view-mode.d.ts +3 -3
- package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +4 -2
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +17 -0
- package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +1 -0
- package/dist/types/src/extensions/autocomplete/index.d.ts +5 -0
- package/dist/types/src/extensions/autocomplete/index.d.ts.map +1 -0
- package/dist/types/src/extensions/autocomplete/match.d.ts +13 -0
- package/dist/types/src/extensions/autocomplete/match.d.ts.map +1 -0
- package/dist/types/src/extensions/autocomplete/placeholder.d.ts +20 -0
- package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +1 -0
- package/dist/types/src/extensions/autocomplete/typeahead.d.ts +10 -0
- package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +1 -0
- package/dist/types/src/extensions/automerge/automerge.d.ts +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 +1 -1
- package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/sync.d.ts +3 -3
- 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/autoscroll.d.ts +14 -4
- package/dist/types/src/extensions/autoscroll.d.ts.map +1 -1
- package/dist/types/src/extensions/awareness/awareness-provider.d.ts +4 -4
- package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
- package/dist/types/src/extensions/blocks.d.ts +2 -0
- package/dist/types/src/extensions/blocks.d.ts.map +1 -0
- package/dist/types/src/extensions/bookmarks.d.ts +12 -0
- package/dist/types/src/extensions/bookmarks.d.ts.map +1 -0
- package/dist/types/src/extensions/comments.d.ts.map +1 -1
- package/dist/types/src/extensions/factories.d.ts +7 -6
- 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 +8 -3
- package/dist/types/src/extensions/index.d.ts.map +1 -1
- package/dist/types/src/extensions/listener.d.ts +8 -6
- 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/formatting.d.ts +1 -3
- package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
- package/dist/types/src/extensions/modal.d.ts +7 -0
- package/dist/types/src/extensions/modal.d.ts.map +1 -0
- package/dist/types/src/extensions/modes.d.ts +1 -1
- package/dist/types/src/extensions/modes.d.ts.map +1 -1
- package/dist/types/src/extensions/outliner/menu.d.ts +8 -0
- package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -0
- package/dist/types/src/extensions/preview/preview.d.ts +6 -3
- package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
- package/dist/types/src/extensions/replacer.d.ts +21 -0
- package/dist/types/src/extensions/replacer.d.ts.map +1 -0
- package/dist/types/src/extensions/replacer.test.d.ts +2 -0
- package/dist/types/src/extensions/replacer.test.d.ts.map +1 -0
- package/dist/types/src/extensions/scrolling.d.ts +78 -0
- package/dist/types/src/extensions/scrolling.d.ts.map +1 -0
- package/dist/types/src/extensions/state.d.ts +2 -0
- package/dist/types/src/extensions/state.d.ts.map +1 -0
- package/dist/types/src/extensions/submit.d.ts +10 -0
- package/dist/types/src/extensions/submit.d.ts.map +1 -0
- package/dist/types/src/extensions/tab.d.ts +4 -0
- package/dist/types/src/extensions/tab.d.ts.map +1 -0
- package/dist/types/src/extensions/tags/xml-tags.d.ts +41 -16
- package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -1
- package/dist/types/src/hooks/useTextEditor.d.ts +3 -7
- package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
- package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Comments.stories.d.ts +3 -3
- package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Experimental.stories.d.ts +3 -3
- package/dist/types/src/stories/Markdown.stories.d.ts +3 -3
- package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
- package/dist/types/src/stories/{CommandMenu.stories.d.ts → Popover.stories.d.ts} +6 -5
- package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
- package/dist/types/src/stories/Preview.stories.d.ts +4 -3
- package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Tags.stories.d.ts.map +1 -1
- package/dist/types/src/stories/TextEditor.stories.d.ts +3 -4
- package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
- package/dist/types/src/stories/components/EditorStory.d.ts +11 -8
- package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
- package/dist/types/src/stories/components/util.d.ts.map +1 -1
- package/dist/types/src/styles/theme.d.ts.map +1 -1
- package/dist/types/src/util/debug.d.ts +4 -0
- package/dist/types/src/util/debug.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +44 -46
- package/src/components/Editor/Editor.stories.tsx +89 -0
- package/src/components/Editor/Editor.tsx +157 -57
- package/src/components/EditorContent/EditorContent.stories.tsx +70 -0
- package/src/components/EditorContent/EditorContent.tsx +70 -0
- package/src/components/EditorContent/controller.ts +50 -0
- package/src/components/EditorContent/index.ts +6 -0
- package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +233 -0
- package/src/components/EditorMenuProvider/index.ts +11 -0
- package/src/components/EditorMenuProvider/menu-presets.ts +123 -0
- package/src/components/EditorMenuProvider/menu.ts +71 -0
- package/src/components/EditorMenuProvider/popover.ts +287 -0
- package/src/components/EditorMenuProvider/useEditorMenu.ts +175 -0
- package/src/components/EditorMenuProvider/util.ts +31 -0
- package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +82 -0
- package/src/components/EditorPreviewProvider/index.ts +5 -0
- package/src/components/EditorToolbar/EditorToolbar.tsx +101 -92
- package/src/components/EditorToolbar/{lists.ts → actions.ts} +46 -16
- package/src/components/EditorToolbar/blocks.ts +2 -1
- package/src/components/EditorToolbar/formatting.ts +2 -1
- package/src/components/EditorToolbar/headings.ts +8 -5
- package/src/components/EditorToolbar/image.ts +1 -1
- package/src/components/EditorToolbar/index.ts +3 -7
- package/src/components/EditorToolbar/search.ts +1 -1
- package/src/components/EditorToolbar/useEditorToolbar.ts +20 -0
- package/src/components/EditorToolbar/view-mode.ts +2 -1
- package/src/components/index.ts +8 -2
- package/src/extensions/{autocomplete.ts → autocomplete/autocomplete.ts} +8 -76
- package/src/extensions/autocomplete/index.ts +8 -0
- package/src/extensions/autocomplete/match.ts +46 -0
- package/src/extensions/{command-menu → autocomplete}/placeholder.ts +21 -17
- package/src/extensions/{command-dialog → autocomplete}/typeahead.ts +6 -48
- package/src/extensions/automerge/automerge.stories.tsx +4 -3
- package/src/extensions/automerge/automerge.ts +28 -9
- package/src/extensions/automerge/cursor.ts +1 -1
- package/src/extensions/automerge/sync.ts +8 -4
- package/src/extensions/automerge/update-automerge.ts +1 -1
- package/src/extensions/autoscroll.ts +75 -69
- package/src/extensions/awareness/awareness-provider.ts +12 -12
- package/src/extensions/blocks.ts +131 -0
- package/src/extensions/bookmarks.ts +75 -0
- package/src/extensions/comments.ts +2 -1
- package/src/extensions/factories.ts +22 -24
- package/src/extensions/folding.tsx +1 -2
- package/src/extensions/index.ts +8 -3
- package/src/extensions/listener.ts +14 -20
- package/src/extensions/markdown/bundle.ts +14 -2
- package/src/extensions/markdown/decorate.ts +8 -8
- package/src/extensions/markdown/formatting.ts +8 -10
- package/src/extensions/markdown/highlight.ts +1 -1
- package/src/extensions/markdown/image.ts +2 -2
- package/src/extensions/markdown/table.ts +6 -6
- package/src/extensions/modal.ts +24 -0
- package/src/extensions/modes.ts +2 -2
- package/src/extensions/{floating-menu.ts → outliner/menu.ts} +7 -5
- package/src/extensions/outliner/outliner.test.ts +1 -1
- package/src/extensions/outliner/outliner.ts +3 -3
- package/src/extensions/outliner/tree.test.ts +1 -1
- package/src/extensions/preview/index.ts +1 -1
- package/src/extensions/preview/preview.ts +14 -11
- package/src/extensions/replacer.test.ts +75 -0
- package/src/extensions/replacer.ts +93 -0
- package/src/extensions/scrolling.ts +189 -0
- package/src/extensions/selection.ts +1 -1
- package/src/extensions/state.ts +7 -0
- package/src/extensions/submit.ts +62 -0
- package/src/extensions/tab.ts +29 -0
- package/src/extensions/tags/extended-markdown.test.ts +2 -1
- package/src/extensions/tags/xml-tags.ts +310 -203
- package/src/extensions/typewriter.ts +1 -1
- package/src/hooks/useTextEditor.ts +25 -25
- package/src/stories/CommandDialog.stories.tsx +13 -19
- package/src/stories/Comments.stories.tsx +3 -4
- package/src/stories/EditorToolbar.stories.tsx +8 -8
- package/src/stories/Experimental.stories.tsx +1 -1
- package/src/stories/Markdown.stories.tsx +1 -1
- package/src/stories/Outliner.stories.tsx +15 -15
- package/src/stories/Popover.stories.tsx +162 -0
- package/src/stories/Preview.stories.tsx +41 -37
- package/src/stories/Tags.stories.tsx +19 -5
- package/src/stories/TextEditor.stories.tsx +4 -30
- package/src/stories/components/EditorStory.tsx +31 -20
- package/src/stories/components/util.tsx +40 -8
- package/src/styles/markdown.ts +1 -1
- package/src/styles/theme.ts +2 -1
- package/src/util/debug.ts +5 -0
- package/dist/lib/browser/testing/index.mjs +0 -76
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/node-esm/testing/index.mjs +0 -78
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
- package/dist/types/src/components/CommandMenu/CommandMenu.d.ts +0 -38
- package/dist/types/src/components/CommandMenu/CommandMenu.d.ts.map +0 -1
- package/dist/types/src/components/CommandMenu/index.d.ts +0 -2
- package/dist/types/src/components/CommandMenu/index.d.ts.map +0 -1
- package/dist/types/src/components/EditorToolbar/lists.d.ts +0 -19
- package/dist/types/src/components/EditorToolbar/lists.d.ts.map +0 -1
- package/dist/types/src/components/EditorToolbar/util.d.ts +0 -51
- package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
- package/dist/types/src/extensions/autocomplete.d.ts +0 -26
- package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
- package/dist/types/src/extensions/command-dialog/action.d.ts +0 -17
- package/dist/types/src/extensions/command-dialog/action.d.ts.map +0 -1
- package/dist/types/src/extensions/command-dialog/command-dialog.d.ts +0 -6
- package/dist/types/src/extensions/command-dialog/command-dialog.d.ts.map +0 -1
- package/dist/types/src/extensions/command-dialog/hint.d.ts +0 -19
- package/dist/types/src/extensions/command-dialog/hint.d.ts.map +0 -1
- package/dist/types/src/extensions/command-dialog/index.d.ts +0 -4
- package/dist/types/src/extensions/command-dialog/index.d.ts.map +0 -1
- package/dist/types/src/extensions/command-dialog/state.d.ts +0 -16
- package/dist/types/src/extensions/command-dialog/state.d.ts.map +0 -1
- package/dist/types/src/extensions/command-dialog/typeahead.d.ts +0 -22
- package/dist/types/src/extensions/command-dialog/typeahead.d.ts.map +0 -1
- package/dist/types/src/extensions/command-menu/command-menu.d.ts +0 -20
- package/dist/types/src/extensions/command-menu/command-menu.d.ts.map +0 -1
- package/dist/types/src/extensions/command-menu/index.d.ts +0 -3
- package/dist/types/src/extensions/command-menu/index.d.ts.map +0 -1
- package/dist/types/src/extensions/command-menu/placeholder.d.ts +0 -10
- package/dist/types/src/extensions/command-menu/placeholder.d.ts.map +0 -1
- package/dist/types/src/extensions/command-menu/useCommandMenu.d.ts +0 -24
- package/dist/types/src/extensions/command-menu/useCommandMenu.d.ts.map +0 -1
- package/dist/types/src/extensions/floating-menu.d.ts +0 -7
- package/dist/types/src/extensions/floating-menu.d.ts.map +0 -1
- package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
- package/dist/types/src/testing/PreviewPopover.d.ts +0 -20
- package/dist/types/src/testing/PreviewPopover.d.ts.map +0 -1
- package/dist/types/src/testing/index.d.ts +0 -3
- package/dist/types/src/testing/index.d.ts.map +0 -1
- package/dist/types/src/testing/util.d.ts +0 -3
- package/dist/types/src/testing/util.d.ts.map +0 -1
- package/src/components/CommandMenu/CommandMenu.tsx +0 -348
- package/src/components/CommandMenu/index.ts +0 -5
- package/src/components/EditorToolbar/util.ts +0 -76
- package/src/extensions/command-dialog/action.ts +0 -55
- package/src/extensions/command-dialog/command-dialog.ts +0 -34
- package/src/extensions/command-dialog/hint.ts +0 -103
- package/src/extensions/command-dialog/index.ts +0 -7
- package/src/extensions/command-dialog/state.ts +0 -90
- package/src/extensions/command-menu/command-menu.ts +0 -210
- package/src/extensions/command-menu/index.ts +0 -6
- package/src/extensions/command-menu/useCommandMenu.ts +0 -134
- package/src/stories/CommandMenu.stories.tsx +0 -158
- package/src/testing/PreviewPopover.tsx +0 -78
- package/src/testing/index.ts +0 -6
- package/src/testing/util.ts +0 -7
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
|
-
import React, { useState } from 'react';
|
|
6
|
+
import React, { useEffect, useState } from 'react';
|
|
7
7
|
import { createPortal } from 'react-dom';
|
|
8
8
|
|
|
9
9
|
import { useThemeContext } from '@dxos/react-ui';
|
|
@@ -22,10 +22,22 @@ import {
|
|
|
22
22
|
import { useTextEditor } from '../hooks';
|
|
23
23
|
|
|
24
24
|
const registry = {
|
|
25
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Custom tag: <test/>
|
|
27
|
+
*/
|
|
26
28
|
['test' as const]: {
|
|
27
29
|
block: true,
|
|
28
|
-
Component: () =>
|
|
30
|
+
Component: () => {
|
|
31
|
+
const [count, setCount] = useState(0);
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
const interval = setInterval(() => {
|
|
34
|
+
setCount((prev) => prev + 1);
|
|
35
|
+
}, 1_000);
|
|
36
|
+
return () => clearInterval(interval);
|
|
37
|
+
}, []);
|
|
38
|
+
|
|
39
|
+
return <div className='p-2 border border-separator rounded'>Test {count}</div>;
|
|
40
|
+
},
|
|
29
41
|
},
|
|
30
42
|
} satisfies XmlWidgetRegistry;
|
|
31
43
|
|
|
@@ -36,7 +48,7 @@ const DefaultStory = ({ text }: { text?: string }) => {
|
|
|
36
48
|
initialValue: text,
|
|
37
49
|
extensions: [
|
|
38
50
|
createThemeExtensions({ themeMode }),
|
|
39
|
-
createBasicExtensions({ lineWrapping: true
|
|
51
|
+
createBasicExtensions({ lineWrapping: true }),
|
|
40
52
|
decorateMarkdown(),
|
|
41
53
|
extendedMarkdown({ registry }),
|
|
42
54
|
xmlTags({ registry, setWidgets }),
|
|
@@ -56,13 +68,15 @@ const DefaultStory = ({ text }: { text?: string }) => {
|
|
|
56
68
|
const text = trim`
|
|
57
69
|
# Tags
|
|
58
70
|
|
|
71
|
+
React widget below.
|
|
72
|
+
|
|
59
73
|
<test id="123" />
|
|
60
74
|
|
|
61
75
|
React widget above.
|
|
62
76
|
`;
|
|
63
77
|
|
|
64
78
|
const meta = {
|
|
65
|
-
title: 'ui/react-ui-editor/
|
|
79
|
+
title: 'ui/react-ui-editor/XmlTags',
|
|
66
80
|
render: DefaultStory,
|
|
67
81
|
decorators: [withTheme],
|
|
68
82
|
parameters: {
|
|
@@ -13,7 +13,6 @@ import { withTheme } from '@dxos/react-ui/testing';
|
|
|
13
13
|
import { editorMonospace } from '../defaults';
|
|
14
14
|
import {
|
|
15
15
|
InputModeExtensions,
|
|
16
|
-
autocomplete,
|
|
17
16
|
decorateMarkdown,
|
|
18
17
|
folding,
|
|
19
18
|
image,
|
|
@@ -23,7 +22,7 @@ import {
|
|
|
23
22
|
staticCompletion,
|
|
24
23
|
typeahead,
|
|
25
24
|
} from '../extensions';
|
|
26
|
-
import { str } from '../
|
|
25
|
+
import { str } from '../util';
|
|
27
26
|
|
|
28
27
|
import {
|
|
29
28
|
EditorStory,
|
|
@@ -32,10 +31,8 @@ import {
|
|
|
32
31
|
defaultExtensions,
|
|
33
32
|
global,
|
|
34
33
|
largeWithImages,
|
|
35
|
-
links,
|
|
36
34
|
longText,
|
|
37
35
|
names,
|
|
38
|
-
renderLinkButton,
|
|
39
36
|
text,
|
|
40
37
|
} from './components';
|
|
41
38
|
|
|
@@ -116,10 +113,10 @@ export const Listener: Story = {
|
|
|
116
113
|
text={str('# Listener', '', content.footer)}
|
|
117
114
|
extensions={[
|
|
118
115
|
listener({
|
|
119
|
-
onFocus: (focusing) => {
|
|
116
|
+
onFocus: ({ focusing }) => {
|
|
120
117
|
log.info('listener', { focusing });
|
|
121
118
|
},
|
|
122
|
-
onChange: (text) => {
|
|
119
|
+
onChange: ({ text }) => {
|
|
123
120
|
log.info('listener', { text });
|
|
124
121
|
},
|
|
125
122
|
}),
|
|
@@ -189,40 +186,17 @@ export const Typescript: Story = {
|
|
|
189
186
|
),
|
|
190
187
|
};
|
|
191
188
|
|
|
192
|
-
//
|
|
193
|
-
// Autocomplete
|
|
194
|
-
//
|
|
195
|
-
|
|
196
|
-
export const Autocomplete: Story = {
|
|
197
|
-
render: () => (
|
|
198
|
-
<EditorStory
|
|
199
|
-
text={str('# Autocomplete', '', 'Press Ctrl-Space...', content.footer)}
|
|
200
|
-
extensions={[
|
|
201
|
-
decorateMarkdown({ renderLinkButton }),
|
|
202
|
-
autocomplete({
|
|
203
|
-
onSuggest: (text) => {
|
|
204
|
-
return links
|
|
205
|
-
.filter(({ label }) => label.toLowerCase().includes(text.toLowerCase()))
|
|
206
|
-
.map(({ label }) => label);
|
|
207
|
-
},
|
|
208
|
-
}),
|
|
209
|
-
]}
|
|
210
|
-
/>
|
|
211
|
-
),
|
|
212
|
-
};
|
|
213
|
-
|
|
214
189
|
//
|
|
215
190
|
// Typeahead
|
|
216
191
|
//
|
|
217
192
|
|
|
218
|
-
const completions = ['
|
|
193
|
+
const completions = ['hello world!', 'dxos.org'];
|
|
219
194
|
|
|
220
195
|
export const Typeahead: Story = {
|
|
221
196
|
render: () => (
|
|
222
197
|
<EditorStory
|
|
223
198
|
text={str('# Typeahead', '')}
|
|
224
199
|
extensions={[
|
|
225
|
-
decorateMarkdown({ renderLinkButton }),
|
|
226
200
|
typeahead({
|
|
227
201
|
onComplete: staticCompletion(completions, { minLength: 2 }),
|
|
228
202
|
}),
|
|
@@ -3,28 +3,29 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { type EditorView } from '@codemirror/view';
|
|
6
|
-
import
|
|
6
|
+
import type * as Schema from 'effect/Schema';
|
|
7
|
+
import React, { type ReactNode, forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
|
|
7
8
|
|
|
8
|
-
import {
|
|
9
|
-
import { live } from '@dxos/echo/internal';
|
|
9
|
+
import { Obj, Type } from '@dxos/echo';
|
|
10
10
|
import { invariant } from '@dxos/invariant';
|
|
11
11
|
import { PublicKey } from '@dxos/keys';
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
12
|
+
import { log } from '@dxos/log';
|
|
13
|
+
import { useMergeRefs, useThemeContext } from '@dxos/react-ui';
|
|
14
14
|
import { useAttentionAttributes } from '@dxos/react-ui-attention';
|
|
15
15
|
import { JsonFilter } from '@dxos/react-ui-syntax-highlighter';
|
|
16
16
|
import { mx } from '@dxos/react-ui-theme';
|
|
17
17
|
import { isNonNullable } from '@dxos/util';
|
|
18
18
|
|
|
19
|
+
import { type EditorController, createEditorController } from '../../components';
|
|
19
20
|
import { editorGutter, editorSlots } from '../../defaults';
|
|
20
21
|
import {
|
|
21
22
|
type DebugNode,
|
|
22
23
|
type ThemeExtensionsOptions,
|
|
23
24
|
createBasicExtensions,
|
|
24
|
-
createDataExtensions,
|
|
25
25
|
createMarkdownExtensions,
|
|
26
26
|
createThemeExtensions,
|
|
27
27
|
debugTree,
|
|
28
|
+
decorateMarkdown,
|
|
28
29
|
} from '../../extensions';
|
|
29
30
|
import { type UseTextEditorProps, useTextEditor } from '../../hooks';
|
|
30
31
|
|
|
@@ -38,32 +39,36 @@ export type StoryProps = Pick<UseTextEditorProps, 'id' | 'scrollTo' | 'selection
|
|
|
38
39
|
debug?: DebugMode;
|
|
39
40
|
debugCustom?: (view: EditorView) => ReactNode;
|
|
40
41
|
text?: string;
|
|
41
|
-
|
|
42
|
+
// TODO(wittjosiah): Find a simpler way to define this type.
|
|
43
|
+
object?: Obj.Obj<Schema.Schema.Type<typeof Type.Expando>>;
|
|
42
44
|
readOnly?: boolean;
|
|
43
45
|
placeholder?: string;
|
|
44
46
|
lineNumbers?: boolean;
|
|
45
47
|
onReady?: (view: EditorView) => void;
|
|
46
48
|
};
|
|
47
49
|
|
|
48
|
-
export const EditorStory = forwardRef<
|
|
49
|
-
({ debug, debugCustom, text, extensions:
|
|
50
|
+
export const EditorStory = forwardRef<EditorController, StoryProps>(
|
|
51
|
+
({ debug, debugCustom, text, extensions: extensionsParam, ...props }, forwardedRef) => {
|
|
52
|
+
const controllerRef = useRef<EditorController>(null);
|
|
53
|
+
const mergedRef = useMergeRefs([controllerRef, forwardedRef]);
|
|
54
|
+
|
|
50
55
|
const attentionAttrs = useAttentionAttributes('test-panel');
|
|
51
56
|
const [tree, setTree] = useState<DebugNode>();
|
|
52
|
-
const [object] = useState(
|
|
53
|
-
|
|
57
|
+
const [object] = useState(Obj.make(Type.Expando, { content: text ?? '' }));
|
|
58
|
+
|
|
54
59
|
const extensions = useMemo(
|
|
55
|
-
() => (debug ? [
|
|
56
|
-
[debug,
|
|
60
|
+
() => (debug ? [extensionsParam, debugTree(setTree)].filter(isNonNullable) : extensionsParam),
|
|
61
|
+
[debug, extensionsParam],
|
|
57
62
|
);
|
|
58
63
|
|
|
59
|
-
const view =
|
|
64
|
+
const view = controllerRef.current?.view;
|
|
60
65
|
return (
|
|
61
|
-
<div className={mx('
|
|
62
|
-
<EditorComponent ref={
|
|
66
|
+
<div className={mx('is-full bs-full grid overflow-hidden', debug && 'grid-cols-2 lg:grid-cols-[1fr_600px]')}>
|
|
67
|
+
<EditorComponent ref={mergedRef} object={object} text={text} extensions={extensions} {...props} />
|
|
63
68
|
|
|
64
69
|
{debug && (
|
|
65
70
|
<div
|
|
66
|
-
className='grid
|
|
71
|
+
className='grid bs-full auto-rows-fr border-l border-separator divide-y divide-separator overflow-hidden'
|
|
67
72
|
{...attentionAttrs}
|
|
68
73
|
>
|
|
69
74
|
{view && debugCustom?.(view)}
|
|
@@ -82,8 +87,10 @@ export const EditorStory = forwardRef<EditorView | null, StoryProps>(
|
|
|
82
87
|
|
|
83
88
|
/**
|
|
84
89
|
* Default story component.
|
|
90
|
+
* @deprecated
|
|
85
91
|
*/
|
|
86
|
-
|
|
92
|
+
// TODO(burdon): Replace with <Editor.Root>
|
|
93
|
+
export const EditorComponent = forwardRef<EditorController, StoryProps>(
|
|
87
94
|
(
|
|
88
95
|
{
|
|
89
96
|
id = defaultId,
|
|
@@ -110,10 +117,10 @@ export const EditorComponent = forwardRef<EditorView | null, StoryProps>(
|
|
|
110
117
|
selection,
|
|
111
118
|
initialValue: text,
|
|
112
119
|
extensions: [
|
|
113
|
-
createDataExtensions({ id, text: createDocAccessor(object, ['content']) }),
|
|
114
120
|
createBasicExtensions({ readOnly, placeholder, lineNumbers, scrollPastEnd: true, search: true }),
|
|
115
121
|
createMarkdownExtensions(),
|
|
116
122
|
createThemeExtensions({ themeMode, syntaxHighlighting: true, slots }),
|
|
123
|
+
decorateMarkdown(),
|
|
117
124
|
editorGutter,
|
|
118
125
|
extensions || [],
|
|
119
126
|
],
|
|
@@ -121,7 +128,11 @@ export const EditorComponent = forwardRef<EditorView | null, StoryProps>(
|
|
|
121
128
|
[id, object, extensions, themeMode],
|
|
122
129
|
);
|
|
123
130
|
|
|
124
|
-
|
|
131
|
+
// External controller.
|
|
132
|
+
useImperativeHandle(forwardedRef, () => {
|
|
133
|
+
log.info('view updated', { id });
|
|
134
|
+
return createEditorController(view);
|
|
135
|
+
}, [id, view]);
|
|
125
136
|
|
|
126
137
|
useEffect(() => {
|
|
127
138
|
if (view) {
|
|
@@ -19,14 +19,14 @@ import {
|
|
|
19
19
|
linkTooltip,
|
|
20
20
|
table,
|
|
21
21
|
} from '../../extensions';
|
|
22
|
-
import { str } from '../../
|
|
23
|
-
import { createRenderer } from '../../util';
|
|
22
|
+
import { createRenderer, str } from '../../util';
|
|
24
23
|
|
|
25
24
|
export const num = () => faker.number.int({ min: 0, max: 9999 }).toLocaleString();
|
|
26
25
|
|
|
27
26
|
export const img = '';
|
|
28
27
|
|
|
29
28
|
export const code = str(
|
|
29
|
+
// prettier-ignore
|
|
30
30
|
'// Code',
|
|
31
31
|
'const Component = () => {',
|
|
32
32
|
' const x = 100;',
|
|
@@ -38,7 +38,7 @@ export const code = str(
|
|
|
38
38
|
// Content blocks for stories
|
|
39
39
|
export const content = {
|
|
40
40
|
tasks: str(
|
|
41
|
-
//
|
|
41
|
+
// prettier-ignore
|
|
42
42
|
'### TaskList',
|
|
43
43
|
'',
|
|
44
44
|
`- [x] ${faker.lorem.sentences()}`,
|
|
@@ -50,7 +50,7 @@ export const content = {
|
|
|
50
50
|
),
|
|
51
51
|
|
|
52
52
|
bullets: str(
|
|
53
|
-
//
|
|
53
|
+
// prettier-ignore
|
|
54
54
|
'### BulletList',
|
|
55
55
|
'',
|
|
56
56
|
`- ${faker.lorem.sentences()}`,
|
|
@@ -62,7 +62,7 @@ export const content = {
|
|
|
62
62
|
),
|
|
63
63
|
|
|
64
64
|
numbered: str(
|
|
65
|
-
//
|
|
65
|
+
// prettier-ignore
|
|
66
66
|
'### OrderedList (part 1)',
|
|
67
67
|
'',
|
|
68
68
|
`1. ${faker.lorem.sentences()}`,
|
|
@@ -81,11 +81,34 @@ export const content = {
|
|
|
81
81
|
|
|
82
82
|
typescript: code,
|
|
83
83
|
|
|
84
|
-
codeblocks: str(
|
|
84
|
+
codeblocks: str(
|
|
85
|
+
// prettier-ignore
|
|
86
|
+
'### Code',
|
|
87
|
+
'',
|
|
88
|
+
'```bash',
|
|
89
|
+
'$ ls -las',
|
|
90
|
+
'```',
|
|
91
|
+
'',
|
|
92
|
+
'```tsx',
|
|
93
|
+
code,
|
|
94
|
+
'```',
|
|
95
|
+
'',
|
|
96
|
+
),
|
|
85
97
|
|
|
86
|
-
comment: str(
|
|
98
|
+
comment: str(
|
|
99
|
+
// prettier-ignore
|
|
100
|
+
'### Comment',
|
|
101
|
+
'',
|
|
102
|
+
'<!--',
|
|
103
|
+
'A comment',
|
|
104
|
+
'-->',
|
|
105
|
+
'',
|
|
106
|
+
'Partial comment. <!-- comment. -->',
|
|
107
|
+
'',
|
|
108
|
+
),
|
|
87
109
|
|
|
88
110
|
links: str(
|
|
111
|
+
// prettier-ignore
|
|
89
112
|
'### Links',
|
|
90
113
|
'',
|
|
91
114
|
'This is a naked link https://dxos.org within a sentence.',
|
|
@@ -97,6 +120,7 @@ export const content = {
|
|
|
97
120
|
),
|
|
98
121
|
|
|
99
122
|
table: str(
|
|
123
|
+
// prettier-ignore
|
|
100
124
|
'### Tables',
|
|
101
125
|
'',
|
|
102
126
|
`| ${faker.lorem.word().padStart(12)} | ${faker.lorem.word().padStart(12)} | ${faker.lorem.word().padStart(12)} |`,
|
|
@@ -113,9 +137,16 @@ export const content = {
|
|
|
113
137
|
...[1, 2, 3, 4, 5, 6].map((level) => ['#'.repeat(level) + ` Heading ${level}`, faker.lorem.sentences(), '']).flat(),
|
|
114
138
|
),
|
|
115
139
|
|
|
116
|
-
formatting: str(
|
|
140
|
+
formatting: str(
|
|
141
|
+
// prettier-ignore
|
|
142
|
+
'### Formatting',
|
|
143
|
+
'',
|
|
144
|
+
'This this is **bold**, ~~strikethrough~~, _italic_, and `f(INLINE)`.',
|
|
145
|
+
'',
|
|
146
|
+
),
|
|
117
147
|
|
|
118
148
|
blockquotes: str(
|
|
149
|
+
// prettier-ignore
|
|
119
150
|
'### Blockquotes',
|
|
120
151
|
'',
|
|
121
152
|
'> This is a block quote.',
|
|
@@ -154,6 +185,7 @@ export const text = str(
|
|
|
154
185
|
'---',
|
|
155
186
|
'## Misc',
|
|
156
187
|
content.codeblocks,
|
|
188
|
+
content.comment,
|
|
157
189
|
content.table,
|
|
158
190
|
content.image,
|
|
159
191
|
content.footer,
|
package/src/styles/markdown.ts
CHANGED
package/src/styles/theme.ts
CHANGED
|
@@ -74,12 +74,12 @@ export const defaultTheme: ThemeStyles = {
|
|
|
74
74
|
*/
|
|
75
75
|
'.cm-gutters': {
|
|
76
76
|
borderRight: 'none',
|
|
77
|
-
// background: 'transparent',
|
|
78
77
|
},
|
|
79
78
|
'.cm-gutter': {},
|
|
80
79
|
'.cm-gutter.cm-lineNumbers': {
|
|
81
80
|
paddingRight: '4px',
|
|
82
81
|
borderRight: '1px solid var(--dx-subduedSeparator)',
|
|
82
|
+
color: 'var(--dx-subduedText)',
|
|
83
83
|
},
|
|
84
84
|
'.cm-gutter.cm-lineNumbers .cm-gutterElement': {
|
|
85
85
|
minWidth: '40px',
|
|
@@ -110,6 +110,7 @@ export const defaultTheme: ThemeStyles = {
|
|
|
110
110
|
borderLeft: '2px solid var(--dx-cmCursor)',
|
|
111
111
|
},
|
|
112
112
|
'.cm-placeholder': {
|
|
113
|
+
fontFamily: fontBody,
|
|
113
114
|
color: 'var(--dx-placeholder)',
|
|
114
115
|
},
|
|
115
116
|
|
package/src/util/debug.ts
CHANGED
|
@@ -7,6 +7,11 @@ import { type EditorView } from '@codemirror/view';
|
|
|
7
7
|
|
|
8
8
|
import { log } from '@dxos/log';
|
|
9
9
|
|
|
10
|
+
/**
|
|
11
|
+
* @deprecated Use `trim` from `@dxos/util`.
|
|
12
|
+
*/
|
|
13
|
+
export const str = (...lines: string[]) => lines.join('\n');
|
|
14
|
+
|
|
10
15
|
export const wrapWithCatch = (fn: (...args: any[]) => any, label?: string) => {
|
|
11
16
|
return (...args: any[]) => {
|
|
12
17
|
try {
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
// src/testing/util.ts
|
|
2
|
-
var str = (...lines) => lines.join("\n");
|
|
3
|
-
|
|
4
|
-
// src/testing/PreviewPopover.tsx
|
|
5
|
-
import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
|
|
6
|
-
import { createContext } from "@radix-ui/react-context";
|
|
7
|
-
import React, { useCallback, useEffect, useRef, useState } from "react";
|
|
8
|
-
import { addEventListener } from "@dxos/async";
|
|
9
|
-
import { Popover } from "@dxos/react-ui";
|
|
10
|
-
var [PreviewPopoverContextProvider, usePreviewPopover] = createContext("PreviewPopover", {});
|
|
11
|
-
var PreviewPopoverProvider = ({ children, onLookup }) => {
|
|
12
|
-
var _effect = _useSignals();
|
|
13
|
-
try {
|
|
14
|
-
const trigger = useRef(null);
|
|
15
|
-
const [value, setValue] = useState({});
|
|
16
|
-
const [open, setOpen] = useState(false);
|
|
17
|
-
const handleDxAnchorActivate = useCallback((event) => {
|
|
18
|
-
const { refId, label, trigger: dxTrigger } = event;
|
|
19
|
-
setValue((value2) => ({
|
|
20
|
-
...value2,
|
|
21
|
-
link: {
|
|
22
|
-
label,
|
|
23
|
-
ref: refId
|
|
24
|
-
},
|
|
25
|
-
pending: true
|
|
26
|
-
}));
|
|
27
|
-
trigger.current = dxTrigger;
|
|
28
|
-
queueMicrotask(() => setOpen(true));
|
|
29
|
-
void onLookup?.({
|
|
30
|
-
label,
|
|
31
|
-
ref: refId
|
|
32
|
-
}).then((target) => setValue((value2) => ({
|
|
33
|
-
...value2,
|
|
34
|
-
target: target ?? void 0,
|
|
35
|
-
pending: false
|
|
36
|
-
})));
|
|
37
|
-
}, [
|
|
38
|
-
onLookup
|
|
39
|
-
]);
|
|
40
|
-
const [rootRef, setRootRef] = useState(null);
|
|
41
|
-
useEffect(() => {
|
|
42
|
-
if (!rootRef || !handleDxAnchorActivate) {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
return addEventListener(rootRef, "dx-anchor-activate", handleDxAnchorActivate, {
|
|
46
|
-
capture: true,
|
|
47
|
-
passive: false
|
|
48
|
-
});
|
|
49
|
-
}, [
|
|
50
|
-
rootRef,
|
|
51
|
-
handleDxAnchorActivate
|
|
52
|
-
]);
|
|
53
|
-
return /* @__PURE__ */ React.createElement(PreviewPopoverContextProvider, {
|
|
54
|
-
pending: value.pending,
|
|
55
|
-
link: value.link,
|
|
56
|
-
target: value.target
|
|
57
|
-
}, /* @__PURE__ */ React.createElement(Popover.Root, {
|
|
58
|
-
open,
|
|
59
|
-
onOpenChange: setOpen
|
|
60
|
-
}, /* @__PURE__ */ React.createElement(Popover.VirtualTrigger, {
|
|
61
|
-
virtualRef: trigger
|
|
62
|
-
}), /* @__PURE__ */ React.createElement("div", {
|
|
63
|
-
role: "none",
|
|
64
|
-
className: "contents",
|
|
65
|
-
ref: setRootRef
|
|
66
|
-
}, children)));
|
|
67
|
-
} finally {
|
|
68
|
-
_effect.f();
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
export {
|
|
72
|
-
PreviewPopoverProvider,
|
|
73
|
-
str,
|
|
74
|
-
usePreviewPopover
|
|
75
|
-
};
|
|
76
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/testing/util.ts", "../../../../src/testing/PreviewPopover.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n/** deprecated Replace with @dxos/util trim */\n// TODO(burdon): Remove\nexport const str = (...lines: string[]) => lines.join('\\n');\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, type RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { addEventListener } from '@dxos/async';\nimport { type DxAnchorActivate, Popover } from '@dxos/react-ui';\n\nimport { type PreviewLinkRef, type PreviewLinkTarget } from '../extensions';\n\ntype PreviewLookup = (link: PreviewLinkRef) => Promise<PreviewLinkTarget | null | undefined>;\n\ntype PreviewPopoverValue = Partial<{\n link: PreviewLinkRef;\n target: PreviewLinkTarget;\n pending: boolean;\n}>;\n\nconst [PreviewPopoverContextProvider, usePreviewPopover] = createContext<PreviewPopoverValue>('PreviewPopover', {});\n\ntype PopoverLookupProviderProps = PropsWithChildren<{\n onLookup?: PreviewLookup;\n}>;\n\nconst PreviewPopoverProvider = ({ children, onLookup }: PopoverLookupProviderProps) => {\n const trigger = useRef<HTMLElement | null>(null);\n const [value, setValue] = useState<PreviewPopoverValue>({});\n const [open, setOpen] = useState(false);\n\n const handleDxAnchorActivate = useCallback(\n (event: DxAnchorActivate) => {\n const { refId, label, trigger: dxTrigger } = event;\n setValue((value) => ({\n ...value,\n link: { label, ref: refId },\n pending: true,\n }));\n trigger.current = dxTrigger;\n queueMicrotask(() => setOpen(true));\n void onLookup?.({ label, ref: refId }).then((target) =>\n setValue((value) => ({\n ...value,\n target: target ?? undefined,\n pending: false,\n })),\n );\n },\n [onLookup],\n );\n\n const [rootRef, setRootRef] = useState<HTMLDivElement | null>(null);\n useEffect(() => {\n if (!rootRef || !handleDxAnchorActivate) {\n return;\n }\n\n return addEventListener(rootRef, 'dx-anchor-activate' as any, handleDxAnchorActivate, {\n capture: true,\n passive: false,\n });\n }, [rootRef, handleDxAnchorActivate]);\n\n return (\n <PreviewPopoverContextProvider 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 </PreviewPopoverContextProvider>\n );\n};\nexport { PreviewPopoverProvider, usePreviewPopover };\n\nexport type { PopoverLookupProviderProps, PreviewPopoverValue };\n"],
|
|
5
|
-
"mappings": ";AAMO,IAAMA,MAAM,IAAIC,UAAoBA,MAAMC,KAAK,IAAA;;;;ACFtD,SAASC,qBAAqB;AAC9B,OAAOC,SAAiDC,aAAaC,WAAWC,QAAQC,gBAAgB;AAExG,SAASC,wBAAwB;AACjC,SAAgCC,eAAe;AAY/C,IAAM,CAACC,+BAA+BC,iBAAAA,IAAqBC,cAAmC,kBAAkB,CAAC,CAAA;AAMjH,IAAMC,yBAAyB,CAAC,EAAEC,UAAUC,SAAQ,MAA8B;;;AAChF,UAAMC,UAAUC,OAA2B,IAAA;AAC3C,UAAM,CAACC,OAAOC,QAAAA,IAAYC,SAA8B,CAAC,CAAA;AACzD,UAAM,CAACC,MAAMC,OAAAA,IAAWF,SAAS,KAAA;AAEjC,UAAMG,yBAAyBC,YAC7B,CAACC,UAAAA;AACC,YAAM,EAAEC,OAAOC,OAAOX,SAASY,UAAS,IAAKH;AAC7CN,eAAS,CAACD,YAAW;QACnB,GAAGA;QACHW,MAAM;UAAEF;UAAOG,KAAKJ;QAAM;QAC1BK,SAAS;MACX,EAAA;AACAf,cAAQgB,UAAUJ;AAClBK,qBAAe,MAAMX,QAAQ,IAAA,CAAA;AAC7B,WAAKP,WAAW;QAAEY;QAAOG,KAAKJ;MAAM,CAAA,EAAGQ,KAAK,CAACC,WAC3ChB,SAAS,CAACD,YAAW;QACnB,GAAGA;QACHiB,QAAQA,UAAUC;QAClBL,SAAS;MACX,EAAA,CAAA;IAEJ,GACA;MAAChB;KAAS;AAGZ,UAAM,CAACsB,SAASC,UAAAA,IAAclB,SAAgC,IAAA;AAC9DmB,cAAU,MAAA;AACR,UAAI,CAACF,WAAW,CAACd,wBAAwB;AACvC;MACF;AAEA,aAAOiB,iBAAiBH,SAAS,sBAA6Bd,wBAAwB;QACpFkB,SAAS;QACTC,SAAS;MACX,CAAA;IACF,GAAG;MAACL;MAASd;KAAuB;AAEpC,WACE,sBAAA,cAACb,+BAAAA;MAA8BqB,SAASb,MAAMa;MAASF,MAAMX,MAAMW;MAAMM,QAAQjB,MAAMiB;OACrF,sBAAA,cAACQ,QAAQC,MAAI;MAACvB;MAAYwB,cAAcvB;OACtC,sBAAA,cAACqB,QAAQG,gBAAc;MAACC,YAAY/B;QACpC,sBAAA,cAACgC,OAAAA;MAAIC,MAAK;MAAOC,WAAU;MAAWpB,KAAKQ;OACxCxB,QAAAA,CAAAA,CAAAA;;;;AAKX;",
|
|
6
|
-
"names": ["str", "lines", "join", "createContext", "React", "useCallback", "useEffect", "useRef", "useState", "addEventListener", "Popover", "PreviewPopoverContextProvider", "usePreviewPopover", "createContext", "PreviewPopoverProvider", "children", "onLookup", "trigger", "useRef", "value", "setValue", "useState", "open", "setOpen", "handleDxAnchorActivate", "useCallback", "event", "refId", "label", "dxTrigger", "link", "ref", "pending", "current", "queueMicrotask", "then", "target", "undefined", "rootRef", "setRootRef", "useEffect", "addEventListener", "capture", "passive", "Popover", "Root", "onOpenChange", "VirtualTrigger", "virtualRef", "div", "role", "className"]
|
|
7
|
-
}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
-
|
|
3
|
-
// src/testing/util.ts
|
|
4
|
-
var str = (...lines) => lines.join("\n");
|
|
5
|
-
|
|
6
|
-
// src/testing/PreviewPopover.tsx
|
|
7
|
-
import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
|
|
8
|
-
import { createContext } from "@radix-ui/react-context";
|
|
9
|
-
import React, { useCallback, useEffect, useRef, useState } from "react";
|
|
10
|
-
import { addEventListener } from "@dxos/async";
|
|
11
|
-
import { Popover } from "@dxos/react-ui";
|
|
12
|
-
var [PreviewPopoverContextProvider, usePreviewPopover] = createContext("PreviewPopover", {});
|
|
13
|
-
var PreviewPopoverProvider = ({ children, onLookup }) => {
|
|
14
|
-
var _effect = _useSignals();
|
|
15
|
-
try {
|
|
16
|
-
const trigger = useRef(null);
|
|
17
|
-
const [value, setValue] = useState({});
|
|
18
|
-
const [open, setOpen] = useState(false);
|
|
19
|
-
const handleDxAnchorActivate = useCallback((event) => {
|
|
20
|
-
const { refId, label, trigger: dxTrigger } = event;
|
|
21
|
-
setValue((value2) => ({
|
|
22
|
-
...value2,
|
|
23
|
-
link: {
|
|
24
|
-
label,
|
|
25
|
-
ref: refId
|
|
26
|
-
},
|
|
27
|
-
pending: true
|
|
28
|
-
}));
|
|
29
|
-
trigger.current = dxTrigger;
|
|
30
|
-
queueMicrotask(() => setOpen(true));
|
|
31
|
-
void onLookup?.({
|
|
32
|
-
label,
|
|
33
|
-
ref: refId
|
|
34
|
-
}).then((target) => setValue((value2) => ({
|
|
35
|
-
...value2,
|
|
36
|
-
target: target ?? void 0,
|
|
37
|
-
pending: false
|
|
38
|
-
})));
|
|
39
|
-
}, [
|
|
40
|
-
onLookup
|
|
41
|
-
]);
|
|
42
|
-
const [rootRef, setRootRef] = useState(null);
|
|
43
|
-
useEffect(() => {
|
|
44
|
-
if (!rootRef || !handleDxAnchorActivate) {
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
return addEventListener(rootRef, "dx-anchor-activate", handleDxAnchorActivate, {
|
|
48
|
-
capture: true,
|
|
49
|
-
passive: false
|
|
50
|
-
});
|
|
51
|
-
}, [
|
|
52
|
-
rootRef,
|
|
53
|
-
handleDxAnchorActivate
|
|
54
|
-
]);
|
|
55
|
-
return /* @__PURE__ */ React.createElement(PreviewPopoverContextProvider, {
|
|
56
|
-
pending: value.pending,
|
|
57
|
-
link: value.link,
|
|
58
|
-
target: value.target
|
|
59
|
-
}, /* @__PURE__ */ React.createElement(Popover.Root, {
|
|
60
|
-
open,
|
|
61
|
-
onOpenChange: setOpen
|
|
62
|
-
}, /* @__PURE__ */ React.createElement(Popover.VirtualTrigger, {
|
|
63
|
-
virtualRef: trigger
|
|
64
|
-
}), /* @__PURE__ */ React.createElement("div", {
|
|
65
|
-
role: "none",
|
|
66
|
-
className: "contents",
|
|
67
|
-
ref: setRootRef
|
|
68
|
-
}, children)));
|
|
69
|
-
} finally {
|
|
70
|
-
_effect.f();
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
export {
|
|
74
|
-
PreviewPopoverProvider,
|
|
75
|
-
str,
|
|
76
|
-
usePreviewPopover
|
|
77
|
-
};
|
|
78
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/testing/util.ts", "../../../../src/testing/PreviewPopover.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n/** deprecated Replace with @dxos/util trim */\n// TODO(burdon): Remove\nexport const str = (...lines: string[]) => lines.join('\\n');\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, type RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { addEventListener } from '@dxos/async';\nimport { type DxAnchorActivate, Popover } from '@dxos/react-ui';\n\nimport { type PreviewLinkRef, type PreviewLinkTarget } from '../extensions';\n\ntype PreviewLookup = (link: PreviewLinkRef) => Promise<PreviewLinkTarget | null | undefined>;\n\ntype PreviewPopoverValue = Partial<{\n link: PreviewLinkRef;\n target: PreviewLinkTarget;\n pending: boolean;\n}>;\n\nconst [PreviewPopoverContextProvider, usePreviewPopover] = createContext<PreviewPopoverValue>('PreviewPopover', {});\n\ntype PopoverLookupProviderProps = PropsWithChildren<{\n onLookup?: PreviewLookup;\n}>;\n\nconst PreviewPopoverProvider = ({ children, onLookup }: PopoverLookupProviderProps) => {\n const trigger = useRef<HTMLElement | null>(null);\n const [value, setValue] = useState<PreviewPopoverValue>({});\n const [open, setOpen] = useState(false);\n\n const handleDxAnchorActivate = useCallback(\n (event: DxAnchorActivate) => {\n const { refId, label, trigger: dxTrigger } = event;\n setValue((value) => ({\n ...value,\n link: { label, ref: refId },\n pending: true,\n }));\n trigger.current = dxTrigger;\n queueMicrotask(() => setOpen(true));\n void onLookup?.({ label, ref: refId }).then((target) =>\n setValue((value) => ({\n ...value,\n target: target ?? undefined,\n pending: false,\n })),\n );\n },\n [onLookup],\n );\n\n const [rootRef, setRootRef] = useState<HTMLDivElement | null>(null);\n useEffect(() => {\n if (!rootRef || !handleDxAnchorActivate) {\n return;\n }\n\n return addEventListener(rootRef, 'dx-anchor-activate' as any, handleDxAnchorActivate, {\n capture: true,\n passive: false,\n });\n }, [rootRef, handleDxAnchorActivate]);\n\n return (\n <PreviewPopoverContextProvider 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 </PreviewPopoverContextProvider>\n );\n};\nexport { PreviewPopoverProvider, usePreviewPopover };\n\nexport type { PopoverLookupProviderProps, PreviewPopoverValue };\n"],
|
|
5
|
-
"mappings": ";;;AAMO,IAAMA,MAAM,IAAIC,UAAoBA,MAAMC,KAAK,IAAA;;;;ACFtD,SAASC,qBAAqB;AAC9B,OAAOC,SAAiDC,aAAaC,WAAWC,QAAQC,gBAAgB;AAExG,SAASC,wBAAwB;AACjC,SAAgCC,eAAe;AAY/C,IAAM,CAACC,+BAA+BC,iBAAAA,IAAqBC,cAAmC,kBAAkB,CAAC,CAAA;AAMjH,IAAMC,yBAAyB,CAAC,EAAEC,UAAUC,SAAQ,MAA8B;;;AAChF,UAAMC,UAAUC,OAA2B,IAAA;AAC3C,UAAM,CAACC,OAAOC,QAAAA,IAAYC,SAA8B,CAAC,CAAA;AACzD,UAAM,CAACC,MAAMC,OAAAA,IAAWF,SAAS,KAAA;AAEjC,UAAMG,yBAAyBC,YAC7B,CAACC,UAAAA;AACC,YAAM,EAAEC,OAAOC,OAAOX,SAASY,UAAS,IAAKH;AAC7CN,eAAS,CAACD,YAAW;QACnB,GAAGA;QACHW,MAAM;UAAEF;UAAOG,KAAKJ;QAAM;QAC1BK,SAAS;MACX,EAAA;AACAf,cAAQgB,UAAUJ;AAClBK,qBAAe,MAAMX,QAAQ,IAAA,CAAA;AAC7B,WAAKP,WAAW;QAAEY;QAAOG,KAAKJ;MAAM,CAAA,EAAGQ,KAAK,CAACC,WAC3ChB,SAAS,CAACD,YAAW;QACnB,GAAGA;QACHiB,QAAQA,UAAUC;QAClBL,SAAS;MACX,EAAA,CAAA;IAEJ,GACA;MAAChB;KAAS;AAGZ,UAAM,CAACsB,SAASC,UAAAA,IAAclB,SAAgC,IAAA;AAC9DmB,cAAU,MAAA;AACR,UAAI,CAACF,WAAW,CAACd,wBAAwB;AACvC;MACF;AAEA,aAAOiB,iBAAiBH,SAAS,sBAA6Bd,wBAAwB;QACpFkB,SAAS;QACTC,SAAS;MACX,CAAA;IACF,GAAG;MAACL;MAASd;KAAuB;AAEpC,WACE,sBAAA,cAACb,+BAAAA;MAA8BqB,SAASb,MAAMa;MAASF,MAAMX,MAAMW;MAAMM,QAAQjB,MAAMiB;OACrF,sBAAA,cAACQ,QAAQC,MAAI;MAACvB;MAAYwB,cAAcvB;OACtC,sBAAA,cAACqB,QAAQG,gBAAc;MAACC,YAAY/B;QACpC,sBAAA,cAACgC,OAAAA;MAAIC,MAAK;MAAOC,WAAU;MAAWpB,KAAKQ;OACxCxB,QAAAA,CAAAA,CAAAA;;;;AAKX;",
|
|
6
|
-
"names": ["str", "lines", "join", "createContext", "React", "useCallback", "useEffect", "useRef", "useState", "addEventListener", "Popover", "PreviewPopoverContextProvider", "usePreviewPopover", "createContext", "PreviewPopoverProvider", "children", "onLookup", "trigger", "useRef", "value", "setValue", "useState", "open", "setOpen", "handleDxAnchorActivate", "useCallback", "event", "refId", "label", "dxTrigger", "link", "ref", "pending", "current", "queueMicrotask", "then", "target", "undefined", "rootRef", "setRootRef", "useEffect", "addEventListener", "capture", "passive", "Popover", "Root", "onOpenChange", "VirtualTrigger", "virtualRef", "div", "role", "className"]
|
|
7
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { type EditorView } from '@codemirror/view';
|
|
2
|
-
import React, { type PropsWithChildren } from 'react';
|
|
3
|
-
import { type DxAnchorActivate, type Label } from '@dxos/react-ui';
|
|
4
|
-
import { type MaybePromise } from '@dxos/util';
|
|
5
|
-
export type CommandMenuGroup = {
|
|
6
|
-
id: string;
|
|
7
|
-
label?: Label;
|
|
8
|
-
items: CommandMenuItem[];
|
|
9
|
-
};
|
|
10
|
-
export type CommandMenuItem = {
|
|
11
|
-
id: string;
|
|
12
|
-
label: Label;
|
|
13
|
-
icon?: string;
|
|
14
|
-
onSelect?: (view: EditorView, head: number) => MaybePromise<void>;
|
|
15
|
-
};
|
|
16
|
-
export type CommandMenuProps = PropsWithChildren<{
|
|
17
|
-
groups: CommandMenuGroup[];
|
|
18
|
-
onSelect: (item: CommandMenuItem) => void;
|
|
19
|
-
onActivate?: (event: DxAnchorActivate) => void;
|
|
20
|
-
currentItem?: string;
|
|
21
|
-
open?: boolean;
|
|
22
|
-
onOpenChange?: (nextOpen: boolean) => void;
|
|
23
|
-
defaultOpen?: boolean;
|
|
24
|
-
}>;
|
|
25
|
-
export declare const CommandMenuProvider: ({ groups, onSelect, onActivate, currentItem, children, open: propsOpen, onOpenChange, defaultOpen, }: CommandMenuProps) => React.JSX.Element;
|
|
26
|
-
export declare const getItem: (groups: CommandMenuGroup[], id?: string) => CommandMenuItem | undefined;
|
|
27
|
-
export declare const getNextItem: (groups: CommandMenuGroup[], id?: string) => CommandMenuItem;
|
|
28
|
-
export declare const getPreviousItem: (groups: CommandMenuGroup[], id?: string) => CommandMenuItem;
|
|
29
|
-
export declare const filterItems: (groups: CommandMenuGroup[], filter: (item: CommandMenuItem) => boolean) => CommandMenuGroup[];
|
|
30
|
-
export declare const insertAtCursor: (view: EditorView, head: number, insert: string) => void;
|
|
31
|
-
/**
|
|
32
|
-
* If the cursor is at the start of a line, insert the text at the cursor.
|
|
33
|
-
* Otherwise, insert the text on a new line.
|
|
34
|
-
*/
|
|
35
|
-
export declare const insertAtLineStart: (view: EditorView, head: number, insert: string) => void;
|
|
36
|
-
export declare const coreSlashCommands: CommandMenuGroup;
|
|
37
|
-
export declare const linkSlashCommands: CommandMenuGroup;
|
|
38
|
-
//# sourceMappingURL=CommandMenu.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CommandMenu.d.ts","sourceRoot":"","sources":["../../../../../src/components/CommandMenu/CommandMenu.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,EAAY,KAAK,iBAAiB,EAA4C,MAAM,OAAO,CAAC;AAG1G,OAAO,EACL,KAAK,gBAAgB,EAErB,KAAK,KAAK,EAKX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;CACnE,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;IAC/C,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC,CAAC;AAGH,eAAO,MAAM,mBAAmB,GAAI,sGASjC,gBAAgB,sBAqElB,CAAC;AAiEF,eAAO,MAAM,OAAO,GAAI,QAAQ,gBAAgB,EAAE,EAAE,KAAK,MAAM,KAAG,eAAe,GAAG,SAEnF,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,QAAQ,gBAAgB,EAAE,EAAE,KAAK,MAAM,KAAG,eAIrE,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,QAAQ,gBAAgB,EAAE,EAAE,KAAK,MAAM,KAAG,eAIzE,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,QAAQ,gBAAgB,EAAE,EAC1B,QAAQ,CAAC,IAAI,EAAE,eAAe,KAAK,OAAO,KACzC,gBAAgB,EAKlB,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,MAAM,UAAU,EAAE,MAAM,MAAM,EAAE,QAAQ,MAAM,SAK5E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM,UAAU,EAAE,MAAM,MAAM,EAAE,QAAQ,MAAM,SAW/E,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,gBA6E/B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,gBA2B/B,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/CommandMenu/index.ts"],"names":[],"mappings":"AAIA,cAAc,eAAe,CAAC"}
|