@dxos/react-ui-editor 0.8.4-main.3a94e84 → 0.8.4-main.3c1ae3b
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 +4541 -2844
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- 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 +4541 -2844
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/types/index.mjs +1 -1
- package/dist/types/src/components/Editor/Editor.d.ts +37 -15
- 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/image.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/search.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/defaults.d.ts +0 -2
- package/dist/types/src/defaults.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 +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 +20 -0
- package/dist/types/src/extensions/autoscroll.d.ts.map +1 -0
- 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 +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 +15 -16
- 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 +10 -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 -4
- 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/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/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/preview/preview.d.ts +8 -8
- 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/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 +97 -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 +5 -9
- 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 +22 -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 +23 -13
- package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Markdown.stories.d.ts +33 -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 +23 -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 +38 -52
- package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
- package/dist/types/src/stories/components/EditorStory.d.ts +15 -12
- 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/markdown.d.ts +1 -1
- package/dist/types/src/styles/markdown.d.ts.map +1 -1
- package/dist/types/src/styles/theme.d.ts +6 -3
- package/dist/types/src/styles/theme.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 +5 -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 +74 -68
- package/src/components/Editor/Editor.stories.tsx +89 -0
- package/src/components/Editor/Editor.tsx +160 -25
- 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 +116 -96
- package/src/components/EditorToolbar/actions.ts +86 -0
- package/src/components/EditorToolbar/blocks.ts +22 -24
- package/src/components/EditorToolbar/formatting.ts +23 -25
- package/src/components/EditorToolbar/headings.ts +17 -9
- package/src/components/EditorToolbar/image.ts +9 -5
- package/src/components/EditorToolbar/index.ts +3 -7
- package/src/components/EditorToolbar/search.ts +9 -5
- package/src/components/EditorToolbar/useEditorToolbar.ts +20 -0
- package/src/components/EditorToolbar/view-mode.ts +12 -6
- package/src/components/index.ts +8 -2
- package/src/defaults.ts +2 -17
- package/src/extensions/autocomplete/autocomplete.ts +151 -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 +34 -26
- 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 +163 -0
- package/src/extensions/awareness/awareness-provider.ts +12 -12
- package/src/extensions/awareness/awareness.ts +2 -2
- package/src/extensions/blocks.ts +131 -0
- package/src/extensions/bookmarks.ts +75 -0
- package/src/extensions/comments.ts +20 -14
- package/src/extensions/dnd.ts +1 -1
- package/src/extensions/factories.ts +64 -46
- package/src/extensions/focus.ts +5 -4
- package/src/extensions/folding.tsx +3 -6
- package/src/extensions/hashtag.tsx +2 -2
- package/src/extensions/index.ts +10 -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 +95 -64
- package/src/extensions/markdown/formatting.test.ts +6 -6
- package/src/extensions/markdown/formatting.ts +11 -13
- package/src/extensions/markdown/highlight.ts +13 -13
- package/src/extensions/markdown/image.ts +5 -6
- package/src/extensions/markdown/link.ts +3 -0
- package/src/extensions/markdown/table.ts +13 -7
- package/src/extensions/mention.ts +1 -1
- package/src/extensions/modal.ts +24 -0
- 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 +8 -7
- package/src/extensions/outliner/selection.ts +1 -1
- package/src/extensions/outliner/tree.test.ts +3 -2
- package/src/extensions/outliner/tree.ts +2 -2
- package/src/extensions/preview/index.ts +1 -1
- package/src/extensions/preview/preview.ts +69 -69
- 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 +3 -3
- 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 +263 -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 +500 -0
- package/src/extensions/tags/xml-util.ts +94 -0
- package/src/extensions/typewriter.ts +1 -1
- package/src/hooks/useTextEditor.ts +31 -43
- package/src/stories/CommandDialog.stories.tsx +83 -0
- package/src/stories/Comments.stories.tsx +17 -14
- package/src/stories/EditorToolbar.stories.tsx +21 -20
- package/src/stories/Experimental.stories.tsx +17 -13
- package/src/stories/Markdown.stories.tsx +26 -22
- package/src/stories/Outliner.stories.tsx +51 -39
- package/src/stories/Popover.stories.tsx +162 -0
- package/src/stories/Preview.stories.tsx +56 -51
- package/src/stories/Tags.stories.tsx +95 -0
- package/src/stories/TextEditor.stories.tsx +43 -67
- package/src/stories/components/EditorStory.tsx +40 -29
- package/src/stories/components/util.tsx +40 -8
- package/src/styles/markdown.ts +2 -2
- package/src/styles/theme.ts +229 -209
- 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 +7 -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/browser/testing/index.mjs +0 -6
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
- package/dist/lib/node-esm/testing/index.mjs +0 -8
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
- 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/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/dist/types/src/testing/index.d.ts +0 -2
- package/dist/types/src/testing/index.d.ts.map +0 -1
- package/dist/types/src/testing/util.d.ts +0 -2
- package/dist/types/src/testing/util.d.ts.map +0 -1
- package/src/components/EditorToolbar/lists.ts +0 -59
- package/src/components/EditorToolbar/util.ts +0 -65
- 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
- package/src/testing/index.ts +0 -5
- package/src/testing/util.ts +0 -5
|
@@ -3,20 +3,21 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { syntaxTree } from '@codemirror/language';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { type EditorState, Prec, RangeSetBuilder, StateEffect } from '@codemirror/state';
|
|
7
|
+
import { Decoration, type DecorationSet, EditorView, ViewPlugin, type ViewUpdate, WidgetType } from '@codemirror/view';
|
|
8
8
|
import { type SyntaxNodeRef } from '@lezer/common';
|
|
9
9
|
|
|
10
10
|
import { invariant } from '@dxos/invariant';
|
|
11
11
|
import { mx } from '@dxos/react-ui-theme';
|
|
12
12
|
|
|
13
|
+
import { type HeadingLevel, markdownTheme } from '../../styles';
|
|
14
|
+
import { type RenderCallback } from '../../types';
|
|
15
|
+
import { wrapWithCatch } from '../../util';
|
|
16
|
+
|
|
13
17
|
import { adjustChanges } from './changes';
|
|
14
18
|
import { image } from './image';
|
|
15
|
-
import {
|
|
19
|
+
import { bulletListIndentationWidth, formattingStyles, orderedListIndentationWidth } from './styles';
|
|
16
20
|
import { table } from './table';
|
|
17
|
-
import { theme, type HeadingLevel } from '../../styles';
|
|
18
|
-
import { type RenderCallback } from '../../types';
|
|
19
|
-
import { wrapWithCatch } from '../../util';
|
|
20
21
|
|
|
21
22
|
/**
|
|
22
23
|
* Unicode characters.
|
|
@@ -51,12 +52,12 @@ class LinkButton extends WidgetType {
|
|
|
51
52
|
super();
|
|
52
53
|
}
|
|
53
54
|
|
|
54
|
-
override eq(other: this)
|
|
55
|
+
override eq(other: this) {
|
|
55
56
|
return this.url === other.url;
|
|
56
57
|
}
|
|
57
58
|
|
|
58
59
|
// TODO(burdon): Create icon and link directly without react?
|
|
59
|
-
override toDOM(view: EditorView)
|
|
60
|
+
override toDOM(view: EditorView) {
|
|
60
61
|
const el = document.createElement('span');
|
|
61
62
|
this.render(el, { url: this.url }, view);
|
|
62
63
|
return el;
|
|
@@ -68,11 +69,15 @@ class CheckboxWidget extends WidgetType {
|
|
|
68
69
|
super();
|
|
69
70
|
}
|
|
70
71
|
|
|
71
|
-
override eq(other: this)
|
|
72
|
+
override eq(other: this) {
|
|
72
73
|
return this._checked === other._checked;
|
|
73
74
|
}
|
|
74
75
|
|
|
75
|
-
override
|
|
76
|
+
override ignoreEvent() {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
override toDOM(view: EditorView) {
|
|
76
81
|
const input = document.createElement('input');
|
|
77
82
|
input.className = 'cm-task-checkbox dx-checkbox';
|
|
78
83
|
input.type = 'checkbox';
|
|
@@ -104,10 +109,6 @@ class CheckboxWidget extends WidgetType {
|
|
|
104
109
|
span.appendChild(input);
|
|
105
110
|
return span;
|
|
106
111
|
}
|
|
107
|
-
|
|
108
|
-
override ignoreEvent(): boolean {
|
|
109
|
-
return false;
|
|
110
|
-
}
|
|
111
112
|
}
|
|
112
113
|
|
|
113
114
|
class TextWidget extends WidgetType {
|
|
@@ -168,8 +169,8 @@ const autoHideTags = new Set([
|
|
|
168
169
|
type NumberingLevel = { type: string; from: number; to: number; level: number; number: number };
|
|
169
170
|
|
|
170
171
|
const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boolean) => {
|
|
171
|
-
const deco =
|
|
172
|
-
const
|
|
172
|
+
const decoRanges: { from: number; to: number; deco: Decoration }[] = [];
|
|
173
|
+
const atomicDecoRanges: { from: number; to: number; deco: Decoration }[] = [];
|
|
173
174
|
const { state } = view;
|
|
174
175
|
|
|
175
176
|
// Header numbering.
|
|
@@ -233,10 +234,10 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
233
234
|
const mark = node.node.firstChild!;
|
|
234
235
|
if (mark?.name === 'HeaderMark') {
|
|
235
236
|
const { from, to = 6 } = options.numberedHeadings ?? {};
|
|
236
|
-
const text =
|
|
237
|
+
const text = state.sliceDoc(node.from, node.to);
|
|
237
238
|
const len = text.match(/[#\s]+/)![0].length;
|
|
238
239
|
if (!from || level < from || level > to) {
|
|
239
|
-
|
|
240
|
+
atomicDecoRanges.push({ from: mark.from, to: mark.from + len, deco: hide });
|
|
240
241
|
} else {
|
|
241
242
|
// TODO(burdon): Number format/style.
|
|
242
243
|
const num =
|
|
@@ -246,13 +247,13 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
246
247
|
.join('.') + ' ';
|
|
247
248
|
|
|
248
249
|
if (num.length) {
|
|
249
|
-
|
|
250
|
-
mark.from,
|
|
251
|
-
mark.from + len,
|
|
252
|
-
Decoration.replace({
|
|
253
|
-
widget: new TextWidget(num,
|
|
250
|
+
atomicDecoRanges.push({
|
|
251
|
+
from: mark.from,
|
|
252
|
+
to: mark.from + len,
|
|
253
|
+
deco: Decoration.replace({
|
|
254
|
+
widget: new TextWidget(num, markdownTheme.heading(level)),
|
|
254
255
|
}),
|
|
255
|
-
);
|
|
256
|
+
});
|
|
256
257
|
}
|
|
257
258
|
}
|
|
258
259
|
}
|
|
@@ -285,16 +286,16 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
285
286
|
|
|
286
287
|
// Add line decoration for the continuation indent.
|
|
287
288
|
// TODO(burdon): Bug if indentation is more than one indentation unit (e.g., 4 spaces) from the previous line.
|
|
288
|
-
|
|
289
|
-
line.from,
|
|
290
|
-
line.from,
|
|
291
|
-
Decoration.line({
|
|
289
|
+
decoRanges.push({
|
|
290
|
+
from: line.from,
|
|
291
|
+
to: line.from,
|
|
292
|
+
deco: Decoration.line({
|
|
292
293
|
class: 'cm-list-item',
|
|
293
294
|
attributes: {
|
|
294
295
|
style: `padding-left: ${offset}px; text-indent: -${width}px;`,
|
|
295
296
|
},
|
|
296
297
|
}),
|
|
297
|
-
);
|
|
298
|
+
});
|
|
298
299
|
|
|
299
300
|
break;
|
|
300
301
|
}
|
|
@@ -313,16 +314,16 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
313
314
|
const label = list.type === 'OrderedList' ? `${++list.number}.` : Unicode.bulletSmall;
|
|
314
315
|
const line = state.doc.lineAt(node.from);
|
|
315
316
|
const to = state.doc.sliceString(node.to, node.to + 1) === ' ' ? node.to + 1 : node.to;
|
|
316
|
-
|
|
317
|
-
line.from,
|
|
317
|
+
atomicDecoRanges.push({
|
|
318
|
+
from: line.from,
|
|
318
319
|
to,
|
|
319
|
-
Decoration.replace({
|
|
320
|
+
deco: Decoration.replace({
|
|
320
321
|
widget: new TextWidget(
|
|
321
322
|
label,
|
|
322
323
|
list.type === 'OrderedList' ? 'cm-list-mark cm-list-mark-ordered' : 'cm-list-mark cm-list-mark-bullet',
|
|
323
324
|
),
|
|
324
325
|
}),
|
|
325
|
-
);
|
|
326
|
+
});
|
|
326
327
|
break;
|
|
327
328
|
}
|
|
328
329
|
|
|
@@ -331,7 +332,7 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
331
332
|
// Check if the next character is a space and if so, include it in the replacement.
|
|
332
333
|
const line = state.doc.lineAt(node.from);
|
|
333
334
|
const to = state.doc.sliceString(node.to, node.to + 1) === ' ' ? node.to + 1 : node.to;
|
|
334
|
-
|
|
335
|
+
atomicDecoRanges.push({ from: line.from, to, deco: checked ? checkedTask : uncheckedTask });
|
|
335
336
|
break;
|
|
336
337
|
}
|
|
337
338
|
|
|
@@ -344,7 +345,7 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
344
345
|
const quoteMark = node.node.getChild('QuoteMark');
|
|
345
346
|
const paragraph = node.node.getChild('Paragraph');
|
|
346
347
|
if (!editing && quoteMark && paragraph) {
|
|
347
|
-
|
|
348
|
+
atomicDecoRanges.push({ from: quoteMark.from, to: paragraph.from, deco: hide });
|
|
348
349
|
}
|
|
349
350
|
|
|
350
351
|
for (const block of view.viewportLineBlocks) {
|
|
@@ -355,7 +356,7 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
355
356
|
break;
|
|
356
357
|
}
|
|
357
358
|
|
|
358
|
-
|
|
359
|
+
decoRanges.push({ from: block.from, to: block.from, deco: blockQuote });
|
|
359
360
|
}
|
|
360
361
|
|
|
361
362
|
break;
|
|
@@ -378,14 +379,14 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
378
379
|
const isFirst = block.from <= node.from;
|
|
379
380
|
const isLast = block.to >= node.to && /^(\s>)*-->$/.test(state.doc.sliceString(block.from, block.to));
|
|
380
381
|
|
|
381
|
-
|
|
382
|
-
block.from,
|
|
383
|
-
block.from,
|
|
384
|
-
isFirst ? commentBlockLineFirst : isLast ? commentBlockLineLast : commentBlockLine,
|
|
385
|
-
);
|
|
382
|
+
decoRanges.push({
|
|
383
|
+
from: block.from,
|
|
384
|
+
to: block.from,
|
|
385
|
+
deco: isFirst ? commentBlockLineFirst : isLast ? commentBlockLineLast : commentBlockLine,
|
|
386
|
+
});
|
|
386
387
|
|
|
387
388
|
if (!editing && (isFirst || isLast)) {
|
|
388
|
-
|
|
389
|
+
atomicDecoRanges.push({ from: block.from, to: block.to, deco: hide });
|
|
389
390
|
}
|
|
390
391
|
}
|
|
391
392
|
break;
|
|
@@ -406,11 +407,15 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
406
407
|
|
|
407
408
|
const first = block.from <= node.from;
|
|
408
409
|
const last = block.to >= node.to && /```$/.test(state.doc.sliceString(block.from, block.to));
|
|
409
|
-
|
|
410
|
+
decoRanges.push({
|
|
411
|
+
from: block.from,
|
|
412
|
+
to: block.from,
|
|
413
|
+
deco: first ? fencedCodeLineFirst : last ? fencedCodeLineLast : fencedCodeLine,
|
|
414
|
+
});
|
|
410
415
|
|
|
411
416
|
const editing = editingRange(state, node, focus);
|
|
412
417
|
if (!editing && (first || last)) {
|
|
413
|
-
|
|
418
|
+
atomicDecoRanges.push({ from: block.from, to: block.to, deco: hide });
|
|
414
419
|
}
|
|
415
420
|
}
|
|
416
421
|
return false;
|
|
@@ -426,14 +431,17 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
426
431
|
const editing = editingRange(state, node, focus);
|
|
427
432
|
if (urlNode && marks.length >= 2) {
|
|
428
433
|
const url = state.sliceDoc(urlNode.from, urlNode.to);
|
|
434
|
+
if (options.skip?.({ name: 'Link', url })) {
|
|
435
|
+
break;
|
|
436
|
+
}
|
|
429
437
|
if (!editing) {
|
|
430
|
-
|
|
438
|
+
atomicDecoRanges.push({ from: node.from, to: marks[0].to, deco: hide });
|
|
431
439
|
}
|
|
432
440
|
|
|
433
|
-
|
|
434
|
-
marks[0].to,
|
|
435
|
-
marks[1].from,
|
|
436
|
-
Decoration.mark({
|
|
441
|
+
decoRanges.push({
|
|
442
|
+
from: marks[0].to,
|
|
443
|
+
to: marks[1].from,
|
|
444
|
+
deco: Decoration.mark({
|
|
437
445
|
tagName: 'a',
|
|
438
446
|
attributes: {
|
|
439
447
|
class: 'cm-link',
|
|
@@ -442,15 +450,16 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
442
450
|
target: '_blank',
|
|
443
451
|
},
|
|
444
452
|
}),
|
|
445
|
-
);
|
|
453
|
+
});
|
|
454
|
+
|
|
446
455
|
if (!editing) {
|
|
447
|
-
|
|
448
|
-
marks[1].from,
|
|
449
|
-
node.to,
|
|
450
|
-
options.renderLinkButton
|
|
456
|
+
atomicDecoRanges.push({
|
|
457
|
+
from: marks[1].from,
|
|
458
|
+
to: node.to,
|
|
459
|
+
deco: options.renderLinkButton
|
|
451
460
|
? Decoration.replace({ widget: new LinkButton(url, options.renderLinkButton) })
|
|
452
461
|
: hide,
|
|
453
|
-
);
|
|
462
|
+
});
|
|
454
463
|
}
|
|
455
464
|
}
|
|
456
465
|
break;
|
|
@@ -462,7 +471,7 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
462
471
|
|
|
463
472
|
case 'HorizontalRule': {
|
|
464
473
|
if (!editingRange(state, node, focus)) {
|
|
465
|
-
|
|
474
|
+
decoRanges.push({ from: node.from, to: node.to, deco: horizontalRule });
|
|
466
475
|
}
|
|
467
476
|
break;
|
|
468
477
|
}
|
|
@@ -470,7 +479,7 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
470
479
|
default: {
|
|
471
480
|
if (autoHideTags.has(node.name)) {
|
|
472
481
|
if (!editingRange(state, node.node.parent!, focus)) {
|
|
473
|
-
|
|
482
|
+
atomicDecoRanges.push({ from: node.from, to: node.to, deco: hide });
|
|
474
483
|
}
|
|
475
484
|
}
|
|
476
485
|
}
|
|
@@ -493,18 +502,35 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
493
502
|
tree.iterate({
|
|
494
503
|
from,
|
|
495
504
|
to,
|
|
496
|
-
enter: wrapWithCatch(enterNode),
|
|
497
|
-
leave: wrapWithCatch(leaveNode),
|
|
505
|
+
enter: wrapWithCatch(enterNode, 'decorate.enter'),
|
|
506
|
+
leave: wrapWithCatch(leaveNode, 'decorate.leave'),
|
|
498
507
|
});
|
|
499
508
|
}
|
|
500
509
|
} else {
|
|
501
510
|
// NOTE: If line numbering then we must iterate from the start of document.
|
|
502
511
|
tree.iterate({
|
|
503
|
-
enter: wrapWithCatch(enterNode),
|
|
504
|
-
leave: wrapWithCatch(leaveNode),
|
|
512
|
+
enter: wrapWithCatch(enterNode, 'decorate.enter'),
|
|
513
|
+
leave: wrapWithCatch(leaveNode, 'decorate.leave'),
|
|
505
514
|
});
|
|
506
515
|
}
|
|
507
516
|
|
|
517
|
+
// Sort and build decoration sets.
|
|
518
|
+
const sortRanges = (a: { from: number; to: number }, b: { from: number; to: number }) =>
|
|
519
|
+
a.from - b.from || a.to - b.to;
|
|
520
|
+
|
|
521
|
+
decoRanges.sort(sortRanges);
|
|
522
|
+
atomicDecoRanges.sort(sortRanges);
|
|
523
|
+
|
|
524
|
+
const deco = new RangeSetBuilder<Decoration>();
|
|
525
|
+
for (const { from, to, deco: d } of decoRanges) {
|
|
526
|
+
deco.add(from, to, d);
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
const atomicDeco = new RangeSetBuilder<Decoration>();
|
|
530
|
+
for (const { from, to, deco: d } of atomicDecoRanges) {
|
|
531
|
+
atomicDeco.add(from, to, d);
|
|
532
|
+
}
|
|
533
|
+
|
|
508
534
|
return {
|
|
509
535
|
deco: deco.finish(),
|
|
510
536
|
atomicDeco: atomicDeco.finish(),
|
|
@@ -513,15 +539,20 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
513
539
|
|
|
514
540
|
const forceUpdate = StateEffect.define<null>();
|
|
515
541
|
|
|
542
|
+
export type NodeData = { name: 'Link'; url: string } | { name: 'Image'; url: string };
|
|
543
|
+
|
|
516
544
|
export interface DecorateOptions {
|
|
517
545
|
/**
|
|
518
546
|
* Prevents triggering decorations as the cursor moves through the document.
|
|
519
547
|
*/
|
|
520
548
|
selectionChangeDelay?: number;
|
|
521
549
|
numberedHeadings?: { from: number; to?: number };
|
|
522
|
-
renderLinkButton?: RenderCallback<{ url: string }>;
|
|
523
550
|
// TODO(burdon): Additional padding for each line.
|
|
524
551
|
listPaddingLeft?: number;
|
|
552
|
+
// TODO(burdon): Use consistently.
|
|
553
|
+
skip?: (node: NodeData) => boolean;
|
|
554
|
+
// TODO(burdon): Remove.
|
|
555
|
+
renderLinkButton?: RenderCallback<{ url: string }>;
|
|
525
556
|
}
|
|
526
557
|
|
|
527
558
|
export const decorateMarkdown = (options: DecorateOptions = {}) => {
|
|
@@ -577,9 +608,9 @@ export const decorateMarkdown = (options: DecorateOptions = {}) => {
|
|
|
577
608
|
},
|
|
578
609
|
{
|
|
579
610
|
provide: (plugin) => [
|
|
580
|
-
EditorView.
|
|
611
|
+
Prec.low(EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? Decoration.none)),
|
|
581
612
|
EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? Decoration.none),
|
|
582
|
-
EditorView.
|
|
613
|
+
EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? Decoration.none),
|
|
583
614
|
],
|
|
584
615
|
},
|
|
585
616
|
),
|
|
@@ -7,21 +7,21 @@ import { EditorState, type StateCommand } from '@codemirror/state';
|
|
|
7
7
|
import { describe, expect, test } from 'vitest';
|
|
8
8
|
|
|
9
9
|
import {
|
|
10
|
+
type Formatting,
|
|
11
|
+
Inline,
|
|
12
|
+
List,
|
|
10
13
|
addBlockquote,
|
|
11
14
|
addCodeblock,
|
|
12
15
|
addLink,
|
|
13
16
|
addList,
|
|
14
17
|
addStyle,
|
|
15
18
|
getFormatting,
|
|
16
|
-
removeStyle,
|
|
17
|
-
removeLink,
|
|
18
|
-
removeList,
|
|
19
19
|
removeBlockquote,
|
|
20
20
|
removeCodeblock,
|
|
21
|
+
removeLink,
|
|
22
|
+
removeList,
|
|
23
|
+
removeStyle,
|
|
21
24
|
setHeading,
|
|
22
|
-
Inline,
|
|
23
|
-
List,
|
|
24
|
-
type Formatting,
|
|
25
25
|
} from './formatting';
|
|
26
26
|
|
|
27
27
|
export const emptyFormatting: Formatting = {
|
|
@@ -7,20 +7,16 @@ import { syntaxTree } from '@codemirror/language';
|
|
|
7
7
|
import {
|
|
8
8
|
type ChangeSpec,
|
|
9
9
|
EditorSelection,
|
|
10
|
-
type Extension,
|
|
11
10
|
type EditorState,
|
|
11
|
+
type Extension,
|
|
12
12
|
type Line,
|
|
13
13
|
type StateCommand,
|
|
14
14
|
type Text,
|
|
15
15
|
} from '@codemirror/state';
|
|
16
|
-
import { EditorView,
|
|
17
|
-
import { type
|
|
18
|
-
import { useCallback, useMemo } from 'react';
|
|
16
|
+
import { EditorView, type ViewUpdate, keymap } from '@codemirror/view';
|
|
17
|
+
import { type SyntaxNode, type SyntaxNodeRef } from '@lezer/common';
|
|
19
18
|
|
|
20
19
|
import { debounceAndThrottle } from '@dxos/async';
|
|
21
|
-
import { type Live } from '@dxos/live-object';
|
|
22
|
-
|
|
23
|
-
import { type EditorToolbarState } from '../../components';
|
|
24
20
|
|
|
25
21
|
// Markdown refs:
|
|
26
22
|
// https://github.github.com/gfm
|
|
@@ -1251,17 +1247,19 @@ export const getFormatting = (state: EditorState): Formatting => {
|
|
|
1251
1247
|
/**
|
|
1252
1248
|
* Hook provides an extension to compute the current formatting state.
|
|
1253
1249
|
*/
|
|
1254
|
-
export const
|
|
1255
|
-
|
|
1250
|
+
export const formattingListener = (stateProvider: () => Formatting | undefined, delay = 100): Extension => {
|
|
1251
|
+
return EditorView.updateListener.of(
|
|
1256
1252
|
debounceAndThrottle((update: ViewUpdate) => {
|
|
1257
1253
|
if (update.docChanged || update.selectionSet) {
|
|
1254
|
+
const state = stateProvider();
|
|
1255
|
+
if (!state) {
|
|
1256
|
+
return;
|
|
1257
|
+
}
|
|
1258
|
+
|
|
1258
1259
|
Object.entries(getFormatting(update.state)).forEach(([key, active]) => {
|
|
1259
1260
|
state[key as keyof Formatting] = active as any;
|
|
1260
1261
|
});
|
|
1261
1262
|
}
|
|
1262
|
-
},
|
|
1263
|
-
[state],
|
|
1263
|
+
}, delay),
|
|
1264
1264
|
);
|
|
1265
|
-
|
|
1266
|
-
return useMemo(() => EditorView.updateListener.of(handleUpdate), [handleUpdate]);
|
|
1267
1265
|
};
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
import { markdownLanguage } from '@codemirror/lang-markdown';
|
|
6
6
|
import { HighlightStyle } from '@codemirror/language';
|
|
7
|
-
import {
|
|
7
|
+
import { Tag, styleTags, tags } from '@lezer/highlight';
|
|
8
8
|
import { type MarkdownConfig, Table } from '@lezer/markdown';
|
|
9
9
|
|
|
10
|
-
import { fontBody,
|
|
10
|
+
import { fontBody, markdownTheme } from '../../styles';
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* Custom tags defined and processed by the GFM lezer extension.
|
|
@@ -114,7 +114,7 @@ export const markdownHighlightStyle = (_options: HighlightOptions = {}) => {
|
|
|
114
114
|
markdownTags.LinkReference,
|
|
115
115
|
markdownTags.ListMark,
|
|
116
116
|
],
|
|
117
|
-
class:
|
|
117
|
+
class: markdownTheme.mark,
|
|
118
118
|
},
|
|
119
119
|
|
|
120
120
|
// Markdown marks.
|
|
@@ -126,7 +126,7 @@ export const markdownHighlightStyle = (_options: HighlightOptions = {}) => {
|
|
|
126
126
|
markdownTags.QuoteMark,
|
|
127
127
|
markdownTags.EmphasisMark,
|
|
128
128
|
],
|
|
129
|
-
class:
|
|
129
|
+
class: markdownTheme.mark,
|
|
130
130
|
},
|
|
131
131
|
|
|
132
132
|
// E.g., code block language (after ```).
|
|
@@ -136,22 +136,22 @@ export const markdownHighlightStyle = (_options: HighlightOptions = {}) => {
|
|
|
136
136
|
tags.function(tags.variableName),
|
|
137
137
|
tags.labelName,
|
|
138
138
|
],
|
|
139
|
-
class:
|
|
139
|
+
class: markdownTheme.codeMark,
|
|
140
140
|
},
|
|
141
141
|
|
|
142
142
|
// Fonts.
|
|
143
143
|
{
|
|
144
|
-
tag: [tags.monospace],
|
|
144
|
+
tag: [tags.monospace, tags.comment],
|
|
145
145
|
class: 'font-mono',
|
|
146
146
|
},
|
|
147
147
|
|
|
148
148
|
// Headings.
|
|
149
|
-
{ tag: tags.heading1, class:
|
|
150
|
-
{ tag: tags.heading2, class:
|
|
151
|
-
{ tag: tags.heading3, class:
|
|
152
|
-
{ tag: tags.heading4, class:
|
|
153
|
-
{ tag: tags.heading5, class:
|
|
154
|
-
{ tag: tags.heading6, class:
|
|
149
|
+
{ tag: tags.heading1, class: markdownTheme.heading(1) },
|
|
150
|
+
{ tag: tags.heading2, class: markdownTheme.heading(2) },
|
|
151
|
+
{ tag: tags.heading3, class: markdownTheme.heading(3) },
|
|
152
|
+
{ tag: tags.heading4, class: markdownTheme.heading(4) },
|
|
153
|
+
{ tag: tags.heading5, class: markdownTheme.heading(5) },
|
|
154
|
+
{ tag: tags.heading6, class: markdownTheme.heading(6) },
|
|
155
155
|
|
|
156
156
|
// Emphasis.
|
|
157
157
|
{ tag: tags.emphasis, class: 'italic' },
|
|
@@ -165,7 +165,7 @@ export const markdownHighlightStyle = (_options: HighlightOptions = {}) => {
|
|
|
165
165
|
// IMPORTANT: Therefore, the fenced code block will use the base editor font unless changed by an extension.
|
|
166
166
|
{
|
|
167
167
|
tag: [markdownTags.CodeText, markdownTags.InlineCode],
|
|
168
|
-
class:
|
|
168
|
+
class: markdownTheme.code,
|
|
169
169
|
},
|
|
170
170
|
|
|
171
171
|
{
|
|
@@ -17,8 +17,7 @@ export const image = (_options: ImageOptions = {}): Extension => {
|
|
|
17
17
|
return [
|
|
18
18
|
StateField.define<DecorationSet>({
|
|
19
19
|
create: (state) => {
|
|
20
|
-
|
|
21
|
-
return Decoration.set(buildDecorations(0, state.doc.length, state));
|
|
20
|
+
return Decoration.set(buildDecorations(state, 0, state.doc.length));
|
|
22
21
|
},
|
|
23
22
|
update: (value: DecorationSet, tr: Transaction) => {
|
|
24
23
|
if (!tr.docChanged && !tr.selection) {
|
|
@@ -43,7 +42,7 @@ export const image = (_options: ImageOptions = {}): Extension => {
|
|
|
43
42
|
filterFrom: from,
|
|
44
43
|
filterTo: to,
|
|
45
44
|
filter: () => false,
|
|
46
|
-
add: buildDecorations(from, to
|
|
45
|
+
add: buildDecorations(tr.state, from, to),
|
|
47
46
|
});
|
|
48
47
|
},
|
|
49
48
|
provide: (field) => EditorView.decorations.from(field),
|
|
@@ -51,7 +50,7 @@ export const image = (_options: ImageOptions = {}): Extension => {
|
|
|
51
50
|
];
|
|
52
51
|
};
|
|
53
52
|
|
|
54
|
-
const buildDecorations = (
|
|
53
|
+
const buildDecorations = (state: EditorState, from: number, to: number) => {
|
|
55
54
|
const decorations: Range<Decoration>[] = [];
|
|
56
55
|
const cursor = state.selection.main.head;
|
|
57
56
|
syntaxTree(state).iterate({
|
|
@@ -99,11 +98,11 @@ class ImageWidget extends WidgetType {
|
|
|
99
98
|
super();
|
|
100
99
|
}
|
|
101
100
|
|
|
102
|
-
override eq(other: this)
|
|
101
|
+
override eq(other: this) {
|
|
103
102
|
return this._url === other._url;
|
|
104
103
|
}
|
|
105
104
|
|
|
106
|
-
override toDOM(view: EditorView)
|
|
105
|
+
override toDOM(view: EditorView) {
|
|
107
106
|
const img = document.createElement('img');
|
|
108
107
|
img.setAttribute('src', this._url);
|
|
109
108
|
img.setAttribute('class', 'cm-image');
|
|
@@ -94,7 +94,13 @@ const update = (state: EditorState, _options: TableOptions) => {
|
|
|
94
94
|
} else {
|
|
95
95
|
// Add class for styling.
|
|
96
96
|
// TODO(burdon): Apply to each line?
|
|
97
|
-
builder.add(
|
|
97
|
+
builder.add(
|
|
98
|
+
table.from,
|
|
99
|
+
table.to,
|
|
100
|
+
Decoration.mark({
|
|
101
|
+
class: 'cm-table',
|
|
102
|
+
}),
|
|
103
|
+
);
|
|
98
104
|
}
|
|
99
105
|
});
|
|
100
106
|
|
|
@@ -106,14 +112,18 @@ class TableWidget extends WidgetType {
|
|
|
106
112
|
super();
|
|
107
113
|
}
|
|
108
114
|
|
|
109
|
-
override eq(other: this)
|
|
115
|
+
override eq(other: this) {
|
|
110
116
|
return (
|
|
111
117
|
this._table.header?.join() === other._table.header?.join() &&
|
|
112
118
|
this._table.rows?.join() === other._table.rows?.join()
|
|
113
119
|
);
|
|
114
120
|
}
|
|
115
121
|
|
|
116
|
-
override
|
|
122
|
+
override ignoreEvent(e: Event): boolean {
|
|
123
|
+
return !/^mouse/.test(e.type);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
override toDOM(_view: EditorView) {
|
|
117
127
|
const div = document.createElement('div');
|
|
118
128
|
const table = div.appendChild(document.createElement('table'));
|
|
119
129
|
|
|
@@ -137,8 +147,4 @@ class TableWidget extends WidgetType {
|
|
|
137
147
|
|
|
138
148
|
return div;
|
|
139
149
|
}
|
|
140
|
-
|
|
141
|
-
override ignoreEvent(e: Event): boolean {
|
|
142
|
-
return !/^mouse/.test(e.type);
|
|
143
|
-
}
|
|
144
150
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { type CompletionContext, type CompletionResult, autocompletion } from '@codemirror/autocomplete';
|
|
6
6
|
import type { Extension } from '@codemirror/state';
|
|
7
7
|
|
|
8
8
|
import { log } from '@dxos/log';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { StateEffect, StateField } from '@codemirror/state';
|
|
6
|
+
|
|
7
|
+
export const modalStateEffect = StateEffect.define<boolean>();
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Determines if a modal dialog (e.g., popover) is active.
|
|
11
|
+
*/
|
|
12
|
+
export const modalStateField = StateField.define<boolean>({
|
|
13
|
+
create: () => false,
|
|
14
|
+
update: (value, tr) => {
|
|
15
|
+
let newValue = value;
|
|
16
|
+
for (const effect of tr.effects) {
|
|
17
|
+
if (effect.is(modalStateEffect)) {
|
|
18
|
+
newValue = effect.value;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return newValue;
|
|
23
|
+
},
|
|
24
|
+
});
|
package/src/extensions/modes.ts
CHANGED
|
@@ -11,7 +11,7 @@ import { singleValueFacet } from '../util';
|
|
|
11
11
|
|
|
12
12
|
export type EditorInputConfig = {
|
|
13
13
|
type?: string;
|
|
14
|
-
|
|
14
|
+
ignoreEscape?: boolean;
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
export const editorInputMode = singleValueFacet<EditorInputConfig>({});
|
|
@@ -26,7 +26,7 @@ export const InputModeExtensions: { [mode: string]: Extension } = {
|
|
|
26
26
|
vim: [
|
|
27
27
|
// https://github.com/replit/codemirror-vim
|
|
28
28
|
vim(),
|
|
29
|
-
editorInputMode.of({ type: 'vim',
|
|
29
|
+
editorInputMode.of({ type: 'vim', ignoreEscape: true }),
|
|
30
30
|
keymap.of([
|
|
31
31
|
{
|
|
32
32
|
key: 'Alt-Escape',
|