@dxos/react-ui-editor 0.8.4-main.5ea62a8 → 0.8.4-main.72ec0f3
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 +5006 -3698
- 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 +5006 -3698
- 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/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 +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 +20 -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/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 +11 -11
- 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/bundle.d.ts +6 -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 +1 -3
- package/dist/types/src/extensions/markdown/formatting.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/tree.d.ts +1 -1
- 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/{Command.stories.d.ts → CommandDialog.stories.d.ts} +2 -3
- package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
- package/dist/types/src/stories/Comments.stories.d.ts +3 -4
- package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
- package/dist/types/src/stories/EditorToolbar.stories.d.ts +1 -2
- package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Experimental.stories.d.ts +3 -4
- package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Markdown.stories.d.ts +3 -4
- package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Outliner.stories.d.ts +0 -1
- 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 -6
- package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
- package/dist/types/src/stories/Preview.stories.d.ts +4 -4
- 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 +3 -5
- package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
- package/dist/types/src/stories/components/EditorStory.d.ts +7 -5
- 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/types/types.d.ts +2 -2
- package/dist/types/src/types/types.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 +68 -66
- 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 +101 -91
- 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/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 +21 -17
- package/src/extensions/{command → autocomplete}/typeahead.ts +6 -48
- package/src/extensions/automerge/automerge.stories.tsx +9 -9
- 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 +163 -0
- package/src/extensions/awareness/awareness-provider.ts +2 -2
- package/src/extensions/blocks.ts +131 -0
- package/src/extensions/bookmarks.ts +75 -0
- package/src/extensions/comments.ts +7 -2
- package/src/extensions/factories.ts +50 -32
- 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/bundle.ts +37 -6
- package/src/extensions/markdown/decorate.ts +26 -17
- package/src/extensions/markdown/formatting.ts +8 -10
- package/src/extensions/markdown/highlight.ts +1 -1
- 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/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 +1 -1
- package/src/extensions/outliner/outliner.ts +5 -5
- package/src/extensions/outliner/tree.test.ts +1 -1
- package/src/extensions/outliner/tree.ts +1 -1
- 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 +262 -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 +8 -9
- package/src/stories/EditorToolbar.stories.tsx +15 -14
- package/src/stories/Experimental.stories.tsx +7 -7
- package/src/stories/Markdown.stories.tsx +6 -6
- package/src/stories/Outliner.stories.tsx +40 -32
- package/src/stories/Popover.stories.tsx +162 -0
- package/src/stories/Preview.stories.tsx +46 -43
- package/src/stories/Tags.stories.tsx +95 -0
- package/src/stories/TextEditor.stories.tsx +10 -33
- package/src/stories/components/EditorStory.tsx +30 -17
- package/src/stories/components/util.tsx +40 -8
- package/src/styles/markdown.ts +1 -1
- package/src/styles/theme.ts +13 -11
- package/src/types/types.ts +1 -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.map +0 -1
- 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 -3
- package/dist/types/src/testing/util.d.ts.map +0 -1
- package/src/components/EditorToolbar/util.ts +0 -76
- 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 -211
- package/src/extensions/command/command.ts +0 -34
- package/src/extensions/command/hint.ts +0 -103
- package/src/extensions/command/index.ts +0 -10
- package/src/extensions/command/state.ts +0 -90
- package/src/extensions/command/useCommandMenu.ts +0 -119
- package/src/stories/Command.stories.tsx +0 -101
- package/src/stories/CommandMenu.stories.tsx +0 -161
- package/src/testing/index.ts +0 -5
- package/src/testing/util.ts +0 -7
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Extension, Prec, StateEffect, StateField } from '@codemirror/state';
|
|
6
|
+
import { keymap } from '@codemirror/view';
|
|
7
|
+
|
|
8
|
+
type Bookmark = {
|
|
9
|
+
id: string;
|
|
10
|
+
pos: number;
|
|
11
|
+
name: string;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export const addBookmark = StateEffect.define<Bookmark>();
|
|
15
|
+
export const removeBookmark = StateEffect.define<string>();
|
|
16
|
+
export const clearBookmarks = StateEffect.define<void>();
|
|
17
|
+
|
|
18
|
+
export const bookmarks = (): Extension => {
|
|
19
|
+
return [
|
|
20
|
+
bookmarksField,
|
|
21
|
+
Prec.highest(
|
|
22
|
+
keymap.of([
|
|
23
|
+
{
|
|
24
|
+
key: 'Mod-ArrowUp',
|
|
25
|
+
run: (view) => {
|
|
26
|
+
const bookmarks = view.state.field(bookmarksField);
|
|
27
|
+
console.log('up', bookmarks);
|
|
28
|
+
return true;
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
key: 'Mod-ArrowDown',
|
|
33
|
+
run: (view) => {
|
|
34
|
+
const bookmarks = view.state.field(bookmarksField);
|
|
35
|
+
console.log('down', bookmarks);
|
|
36
|
+
return true;
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
]),
|
|
40
|
+
),
|
|
41
|
+
];
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
type BookmarkFieldState = {
|
|
45
|
+
bookmarks: Bookmark[];
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const bookmarksField = StateField.define<BookmarkFieldState>({
|
|
49
|
+
create: (): BookmarkFieldState => ({
|
|
50
|
+
bookmarks: [],
|
|
51
|
+
}),
|
|
52
|
+
|
|
53
|
+
update: (value: BookmarkFieldState, tr): BookmarkFieldState => {
|
|
54
|
+
// Map bookmark positions through document changes.
|
|
55
|
+
let bookmarks = value.bookmarks.map((bookmark) => ({
|
|
56
|
+
...bookmark,
|
|
57
|
+
pos: tr.changes.mapPos(bookmark.pos),
|
|
58
|
+
}));
|
|
59
|
+
|
|
60
|
+
// Process effects.
|
|
61
|
+
for (const effect of tr.effects) {
|
|
62
|
+
if (effect.is(addBookmark)) {
|
|
63
|
+
bookmarks = [...bookmarks, effect.value];
|
|
64
|
+
} else if (effect.is(removeBookmark)) {
|
|
65
|
+
bookmarks = bookmarks.filter((b) => b.id !== effect.value);
|
|
66
|
+
} else if (effect.is(clearBookmarks)) {
|
|
67
|
+
bookmarks = [];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Sort bookmarks by position.
|
|
72
|
+
bookmarks.sort(({ pos: a }, { pos: b }) => a - b);
|
|
73
|
+
return { bookmarks };
|
|
74
|
+
},
|
|
75
|
+
});
|
|
@@ -58,7 +58,11 @@ const setCommentState = StateEffect.define<CommentsState>();
|
|
|
58
58
|
* The ranges are tracked as Automerge cursors from which the absolute indexed ranges can be computed.
|
|
59
59
|
*/
|
|
60
60
|
export const commentsState = StateField.define<CommentsState>({
|
|
61
|
-
create: (state) => ({
|
|
61
|
+
create: (state) => ({
|
|
62
|
+
id: state.facet(documentId),
|
|
63
|
+
comments: [],
|
|
64
|
+
selection: {},
|
|
65
|
+
}),
|
|
62
66
|
update: (value, tr) => {
|
|
63
67
|
for (const effect of tr.effects) {
|
|
64
68
|
// Update selection.
|
|
@@ -100,13 +104,14 @@ export const commentsState = StateField.define<CommentsState>({
|
|
|
100
104
|
const styles = EditorView.theme({
|
|
101
105
|
'.cm-comment, .cm-comment-current': {
|
|
102
106
|
padding: '3px 0',
|
|
107
|
+
color: 'var(--dx-cmCommentText)',
|
|
103
108
|
backgroundColor: 'var(--dx-cmCommentSurface)',
|
|
104
109
|
},
|
|
105
110
|
'.cm-comment > span, .cm-comment-current > span': {
|
|
106
111
|
boxDecorationBreak: 'clone',
|
|
107
112
|
boxShadow: '0 0 1px 3px var(--dx-cmCommentSurface)',
|
|
108
113
|
backgroundColor: 'var(--dx-cmCommentSurface)',
|
|
109
|
-
color: 'var(--dx-
|
|
114
|
+
color: 'var(--dx-cmCommentText)',
|
|
110
115
|
cursor: 'pointer',
|
|
111
116
|
},
|
|
112
117
|
});
|
|
@@ -4,10 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
import { closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete';
|
|
6
6
|
import { defaultKeymap, history, historyKeymap, indentWithTab, standardKeymap } from '@codemirror/commands';
|
|
7
|
-
import {
|
|
7
|
+
import { HighlightStyle, bracketMatching, syntaxHighlighting } from '@codemirror/language';
|
|
8
8
|
import { searchKeymap } from '@codemirror/search';
|
|
9
|
-
import { EditorState, type Extension } from '@codemirror/state';
|
|
10
|
-
import { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';
|
|
9
|
+
import { type ChangeSpec, EditorState, type Extension, type TransactionSpec } from '@codemirror/state';
|
|
11
10
|
import {
|
|
12
11
|
EditorView,
|
|
13
12
|
type KeyBinding,
|
|
@@ -20,16 +19,17 @@ import {
|
|
|
20
19
|
placeholder,
|
|
21
20
|
scrollPastEnd,
|
|
22
21
|
} from '@codemirror/view';
|
|
22
|
+
import { vscodeDarkStyle, vscodeLightStyle } from '@uiw/codemirror-theme-vscode';
|
|
23
23
|
import defaultsDeep from 'lodash.defaultsdeep';
|
|
24
24
|
import merge from 'lodash.merge';
|
|
25
25
|
|
|
26
|
+
import { type DocAccessor, type Space } from '@dxos/client/echo';
|
|
27
|
+
import { type Identity } from '@dxos/client/halo';
|
|
26
28
|
import { generateName } from '@dxos/display-name';
|
|
27
29
|
import { log } from '@dxos/log';
|
|
28
|
-
import { type DocAccessor, type Space } from '@dxos/react-client/echo';
|
|
29
|
-
import { type Identity } from '@dxos/react-client/halo';
|
|
30
30
|
import { type ThemeMode } from '@dxos/react-ui';
|
|
31
31
|
import { type HuePalette } from '@dxos/react-ui-theme';
|
|
32
|
-
import { hexToHue,
|
|
32
|
+
import { hexToHue, isTruthy } from '@dxos/util';
|
|
33
33
|
|
|
34
34
|
import { editorGutter, editorMonospace } from '../defaults';
|
|
35
35
|
import { type ThemeStyles, defaultTheme } from '../styles';
|
|
@@ -42,12 +42,35 @@ import { focus } from './focus';
|
|
|
42
42
|
// Basic
|
|
43
43
|
//
|
|
44
44
|
|
|
45
|
-
export const
|
|
45
|
+
export const filterChars = (chars: RegExp) => {
|
|
46
|
+
return EditorState.transactionFilter.of((transaction) => {
|
|
47
|
+
if (!transaction.docChanged) return transaction;
|
|
48
|
+
|
|
49
|
+
const changes: ChangeSpec[] = [];
|
|
50
|
+
transaction.changes.iterChanges((fromA, toA, fromB, toB, text) => {
|
|
51
|
+
const inserted = text.toString();
|
|
52
|
+
const filtered = inserted.replace(chars, '');
|
|
53
|
+
if (inserted !== filtered) {
|
|
54
|
+
changes.push({
|
|
55
|
+
from: fromB,
|
|
56
|
+
to: toB,
|
|
57
|
+
insert: filtered,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
if (changes.length) {
|
|
63
|
+
return [transaction, { changes, sequential: true } as TransactionSpec];
|
|
64
|
+
}
|
|
65
|
+
return transaction;
|
|
66
|
+
});
|
|
67
|
+
};
|
|
46
68
|
|
|
47
69
|
/**
|
|
48
70
|
* https://codemirror.net/docs/extensions
|
|
49
71
|
* https://github.com/codemirror/basic-setup
|
|
50
72
|
* https://github.com/codemirror/basic-setup/blob/main/src/codemirror.ts
|
|
73
|
+
* https://github.com/codemirror/theme-one-dark
|
|
51
74
|
*/
|
|
52
75
|
export type BasicExtensionsOptions = {
|
|
53
76
|
allowMultipleSelections?: boolean;
|
|
@@ -64,11 +87,11 @@ export type BasicExtensionsOptions = {
|
|
|
64
87
|
lineNumbers?: boolean;
|
|
65
88
|
/** If false then do not set a max-width or side margin on the editor. */
|
|
66
89
|
lineWrapping?: boolean;
|
|
67
|
-
monospace?: boolean;
|
|
68
90
|
placeholder?: string;
|
|
69
91
|
/** If true user cannot edit the text, but they can still select and copy it. */
|
|
70
92
|
readOnly?: boolean;
|
|
71
93
|
search?: boolean;
|
|
94
|
+
/** NOTE: Do not use with stack sections. */
|
|
72
95
|
scrollPastEnd?: boolean;
|
|
73
96
|
standardKeymap?: boolean;
|
|
74
97
|
tabSize?: number;
|
|
@@ -112,7 +135,6 @@ export const createBasicExtensions = (_props?: BasicExtensionsOptions): Extensio
|
|
|
112
135
|
props.history && history(),
|
|
113
136
|
props.lineNumbers && [lineNumbers(), editorGutter],
|
|
114
137
|
props.lineWrapping && EditorView.lineWrapping,
|
|
115
|
-
props.monospace && editorMonospace,
|
|
116
138
|
props.placeholder && placeholder(props.placeholder),
|
|
117
139
|
props.readOnly !== undefined && EditorState.readOnly.of(props.readOnly),
|
|
118
140
|
props.scrollPastEnd && scrollPastEnd(),
|
|
@@ -138,9 +160,9 @@ export const createBasicExtensions = (_props?: BasicExtensionsOptions): Extensio
|
|
|
138
160
|
preventDefault: true,
|
|
139
161
|
run: () => true,
|
|
140
162
|
},
|
|
141
|
-
].filter(
|
|
163
|
+
].filter(isTruthy),
|
|
142
164
|
),
|
|
143
|
-
].filter(
|
|
165
|
+
].filter(isTruthy);
|
|
144
166
|
};
|
|
145
167
|
|
|
146
168
|
//
|
|
@@ -149,6 +171,7 @@ export const createBasicExtensions = (_props?: BasicExtensionsOptions): Extensio
|
|
|
149
171
|
|
|
150
172
|
export type ThemeExtensionsOptions = {
|
|
151
173
|
themeMode?: ThemeMode;
|
|
174
|
+
monospace?: boolean;
|
|
152
175
|
styles?: ThemeStyles;
|
|
153
176
|
syntaxHighlighting?: boolean;
|
|
154
177
|
slots?: {
|
|
@@ -156,9 +179,7 @@ export type ThemeExtensionsOptions = {
|
|
|
156
179
|
className?: string;
|
|
157
180
|
};
|
|
158
181
|
scroll?: {
|
|
159
|
-
|
|
160
|
-
};
|
|
161
|
-
scroller?: {
|
|
182
|
+
// NOTE: Do not apply vertical padding to scroll container.
|
|
162
183
|
className?: string;
|
|
163
184
|
};
|
|
164
185
|
content?: {
|
|
@@ -181,41 +202,39 @@ export const fullWidth: ThemeExtensionsOptions['slots'] = {
|
|
|
181
202
|
|
|
182
203
|
export const defaultThemeSlots = grow;
|
|
183
204
|
|
|
205
|
+
export const defaultStyles = {
|
|
206
|
+
dark: vscodeDarkStyle,
|
|
207
|
+
light: vscodeLightStyle,
|
|
208
|
+
};
|
|
209
|
+
|
|
184
210
|
/**
|
|
185
211
|
* https://codemirror.net/examples/styling
|
|
186
212
|
*/
|
|
187
213
|
export const createThemeExtensions = ({
|
|
188
214
|
themeMode,
|
|
215
|
+
monospace,
|
|
189
216
|
styles,
|
|
190
|
-
syntaxHighlighting:
|
|
191
|
-
slots:
|
|
217
|
+
syntaxHighlighting: syntaxHighlightingProp,
|
|
218
|
+
slots: slotsParam,
|
|
192
219
|
}: ThemeExtensionsOptions = {}): Extension => {
|
|
193
|
-
const slots = defaultsDeep({},
|
|
220
|
+
const slots = defaultsDeep({}, slotsParam, defaultThemeSlots);
|
|
194
221
|
return [
|
|
195
222
|
EditorView.darkTheme.of(themeMode === 'dark'),
|
|
196
223
|
EditorView.baseTheme(styles ? merge({}, defaultTheme, styles) : defaultTheme),
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
(themeMode === 'dark' ?
|
|
224
|
+
monospace && editorMonospace,
|
|
225
|
+
syntaxHighlightingProp &&
|
|
226
|
+
syntaxHighlighting(HighlightStyle.define(themeMode === 'dark' ? defaultStyles.dark : defaultStyles.light)),
|
|
200
227
|
slots.editor?.className && EditorView.editorAttributes.of({ class: slots.editor.className }),
|
|
201
228
|
slots.content?.className && EditorView.contentAttributes.of({ class: slots.content.className }),
|
|
202
229
|
slots.scroll?.className &&
|
|
203
230
|
ViewPlugin.fromClass(
|
|
204
231
|
class {
|
|
205
232
|
constructor(view: EditorView) {
|
|
206
|
-
view.scrollDOM.classList.add(slots.scroll.className);
|
|
233
|
+
view.scrollDOM.classList.add(...slots.scroll.className.split(/\s+/));
|
|
207
234
|
}
|
|
208
235
|
},
|
|
209
236
|
),
|
|
210
|
-
|
|
211
|
-
ViewPlugin.fromClass(
|
|
212
|
-
class {
|
|
213
|
-
constructor(view: EditorView) {
|
|
214
|
-
view.dom.querySelector('.cm-scroller')?.classList.add(...slots.scroller.className.split(' '));
|
|
215
|
-
}
|
|
216
|
-
},
|
|
217
|
-
),
|
|
218
|
-
].filter(isNotFalsy);
|
|
237
|
+
].filter(isTruthy);
|
|
219
238
|
};
|
|
220
239
|
|
|
221
240
|
//
|
|
@@ -239,7 +258,6 @@ export const createDataExtensions = <T>({ id, text, space, identity }: DataExten
|
|
|
239
258
|
if (space && identity) {
|
|
240
259
|
const peerId = identity?.identityKey.toHex();
|
|
241
260
|
const hue = (identity?.profile?.data?.hue as HuePalette | undefined) ?? hexToHue(peerId ?? '0');
|
|
242
|
-
|
|
243
261
|
extensions.push(
|
|
244
262
|
awareness(
|
|
245
263
|
new SpaceAwarenessProvider({
|
|
@@ -247,9 +265,9 @@ export const createDataExtensions = <T>({ id, text, space, identity }: DataExten
|
|
|
247
265
|
channel: `awareness.${id}`,
|
|
248
266
|
peerId: identity.identityKey.toHex(),
|
|
249
267
|
info: {
|
|
250
|
-
displayName: identity.profile?.displayName ?? generateName(identity.identityKey.toHex()),
|
|
251
268
|
darkColor: `var(--dx-${hue}Cursor)`,
|
|
252
269
|
lightColor: `var(--dx-${hue}Cursor)`,
|
|
270
|
+
displayName: identity.profile?.displayName ?? generateName(identity.identityKey.toHex()),
|
|
253
271
|
},
|
|
254
272
|
}),
|
|
255
273
|
),
|
package/src/extensions/focus.ts
CHANGED
|
@@ -15,6 +15,7 @@ export const focusField = StateField.define<boolean>({
|
|
|
15
15
|
return effect.value;
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
|
+
|
|
18
19
|
return value;
|
|
19
20
|
},
|
|
20
21
|
});
|
|
@@ -25,11 +26,11 @@ export const focusField = StateField.define<boolean>({
|
|
|
25
26
|
export const focus = [
|
|
26
27
|
focusField,
|
|
27
28
|
EditorView.domEventHandlers({
|
|
28
|
-
focus: (
|
|
29
|
-
|
|
29
|
+
focus: (_event, view) => {
|
|
30
|
+
requestAnimationFrame(() => view.dispatch({ effects: focusEffect.of(true) }));
|
|
30
31
|
},
|
|
31
|
-
blur: (
|
|
32
|
-
|
|
32
|
+
blur: (_event, view) => {
|
|
33
|
+
requestAnimationFrame(() => view.dispatch({ effects: focusEffect.of(false) }));
|
|
33
34
|
},
|
|
34
35
|
}),
|
|
35
36
|
];
|
|
@@ -7,16 +7,15 @@ import { type Extension } from '@codemirror/state';
|
|
|
7
7
|
import { EditorView } from '@codemirror/view';
|
|
8
8
|
import React from 'react';
|
|
9
9
|
|
|
10
|
-
import { Icon } from '@dxos/react-ui';
|
|
10
|
+
import { Domino, Icon } from '@dxos/react-ui';
|
|
11
11
|
|
|
12
|
-
import {
|
|
12
|
+
import { renderRoot } from '../util';
|
|
13
13
|
|
|
14
14
|
export type FoldingOptions = {};
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* https://codemirror.net/examples/gutter
|
|
18
18
|
*/
|
|
19
|
-
// TODO(burdon): Remember folding state (to state).
|
|
20
19
|
export const folding = (_props: FoldingOptions = {}): Extension => [
|
|
21
20
|
codeFolding({
|
|
22
21
|
placeholderDOM: () => {
|
|
@@ -25,10 +24,8 @@ export const folding = (_props: FoldingOptions = {}): Extension => [
|
|
|
25
24
|
}),
|
|
26
25
|
foldGutter({
|
|
27
26
|
markerDOM: (open) => {
|
|
28
|
-
// TODO(burdon): Use sprite directly.
|
|
29
|
-
const el = createElement('div', { className: 'flex h-full items-center' });
|
|
30
27
|
return renderRoot(
|
|
31
|
-
|
|
28
|
+
Domino.of('div').classNames('flex bs-full items-center').build(),
|
|
32
29
|
<Icon icon='ph--caret-right--bold' size={3} classNames={['mx-3 cursor-pointer', open && 'rotate-90']} />,
|
|
33
30
|
);
|
|
34
31
|
},
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
WidgetType,
|
|
14
14
|
} from '@codemirror/view';
|
|
15
15
|
|
|
16
|
-
import {
|
|
16
|
+
import { getHashStyles, mx } from '@dxos/react-ui-theme';
|
|
17
17
|
|
|
18
18
|
class TagWidget extends WidgetType {
|
|
19
19
|
constructor(private _text: string) {
|
|
@@ -22,7 +22,7 @@ class TagWidget extends WidgetType {
|
|
|
22
22
|
|
|
23
23
|
toDOM(): HTMLSpanElement {
|
|
24
24
|
const span = document.createElement('span');
|
|
25
|
-
span.className = mx('cm-tag',
|
|
25
|
+
span.className = mx('cm-tag', getHashStyles(this._text).surface);
|
|
26
26
|
span.textContent = this._text;
|
|
27
27
|
return span;
|
|
28
28
|
}
|
package/src/extensions/index.ts
CHANGED
|
@@ -4,10 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
export * from './annotations';
|
|
6
6
|
export * from './autocomplete';
|
|
7
|
+
export * from './autoscroll';
|
|
7
8
|
export * from './automerge';
|
|
8
9
|
export * from './awareness';
|
|
9
10
|
export * from './blast';
|
|
10
|
-
export * from './
|
|
11
|
+
export * from './blocks';
|
|
12
|
+
export * from './bookmarks';
|
|
11
13
|
export * from './comments';
|
|
12
14
|
export * from './debug';
|
|
13
15
|
export * from './dnd';
|
|
@@ -19,8 +21,15 @@ export * from './json';
|
|
|
19
21
|
export * from './listener';
|
|
20
22
|
export * from './markdown';
|
|
21
23
|
export * from './mention';
|
|
24
|
+
export * from './modal';
|
|
22
25
|
export * from './modes';
|
|
23
26
|
export * from './outliner';
|
|
24
27
|
export * from './preview';
|
|
28
|
+
export * from './replacer';
|
|
25
29
|
export * from './selection';
|
|
30
|
+
export * from './scrolling';
|
|
31
|
+
export * from './state';
|
|
32
|
+
export * from './submit';
|
|
33
|
+
export * from './tab';
|
|
34
|
+
export * from './tags';
|
|
26
35
|
export * from './typewriter';
|
package/src/extensions/json.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { type LintSource, linter } from '@codemirror/lint';
|
|
|
7
7
|
import { type Extension } from '@codemirror/state';
|
|
8
8
|
import Ajv, { type ValidateFunction } from 'ajv';
|
|
9
9
|
|
|
10
|
-
import { type JsonSchemaType } from '@dxos/echo
|
|
10
|
+
import { type JsonSchemaType } from '@dxos/echo/internal';
|
|
11
11
|
|
|
12
12
|
export type JsonExtensionsOptions = {
|
|
13
13
|
schema?: JsonSchemaType;
|
|
@@ -5,34 +5,28 @@
|
|
|
5
5
|
import { type Extension } from '@codemirror/state';
|
|
6
6
|
import { EditorView } from '@codemirror/view';
|
|
7
7
|
|
|
8
|
+
import { isNonNullable } from '@dxos/util';
|
|
9
|
+
|
|
8
10
|
import { documentId } from './selection';
|
|
9
11
|
|
|
10
12
|
export type ListenerOptions = {
|
|
11
|
-
onFocus?: (focusing: boolean) => void;
|
|
12
|
-
onChange?: (
|
|
13
|
+
onFocus?: (event: { id: string; focusing: boolean }) => void;
|
|
14
|
+
onChange?: (event: { id: string; text: string }) => void;
|
|
13
15
|
};
|
|
14
16
|
|
|
15
|
-
/**
|
|
16
|
-
* Event listener.
|
|
17
|
-
* @deprecated Use EditorView.updateListener and listen for specific update events.
|
|
18
|
-
*/
|
|
19
17
|
export const listener = ({ onFocus, onChange }: ListenerOptions): Extension => {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
EditorView.focusChangeEffect.of((_, focusing) => {
|
|
25
|
-
onFocus(focusing);
|
|
18
|
+
return [
|
|
19
|
+
onFocus &&
|
|
20
|
+
EditorView.focusChangeEffect.of((state, focusing) => {
|
|
21
|
+
onFocus({ id: state.facet(documentId), focusing });
|
|
26
22
|
return null;
|
|
27
23
|
}),
|
|
28
|
-
);
|
|
29
24
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
25
|
+
onChange &&
|
|
26
|
+
EditorView.updateListener.of(({ state, docChanged }) => {
|
|
27
|
+
if (docChanged) {
|
|
28
|
+
onChange({ id: state.facet(documentId), text: state.doc.toString() });
|
|
29
|
+
}
|
|
34
30
|
}),
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
return extensions;
|
|
31
|
+
].filter(isNonNullable);
|
|
38
32
|
};
|
|
@@ -4,22 +4,23 @@
|
|
|
4
4
|
|
|
5
5
|
import { completionKeymap } from '@codemirror/autocomplete';
|
|
6
6
|
import { defaultKeymap, indentWithTab } from '@codemirror/commands';
|
|
7
|
+
import { jsonLanguage } from '@codemirror/lang-json';
|
|
7
8
|
import { markdown, markdownLanguage } from '@codemirror/lang-markdown';
|
|
8
|
-
import {
|
|
9
|
+
import { xml } from '@codemirror/lang-xml';
|
|
10
|
+
import { LanguageDescription, syntaxHighlighting } from '@codemirror/language';
|
|
9
11
|
import { languages } from '@codemirror/language-data';
|
|
10
12
|
import { type Extension } from '@codemirror/state';
|
|
11
13
|
import { keymap } from '@codemirror/view';
|
|
12
14
|
import { type MarkdownConfig } from '@lezer/markdown';
|
|
13
15
|
|
|
14
|
-
import {
|
|
15
|
-
import { isNotFalsy } from '@dxos/util';
|
|
16
|
+
import { isTruthy } from '@dxos/util';
|
|
16
17
|
|
|
17
18
|
import { markdownHighlightStyle, markdownTagsExtensions } from './highlight';
|
|
18
19
|
|
|
19
20
|
export type MarkdownBundleOptions = {
|
|
20
|
-
themeMode?: ThemeMode;
|
|
21
21
|
extensions?: MarkdownConfig[];
|
|
22
22
|
indentWithTab?: boolean;
|
|
23
|
+
setextHeading?: boolean;
|
|
23
24
|
};
|
|
24
25
|
|
|
25
26
|
/**
|
|
@@ -44,6 +45,7 @@ export const createMarkdownExtensions = (options: MarkdownBundleOptions = {}): E
|
|
|
44
45
|
base: markdownLanguage,
|
|
45
46
|
|
|
46
47
|
// Languages for syntax highlighting fenced code blocks.
|
|
48
|
+
defaultCodeLanguage: jsonLanguage,
|
|
47
49
|
codeLanguages: languages,
|
|
48
50
|
|
|
49
51
|
// Don't complete HTML tags.
|
|
@@ -53,7 +55,7 @@ export const createMarkdownExtensions = (options: MarkdownBundleOptions = {}): E
|
|
|
53
55
|
extensions: [
|
|
54
56
|
// GFM provided by default.
|
|
55
57
|
markdownTagsExtensions,
|
|
56
|
-
...(options.extensions ??
|
|
58
|
+
...(options.extensions ?? defaultExtensions()),
|
|
57
59
|
],
|
|
58
60
|
}),
|
|
59
61
|
|
|
@@ -67,8 +69,37 @@ export const createMarkdownExtensions = (options: MarkdownBundleOptions = {}): E
|
|
|
67
69
|
|
|
68
70
|
// https://codemirror.net/docs/ref/#commands.defaultKeymap
|
|
69
71
|
...defaultKeymap,
|
|
72
|
+
|
|
73
|
+
// TODO(burdon): Remove?
|
|
70
74
|
...completionKeymap,
|
|
71
|
-
].filter(
|
|
75
|
+
].filter(isTruthy),
|
|
72
76
|
),
|
|
73
77
|
];
|
|
74
78
|
};
|
|
79
|
+
|
|
80
|
+
const xmlLanguageDesc = LanguageDescription.of({
|
|
81
|
+
name: 'xml',
|
|
82
|
+
alias: ['html', 'xhtml'],
|
|
83
|
+
extensions: ['xml', 'xhtml'],
|
|
84
|
+
load: async () => xml(),
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Default customizations.
|
|
89
|
+
* https://github.com/lezer-parser/markdown/blob/main/src/markdown.ts
|
|
90
|
+
*/
|
|
91
|
+
export const defaultExtensions = (): MarkdownConfig[] => [noSetExtHeading, noHtml];
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Remove SetextHeading (e.g., headings created from "---").
|
|
95
|
+
*/
|
|
96
|
+
const noSetExtHeading: MarkdownConfig = {
|
|
97
|
+
remove: ['SetextHeading'],
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Remove HTML and XML parsing.
|
|
102
|
+
*/
|
|
103
|
+
const noHtml: MarkdownConfig = {
|
|
104
|
+
// remove: ['HTMLBlock', 'HTMLTag'],
|
|
105
|
+
};
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { syntaxTree } from '@codemirror/language';
|
|
6
|
-
import { type EditorState, RangeSetBuilder, StateEffect } from '@codemirror/state';
|
|
6
|
+
import { type EditorState, Prec, RangeSetBuilder, StateEffect } from '@codemirror/state';
|
|
7
7
|
import { Decoration, type DecorationSet, EditorView, ViewPlugin, type ViewUpdate, WidgetType } from '@codemirror/view';
|
|
8
8
|
import { type SyntaxNodeRef } from '@lezer/common';
|
|
9
9
|
|
|
@@ -52,12 +52,12 @@ class LinkButton extends WidgetType {
|
|
|
52
52
|
super();
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
override eq(other: this)
|
|
55
|
+
override eq(other: this) {
|
|
56
56
|
return this.url === other.url;
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
// TODO(burdon): Create icon and link directly without react?
|
|
60
|
-
override toDOM(view: EditorView)
|
|
60
|
+
override toDOM(view: EditorView) {
|
|
61
61
|
const el = document.createElement('span');
|
|
62
62
|
this.render(el, { url: this.url }, view);
|
|
63
63
|
return el;
|
|
@@ -69,11 +69,15 @@ class CheckboxWidget extends WidgetType {
|
|
|
69
69
|
super();
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
override eq(other: this)
|
|
72
|
+
override eq(other: this) {
|
|
73
73
|
return this._checked === other._checked;
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
override
|
|
76
|
+
override ignoreEvent() {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
override toDOM(view: EditorView) {
|
|
77
81
|
const input = document.createElement('input');
|
|
78
82
|
input.className = 'cm-task-checkbox dx-checkbox';
|
|
79
83
|
input.type = 'checkbox';
|
|
@@ -105,10 +109,6 @@ class CheckboxWidget extends WidgetType {
|
|
|
105
109
|
span.appendChild(input);
|
|
106
110
|
return span;
|
|
107
111
|
}
|
|
108
|
-
|
|
109
|
-
override ignoreEvent(): boolean {
|
|
110
|
-
return false;
|
|
111
|
-
}
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
class TextWidget extends WidgetType {
|
|
@@ -234,7 +234,7 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
234
234
|
const mark = node.node.firstChild!;
|
|
235
235
|
if (mark?.name === 'HeaderMark') {
|
|
236
236
|
const { from, to = 6 } = options.numberedHeadings ?? {};
|
|
237
|
-
const text =
|
|
237
|
+
const text = state.sliceDoc(node.from, node.to);
|
|
238
238
|
const len = text.match(/[#\s]+/)![0].length;
|
|
239
239
|
if (!from || level < from || level > to) {
|
|
240
240
|
atomicDeco.add(mark.from, mark.from + len, hide);
|
|
@@ -427,6 +427,9 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
427
427
|
const editing = editingRange(state, node, focus);
|
|
428
428
|
if (urlNode && marks.length >= 2) {
|
|
429
429
|
const url = state.sliceDoc(urlNode.from, urlNode.to);
|
|
430
|
+
if (options.skip?.({ name: 'Link', url })) {
|
|
431
|
+
break;
|
|
432
|
+
}
|
|
430
433
|
if (!editing) {
|
|
431
434
|
atomicDeco.add(node.from, marks[0].to, hide);
|
|
432
435
|
}
|
|
@@ -444,6 +447,7 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
444
447
|
},
|
|
445
448
|
}),
|
|
446
449
|
);
|
|
450
|
+
|
|
447
451
|
if (!editing) {
|
|
448
452
|
atomicDeco.add(
|
|
449
453
|
marks[1].from,
|
|
@@ -494,15 +498,15 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
494
498
|
tree.iterate({
|
|
495
499
|
from,
|
|
496
500
|
to,
|
|
497
|
-
enter: wrapWithCatch(enterNode),
|
|
498
|
-
leave: wrapWithCatch(leaveNode),
|
|
501
|
+
enter: wrapWithCatch(enterNode, 'decorate.enter'),
|
|
502
|
+
leave: wrapWithCatch(leaveNode, 'decorate.leave'),
|
|
499
503
|
});
|
|
500
504
|
}
|
|
501
505
|
} else {
|
|
502
506
|
// NOTE: If line numbering then we must iterate from the start of document.
|
|
503
507
|
tree.iterate({
|
|
504
|
-
enter: wrapWithCatch(enterNode),
|
|
505
|
-
leave: wrapWithCatch(leaveNode),
|
|
508
|
+
enter: wrapWithCatch(enterNode, 'decorate.enter'),
|
|
509
|
+
leave: wrapWithCatch(leaveNode, 'decorate.leave'),
|
|
506
510
|
});
|
|
507
511
|
}
|
|
508
512
|
|
|
@@ -514,15 +518,20 @@ const buildDecorations = (view: EditorView, options: DecorateOptions, focus: boo
|
|
|
514
518
|
|
|
515
519
|
const forceUpdate = StateEffect.define<null>();
|
|
516
520
|
|
|
521
|
+
export type NodeData = { name: 'Link'; url: string } | { name: 'Image'; url: string };
|
|
522
|
+
|
|
517
523
|
export interface DecorateOptions {
|
|
518
524
|
/**
|
|
519
525
|
* Prevents triggering decorations as the cursor moves through the document.
|
|
520
526
|
*/
|
|
521
527
|
selectionChangeDelay?: number;
|
|
522
528
|
numberedHeadings?: { from: number; to?: number };
|
|
523
|
-
renderLinkButton?: RenderCallback<{ url: string }>;
|
|
524
529
|
// TODO(burdon): Additional padding for each line.
|
|
525
530
|
listPaddingLeft?: number;
|
|
531
|
+
// TODO(burdon): Use consistently.
|
|
532
|
+
skip?: (node: NodeData) => boolean;
|
|
533
|
+
// TODO(burdon): Remove.
|
|
534
|
+
renderLinkButton?: RenderCallback<{ url: string }>;
|
|
526
535
|
}
|
|
527
536
|
|
|
528
537
|
export const decorateMarkdown = (options: DecorateOptions = {}) => {
|
|
@@ -578,9 +587,9 @@ export const decorateMarkdown = (options: DecorateOptions = {}) => {
|
|
|
578
587
|
},
|
|
579
588
|
{
|
|
580
589
|
provide: (plugin) => [
|
|
581
|
-
EditorView.
|
|
590
|
+
Prec.low(EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? Decoration.none)),
|
|
582
591
|
EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? Decoration.none),
|
|
583
|
-
EditorView.
|
|
592
|
+
EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? Decoration.none),
|
|
584
593
|
],
|
|
585
594
|
},
|
|
586
595
|
),
|