@dxos/react-ui-editor 0.8.4-main.84f28bd → 0.8.4-main.ae835ea
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/{chunk-22UMM3QJ.mjs → chunk-HL3YF6WC.mjs} +2 -2
- package/dist/lib/browser/chunk-HL3YF6WC.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +4225 -3369
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +71 -1
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/browser/types/index.mjs +1 -1
- package/dist/lib/node-esm/{chunk-YXYQPV6R.mjs → chunk-YJZGD3LY.mjs} +2 -2
- package/dist/lib/node-esm/chunk-YJZGD3LY.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +4225 -3369
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +71 -1
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/types/index.mjs +1 -1
- package/dist/types/src/components/Editor/Editor.d.ts +24 -9
- package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
- package/dist/types/src/components/Editor/Editor.stories.d.ts +27 -0
- package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +17 -2
- package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/util.d.ts +6 -20
- package/dist/types/src/components/EditorToolbar/util.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/view-mode.d.ts +1 -1
- package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +0 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/defaults.d.ts.map +1 -1
- package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +26 -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 +10 -19
- 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/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 +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 +10 -0
- package/dist/types/src/extensions/autoscroll.d.ts.map +1 -0
- package/dist/types/src/extensions/awareness/awareness-provider.d.ts +1 -1
- package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
- package/dist/types/src/extensions/comments.d.ts +1 -1
- package/dist/types/src/extensions/comments.d.ts.map +1 -1
- package/dist/types/src/extensions/dnd.d.ts.map +1 -1
- package/dist/types/src/extensions/factories.d.ts +20 -19
- package/dist/types/src/extensions/factories.d.ts.map +1 -1
- package/dist/types/src/extensions/focus.d.ts.map +1 -1
- package/dist/types/src/extensions/folding.d.ts.map +1 -1
- package/dist/types/src/extensions/index.d.ts +4 -1
- package/dist/types/src/extensions/index.d.ts.map +1 -1
- package/dist/types/src/extensions/json.d.ts +1 -1
- package/dist/types/src/extensions/json.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/action.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/bundle.d.ts +8 -2
- package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/changes.d.ts +1 -1
- package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/decorate.d.ts +9 -1
- package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/formatting.d.ts +2 -3
- package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
- 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/outliner/outliner.d.ts +1 -1
- package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
- package/dist/types/src/extensions/outliner/selection.d.ts.map +1 -1
- package/dist/types/src/extensions/outliner/tree.d.ts +2 -2
- package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
- package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts +36 -0
- package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts.map +1 -0
- package/dist/types/src/extensions/popover/index.d.ts +8 -0
- package/dist/types/src/extensions/popover/index.d.ts.map +1 -0
- package/dist/types/src/extensions/popover/menu-presets.d.ts +4 -0
- package/dist/types/src/extensions/popover/menu-presets.d.ts.map +1 -0
- package/dist/types/src/extensions/popover/menu.d.ts +24 -0
- package/dist/types/src/extensions/popover/menu.d.ts.map +1 -0
- package/dist/types/src/extensions/popover/modal.d.ts +7 -0
- package/dist/types/src/extensions/popover/modal.d.ts.map +1 -0
- package/dist/types/src/extensions/popover/popover.d.ts +47 -0
- package/dist/types/src/extensions/popover/popover.d.ts.map +1 -0
- package/dist/types/src/extensions/popover/usePopoverMenu.d.ts +34 -0
- package/dist/types/src/extensions/popover/usePopoverMenu.d.ts.map +1 -0
- package/dist/types/src/extensions/popover/util.d.ts +8 -0
- package/dist/types/src/extensions/popover/util.d.ts.map +1 -0
- package/dist/types/src/extensions/preview/preview.d.ts +8 -8
- package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
- 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/tags/extended-markdown.d.ts +10 -0
- package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +1 -0
- package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +2 -0
- package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +1 -0
- package/dist/types/src/extensions/tags/index.d.ts +4 -0
- package/dist/types/src/extensions/tags/index.d.ts.map +1 -0
- package/dist/types/src/extensions/tags/streamer.d.ts +12 -0
- package/dist/types/src/extensions/tags/streamer.d.ts.map +1 -0
- package/dist/types/src/extensions/tags/xml-tags.d.ts +72 -0
- package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -0
- package/dist/types/src/extensions/tags/xml-util.d.ts +10 -0
- package/dist/types/src/extensions/tags/xml-util.d.ts.map +1 -0
- package/dist/types/src/hooks/useTextEditor.d.ts +4 -8
- package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
- package/dist/types/src/stories/CommandDialog.stories.d.ts +14 -0
- package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
- package/dist/types/src/stories/Comments.stories.d.ts +21 -10
- package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
- package/dist/types/src/stories/EditorToolbar.stories.d.ts +39 -3
- package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Experimental.stories.d.ts +22 -13
- package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Markdown.stories.d.ts +32 -43
- package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Outliner.stories.d.ts +15 -21
- package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Popover.stories.d.ts +20 -0
- package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
- package/dist/types/src/stories/Preview.stories.d.ts +21 -7
- package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Tags.stories.d.ts +16 -0
- package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
- package/dist/types/src/stories/TextEditor.stories.d.ts +37 -52
- package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
- package/dist/types/src/stories/components/EditorStory.d.ts +6 -9
- package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
- package/dist/types/src/styles/theme.d.ts.map +1 -1
- package/dist/types/src/testing/PreviewPopover.d.ts +20 -0
- package/dist/types/src/testing/PreviewPopover.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +1 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/util.d.ts +1 -0
- package/dist/types/src/testing/util.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +1 -1
- package/dist/types/src/types/types.d.ts +2 -2
- package/dist/types/src/types/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 +1 -1
- package/dist/types/src/util/debug.d.ts.map +1 -1
- package/dist/types/src/util/decorations.d.ts +4 -0
- package/dist/types/src/util/decorations.d.ts.map +1 -0
- package/dist/types/src/util/dom.d.ts +2 -12
- package/dist/types/src/util/dom.d.ts.map +1 -1
- package/dist/types/src/util/index.d.ts +1 -0
- package/dist/types/src/util/index.d.ts.map +1 -1
- package/dist/types/src/util/react.d.ts +1 -1
- package/dist/types/src/util/react.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +71 -61
- package/src/components/Editor/Editor.stories.tsx +69 -0
- package/src/components/Editor/Editor.tsx +58 -15
- package/src/components/EditorToolbar/EditorToolbar.tsx +104 -93
- package/src/components/EditorToolbar/blocks.ts +22 -25
- package/src/components/EditorToolbar/formatting.ts +22 -25
- package/src/components/EditorToolbar/headings.ts +16 -9
- package/src/components/EditorToolbar/image.ts +8 -4
- package/src/components/EditorToolbar/lists.ts +16 -19
- package/src/components/EditorToolbar/search.ts +8 -4
- package/src/components/EditorToolbar/util.ts +18 -23
- package/src/components/EditorToolbar/view-mode.ts +11 -6
- package/src/components/index.ts +0 -1
- package/src/defaults.ts +5 -2
- package/src/extensions/autocomplete/autocomplete.ts +220 -0
- package/src/extensions/autocomplete/index.ts +8 -0
- package/src/extensions/autocomplete/match.ts +46 -0
- package/src/extensions/{command → autocomplete}/placeholder.ts +22 -18
- package/src/extensions/{command → autocomplete}/typeahead.ts +8 -50
- package/src/extensions/automerge/automerge.stories.tsx +31 -24
- package/src/extensions/automerge/automerge.ts +31 -11
- package/src/extensions/automerge/cursor.ts +1 -1
- package/src/extensions/automerge/defs.ts +1 -1
- package/src/extensions/automerge/sync.ts +9 -5
- package/src/extensions/automerge/update-automerge.ts +2 -2
- package/src/extensions/autoscroll.ts +157 -0
- package/src/extensions/awareness/awareness-provider.ts +2 -2
- package/src/extensions/awareness/awareness.ts +2 -2
- package/src/extensions/comments.ts +18 -13
- package/src/extensions/dnd.ts +1 -1
- package/src/extensions/factories.ts +55 -37
- package/src/extensions/focus.ts +5 -4
- package/src/extensions/folding.tsx +4 -6
- package/src/extensions/hashtag.tsx +2 -2
- package/src/extensions/index.ts +4 -1
- package/src/extensions/json.ts +1 -1
- package/src/extensions/listener.ts +14 -20
- package/src/extensions/markdown/action.ts +2 -1
- package/src/extensions/markdown/bundle.ts +40 -6
- package/src/extensions/markdown/changes.ts +1 -1
- package/src/extensions/markdown/decorate.ts +24 -14
- package/src/extensions/markdown/formatting.test.ts +6 -6
- package/src/extensions/markdown/formatting.ts +11 -11
- package/src/extensions/markdown/highlight.ts +1 -1
- package/src/extensions/markdown/image.ts +3 -4
- package/src/extensions/markdown/link.ts +3 -0
- package/src/extensions/markdown/table.ts +7 -1
- package/src/extensions/mention.ts +1 -1
- package/src/extensions/modes.ts +2 -2
- package/src/extensions/{command/floating-menu.ts → outliner/menu.ts} +16 -21
- package/src/extensions/outliner/outliner.test.ts +3 -2
- package/src/extensions/outliner/outliner.ts +7 -6
- package/src/extensions/outliner/selection.ts +1 -1
- package/src/extensions/outliner/tree.test.ts +2 -1
- package/src/extensions/outliner/tree.ts +2 -2
- package/src/extensions/popover/PopoverMenuProvider.tsx +220 -0
- package/src/extensions/popover/index.ts +12 -0
- package/src/extensions/popover/menu-presets.ts +124 -0
- package/src/extensions/popover/menu.ts +67 -0
- package/src/extensions/popover/modal.ts +24 -0
- package/src/extensions/popover/popover.ts +289 -0
- package/src/extensions/popover/usePopoverMenu.ts +173 -0
- package/src/extensions/popover/util.ts +29 -0
- package/src/extensions/preview/index.ts +1 -1
- package/src/extensions/preview/preview.ts +67 -67
- package/src/extensions/selection.ts +2 -2
- package/src/extensions/state.ts +7 -0
- package/src/extensions/tags/extended-markdown.test.ts +261 -0
- package/src/extensions/tags/extended-markdown.ts +78 -0
- package/src/extensions/tags/index.ts +7 -0
- package/src/extensions/tags/streamer.ts +243 -0
- package/src/extensions/tags/xml-tags.ts +393 -0
- package/src/extensions/tags/xml-util.ts +94 -0
- package/src/hooks/useTextEditor.ts +27 -39
- package/src/stories/CommandDialog.stories.tsx +78 -0
- package/src/stories/Comments.stories.tsx +14 -10
- package/src/stories/EditorToolbar.stories.tsx +17 -17
- package/src/stories/Experimental.stories.tsx +17 -13
- package/src/stories/Markdown.stories.tsx +25 -21
- package/src/stories/Outliner.stories.tsx +54 -35
- package/src/stories/Popover.stories.tsx +163 -0
- package/src/stories/Preview.stories.tsx +49 -41
- package/src/stories/Tags.stories.tsx +81 -0
- package/src/stories/TextEditor.stories.tsx +41 -60
- package/src/stories/components/EditorStory.tsx +17 -16
- package/src/styles/theme.ts +18 -15
- package/src/testing/PreviewPopover.tsx +80 -0
- package/src/testing/index.ts +1 -0
- package/src/testing/util.ts +2 -0
- package/src/translations.ts +1 -1
- package/src/types/types.ts +1 -1
- package/src/util/cursor.ts +2 -1
- package/src/util/debug.ts +2 -2
- package/src/util/decorations.ts +21 -0
- package/src/util/dom.ts +5 -27
- package/src/util/index.ts +1 -0
- package/src/util/react.tsx +1 -1
- package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
- package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
- package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
- package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
- package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
- package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
- package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
- package/dist/types/src/components/Popover/index.d.ts +0 -4
- package/dist/types/src/components/Popover/index.d.ts.map +0 -1
- package/dist/types/src/extensions/autocomplete.d.ts +0 -13
- package/dist/types/src/extensions/autocomplete.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/command/command-menu.d.ts +0 -20
- package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
- package/dist/types/src/extensions/command/command.d.ts +0 -6
- package/dist/types/src/extensions/command/command.d.ts.map +0 -1
- package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
- package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
- package/dist/types/src/extensions/command/hint.d.ts +0 -24
- package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
- package/dist/types/src/extensions/command/index.d.ts +0 -7
- package/dist/types/src/extensions/command/index.d.ts.map +0 -1
- package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
- package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
- package/dist/types/src/extensions/command/state.d.ts +0 -16
- package/dist/types/src/extensions/command/state.d.ts.map +0 -1
- package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
- package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
- package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
- package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
- package/dist/types/src/stories/Command.stories.d.ts +0 -7
- package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
- package/dist/types/src/stories/CommandMenu.stories.d.ts +0 -13
- package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
- package/src/components/Popover/CommandMenu.tsx +0 -279
- package/src/components/Popover/RefDropdownMenu.tsx +0 -85
- package/src/components/Popover/RefPopover.tsx +0 -99
- package/src/components/Popover/index.ts +0 -7
- package/src/extensions/autocomplete.ts +0 -69
- package/src/extensions/command/action.ts +0 -56
- package/src/extensions/command/command-menu.ts +0 -210
- package/src/extensions/command/command.ts +0 -34
- package/src/extensions/command/hint.ts +0 -102
- package/src/extensions/command/index.ts +0 -10
- package/src/extensions/command/state.ts +0 -89
- package/src/extensions/command/useCommandMenu.ts +0 -118
- package/src/stories/Command.stories.tsx +0 -97
- package/src/stories/CommandMenu.stories.tsx +0 -159
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type EditorState } from '@codemirror/state';
|
|
6
|
+
import { type SyntaxNode } from '@lezer/common';
|
|
7
|
+
|
|
8
|
+
import { invariant } from '@dxos/invariant';
|
|
9
|
+
|
|
10
|
+
export type Tag = Record<string, any> & {
|
|
11
|
+
_tag: string;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Parse XML Element.
|
|
16
|
+
*/
|
|
17
|
+
export const nodeToJson = (state: EditorState, node: SyntaxNode): Tag | undefined => {
|
|
18
|
+
invariant(node.type.name === 'Element', 'Node is not an Element');
|
|
19
|
+
|
|
20
|
+
// Find the opening tag.
|
|
21
|
+
const openTag = node.node.getChild('OpenTag') || node.node.getChild('SelfClosingTag');
|
|
22
|
+
if (openTag) {
|
|
23
|
+
// Extract tag name.
|
|
24
|
+
const tagName = openTag.getChild('TagName');
|
|
25
|
+
if (!tagName) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const tag: Tag = {
|
|
30
|
+
_tag: state.doc.sliceString(tagName.from, tagName.to),
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// Extract attributes.
|
|
34
|
+
let attributeNode = openTag.getChild('Attribute');
|
|
35
|
+
while (attributeNode) {
|
|
36
|
+
const attrName = attributeNode.getChild('AttributeName');
|
|
37
|
+
const attrValue = attributeNode.getChild('AttributeValue');
|
|
38
|
+
if (attrName) {
|
|
39
|
+
const attr = state.doc.sliceString(attrName.from, attrName.to);
|
|
40
|
+
|
|
41
|
+
// Default for attributes without values.
|
|
42
|
+
let value: string | boolean = true;
|
|
43
|
+
|
|
44
|
+
if (attrValue) {
|
|
45
|
+
const rawValue = state.doc.sliceString(attrValue.from, attrValue.to);
|
|
46
|
+
// Remove quotes if present.
|
|
47
|
+
if (
|
|
48
|
+
(rawValue.startsWith('"') && rawValue.endsWith('"')) ||
|
|
49
|
+
(rawValue.startsWith("'") && rawValue.endsWith("'"))
|
|
50
|
+
) {
|
|
51
|
+
value = rawValue.slice(1, -1);
|
|
52
|
+
} else {
|
|
53
|
+
value = rawValue;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
tag[attr] = value;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Get next sibling attribute.
|
|
61
|
+
attributeNode = attributeNode.nextSibling;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Extract children for non-self-closing tags.
|
|
65
|
+
if (node.type.name === 'Element' && openTag.type.name !== 'SelfClosingTag') {
|
|
66
|
+
const children: any[] = [];
|
|
67
|
+
let child = node.node.firstChild;
|
|
68
|
+
|
|
69
|
+
while (child) {
|
|
70
|
+
// Skip the opening and closing tags.
|
|
71
|
+
if (child.type.name !== 'OpenTag' && child.type.name !== 'CloseTag') {
|
|
72
|
+
if (child.type.name === 'Text') {
|
|
73
|
+
const text = state.doc.sliceString(child.from, child.to).trim();
|
|
74
|
+
if (text) {
|
|
75
|
+
children.push(text);
|
|
76
|
+
}
|
|
77
|
+
} else if (child.type.name === 'Element') {
|
|
78
|
+
const data = nodeToJson(state, child);
|
|
79
|
+
if (data) {
|
|
80
|
+
children.push(data);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
child = child.nextSibling;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (children.length > 0) {
|
|
88
|
+
tag.children = children;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return tag;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
import { EditorState, type EditorStateConfig, type Text } from '@codemirror/state';
|
|
6
6
|
import { EditorView } from '@codemirror/view';
|
|
7
|
-
import { useFocusableGroup, type TabsterTypes } from '@fluentui/react-tabster';
|
|
8
7
|
import {
|
|
8
|
+
type ComponentPropsWithoutRef,
|
|
9
9
|
type DependencyList,
|
|
10
10
|
type KeyboardEventHandler,
|
|
11
11
|
type RefObject,
|
|
@@ -17,9 +17,9 @@ import {
|
|
|
17
17
|
} from 'react';
|
|
18
18
|
|
|
19
19
|
import { log } from '@dxos/log';
|
|
20
|
-
import {
|
|
20
|
+
import { type MaybeProvider, getProviderValue, isTruthy } from '@dxos/util';
|
|
21
21
|
|
|
22
|
-
import { type EditorSelection,
|
|
22
|
+
import { type EditorSelection, createEditorStateTransaction, documentId, modalStateField } from '../extensions';
|
|
23
23
|
import { debugDispatcher } from '../util';
|
|
24
24
|
|
|
25
25
|
let instanceCount = 0;
|
|
@@ -34,13 +34,9 @@ export type CursorInfo = {
|
|
|
34
34
|
};
|
|
35
35
|
|
|
36
36
|
export type UseTextEditor = {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
focusAttributes?: TabsterTypes.TabsterDOMAttribute & {
|
|
41
|
-
tabIndex: 0;
|
|
42
|
-
onKeyUp: KeyboardEventHandler<HTMLDivElement>;
|
|
43
|
-
};
|
|
37
|
+
parentRef: RefObject<HTMLDivElement | null>;
|
|
38
|
+
view: EditorView | null;
|
|
39
|
+
focusAttributes?: ComponentPropsWithoutRef<'div'>;
|
|
44
40
|
};
|
|
45
41
|
|
|
46
42
|
export type UseTextEditorProps = Pick<EditorStateConfig, 'extensions'> & {
|
|
@@ -66,11 +62,11 @@ export const useTextEditor = (
|
|
|
66
62
|
|
|
67
63
|
// NOTE: Increments by 2 in strict mode.
|
|
68
64
|
const [instanceId] = useState(() => `text-editor-${++instanceCount}`);
|
|
69
|
-
const [view, setView] = useState<EditorView>();
|
|
65
|
+
const [view, setView] = useState<EditorView | null>(null);
|
|
70
66
|
const parentRef = useRef<HTMLDivElement>(null);
|
|
71
67
|
|
|
72
68
|
useEffect(() => {
|
|
73
|
-
let view: EditorView;
|
|
69
|
+
let view: EditorView | null = null;
|
|
74
70
|
if (parentRef.current) {
|
|
75
71
|
log('create', { id, instanceId, doc: initialValue?.length ?? 0 });
|
|
76
72
|
|
|
@@ -96,19 +92,7 @@ export const useTextEditor = (
|
|
|
96
92
|
EditorView.exceptionSink.of((err) => {
|
|
97
93
|
log.catch(err);
|
|
98
94
|
}),
|
|
99
|
-
|
|
100
|
-
// ViewPlugin.fromClass(
|
|
101
|
-
// class {
|
|
102
|
-
// constructor(_view: EditorView) {
|
|
103
|
-
// log('construct', { id });
|
|
104
|
-
// }
|
|
105
|
-
//
|
|
106
|
-
// destroy() {
|
|
107
|
-
// log('destroy', { id });
|
|
108
|
-
// }
|
|
109
|
-
// },
|
|
110
|
-
// ),
|
|
111
|
-
].filter(isNotFalsy),
|
|
95
|
+
].filter(isTruthy),
|
|
112
96
|
});
|
|
113
97
|
|
|
114
98
|
// https://codemirror.net/docs/ref/#view.EditorViewConfig
|
|
@@ -155,23 +139,28 @@ export const useTextEditor = (
|
|
|
155
139
|
}
|
|
156
140
|
}, [autoFocus, view]);
|
|
157
141
|
|
|
158
|
-
const focusableGroupAttrs = useFocusableGroup({
|
|
159
|
-
tabBehavior: 'limited',
|
|
160
|
-
ignoreDefaultKeydown: {
|
|
161
|
-
Escape: view?.state.facet(editorInputMode).noTabster,
|
|
162
|
-
},
|
|
163
|
-
});
|
|
164
|
-
|
|
165
142
|
// Focus editor on Enter (e.g., when tabbing to this component).
|
|
166
|
-
const
|
|
143
|
+
const handleKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(
|
|
167
144
|
(event) => {
|
|
168
145
|
const { key, target, currentTarget } = event;
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
146
|
+
switch (key) {
|
|
147
|
+
case 'Escape': {
|
|
148
|
+
// Check if popover is open.
|
|
149
|
+
const modal = view?.state.field(modalStateField, false);
|
|
150
|
+
if (modal) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Focus the closest focusable parent.
|
|
155
|
+
const element = view?.contentDOM.closest('[tabindex="0"]') as HTMLDivElement | null;
|
|
156
|
+
element?.focus();
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
case 'Enter': {
|
|
160
|
+
if (target === currentTarget) {
|
|
172
161
|
view?.focus();
|
|
173
|
-
break;
|
|
174
162
|
}
|
|
163
|
+
break;
|
|
175
164
|
}
|
|
176
165
|
}
|
|
177
166
|
},
|
|
@@ -183,8 +172,7 @@ export const useTextEditor = (
|
|
|
183
172
|
view,
|
|
184
173
|
focusAttributes: {
|
|
185
174
|
tabIndex: 0 as const,
|
|
186
|
-
|
|
187
|
-
onKeyUp: handleKeyUp,
|
|
175
|
+
onKeyDown: handleKeyDown,
|
|
188
176
|
},
|
|
189
177
|
};
|
|
190
178
|
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
|
+
import React, { type KeyboardEvent, useState } from 'react';
|
|
7
|
+
|
|
8
|
+
import { Button, Icon, Input } from '@dxos/react-ui';
|
|
9
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
10
|
+
import { mx } from '@dxos/react-ui-theme';
|
|
11
|
+
|
|
12
|
+
import { editorWidth } from '../defaults';
|
|
13
|
+
import { str } from '../testing';
|
|
14
|
+
|
|
15
|
+
import { EditorStory } from './components';
|
|
16
|
+
|
|
17
|
+
// TODO(burdon): Reimplement with Popover.
|
|
18
|
+
const CommandDialog = ({ onAction }: { onAction: (action?: any) => void }) => {
|
|
19
|
+
const [text, setText] = useState('');
|
|
20
|
+
|
|
21
|
+
const handleInsert = () => {
|
|
22
|
+
// TODO(burdon): Use queue ref.
|
|
23
|
+
const link = ``;
|
|
24
|
+
onAction(text.length ? { type: 'insert', text: link } : undefined);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
|
|
28
|
+
switch (event.key) {
|
|
29
|
+
case 'Enter': {
|
|
30
|
+
handleInsert();
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
case 'Escape': {
|
|
34
|
+
onAction();
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<div className='flex is-full justify-center'>
|
|
42
|
+
<div
|
|
43
|
+
className={mx(
|
|
44
|
+
'flex is-full p-2 gap-2 items-center bg-modalSurface border border-separator rounded-md',
|
|
45
|
+
editorWidth,
|
|
46
|
+
)}
|
|
47
|
+
>
|
|
48
|
+
<Input.Root>
|
|
49
|
+
<Input.TextInput
|
|
50
|
+
autoFocus={true}
|
|
51
|
+
placeholder='Ask a question...'
|
|
52
|
+
value={text}
|
|
53
|
+
onChange={(ev) => setText(ev.target.value)}
|
|
54
|
+
onKeyDown={handleKeyDown}
|
|
55
|
+
/>
|
|
56
|
+
</Input.Root>
|
|
57
|
+
<Button variant='ghost' classNames='pli-0' onClick={() => onAction({ type: 'cancel' })}>
|
|
58
|
+
<Icon icon='ph--x--regular' size={5} />
|
|
59
|
+
</Button>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const meta = {
|
|
66
|
+
title: 'ui/react-ui-editor/CommandDialog',
|
|
67
|
+
render: () => <EditorStory text={str('# Command', '', '')} extensions={[]} />,
|
|
68
|
+
decorators: [withTheme],
|
|
69
|
+
parameters: {
|
|
70
|
+
layout: 'fullscreen',
|
|
71
|
+
},
|
|
72
|
+
} satisfies Meta<typeof Button>;
|
|
73
|
+
|
|
74
|
+
export default meta;
|
|
75
|
+
|
|
76
|
+
type Story = StoryObj<typeof meta>;
|
|
77
|
+
|
|
78
|
+
export const Default: Story = {};
|
|
@@ -2,36 +2,40 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@dxos-theme';
|
|
6
|
-
|
|
7
5
|
import { effect, useSignal } from '@preact/signals-react';
|
|
6
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
8
7
|
import React, { type FC } from 'react';
|
|
9
8
|
|
|
10
9
|
import { keySymbols, parseShortcut } from '@dxos/keyboard';
|
|
11
10
|
import { PublicKey } from '@dxos/keys';
|
|
12
11
|
import { log } from '@dxos/log';
|
|
13
|
-
import {
|
|
12
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
14
13
|
|
|
15
|
-
import { EditorStory, content, longText } from './components';
|
|
16
14
|
import { annotations, comments, createExternalCommentSync } from '../extensions';
|
|
17
15
|
import { str } from '../testing';
|
|
18
16
|
import { type Comment } from '../types';
|
|
19
17
|
import { createRenderer } from '../util';
|
|
20
18
|
|
|
21
|
-
|
|
19
|
+
import { EditorStory, content, longText } from './components';
|
|
20
|
+
|
|
21
|
+
const meta = {
|
|
22
22
|
title: 'ui/react-ui-editor/Comments',
|
|
23
23
|
component: EditorStory,
|
|
24
|
-
decorators: [withTheme
|
|
25
|
-
parameters: {
|
|
26
|
-
|
|
24
|
+
decorators: [withTheme],
|
|
25
|
+
parameters: {
|
|
26
|
+
layout: 'fullscreen',
|
|
27
|
+
},
|
|
28
|
+
} satisfies Meta<typeof EditorStory>;
|
|
27
29
|
|
|
28
30
|
export default meta;
|
|
29
31
|
|
|
32
|
+
type Story = StoryObj<typeof meta>;
|
|
33
|
+
|
|
30
34
|
//
|
|
31
35
|
// Comments
|
|
32
36
|
//
|
|
33
37
|
|
|
34
|
-
export const Comments = {
|
|
38
|
+
export const Comments: Story = {
|
|
35
39
|
render: () => {
|
|
36
40
|
const _comments = useSignal<Comment[]>([]);
|
|
37
41
|
return (
|
|
@@ -91,7 +95,7 @@ const CommentTooltip: FC<{ shortcut: string }> = ({ shortcut }) => {
|
|
|
91
95
|
// Annotations
|
|
92
96
|
//
|
|
93
97
|
|
|
94
|
-
export const Annotations = {
|
|
98
|
+
export const Annotations: Story = {
|
|
95
99
|
render: () => (
|
|
96
100
|
<EditorStory text={str('# Annotations', '', longText)} extensions={[annotations({ match: /volup/gi })]} />
|
|
97
101
|
),
|
|
@@ -2,28 +2,26 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@
|
|
6
|
-
|
|
7
|
-
import { type StoryObj } from '@storybook/react-vite';
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
8
6
|
import React, { useCallback, useState } from 'react';
|
|
9
7
|
|
|
10
8
|
import { invariant } from '@dxos/invariant';
|
|
11
9
|
import { useThemeContext } from '@dxos/react-ui';
|
|
10
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
12
11
|
import { attentionSurface, mx } from '@dxos/react-ui-theme';
|
|
13
|
-
import { type Meta, withLayout, withTheme } from '@dxos/storybook-utils';
|
|
14
12
|
|
|
15
13
|
import { EditorToolbar, useEditorToolbarState } from '../components';
|
|
16
14
|
import { editorWidth } from '../defaults';
|
|
17
15
|
import {
|
|
18
16
|
InputModeExtensions,
|
|
19
|
-
createMarkdownExtensions,
|
|
20
17
|
createBasicExtensions,
|
|
18
|
+
createMarkdownExtensions,
|
|
21
19
|
createThemeExtensions,
|
|
22
20
|
decorateMarkdown,
|
|
23
21
|
formattingKeymap,
|
|
24
|
-
|
|
22
|
+
formattingListener,
|
|
25
23
|
} from '../extensions';
|
|
26
|
-
import {
|
|
24
|
+
import { type UseTextEditorProps, useTextEditor } from '../hooks';
|
|
27
25
|
import { translations } from '../translations';
|
|
28
26
|
import { type EditorInputMode, type EditorViewMode } from '../types';
|
|
29
27
|
|
|
@@ -33,7 +31,6 @@ const DefaultStory = ({ autoFocus, initialValue, placeholder }: StoryProps) => {
|
|
|
33
31
|
const { themeMode } = useThemeContext();
|
|
34
32
|
const toolbarState = useEditorToolbarState({ viewMode: 'source' });
|
|
35
33
|
const viewMode = toolbarState.viewMode;
|
|
36
|
-
const trackFormatting = useFormattingState(toolbarState);
|
|
37
34
|
// TODO(wittjosiah): Provide way to change the input mode.
|
|
38
35
|
const [editorInputMode, _setEditorInputMode] = useState<EditorInputMode>('default');
|
|
39
36
|
const { parentRef, view } = useTextEditor(
|
|
@@ -43,12 +40,12 @@ const DefaultStory = ({ autoFocus, initialValue, placeholder }: StoryProps) => {
|
|
|
43
40
|
moveToEndOfLine: true,
|
|
44
41
|
extensions: [
|
|
45
42
|
editorInputMode ? InputModeExtensions[editorInputMode] : [],
|
|
46
|
-
createBasicExtensions({ placeholder, lineWrapping: true, readOnly: viewMode === 'readonly' }),
|
|
47
|
-
createMarkdownExtensions(
|
|
43
|
+
createBasicExtensions({ placeholder, lineWrapping: true, readOnly: viewMode === 'readonly', search: true }),
|
|
44
|
+
createMarkdownExtensions(),
|
|
48
45
|
createThemeExtensions({ themeMode, syntaxHighlighting: true }),
|
|
49
46
|
viewMode === 'source' ? [] : decorateMarkdown(),
|
|
50
47
|
formattingKeymap(),
|
|
51
|
-
|
|
48
|
+
formattingListener(() => toolbarState),
|
|
52
49
|
],
|
|
53
50
|
}),
|
|
54
51
|
[editorInputMode, viewMode, themeMode, placeholder],
|
|
@@ -67,7 +64,7 @@ const DefaultStory = ({ autoFocus, initialValue, placeholder }: StoryProps) => {
|
|
|
67
64
|
// Also not sure if view is even guaranteed to exist at this point.
|
|
68
65
|
return (
|
|
69
66
|
<div role='none' className={mx('fixed inset-0 flex flex-col')}>
|
|
70
|
-
{toolbarState && <EditorToolbar state={toolbarState} getView={getView}
|
|
67
|
+
{toolbarState && <EditorToolbar state={toolbarState} getView={getView} onViewModeChange={handleViewModeChange} />}
|
|
71
68
|
<div role='none' className={mx('grow overflow-hidden', attentionSurface)}>
|
|
72
69
|
<div className={mx(editorWidth)} ref={parentRef} />
|
|
73
70
|
</div>
|
|
@@ -75,12 +72,15 @@ const DefaultStory = ({ autoFocus, initialValue, placeholder }: StoryProps) => {
|
|
|
75
72
|
);
|
|
76
73
|
};
|
|
77
74
|
|
|
78
|
-
const meta
|
|
75
|
+
const meta = {
|
|
79
76
|
title: 'ui/react-ui-editor/EditorToolbar',
|
|
80
77
|
render: DefaultStory,
|
|
81
|
-
decorators: [withTheme
|
|
82
|
-
parameters: {
|
|
83
|
-
|
|
78
|
+
decorators: [withTheme],
|
|
79
|
+
parameters: {
|
|
80
|
+
layout: 'fullscreen',
|
|
81
|
+
translations,
|
|
82
|
+
},
|
|
83
|
+
} satisfies Meta<typeof DefaultStory>;
|
|
84
84
|
|
|
85
85
|
export default meta;
|
|
86
86
|
|
|
@@ -90,6 +90,6 @@ export const Default: Story = {
|
|
|
90
90
|
args: {
|
|
91
91
|
autoFocus: true,
|
|
92
92
|
placeholder: 'Text...',
|
|
93
|
-
initialValue: '# Demo\n\nThis is a document
|
|
93
|
+
initialValue: '# Demo\n\nThis is a **document**.\n\n',
|
|
94
94
|
},
|
|
95
95
|
};
|
|
@@ -2,35 +2,39 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@
|
|
6
|
-
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
7
6
|
import defaultsDeep from 'lodash.defaultsdeep';
|
|
8
7
|
import React from 'react';
|
|
9
8
|
|
|
10
9
|
import { log } from '@dxos/log';
|
|
11
10
|
import { faker } from '@dxos/random';
|
|
12
|
-
import {
|
|
11
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
13
12
|
|
|
14
|
-
import {
|
|
15
|
-
import { typewriter, blast, defaultOptions, dropFile } from '../extensions';
|
|
13
|
+
import { blast, defaultOptions, dropFile, typewriter } from '../extensions';
|
|
16
14
|
import { str } from '../testing';
|
|
17
15
|
|
|
18
|
-
|
|
16
|
+
import { EditorStory, content } from './components';
|
|
17
|
+
|
|
18
|
+
const meta = {
|
|
19
19
|
title: 'ui/react-ui-editor/Experimental',
|
|
20
20
|
component: EditorStory,
|
|
21
|
-
decorators: [withTheme
|
|
22
|
-
parameters: {
|
|
23
|
-
|
|
21
|
+
decorators: [withTheme],
|
|
22
|
+
parameters: {
|
|
23
|
+
layout: 'fullscreen',
|
|
24
|
+
},
|
|
25
|
+
} satisfies Meta<typeof EditorStory>;
|
|
24
26
|
|
|
25
27
|
export default meta;
|
|
26
28
|
|
|
29
|
+
type Story = StoryObj<typeof meta>;
|
|
30
|
+
|
|
27
31
|
//
|
|
28
32
|
// Typewriter
|
|
29
33
|
//
|
|
30
34
|
|
|
31
|
-
const typewriterItems = localStorage.getItem('dxos.org/
|
|
35
|
+
const typewriterItems = localStorage.getItem('dxos.org/testing/typewriter')?.split(',');
|
|
32
36
|
|
|
33
|
-
export const Typewriter = {
|
|
37
|
+
export const Typewriter: Story = {
|
|
34
38
|
render: () => (
|
|
35
39
|
<EditorStory
|
|
36
40
|
text={str('# Typewriter', '', content.paragraphs, content.footer)}
|
|
@@ -43,7 +47,7 @@ export const Typewriter = {
|
|
|
43
47
|
// Blast
|
|
44
48
|
//
|
|
45
49
|
|
|
46
|
-
export const Blast = {
|
|
50
|
+
export const Blast: Story = {
|
|
47
51
|
render: () => (
|
|
48
52
|
<EditorStory
|
|
49
53
|
text={str('# Blast', '', content.paragraphs, content.codeblocks, content.paragraphs)}
|
|
@@ -70,7 +74,7 @@ export const Blast = {
|
|
|
70
74
|
// DND
|
|
71
75
|
//
|
|
72
76
|
|
|
73
|
-
export const DND = {
|
|
77
|
+
export const DND: Story = {
|
|
74
78
|
render: () => (
|
|
75
79
|
<EditorStory
|
|
76
80
|
text={str('# DND', '')}
|
|
@@ -2,35 +2,39 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@dxos-theme';
|
|
6
|
-
|
|
7
5
|
import { markdown } from '@codemirror/lang-markdown';
|
|
6
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
8
7
|
import React from 'react';
|
|
9
8
|
|
|
10
|
-
import {
|
|
9
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
11
10
|
|
|
12
|
-
import { EditorStory, content, defaultExtensions, headings, renderLinkTooltip, text } from './components';
|
|
13
11
|
import { decorateMarkdown, image, linkTooltip, table } from '../extensions';
|
|
14
12
|
import { str } from '../testing';
|
|
15
13
|
|
|
16
|
-
|
|
14
|
+
import { EditorStory, content, defaultExtensions, headings, renderLinkTooltip, text } from './components';
|
|
15
|
+
|
|
16
|
+
const meta = {
|
|
17
17
|
title: 'ui/react-ui-editor/Markdown',
|
|
18
18
|
component: EditorStory,
|
|
19
|
-
decorators: [withTheme
|
|
20
|
-
parameters: {
|
|
21
|
-
|
|
19
|
+
decorators: [withTheme],
|
|
20
|
+
parameters: {
|
|
21
|
+
layout: 'fullscreen',
|
|
22
|
+
},
|
|
23
|
+
} satisfies Meta<typeof EditorStory>;
|
|
22
24
|
|
|
23
25
|
export default meta;
|
|
24
26
|
|
|
27
|
+
type Story = StoryObj<typeof meta>;
|
|
28
|
+
|
|
25
29
|
//
|
|
26
30
|
// Default
|
|
27
31
|
//
|
|
28
32
|
|
|
29
|
-
export const Default = {
|
|
33
|
+
export const Default: Story = {
|
|
30
34
|
render: () => <EditorStory text={text} extensions={defaultExtensions} />,
|
|
31
35
|
};
|
|
32
36
|
|
|
33
|
-
export const Blockquote = {
|
|
37
|
+
export const Blockquote: Story = {
|
|
34
38
|
render: () => (
|
|
35
39
|
<EditorStory
|
|
36
40
|
text={str('> Blockquote', 'continuation', content.footer)}
|
|
@@ -40,23 +44,23 @@ export const Blockquote = {
|
|
|
40
44
|
),
|
|
41
45
|
};
|
|
42
46
|
|
|
43
|
-
export const Headings = {
|
|
47
|
+
export const Headings: Story = {
|
|
44
48
|
render: () => <EditorStory text={headings} extensions={decorateMarkdown({ numberedHeadings: { from: 2, to: 4 } })} />,
|
|
45
49
|
};
|
|
46
50
|
|
|
47
|
-
export const Links = {
|
|
51
|
+
export const Links: Story = {
|
|
48
52
|
render: () => <EditorStory text={str(content.links, content.footer)} extensions={[linkTooltip(renderLinkTooltip)]} />,
|
|
49
53
|
};
|
|
50
54
|
|
|
51
|
-
export const Image = {
|
|
55
|
+
export const Image: Story = {
|
|
52
56
|
render: () => <EditorStory text={str(content.image, content.footer)} extensions={[image()]} />,
|
|
53
57
|
};
|
|
54
58
|
|
|
55
|
-
export const Code = {
|
|
59
|
+
export const Code: Story = {
|
|
56
60
|
render: () => <EditorStory text={str(content.codeblocks, content.footer)} extensions={[decorateMarkdown()]} />,
|
|
57
61
|
};
|
|
58
62
|
|
|
59
|
-
export const Lists = {
|
|
63
|
+
export const Lists: Story = {
|
|
60
64
|
render: () => (
|
|
61
65
|
<EditorStory
|
|
62
66
|
text={str(content.tasks, '', content.bullets, '', content.numbered, content.footer)}
|
|
@@ -69,7 +73,7 @@ export const Lists = {
|
|
|
69
73
|
// Bullet List
|
|
70
74
|
//
|
|
71
75
|
|
|
72
|
-
export const BulletList = {
|
|
76
|
+
export const BulletList: Story = {
|
|
73
77
|
render: () => <EditorStory text={str(content.bullets, content.footer)} extensions={[decorateMarkdown()]} />,
|
|
74
78
|
};
|
|
75
79
|
|
|
@@ -77,7 +81,7 @@ export const BulletList = {
|
|
|
77
81
|
// Ordered List
|
|
78
82
|
//
|
|
79
83
|
|
|
80
|
-
export const OrderedList = {
|
|
84
|
+
export const OrderedList: Story = {
|
|
81
85
|
render: () => <EditorStory text={str(content.numbered, content.footer)} extensions={[decorateMarkdown()]} />,
|
|
82
86
|
};
|
|
83
87
|
|
|
@@ -85,13 +89,13 @@ export const OrderedList = {
|
|
|
85
89
|
// Task List
|
|
86
90
|
//
|
|
87
91
|
|
|
88
|
-
export const TaskList = {
|
|
92
|
+
export const TaskList: Story = {
|
|
89
93
|
render: () => (
|
|
90
94
|
<EditorStory text={str(content.tasks, content.footer)} extensions={[decorateMarkdown()]} debug='raw+tree' />
|
|
91
95
|
),
|
|
92
96
|
};
|
|
93
97
|
|
|
94
|
-
export const TaskListEmpty = {
|
|
98
|
+
export const TaskListEmpty: Story = {
|
|
95
99
|
render: () => <EditorStory text={str('- [ ] ')} extensions={[decorateMarkdown()]} debug='raw+tree' />,
|
|
96
100
|
};
|
|
97
101
|
|
|
@@ -99,7 +103,7 @@ export const TaskListEmpty = {
|
|
|
99
103
|
// Table
|
|
100
104
|
//
|
|
101
105
|
|
|
102
|
-
export const Table = {
|
|
106
|
+
export const Table: Story = {
|
|
103
107
|
render: () => <EditorStory text={str(content.table, content.footer)} extensions={[decorateMarkdown(), table()]} />,
|
|
104
108
|
};
|
|
105
109
|
|
|
@@ -107,7 +111,7 @@ export const Table = {
|
|
|
107
111
|
// Commented out
|
|
108
112
|
//
|
|
109
113
|
|
|
110
|
-
export const CommentedOut = {
|
|
114
|
+
export const CommentedOut: Story = {
|
|
111
115
|
render: () => (
|
|
112
116
|
<EditorStory
|
|
113
117
|
text={str('# Commented out', '', content.comment, content.footer)}
|