@dxos/ui-editor 0.10.0 → 0.11.0
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/chunk-diff.mjs +935 -0
- package/dist/lib/chunk-diff.mjs.map +1 -0
- package/dist/lib/headless.mjs +2 -0
- package/dist/lib/index.mjs +9937 -0
- package/dist/lib/index.mjs.map +1 -0
- package/dist/lib/types.mjs +18 -0
- package/dist/lib/types.mjs.map +1 -0
- package/dist/types/src/extensions/{bookmarks.d.ts → behavior/bookmarks.d.ts} +3 -0
- package/dist/types/src/extensions/behavior/bookmarks.d.ts.map +1 -0
- package/dist/types/src/extensions/behavior/dnd.d.ts.map +1 -0
- package/dist/types/src/extensions/behavior/index.d.ts +6 -0
- package/dist/types/src/extensions/behavior/index.d.ts.map +1 -0
- package/dist/types/src/extensions/{listener.d.ts → behavior/listener.d.ts} +3 -0
- package/dist/types/src/extensions/behavior/listener.d.ts.map +1 -0
- package/dist/types/src/extensions/{spacing.d.ts → behavior/spacing.d.ts} +3 -0
- package/dist/types/src/extensions/behavior/spacing.d.ts.map +1 -0
- package/dist/types/src/extensions/behavior/submit.d.ts.map +1 -0
- package/dist/types/src/extensions/collab/automerge/automerge.d.ts.map +1 -0
- package/dist/types/src/extensions/collab/automerge/automerge.test.d.ts.map +1 -0
- package/dist/types/src/extensions/{automerge → collab/automerge}/cursor.d.ts +1 -1
- package/dist/types/src/extensions/collab/automerge/cursor.d.ts.map +1 -0
- package/dist/types/src/extensions/{automerge → collab/automerge}/defs.d.ts +3 -1
- package/dist/types/src/extensions/collab/automerge/defs.d.ts.map +1 -0
- package/dist/types/src/extensions/collab/automerge/index.d.ts +3 -0
- package/dist/types/src/extensions/collab/automerge/index.d.ts.map +1 -0
- package/dist/types/src/extensions/collab/automerge/sync.d.ts.map +1 -0
- package/dist/types/src/extensions/{automerge → collab/automerge}/update-automerge.d.ts +4 -0
- package/dist/types/src/extensions/collab/automerge/update-automerge.d.ts.map +1 -0
- package/dist/types/src/extensions/{automerge → collab/automerge}/update-codemirror.d.ts +4 -0
- package/dist/types/src/extensions/collab/automerge/update-codemirror.d.ts.map +1 -0
- package/dist/types/src/extensions/collab/awareness/awareness-provider.d.ts.map +1 -0
- package/dist/types/src/extensions/{awareness → collab/awareness}/awareness.d.ts +4 -1
- package/dist/types/src/extensions/collab/awareness/awareness.d.ts.map +1 -0
- package/dist/types/src/extensions/collab/awareness/index.d.ts.map +1 -0
- package/dist/types/src/extensions/collab/index.d.ts +3 -0
- package/dist/types/src/extensions/collab/index.d.ts.map +1 -0
- package/dist/types/src/extensions/completion/autocomplete.d.ts.map +1 -0
- package/dist/types/src/extensions/{autocomplete → completion}/index.d.ts +1 -0
- package/dist/types/src/extensions/completion/index.d.ts.map +1 -0
- package/dist/types/src/extensions/{autocomplete → completion}/match.d.ts +2 -2
- package/dist/types/src/extensions/completion/match.d.ts.map +1 -0
- package/dist/types/src/extensions/{mention.d.ts → completion/mention.d.ts} +3 -0
- package/dist/types/src/extensions/completion/mention.d.ts.map +1 -0
- package/dist/types/src/extensions/completion/placeholder.d.ts.map +1 -0
- package/dist/types/src/extensions/{autocomplete → completion}/typeahead.d.ts +2 -2
- package/dist/types/src/extensions/completion/typeahead.d.ts.map +1 -0
- package/dist/types/src/extensions/{factories.d.ts → core/factories.d.ts} +23 -2
- package/dist/types/src/extensions/core/factories.d.ts.map +1 -0
- package/dist/types/src/extensions/core/factories.test.d.ts.map +1 -0
- package/dist/types/src/extensions/core/index.d.ts +3 -0
- package/dist/types/src/extensions/core/index.d.ts.map +1 -0
- package/dist/types/src/extensions/{modes.d.ts → core/modes.d.ts} +3 -0
- package/dist/types/src/extensions/core/modes.d.ts.map +1 -0
- package/dist/types/src/extensions/{debug.d.ts → debug/debug.d.ts} +3 -0
- package/dist/types/src/extensions/debug/debug.d.ts.map +1 -0
- package/dist/types/src/extensions/debug/index.d.ts +2 -0
- package/dist/types/src/extensions/debug/index.d.ts.map +1 -0
- package/dist/types/src/extensions/{annotations.d.ts → decoration/annotations.d.ts} +1 -1
- package/dist/types/src/extensions/decoration/annotations.d.ts.map +1 -0
- package/dist/types/src/extensions/decoration/assistant.d.ts +27 -0
- package/dist/types/src/extensions/decoration/assistant.d.ts.map +1 -0
- package/dist/types/src/extensions/decoration/fader.d.ts.map +1 -0
- package/dist/types/src/extensions/decoration/hashtag.d.ts +6 -0
- package/dist/types/src/extensions/decoration/hashtag.d.ts.map +1 -0
- package/dist/types/src/extensions/decoration/index.d.ts +8 -0
- package/dist/types/src/extensions/decoration/index.d.ts.map +1 -0
- package/dist/types/src/extensions/decoration/marker.d.ts.map +1 -0
- package/dist/types/src/extensions/{pos.d.ts → decoration/pos.d.ts} +40 -14
- package/dist/types/src/extensions/decoration/pos.d.ts.map +1 -0
- package/dist/types/src/extensions/decoration/pos.test.d.ts.map +1 -0
- package/dist/types/src/extensions/{replacer.d.ts → decoration/replacer.d.ts} +8 -8
- package/dist/types/src/extensions/decoration/replacer.d.ts.map +1 -0
- package/dist/types/src/extensions/decoration/replacer.test.d.ts.map +1 -0
- package/dist/types/src/extensions/{blast.d.ts → demo/blast.d.ts} +3 -0
- package/dist/types/src/extensions/demo/blast.d.ts.map +1 -0
- package/dist/types/src/extensions/demo/index.d.ts +3 -0
- package/dist/types/src/extensions/demo/index.d.ts.map +1 -0
- package/dist/types/src/extensions/demo/snippets.d.ts.map +1 -0
- package/dist/types/src/extensions/index.d.ts +10 -33
- package/dist/types/src/extensions/index.d.ts.map +1 -1
- package/dist/types/src/extensions/language/index.d.ts +5 -0
- package/dist/types/src/extensions/language/index.d.ts.map +1 -0
- package/dist/types/src/extensions/language/json/index.d.ts +2 -0
- package/dist/types/src/extensions/language/json/index.d.ts.map +1 -0
- package/dist/types/src/extensions/language/json/json.d.ts +12 -0
- package/dist/types/src/extensions/language/json/json.d.ts.map +1 -0
- package/dist/types/src/extensions/language/markdown/action.d.ts.map +1 -0
- package/dist/types/src/extensions/language/markdown/bundle.d.ts.map +1 -0
- package/dist/types/src/extensions/{markdown → language/markdown}/changes.d.ts +1 -1
- package/dist/types/src/extensions/language/markdown/changes.d.ts.map +1 -0
- package/dist/types/src/extensions/language/markdown/changes.test.d.ts.map +1 -0
- package/dist/types/src/extensions/{markdown → language/markdown}/debug.d.ts +3 -0
- package/dist/types/src/extensions/language/markdown/debug.d.ts.map +1 -0
- package/dist/types/src/extensions/{markdown → language/markdown}/decorate.d.ts +5 -1
- package/dist/types/src/extensions/language/markdown/decorate.d.ts.map +1 -0
- package/dist/types/src/extensions/{markdown → language/markdown}/formatting.d.ts +11 -2
- package/dist/types/src/extensions/language/markdown/formatting.d.ts.map +1 -0
- package/dist/types/src/extensions/language/markdown/formatting.test.d.ts.map +1 -0
- package/dist/types/src/extensions/{markdown → language/markdown}/highlight.d.ts +16 -12
- package/dist/types/src/extensions/language/markdown/highlight.d.ts.map +1 -0
- package/dist/types/src/extensions/language/markdown/image.d.ts.map +1 -0
- package/dist/types/src/extensions/language/markdown/image.test.d.ts.map +1 -0
- package/dist/types/src/extensions/language/markdown/index.d.ts.map +1 -0
- package/dist/types/src/extensions/language/markdown/link.d.ts +25 -0
- package/dist/types/src/extensions/language/markdown/link.d.ts.map +1 -0
- package/dist/types/src/extensions/language/markdown/link.test.d.ts +2 -0
- package/dist/types/src/extensions/language/markdown/link.test.d.ts.map +1 -0
- package/dist/types/src/extensions/language/markdown/parser.test.d.ts.map +1 -0
- package/dist/types/src/extensions/{markdown → language/markdown}/styles.d.ts +3 -0
- package/dist/types/src/extensions/language/markdown/styles.d.ts.map +1 -0
- package/dist/types/src/extensions/language/markdown/table.d.ts.map +1 -0
- package/dist/types/src/extensions/language/mermaid/index.d.ts +2 -0
- package/dist/types/src/extensions/language/mermaid/index.d.ts.map +1 -0
- package/dist/types/src/extensions/language/mermaid/mermaid.d.ts +18 -0
- package/dist/types/src/extensions/language/mermaid/mermaid.d.ts.map +1 -0
- package/dist/types/src/extensions/language/xml/extended-markdown.d.ts.map +1 -0
- package/dist/types/src/extensions/language/xml/extended-markdown.test.d.ts.map +1 -0
- package/dist/types/src/extensions/language/xml/index.d.ts.map +1 -0
- package/dist/types/src/extensions/language/xml/stub.d.ts +76 -0
- package/dist/types/src/extensions/language/xml/stub.d.ts.map +1 -0
- package/dist/types/src/extensions/language/xml/widgets/anchor.d.ts.map +1 -0
- package/dist/types/src/extensions/language/xml/widgets/index.d.ts.map +1 -0
- package/dist/types/src/extensions/language/xml/xml-block-decoration.d.ts +48 -0
- package/dist/types/src/extensions/language/xml/xml-block-decoration.d.ts.map +1 -0
- package/dist/types/src/extensions/language/xml/xml-formatting.d.ts.map +1 -0
- package/dist/types/src/extensions/{tags → language/xml}/xml-tags.d.ts +12 -1
- package/dist/types/src/extensions/language/xml/xml-tags.d.ts.map +1 -0
- package/dist/types/src/extensions/language/xml/xml-tags.test.d.ts +2 -0
- package/dist/types/src/extensions/language/xml/xml-tags.test.d.ts.map +1 -0
- package/dist/types/src/extensions/language/xml/xml-util.d.ts.map +1 -0
- package/dist/types/src/extensions/language/xml/xml-util.test.d.ts.map +1 -0
- package/dist/types/src/extensions/review/change-bar.d.ts +29 -0
- package/dist/types/src/extensions/review/change-bar.d.ts.map +1 -0
- package/dist/types/src/extensions/{comments.d.ts → review/comments.d.ts} +56 -38
- package/dist/types/src/extensions/review/comments.d.ts.map +1 -0
- package/dist/types/src/extensions/review/comments.test.d.ts +2 -0
- package/dist/types/src/extensions/review/comments.test.d.ts.map +1 -0
- package/dist/types/src/extensions/review/diff.d.ts +131 -0
- package/dist/types/src/extensions/review/diff.d.ts.map +1 -0
- package/dist/types/src/extensions/review/diff.test.d.ts +2 -0
- package/dist/types/src/extensions/review/diff.test.d.ts.map +1 -0
- package/dist/types/src/extensions/review/index.d.ts +7 -0
- package/dist/types/src/extensions/review/index.d.ts.map +1 -0
- package/dist/types/src/extensions/review/suggest.d.ts +89 -0
- package/dist/types/src/extensions/review/suggest.d.ts.map +1 -0
- package/dist/types/src/extensions/review/suggest.test.d.ts +2 -0
- package/dist/types/src/extensions/review/suggest.test.d.ts.map +1 -0
- package/dist/types/src/extensions/review/suggestions-overlay.d.ts +25 -0
- package/dist/types/src/extensions/review/suggestions-overlay.d.ts.map +1 -0
- package/dist/types/src/extensions/review/suggestions-overlay.test.d.ts +2 -0
- package/dist/types/src/extensions/review/suggestions-overlay.test.d.ts.map +1 -0
- package/dist/types/src/extensions/review/track-changes.d.ts +27 -0
- package/dist/types/src/extensions/review/track-changes.d.ts.map +1 -0
- package/dist/types/src/extensions/review/track-changes.test.d.ts +2 -0
- package/dist/types/src/extensions/review/track-changes.test.d.ts.map +1 -0
- package/dist/types/src/extensions/{busy.d.ts → state/busy.d.ts} +1 -0
- package/dist/types/src/extensions/state/busy.d.ts.map +1 -0
- package/dist/types/src/extensions/{focus.d.ts → state/focus.d.ts} +4 -0
- package/dist/types/src/extensions/state/focus.d.ts.map +1 -0
- package/dist/types/src/extensions/state/index.d.ts +5 -0
- package/dist/types/src/extensions/state/index.d.ts.map +1 -0
- package/dist/types/src/extensions/state/modal.d.ts.map +1 -0
- package/dist/types/src/extensions/{selection.d.ts → state/selection.d.ts} +1 -1
- package/dist/types/src/extensions/state/selection.d.ts.map +1 -0
- package/dist/types/src/extensions/state/selection.test.d.ts.map +1 -0
- package/dist/types/src/extensions/streaming/index.d.ts +4 -0
- package/dist/types/src/extensions/streaming/index.d.ts.map +1 -0
- package/dist/types/src/extensions/streaming/pending/index.d.ts.map +1 -0
- package/dist/types/src/extensions/streaming/pending/pending-text-stream.d.ts.map +1 -0
- package/dist/types/src/extensions/streaming/pending/pending-text-stream.test.d.ts.map +1 -0
- package/dist/types/src/extensions/{pending → streaming/pending}/pending-text.d.ts +1 -0
- package/dist/types/src/extensions/streaming/pending/pending-text.d.ts.map +1 -0
- package/dist/types/src/extensions/streaming/pending/pending-text.test.d.ts.map +1 -0
- package/dist/types/src/extensions/streaming/scrolling/auto-scroll.d.ts.map +1 -0
- package/dist/types/src/extensions/streaming/scrolling/crawler.d.ts.map +1 -0
- package/dist/types/src/extensions/streaming/scrolling/index.d.ts.map +1 -0
- package/dist/types/src/extensions/streaming/scrolling/scroll-past-end.d.ts +4 -0
- package/dist/types/src/extensions/streaming/scrolling/scroll-past-end.d.ts.map +1 -0
- package/dist/types/src/extensions/streaming/scrolling/scrollbar-autohide.d.ts.map +1 -0
- package/dist/types/src/extensions/streaming/scrolling/scroller.d.ts.map +1 -0
- package/dist/types/src/extensions/{typewriter.d.ts → streaming/typewriter.d.ts} +12 -12
- package/dist/types/src/extensions/streaming/typewriter.d.ts.map +1 -0
- package/dist/types/src/extensions/streaming/typewriter.test.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/blocks/blocks.d.ts +52 -0
- package/dist/types/src/extensions/structure/blocks/blocks.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/blocks/blocks.test.d.ts +2 -0
- package/dist/types/src/extensions/structure/blocks/blocks.test.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/blocks/drag.d.ts +57 -0
- package/dist/types/src/extensions/structure/blocks/drag.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/blocks/index.d.ts +5 -0
- package/dist/types/src/extensions/structure/blocks/index.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/blocks/selection.d.ts +47 -0
- package/dist/types/src/extensions/structure/blocks/selection.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/blocks/selection.test.d.ts +2 -0
- package/dist/types/src/extensions/structure/blocks/selection.test.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/blocks/types.d.ts +17 -0
- package/dist/types/src/extensions/structure/blocks/types.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/folding/folding.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/folding/index.d.ts +3 -0
- package/dist/types/src/extensions/structure/folding/index.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/folding/turns.d.ts +55 -0
- package/dist/types/src/extensions/structure/folding/turns.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/folding/turns.test.d.ts +2 -0
- package/dist/types/src/extensions/structure/folding/turns.test.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/index.d.ts +4 -0
- package/dist/types/src/extensions/structure/index.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/outliner/commands.d.ts +31 -0
- package/dist/types/src/extensions/structure/outliner/commands.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/outliner/dnd.d.ts +43 -0
- package/dist/types/src/extensions/structure/outliner/dnd.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/outliner/dnd.test.d.ts +2 -0
- package/dist/types/src/extensions/structure/outliner/dnd.test.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/outliner/editor.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/outliner/editor.test.d.ts.map +1 -0
- package/dist/types/src/extensions/{outliner → structure/outliner}/index.d.ts +1 -0
- package/dist/types/src/extensions/structure/outliner/index.d.ts.map +1 -0
- package/dist/types/src/extensions/{outliner → structure/outliner}/menu.d.ts +1 -0
- package/dist/types/src/extensions/structure/outliner/menu.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/outliner/outliner.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/outliner/outliner.test.d.ts.map +1 -0
- package/dist/types/src/extensions/{outliner → structure/outliner}/tree.d.ts +1 -1
- package/dist/types/src/extensions/structure/outliner/tree.d.ts.map +1 -0
- package/dist/types/src/extensions/structure/outliner/tree.test.d.ts.map +1 -0
- package/dist/types/src/headless.d.ts +4 -0
- package/dist/types/src/headless.d.ts.map +1 -0
- package/dist/types/src/styles/theme.d.ts +1 -1
- package/dist/types/src/styles/theme.d.ts.map +1 -1
- package/dist/types/src/util/util.d.ts +2 -0
- package/dist/types/src/util/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +48 -42
- package/src/defaults.ts +1 -1
- package/src/extensions/{bookmarks.ts → behavior/bookmarks.ts} +24 -14
- package/src/extensions/behavior/index.ts +9 -0
- package/src/extensions/{listener.ts → behavior/listener.ts} +4 -1
- package/src/extensions/{spacing.ts → behavior/spacing.ts} +8 -2
- package/src/extensions/{submit.ts → behavior/submit.ts} +2 -10
- package/src/extensions/{automerge → collab/automerge}/automerge.test.tsx +4 -4
- package/src/extensions/{automerge → collab/automerge}/automerge.ts +7 -4
- package/src/extensions/{automerge → collab/automerge}/cursor.ts +1 -1
- package/src/extensions/{automerge → collab/automerge}/defs.ts +4 -1
- package/src/extensions/{automerge → collab/automerge}/index.ts +1 -0
- package/src/extensions/{automerge → collab/automerge}/sync.ts +1 -2
- package/src/extensions/{automerge → collab/automerge}/update-automerge.ts +4 -0
- package/src/extensions/{automerge → collab/automerge}/update-codemirror.ts +5 -1
- package/src/extensions/{awareness → collab/awareness}/awareness-provider.ts +3 -4
- package/src/extensions/{awareness → collab/awareness}/awareness.ts +19 -16
- package/src/extensions/collab/index.ts +6 -0
- package/src/extensions/{autocomplete → completion}/autocomplete.ts +7 -5
- package/src/extensions/{autocomplete → completion}/index.ts +2 -1
- package/src/extensions/{autocomplete → completion}/match.ts +2 -2
- package/src/extensions/{mention.ts → completion/mention.ts} +3 -0
- package/src/extensions/{autocomplete → completion}/placeholder.ts +1 -1
- package/src/extensions/completion/typeahead.ts +97 -0
- package/src/extensions/{factories.ts → core/factories.ts} +35 -13
- package/src/extensions/core/index.ts +6 -0
- package/src/extensions/{modes.ts → core/modes.ts} +4 -1
- package/src/extensions/{debug.ts → debug/debug.ts} +3 -0
- package/src/extensions/debug/index.ts +5 -0
- package/src/extensions/{annotations.ts → decoration/annotations.ts} +12 -10
- package/src/extensions/decoration/assistant.ts +225 -0
- package/src/extensions/{fader.ts → decoration/fader.ts} +17 -19
- package/src/extensions/{hashtag.ts → decoration/hashtag.ts} +35 -28
- package/src/extensions/decoration/index.ts +11 -0
- package/src/extensions/{marker.ts → decoration/marker.ts} +18 -18
- package/src/extensions/{pos.test.ts → decoration/pos.test.ts} +57 -1
- package/src/extensions/{pos.ts → decoration/pos.ts} +165 -31
- package/src/extensions/{blast.ts → demo/blast.ts} +3 -0
- package/src/extensions/demo/index.ts +6 -0
- package/src/extensions/{snippets.ts → demo/snippets.ts} +5 -1
- package/src/extensions/index.ts +10 -33
- package/src/extensions/language/index.ts +8 -0
- package/src/extensions/language/json/index.ts +5 -0
- package/src/extensions/{json.ts → language/json/json.ts} +11 -6
- package/src/extensions/{markdown → language/markdown}/action.ts +1 -1
- package/src/extensions/{markdown → language/markdown}/bundle.ts +7 -1
- package/src/extensions/{markdown → language/markdown}/changes.test.ts +2 -2
- package/src/extensions/{markdown → language/markdown}/changes.ts +2 -2
- package/src/extensions/{markdown → language/markdown}/debug.ts +3 -0
- package/src/extensions/{markdown → language/markdown}/decorate.ts +96 -85
- package/src/extensions/{markdown → language/markdown}/formatting.test.ts +88 -1
- package/src/extensions/{markdown → language/markdown}/formatting.ts +193 -74
- package/src/extensions/{markdown → language/markdown}/highlight.ts +42 -41
- package/src/extensions/{markdown → language/markdown}/image.test.ts +1 -1
- package/src/extensions/{markdown → language/markdown}/image.ts +6 -6
- package/src/extensions/language/markdown/link.test.ts +58 -0
- package/src/extensions/language/markdown/link.ts +109 -0
- package/src/extensions/{markdown → language/markdown}/parser.test.ts +0 -28
- package/src/extensions/{markdown → language/markdown}/styles.ts +38 -7
- package/src/extensions/{markdown → language/markdown}/table.ts +5 -5
- package/src/extensions/language/mermaid/index.ts +5 -0
- package/src/extensions/language/mermaid/mermaid.ts +44 -0
- package/src/extensions/{tags → language/xml}/DESIGN.md +3 -3
- package/src/extensions/{tags → language/xml}/extended-markdown.test.ts +2 -1
- package/src/extensions/{tags → language/xml}/extended-markdown.ts +2 -4
- package/src/extensions/language/xml/stub.ts +233 -0
- package/src/extensions/language/xml/xml-block-decoration.ts +165 -0
- package/src/extensions/{tags → language/xml}/xml-formatting.ts +54 -38
- package/src/extensions/language/xml/xml-tags.test.ts +588 -0
- package/src/extensions/{tags → language/xml}/xml-tags.ts +165 -66
- package/src/extensions/{tags → language/xml}/xml-util.test.ts +2 -2
- package/src/extensions/review/change-bar.ts +94 -0
- package/src/extensions/review/comments.test.ts +72 -0
- package/src/extensions/{comments.ts → review/comments.ts} +395 -267
- package/src/extensions/review/diff.test.ts +405 -0
- package/src/extensions/review/diff.ts +502 -0
- package/src/extensions/review/index.ts +10 -0
- package/src/extensions/review/suggest.test.ts +170 -0
- package/src/extensions/review/suggest.ts +512 -0
- package/src/extensions/review/suggestions-overlay.test.ts +58 -0
- package/src/extensions/review/suggestions-overlay.ts +50 -0
- package/src/extensions/review/track-changes.test.ts +101 -0
- package/src/extensions/review/track-changes.ts +215 -0
- package/src/extensions/{busy.ts → state/busy.ts} +1 -0
- package/src/extensions/{focus.ts → state/focus.ts} +4 -0
- package/src/extensions/state/index.ts +8 -0
- package/src/extensions/{selection.ts → state/selection.ts} +3 -3
- package/src/extensions/streaming/index.ts +7 -0
- package/src/extensions/{pending → streaming/pending}/pending-text-stream.ts +10 -3
- package/src/extensions/{pending → streaming/pending}/pending-text.test.ts +1 -1
- package/src/extensions/{pending → streaming/pending}/pending-text.ts +20 -19
- package/src/extensions/{scrolling → streaming/scrolling}/auto-scroll.ts +9 -6
- package/src/extensions/{scrolling → streaming/scrolling}/scroll-past-end.ts +1 -0
- package/src/extensions/{scrolling → streaming/scrolling}/scrollbar-autohide.ts +13 -11
- package/src/extensions/{typewriter.ts → streaming/typewriter.ts} +46 -47
- package/src/extensions/structure/blocks/DESIGN.md +134 -0
- package/src/extensions/structure/blocks/blocks.test.ts +147 -0
- package/src/extensions/structure/blocks/blocks.ts +219 -0
- package/src/extensions/structure/blocks/drag.ts +996 -0
- package/src/extensions/structure/blocks/index.ts +8 -0
- package/src/extensions/structure/blocks/selection.test.ts +56 -0
- package/src/extensions/structure/blocks/selection.ts +279 -0
- package/src/extensions/structure/blocks/types.ts +22 -0
- package/src/extensions/{folding.ts → structure/folding/folding.ts} +12 -10
- package/src/extensions/structure/folding/index.ts +6 -0
- package/src/extensions/structure/folding/turns.test.ts +72 -0
- package/src/extensions/structure/folding/turns.ts +209 -0
- package/src/extensions/structure/index.ts +7 -0
- package/src/extensions/structure/outliner/DESIGN.md +183 -0
- package/src/extensions/structure/outliner/SPEC.mdl +305 -0
- package/src/extensions/{outliner → structure/outliner}/commands.ts +125 -42
- package/src/extensions/structure/outliner/dnd.test.ts +142 -0
- package/src/extensions/structure/outliner/dnd.ts +375 -0
- package/src/extensions/structure/outliner/editor.test.ts +85 -0
- package/src/extensions/{outliner → structure/outliner}/editor.ts +14 -9
- package/src/extensions/{outliner → structure/outliner}/index.ts +1 -0
- package/src/extensions/{outliner → structure/outliner}/menu.ts +48 -25
- package/src/extensions/structure/outliner/outliner.test.ts +193 -0
- package/src/extensions/structure/outliner/outliner.ts +183 -0
- package/src/extensions/{outliner → structure/outliner}/tree.test.ts +2 -2
- package/src/extensions/{outliner → structure/outliner}/tree.ts +1 -1
- package/src/headless.ts +13 -0
- package/src/styles/theme.ts +3 -1
- package/src/util/util.ts +3 -0
- package/dist/lib/browser/index.mjs +0 -9594
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/types/index.mjs +0 -33
- package/dist/lib/browser/types/index.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -9596
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/types/index.mjs +0 -35
- package/dist/lib/node-esm/types/index.mjs.map +0 -7
- package/dist/types/src/extensions/annotations.d.ts.map +0 -1
- package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +0 -1
- package/dist/types/src/extensions/autocomplete/index.d.ts.map +0 -1
- package/dist/types/src/extensions/autocomplete/match.d.ts.map +0 -1
- package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +0 -1
- package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +0 -1
- package/dist/types/src/extensions/automerge/automerge.d.ts.map +0 -1
- package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +0 -1
- package/dist/types/src/extensions/automerge/cursor.d.ts.map +0 -1
- package/dist/types/src/extensions/automerge/defs.d.ts.map +0 -1
- package/dist/types/src/extensions/automerge/index.d.ts +0 -2
- package/dist/types/src/extensions/automerge/index.d.ts.map +0 -1
- package/dist/types/src/extensions/automerge/sync.d.ts.map +0 -1
- package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +0 -1
- package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +0 -1
- package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +0 -1
- package/dist/types/src/extensions/awareness/awareness.d.ts.map +0 -1
- package/dist/types/src/extensions/awareness/index.d.ts.map +0 -1
- package/dist/types/src/extensions/blast.d.ts.map +0 -1
- package/dist/types/src/extensions/blocks.d.ts +0 -2
- package/dist/types/src/extensions/blocks.d.ts.map +0 -1
- package/dist/types/src/extensions/bookmarks.d.ts.map +0 -1
- package/dist/types/src/extensions/busy.d.ts.map +0 -1
- package/dist/types/src/extensions/comments.d.ts.map +0 -1
- package/dist/types/src/extensions/debug.d.ts.map +0 -1
- package/dist/types/src/extensions/dnd.d.ts.map +0 -1
- package/dist/types/src/extensions/factories.d.ts.map +0 -1
- package/dist/types/src/extensions/factories.test.d.ts.map +0 -1
- package/dist/types/src/extensions/fader.d.ts.map +0 -1
- package/dist/types/src/extensions/focus.d.ts.map +0 -1
- package/dist/types/src/extensions/folding.d.ts.map +0 -1
- package/dist/types/src/extensions/hashtag.d.ts +0 -3
- package/dist/types/src/extensions/hashtag.d.ts.map +0 -1
- package/dist/types/src/extensions/json.d.ts +0 -7
- package/dist/types/src/extensions/json.d.ts.map +0 -1
- package/dist/types/src/extensions/listener.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/action.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/bundle.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/changes.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/changes.test.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/debug.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/decorate.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/formatting.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/highlight.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/image.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/image.test.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/index.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/link.d.ts +0 -7
- package/dist/types/src/extensions/markdown/link.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/parser.test.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/styles.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/table.d.ts.map +0 -1
- package/dist/types/src/extensions/marker.d.ts.map +0 -1
- package/dist/types/src/extensions/mention.d.ts.map +0 -1
- package/dist/types/src/extensions/modal.d.ts.map +0 -1
- package/dist/types/src/extensions/modes.d.ts.map +0 -1
- package/dist/types/src/extensions/outliner/commands.d.ts +0 -10
- package/dist/types/src/extensions/outliner/commands.d.ts.map +0 -1
- package/dist/types/src/extensions/outliner/editor.d.ts.map +0 -1
- package/dist/types/src/extensions/outliner/editor.test.d.ts.map +0 -1
- package/dist/types/src/extensions/outliner/index.d.ts.map +0 -1
- package/dist/types/src/extensions/outliner/menu.d.ts.map +0 -1
- package/dist/types/src/extensions/outliner/outliner.d.ts.map +0 -1
- package/dist/types/src/extensions/outliner/outliner.test.d.ts.map +0 -1
- package/dist/types/src/extensions/outliner/selection.d.ts +0 -12
- package/dist/types/src/extensions/outliner/selection.d.ts.map +0 -1
- package/dist/types/src/extensions/outliner/tree.d.ts.map +0 -1
- package/dist/types/src/extensions/outliner/tree.test.d.ts.map +0 -1
- package/dist/types/src/extensions/pending/index.d.ts.map +0 -1
- package/dist/types/src/extensions/pending/pending-text-stream.d.ts.map +0 -1
- package/dist/types/src/extensions/pending/pending-text-stream.test.d.ts.map +0 -1
- package/dist/types/src/extensions/pending/pending-text.d.ts.map +0 -1
- package/dist/types/src/extensions/pending/pending-text.test.d.ts.map +0 -1
- package/dist/types/src/extensions/pos.d.ts.map +0 -1
- package/dist/types/src/extensions/pos.test.d.ts.map +0 -1
- package/dist/types/src/extensions/replacer.d.ts.map +0 -1
- package/dist/types/src/extensions/replacer.test.d.ts.map +0 -1
- package/dist/types/src/extensions/scrolling/auto-scroll.d.ts.map +0 -1
- package/dist/types/src/extensions/scrolling/crawler.d.ts.map +0 -1
- package/dist/types/src/extensions/scrolling/index.d.ts.map +0 -1
- package/dist/types/src/extensions/scrolling/scroll-past-end.d.ts +0 -3
- package/dist/types/src/extensions/scrolling/scroll-past-end.d.ts.map +0 -1
- package/dist/types/src/extensions/scrolling/scrollbar-autohide.d.ts.map +0 -1
- package/dist/types/src/extensions/scrolling/scroller.d.ts.map +0 -1
- package/dist/types/src/extensions/selection.d.ts.map +0 -1
- package/dist/types/src/extensions/selection.test.d.ts.map +0 -1
- package/dist/types/src/extensions/snippets.d.ts.map +0 -1
- package/dist/types/src/extensions/spacing.d.ts.map +0 -1
- package/dist/types/src/extensions/state.d.ts +0 -2
- package/dist/types/src/extensions/state.d.ts.map +0 -1
- package/dist/types/src/extensions/submit.d.ts.map +0 -1
- package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +0 -1
- package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +0 -1
- package/dist/types/src/extensions/tags/index.d.ts.map +0 -1
- package/dist/types/src/extensions/tags/stub.d.ts +0 -35
- package/dist/types/src/extensions/tags/stub.d.ts.map +0 -1
- package/dist/types/src/extensions/tags/widgets/anchor.d.ts.map +0 -1
- package/dist/types/src/extensions/tags/widgets/index.d.ts.map +0 -1
- package/dist/types/src/extensions/tags/xml-block-decoration.d.ts +0 -31
- package/dist/types/src/extensions/tags/xml-block-decoration.d.ts.map +0 -1
- package/dist/types/src/extensions/tags/xml-formatting.d.ts.map +0 -1
- package/dist/types/src/extensions/tags/xml-tags.d.ts.map +0 -1
- package/dist/types/src/extensions/tags/xml-util.d.ts.map +0 -1
- package/dist/types/src/extensions/tags/xml-util.test.d.ts.map +0 -1
- package/dist/types/src/extensions/typewriter.d.ts.map +0 -1
- package/dist/types/src/extensions/typewriter.test.d.ts.map +0 -1
- package/src/extensions/autocomplete/typeahead.ts +0 -87
- package/src/extensions/blocks.ts +0 -131
- package/src/extensions/markdown/link.ts +0 -49
- package/src/extensions/outliner/editor.test.ts +0 -33
- package/src/extensions/outliner/outliner.test.ts +0 -99
- package/src/extensions/outliner/outliner.ts +0 -166
- package/src/extensions/outliner/selection.ts +0 -50
- package/src/extensions/state.ts +0 -7
- package/src/extensions/tags/stub.ts +0 -80
- package/src/extensions/tags/xml-block-decoration.ts +0 -123
- package/dist/types/src/extensions/{dnd.d.ts → behavior/dnd.d.ts} +0 -0
- package/dist/types/src/extensions/{submit.d.ts → behavior/submit.d.ts} +0 -0
- package/dist/types/src/extensions/{automerge → collab/automerge}/automerge.d.ts +0 -0
- package/dist/types/src/extensions/{automerge → collab/automerge}/automerge.test.d.ts +0 -0
- package/dist/types/src/extensions/{automerge → collab/automerge}/sync.d.ts +0 -0
- package/dist/types/src/extensions/{awareness → collab/awareness}/awareness-provider.d.ts +0 -0
- package/dist/types/src/extensions/{awareness → collab/awareness}/index.d.ts +0 -0
- package/dist/types/src/extensions/{autocomplete → completion}/autocomplete.d.ts +0 -0
- package/dist/types/src/extensions/{autocomplete → completion}/placeholder.d.ts +0 -0
- package/dist/types/src/extensions/{factories.test.d.ts → core/factories.test.d.ts} +0 -0
- package/dist/types/src/extensions/{fader.d.ts → decoration/fader.d.ts} +0 -0
- package/dist/types/src/extensions/{marker.d.ts → decoration/marker.d.ts} +0 -0
- package/dist/types/src/extensions/{pos.test.d.ts → decoration/pos.test.d.ts} +0 -0
- package/dist/types/src/extensions/{replacer.test.d.ts → decoration/replacer.test.d.ts} +0 -0
- package/dist/types/src/extensions/{snippets.d.ts → demo/snippets.d.ts} +0 -0
- package/dist/types/src/extensions/{markdown → language/markdown}/action.d.ts +0 -0
- package/dist/types/src/extensions/{markdown → language/markdown}/bundle.d.ts +0 -0
- package/dist/types/src/extensions/{markdown → language/markdown}/changes.test.d.ts +0 -0
- package/dist/types/src/extensions/{markdown → language/markdown}/formatting.test.d.ts +0 -0
- package/dist/types/src/extensions/{markdown → language/markdown}/image.d.ts +0 -0
- package/dist/types/src/extensions/{markdown → language/markdown}/image.test.d.ts +0 -0
- package/dist/types/src/extensions/{markdown → language/markdown}/index.d.ts +0 -0
- package/dist/types/src/extensions/{markdown → language/markdown}/parser.test.d.ts +0 -0
- package/dist/types/src/extensions/{markdown → language/markdown}/table.d.ts +0 -0
- package/dist/types/src/extensions/{tags → language/xml}/extended-markdown.d.ts +0 -0
- package/dist/types/src/extensions/{tags → language/xml}/extended-markdown.test.d.ts +0 -0
- package/dist/types/src/extensions/{tags → language/xml}/index.d.ts +0 -0
- package/dist/types/src/extensions/{tags → language/xml}/widgets/anchor.d.ts +0 -0
- package/dist/types/src/extensions/{tags → language/xml}/widgets/index.d.ts +0 -0
- package/dist/types/src/extensions/{tags → language/xml}/xml-formatting.d.ts +0 -0
- package/dist/types/src/extensions/{tags → language/xml}/xml-util.d.ts +0 -0
- package/dist/types/src/extensions/{tags → language/xml}/xml-util.test.d.ts +0 -0
- package/dist/types/src/extensions/{modal.d.ts → state/modal.d.ts} +0 -0
- package/dist/types/src/extensions/{selection.test.d.ts → state/selection.test.d.ts} +0 -0
- package/dist/types/src/extensions/{pending → streaming/pending}/index.d.ts +0 -0
- package/dist/types/src/extensions/{pending → streaming/pending}/pending-text-stream.d.ts +0 -0
- package/dist/types/src/extensions/{pending → streaming/pending}/pending-text-stream.test.d.ts +0 -0
- package/dist/types/src/extensions/{pending → streaming/pending}/pending-text.test.d.ts +0 -0
- package/dist/types/src/extensions/{scrolling → streaming/scrolling}/auto-scroll.d.ts +0 -0
- package/dist/types/src/extensions/{scrolling → streaming/scrolling}/crawler.d.ts +0 -0
- package/dist/types/src/extensions/{scrolling → streaming/scrolling}/index.d.ts +0 -0
- package/dist/types/src/extensions/{scrolling → streaming/scrolling}/scrollbar-autohide.d.ts +0 -0
- package/dist/types/src/extensions/{scrolling → streaming/scrolling}/scroller.d.ts +0 -0
- package/dist/types/src/extensions/{typewriter.test.d.ts → streaming/typewriter.test.d.ts} +0 -0
- package/dist/types/src/extensions/{folding.d.ts → structure/folding/folding.d.ts} +0 -0
- package/dist/types/src/extensions/{outliner → structure/outliner}/editor.d.ts +0 -0
- package/dist/types/src/extensions/{outliner → structure/outliner}/editor.test.d.ts +0 -0
- package/dist/types/src/extensions/{outliner → structure/outliner}/outliner.d.ts +0 -0
- package/dist/types/src/extensions/{outliner → structure/outliner}/outliner.test.d.ts +0 -0
- package/dist/types/src/extensions/{outliner → structure/outliner}/tree.test.d.ts +0 -0
- package/src/extensions/{dnd.ts → behavior/dnd.ts} +29 -29
- package/src/extensions/{awareness → collab/awareness}/index.ts +0 -0
- package/src/extensions/{factories.test.ts → core/factories.test.ts} +0 -0
- package/src/extensions/{replacer.test.ts → decoration/replacer.test.ts} +0 -0
- package/src/extensions/{replacer.ts → decoration/replacer.ts} +25 -25
- /package/src/extensions/{markdown → language/markdown}/index.ts +0 -0
- /package/src/extensions/{tags → language/xml}/index.ts +0 -0
- /package/src/extensions/{tags → language/xml}/testing/text.md +0 -0
- /package/src/extensions/{tags → language/xml}/testing/text.txt +0 -0
- /package/src/extensions/{tags → language/xml}/widgets/anchor.ts +0 -0
- /package/src/extensions/{tags → language/xml}/widgets/index.ts +0 -0
- /package/src/extensions/{tags → language/xml}/xml-util.ts +0 -0
- /package/src/extensions/{modal.ts → state/modal.ts} +0 -0
- /package/src/extensions/{selection.test.ts → state/selection.test.ts} +0 -0
- /package/src/extensions/{pending → streaming/pending}/index.ts +0 -0
- /package/src/extensions/{pending → streaming/pending}/pending-text-stream.test.ts +0 -0
- /package/src/extensions/{scrolling → streaming/scrolling}/crawler.ts +0 -0
- /package/src/extensions/{scrolling → streaming/scrolling}/index.ts +0 -0
- /package/src/extensions/{scrolling → streaming/scrolling}/scroller.ts +0 -0
- /package/src/extensions/{typewriter.test.ts → streaming/typewriter.test.ts} +0 -0
|
@@ -7,47 +7,7 @@ import { HighlightStyle } from '@codemirror/language';
|
|
|
7
7
|
import { Tag, styleTags, tags } from '@lezer/highlight';
|
|
8
8
|
import { type MarkdownConfig, Table } from '@lezer/markdown';
|
|
9
9
|
|
|
10
|
-
import { fontBody, markdownTheme } from '
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Custom tags defined and processed by the GFM lezer extension.
|
|
14
|
-
* https://github.com/lezer-parser/markdown
|
|
15
|
-
* https://github.com/lezer-parser/markdown/blob/main/src/markdown.ts
|
|
16
|
-
*/
|
|
17
|
-
export const markdownTags = {
|
|
18
|
-
Blockquote: Tag.define(),
|
|
19
|
-
CodeMark: Tag.define(),
|
|
20
|
-
CodeText: Tag.define(),
|
|
21
|
-
EmphasisMark: Tag.define(),
|
|
22
|
-
HeaderMark: Tag.define(),
|
|
23
|
-
InlineCode: Tag.define(),
|
|
24
|
-
LinkLabel: Tag.define(),
|
|
25
|
-
LinkReference: Tag.define(),
|
|
26
|
-
ListMark: Tag.define(),
|
|
27
|
-
QuoteMark: Tag.define(),
|
|
28
|
-
URL: Tag.define(),
|
|
29
|
-
|
|
30
|
-
// Custom.
|
|
31
|
-
TableCell: Tag.define(),
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
// TODO(burdon): Customize table parser (make all content monospace).
|
|
35
|
-
// https://github.com/lezer-parser/markdown/blob/main/src/extension.ts
|
|
36
|
-
Table.defineNodes?.forEach((node: any) => {
|
|
37
|
-
switch (node?.name) {
|
|
38
|
-
case 'TableCell': {
|
|
39
|
-
node.style = markdownTags.TableCell;
|
|
40
|
-
break;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
export const markdownTagsExtensions: MarkdownConfig[] = [
|
|
46
|
-
Table,
|
|
47
|
-
{
|
|
48
|
-
props: [styleTags(markdownTags)],
|
|
49
|
-
},
|
|
50
|
-
];
|
|
10
|
+
import { fontBody, markdownTheme } from '../../../styles';
|
|
51
11
|
|
|
52
12
|
export type HighlightOptions = {};
|
|
53
13
|
|
|
@@ -189,3 +149,44 @@ export const markdownHighlightStyle = (_options: HighlightOptions = {}) => {
|
|
|
189
149
|
},
|
|
190
150
|
);
|
|
191
151
|
};
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Custom tags defined and processed by the GFM lezer extension.
|
|
155
|
+
* https://github.com/lezer-parser/markdown
|
|
156
|
+
* https://github.com/lezer-parser/markdown/blob/main/src/markdown.ts
|
|
157
|
+
*/
|
|
158
|
+
export const markdownTags = {
|
|
159
|
+
Blockquote: Tag.define(),
|
|
160
|
+
CodeMark: Tag.define(),
|
|
161
|
+
CodeText: Tag.define(),
|
|
162
|
+
EmphasisMark: Tag.define(),
|
|
163
|
+
HeaderMark: Tag.define(),
|
|
164
|
+
InlineCode: Tag.define(),
|
|
165
|
+
LinkLabel: Tag.define(),
|
|
166
|
+
LinkReference: Tag.define(),
|
|
167
|
+
ListMark: Tag.define(),
|
|
168
|
+
QuoteMark: Tag.define(),
|
|
169
|
+
URL: Tag.define(),
|
|
170
|
+
|
|
171
|
+
// Custom.
|
|
172
|
+
TableCell: Tag.define(),
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
// TODO(burdon): Customize table parser (make all content monospace).
|
|
176
|
+
// https://github.com/lezer-parser/markdown/blob/main/src/extension.ts
|
|
177
|
+
Table.defineNodes?.forEach((node) => {
|
|
178
|
+
if (typeof node === 'object' && node !== null && node.name === 'TableCell') {
|
|
179
|
+
node.style = markdownTags.TableCell;
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Lezer MarkdownConfig entries (GFM Table plus styleTags) contributed to the parser.
|
|
185
|
+
* Note: this is parser config, not an editor Extension.
|
|
186
|
+
*/
|
|
187
|
+
export const markdownTagsExtensions: MarkdownConfig[] = [
|
|
188
|
+
Table,
|
|
189
|
+
{
|
|
190
|
+
props: [styleTags(markdownTags)],
|
|
191
|
+
},
|
|
192
|
+
];
|
|
@@ -7,7 +7,7 @@ import { EditorState } from '@codemirror/state';
|
|
|
7
7
|
import { EditorView } from '@codemirror/view';
|
|
8
8
|
import { describe, test } from 'vitest';
|
|
9
9
|
|
|
10
|
-
import { focus } from '
|
|
10
|
+
import { focus } from '../../state/focus';
|
|
11
11
|
import { image } from './image';
|
|
12
12
|
|
|
13
13
|
const createView = (doc: string, extensions: any[]) => {
|
|
@@ -13,12 +13,7 @@ import {
|
|
|
13
13
|
} from '@codemirror/state';
|
|
14
14
|
import { Decoration, type DecorationSet, EditorView, ViewPlugin, WidgetType } from '@codemirror/view';
|
|
15
15
|
|
|
16
|
-
import { focusField } from '
|
|
17
|
-
|
|
18
|
-
// Effect dispatched when the viewport extends (e.g., scrolling reveals new content). The state
|
|
19
|
-
// field listens for this and rebuilds decorations across the full doc so images outside the
|
|
20
|
-
// initial parse range get widgetized.
|
|
21
|
-
const rebuildEffect = StateEffect.define<void>();
|
|
16
|
+
import { focusField } from '../../state/focus';
|
|
22
17
|
|
|
23
18
|
export type ImageNodeData = { name: 'Image'; url: string };
|
|
24
19
|
|
|
@@ -85,6 +80,11 @@ export const image = (options: ImageOptions = {}): Extension => {
|
|
|
85
80
|
];
|
|
86
81
|
};
|
|
87
82
|
|
|
83
|
+
// Effect dispatched when the viewport extends (e.g., scrolling reveals new content). The state
|
|
84
|
+
// field listens for this and rebuilds decorations across the full doc so images outside the
|
|
85
|
+
// initial parse range get widgetized.
|
|
86
|
+
const rebuildEffect = StateEffect.define<void>();
|
|
87
|
+
|
|
88
88
|
const buildDecorations = (state: EditorState, from: number, to: number, options: ImageOptions = {}) => {
|
|
89
89
|
const decorations: Range<Decoration>[] = [];
|
|
90
90
|
const cursor = state.selection.main.head;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { EditorState } from '@codemirror/state';
|
|
6
|
+
import { EditorView } from '@codemirror/view';
|
|
7
|
+
import { describe, test } from 'vitest';
|
|
8
|
+
|
|
9
|
+
import { createMarkdownExtensions } from './bundle';
|
|
10
|
+
import { syncLinkLabels } from './link';
|
|
11
|
+
|
|
12
|
+
describe('syncLinkLabels', () => {
|
|
13
|
+
test('rewrites a label that has drifted from its target', ({ expect }) => {
|
|
14
|
+
const { doc, changed } = run('- [Old title](dxn:echo:@:01ABC)', () => 'New title');
|
|
15
|
+
expect(changed).to.be.true;
|
|
16
|
+
expect(doc).to.eq('- [New title](dxn:echo:@:01ABC)');
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test('leaves the document alone when the label already matches', ({ expect }) => {
|
|
20
|
+
const { doc, changed } = run('- [Same](dxn:echo:@:01ABC)', () => 'Same');
|
|
21
|
+
expect(changed).to.be.false;
|
|
22
|
+
expect(doc).to.eq('- [Same](dxn:echo:@:01ABC)');
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test('leaves unresolved links alone', ({ expect }) => {
|
|
26
|
+
const { doc, changed } = run('- [Docs](https://dxos.org)', () => undefined);
|
|
27
|
+
expect(changed).to.be.false;
|
|
28
|
+
expect(doc).to.eq('- [Docs](https://dxos.org)');
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('rewrites every stale link in the document', ({ expect }) => {
|
|
32
|
+
const labels: Record<string, string> = { 'dxn:echo:@:01A': 'First', 'dxn:echo:@:01B': 'Second' };
|
|
33
|
+
const { doc } = run('- [a](dxn:echo:@:01A)\n- [b](dxn:echo:@:01B)', (url) => labels[url]);
|
|
34
|
+
expect(doc).to.eq('- [First](dxn:echo:@:01A)\n- [Second](dxn:echo:@:01B)');
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test('escapes brackets and newlines in the resolved label', ({ expect }) => {
|
|
38
|
+
const { doc } = run('- [a](dxn:echo:@:01A)', () => 'a [b]\n c');
|
|
39
|
+
expect(doc).to.eq('- [a b c](dxn:echo:@:01A)');
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test('keeps the existing label when the resolved one is empty', ({ expect }) => {
|
|
43
|
+
// `[](url)` no longer parses as a Link, so the node would become invisible to later passes.
|
|
44
|
+
const { doc, changed } = run('- [Old title](dxn:echo:@:01ABC)', () => ' ');
|
|
45
|
+
expect(changed).to.be.false;
|
|
46
|
+
expect(doc).to.eq('- [Old title](dxn:echo:@:01ABC)');
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
const run = (doc: string, resolve: (url: string) => string | undefined): { doc: string; changed: boolean } => {
|
|
51
|
+
const view = new EditorView({ state: EditorState.create({ doc, extensions: [createMarkdownExtensions()] }) });
|
|
52
|
+
try {
|
|
53
|
+
const changed = syncLinkLabels(view, resolve);
|
|
54
|
+
return { doc: view.state.doc.toString(), changed };
|
|
55
|
+
} finally {
|
|
56
|
+
view.destroy();
|
|
57
|
+
}
|
|
58
|
+
};
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
// Copyright CodeMirror
|
|
4
|
+
//
|
|
5
|
+
|
|
6
|
+
import { syntaxTree } from '@codemirror/language';
|
|
7
|
+
import { type ChangeSpec } from '@codemirror/state';
|
|
8
|
+
import { type EditorView, hoverTooltip } from '@codemirror/view';
|
|
9
|
+
import { type SyntaxNode } from '@lezer/common';
|
|
10
|
+
|
|
11
|
+
import { mx, surfaceShadow } from '@dxos/ui-theme';
|
|
12
|
+
|
|
13
|
+
import { type RenderCallback } from '../../../types';
|
|
14
|
+
|
|
15
|
+
export type LinkTooltipProps = {
|
|
16
|
+
render: RenderCallback<{ url: string }>;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
// Internal object links render their own inline/block preview, so a raw-URI hover tooltip is noise.
|
|
20
|
+
const INTERNAL_SCHEMES = ['dxn:', 'echo:'];
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Hover tooltip showing a rendered preview for markdown links (skips internal object URIs).
|
|
24
|
+
*/
|
|
25
|
+
export const linkTooltip = ({ render }: LinkTooltipProps) => {
|
|
26
|
+
return hoverTooltip((view, pos, side) => {
|
|
27
|
+
const syntax = syntaxTree(view.state).resolveInner(pos, side);
|
|
28
|
+
let link = null;
|
|
29
|
+
for (let i = 0, node: SyntaxNode | null = syntax; !link && node && i < 5; node = node.parent, i++) {
|
|
30
|
+
link = node.name === 'Link' ? node : null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const url = link && link.getChild('URL');
|
|
34
|
+
if (!url || !link) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const urlText = view.state.sliceDoc(url.from, url.to);
|
|
39
|
+
if (INTERNAL_SCHEMES.some((scheme) => urlText.startsWith(scheme))) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
pos: link.from,
|
|
45
|
+
end: link.to,
|
|
46
|
+
above: true,
|
|
47
|
+
create: () => {
|
|
48
|
+
const el = document.createElement('div');
|
|
49
|
+
el.className = tooltipClassName;
|
|
50
|
+
render(el, { url: urlText }, view);
|
|
51
|
+
return { dom: el, offset: { x: 0, y: 4 } };
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/** Brackets and newlines would terminate the inline link, so they are folded into the label text. */
|
|
58
|
+
export const escapeLinkLabel = (label: string): string => label.replace(/[[\]]/g, '').replace(/\s+/g, ' ').trim();
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Rewrites link labels that have drifted from their target's current label.
|
|
62
|
+
* The document holds the label so that it stays searchable and readable as plain markdown; this
|
|
63
|
+
* reconciles it whenever the caller can resolve a newer one.
|
|
64
|
+
*
|
|
65
|
+
* @param resolve Returns the target's label, or `undefined` when it is unknown (left untouched).
|
|
66
|
+
* @returns true if the document was changed.
|
|
67
|
+
*/
|
|
68
|
+
export const syncLinkLabels = (view: EditorView, resolve: (url: string) => string | undefined): boolean => {
|
|
69
|
+
const { state } = view;
|
|
70
|
+
const changes: ChangeSpec[] = [];
|
|
71
|
+
syntaxTree(state).iterate({
|
|
72
|
+
enter: (node) => {
|
|
73
|
+
if (node.name !== 'Link') {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const marks = node.node.getChildren('LinkMark');
|
|
78
|
+
const urlNode = node.node.getChild('URL');
|
|
79
|
+
if (!urlNode || marks.length < 2) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const label = resolve(state.sliceDoc(urlNode.from, urlNode.to));
|
|
84
|
+
if (label === undefined) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const [from, to] = [marks[0].to, marks[1].from];
|
|
89
|
+
const escaped = escapeLinkLabel(label);
|
|
90
|
+
// An empty label leaves `[](url)`, which no longer parses as a Link — the node would then be
|
|
91
|
+
// invisible to this pass, so a later rename could never repair it.
|
|
92
|
+
if (escaped.length > 0 && state.sliceDoc(from, to) !== escaped) {
|
|
93
|
+
changes.push({ from, to, insert: escaped });
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
if (changes.length === 0) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
view.dispatch({ changes, userEvent: 'sync.link' });
|
|
103
|
+
return true;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const tooltipClassName = mx(
|
|
107
|
+
'inline-flex items-center p-1 max-w-64 text-sm bg-inverse-surface text-inverse-fg rounded-sm',
|
|
108
|
+
surfaceShadow({ elevation: 'positioned' }),
|
|
109
|
+
);
|
|
@@ -7,34 +7,6 @@ import { parser } from '@lezer/markdown';
|
|
|
7
7
|
import { describe, test } from 'vitest';
|
|
8
8
|
|
|
9
9
|
describe('parser', () => {
|
|
10
|
-
// test.only('list-mark', () => {
|
|
11
|
-
// const newParser = parser.configure({
|
|
12
|
-
// parseBlock: [
|
|
13
|
-
// {
|
|
14
|
-
// name: 'ListItem',
|
|
15
|
-
// parse: (cx, line) => {
|
|
16
|
-
// console.log(`[${line.text}]`, cx.lineStart, line.text.length);
|
|
17
|
-
// // line.skipSpace(1);
|
|
18
|
-
// return true;
|
|
19
|
-
// },
|
|
20
|
-
// },
|
|
21
|
-
// ],
|
|
22
|
-
// });
|
|
23
|
-
//
|
|
24
|
-
// {
|
|
25
|
-
// const result = newParser.parse(' - ');
|
|
26
|
-
// testTree(result, 'Document(BulletList(ListItem(ListMark)))');
|
|
27
|
-
// }
|
|
28
|
-
// {
|
|
29
|
-
// const result = newParser.parse('-x');
|
|
30
|
-
// testTree(result, 'Document(Paragraph)');
|
|
31
|
-
// }
|
|
32
|
-
// {
|
|
33
|
-
// const result = newParser.parse('- x');
|
|
34
|
-
// testTree(result, 'Document(BulletList(ListItem(ListMark,Paragraph)))');
|
|
35
|
-
// }
|
|
36
|
-
// });
|
|
37
|
-
|
|
38
10
|
// https://www.markdownguide.org/basic-syntax/#lists-1
|
|
39
11
|
test('lists', () => {
|
|
40
12
|
// Indented list must have 4 spaces.
|
|
@@ -4,11 +4,14 @@
|
|
|
4
4
|
|
|
5
5
|
import { EditorView } from '@codemirror/view';
|
|
6
6
|
|
|
7
|
-
import { fontMono } from '
|
|
7
|
+
import { fontBody, fontMono } from '../../../styles';
|
|
8
8
|
|
|
9
9
|
export const bulletListIndentationWidth = 24;
|
|
10
10
|
export const orderedListIndentationWidth = 36; // TODO(burdon): Make variable length based on number of digits.
|
|
11
11
|
|
|
12
|
+
/**
|
|
13
|
+
* EditorView theme with CSS for horizontal rules, lists, blockquotes, code, tasks, tables, and images.
|
|
14
|
+
*/
|
|
12
15
|
export const formattingStyles = EditorView.theme({
|
|
13
16
|
/**
|
|
14
17
|
* Horizontal rule.
|
|
@@ -27,13 +30,29 @@ export const formattingStyles = EditorView.theme({
|
|
|
27
30
|
*/
|
|
28
31
|
'& .cm-list-item': {},
|
|
29
32
|
'& .cm-list-mark': {
|
|
33
|
+
// Must be inline-block so the fixed width applies and the first-line text start matches the
|
|
34
|
+
// hanging indent (`text-indent: -width`) set on `.cm-list-item`.
|
|
30
35
|
display: 'inline-block',
|
|
31
36
|
textAlign: 'right',
|
|
32
37
|
paddingRight: '0.5em',
|
|
38
|
+
// Being inline-block makes this a block container, so it would otherwise inherit the row's
|
|
39
|
+
// hanging indent and lay its own glyph out against a shifted line box.
|
|
40
|
+
textIndent: 0,
|
|
33
41
|
fontVariant: 'tabular-nums',
|
|
42
|
+
// Anchor to the line top (not the baseline) so the inline-block marker — whose height already
|
|
43
|
+
// equals the line-height — fills the line box exactly instead of extending it and making a
|
|
44
|
+
// bulleted line taller than a plain one.
|
|
45
|
+
verticalAlign: 'top',
|
|
46
|
+
lineHeight: 'inherit',
|
|
34
47
|
},
|
|
35
48
|
'& .cm-list-mark-bullet': {
|
|
36
49
|
width: `${bulletListIndentationWidth}px`,
|
|
50
|
+
// Centered (not right-aligned like an ordered marker, whose digits align on the last column) so
|
|
51
|
+
// the glyph lands on the same axis as a task checkbox, which fills the same box from its start.
|
|
52
|
+
textAlign: 'center',
|
|
53
|
+
// The rendered bullet widget sits inside the `ListMark` font-mono highlight span; a direct
|
|
54
|
+
// font-family on the widget overrides that inherited monospace so the bullet uses the body font.
|
|
55
|
+
fontFamily: fontBody,
|
|
37
56
|
},
|
|
38
57
|
'& .cm-list-mark-ordered': {
|
|
39
58
|
width: `${orderedListIndentationWidth}px`,
|
|
@@ -111,26 +130,38 @@ export const formattingStyles = EditorView.theme({
|
|
|
111
130
|
/**
|
|
112
131
|
* Table.
|
|
113
132
|
*/
|
|
133
|
+
'.cm-table': {
|
|
134
|
+
borderCollapse: 'separate',
|
|
135
|
+
borderSpacing: '2px',
|
|
136
|
+
},
|
|
114
137
|
'.cm-table *': {
|
|
115
|
-
fontFamily: fontMono,
|
|
116
138
|
lineHeight: 1.5,
|
|
117
|
-
|
|
139
|
+
},
|
|
140
|
+
'.cm-table-editor *': {
|
|
141
|
+
fontFamily: fontMono,
|
|
118
142
|
},
|
|
119
143
|
'.cm-table-head': {
|
|
120
|
-
padding: '
|
|
144
|
+
padding: '4px 8px',
|
|
145
|
+
paddingRight: '24px',
|
|
121
146
|
overflowWrap: 'break-word',
|
|
122
147
|
whiteSpace: 'pre-wrap',
|
|
123
148
|
wordBreak: 'keep-all',
|
|
124
149
|
textAlign: 'left',
|
|
125
|
-
|
|
126
|
-
|
|
150
|
+
textDecoration: 'none !important',
|
|
151
|
+
fontSize: 'small',
|
|
152
|
+
textTransform: 'uppercase',
|
|
153
|
+
color: 'var(--color-description)',
|
|
154
|
+
backgroundColor: 'var(--color-input-surface)',
|
|
155
|
+
// borderBottom: '1px solid var(--color-cm-separator)',
|
|
127
156
|
},
|
|
128
157
|
'.cm-table-cell': {
|
|
129
|
-
padding: '
|
|
158
|
+
padding: '4px 8px',
|
|
130
159
|
overflowWrap: 'break-word',
|
|
131
160
|
whiteSpace: 'pre-wrap',
|
|
132
161
|
wordBreak: 'keep-all',
|
|
133
162
|
verticalAlign: 'top',
|
|
163
|
+
backgroundColor: 'var(--color-base-surface)',
|
|
164
|
+
fontVariantNumeric: 'tabular-nums',
|
|
134
165
|
},
|
|
135
166
|
|
|
136
167
|
/**
|
|
@@ -83,6 +83,7 @@ const update = (state: EditorState, _options: TableOptions) => {
|
|
|
83
83
|
tables.forEach((table) => {
|
|
84
84
|
const replace = state.readOnly || cursor < table.from || cursor > table.to;
|
|
85
85
|
if (replace) {
|
|
86
|
+
// TODO(burdon): Compute left/right alignment based on column syntax.
|
|
86
87
|
builder.add(
|
|
87
88
|
table.from,
|
|
88
89
|
table.to,
|
|
@@ -92,13 +93,11 @@ const update = (state: EditorState, _options: TableOptions) => {
|
|
|
92
93
|
}),
|
|
93
94
|
);
|
|
94
95
|
} else {
|
|
95
|
-
// Add class for styling.
|
|
96
|
-
// TODO(burdon): Apply to each line?
|
|
97
96
|
builder.add(
|
|
98
97
|
table.from,
|
|
99
98
|
table.to,
|
|
100
99
|
Decoration.mark({
|
|
101
|
-
class: 'cm-table',
|
|
100
|
+
class: 'cm-table-editor',
|
|
102
101
|
}),
|
|
103
102
|
);
|
|
104
103
|
}
|
|
@@ -136,8 +135,8 @@ class TableWidget extends WidgetType {
|
|
|
136
135
|
|
|
137
136
|
override eq(other: this) {
|
|
138
137
|
return (
|
|
139
|
-
this._table.header
|
|
140
|
-
this._table.rows
|
|
138
|
+
JSON.stringify(this._table.header) === JSON.stringify(other._table.header) &&
|
|
139
|
+
JSON.stringify(this._table.rows) === JSON.stringify(other._table.rows)
|
|
141
140
|
);
|
|
142
141
|
}
|
|
143
142
|
|
|
@@ -148,6 +147,7 @@ class TableWidget extends WidgetType {
|
|
|
148
147
|
override toDOM(_view: EditorView) {
|
|
149
148
|
const div = document.createElement('div');
|
|
150
149
|
const table = div.appendChild(document.createElement('table'));
|
|
150
|
+
table.setAttribute('class', 'cm-table');
|
|
151
151
|
|
|
152
152
|
const header = table.appendChild(document.createElement('thead'));
|
|
153
153
|
const tr = header.appendChild(document.createElement('tr'));
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { HighlightStyle, syntaxHighlighting } from '@codemirror/language';
|
|
6
|
+
import { type Extension } from '@codemirror/state';
|
|
7
|
+
import { flowchartTags, mermaid as mermaidLanguage, mermaidTags } from 'codemirror-lang-mermaid';
|
|
8
|
+
|
|
9
|
+
export type MermaidHighlightOptions = {};
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* `codemirror-lang-mermaid` emits its own tags rather than the standard `@lezer/highlight` ones, so
|
|
13
|
+
* no default highlight style matches them and the source renders unstyled without this.
|
|
14
|
+
*
|
|
15
|
+
* Only the distinctions worth drawing are styled — header, connectors, labels, comments — and the
|
|
16
|
+
* rest inherits, as in `markdownHighlightStyle`. Classes are semantic theme tokens so the palette
|
|
17
|
+
* follows light/dark rather than pinning syntax hues.
|
|
18
|
+
*/
|
|
19
|
+
export const mermaidHighlightStyle = (_options: MermaidHighlightOptions = {}) =>
|
|
20
|
+
HighlightStyle.define([
|
|
21
|
+
// `flowchart`/`graph` and its direction, plus the `subgraph`/`end` keywords.
|
|
22
|
+
{
|
|
23
|
+
tag: [mermaidTags.diagramName, flowchartTags.diagramName, flowchartTags.keyword, flowchartTags.orientation],
|
|
24
|
+
class: 'text-primary-500',
|
|
25
|
+
},
|
|
26
|
+
// Connectors recede; the nodes they join are the content. `link` is the arrow itself (`-->`),
|
|
27
|
+
// so it must not be underlined — that reads as a hyperlink.
|
|
28
|
+
{ tag: [flowchartTags.link, flowchartTags.nodeEdge], class: 'text-subdued' },
|
|
29
|
+
// Labels, on nodes and on edges. Node ids are left inheriting, as the backbone of the source.
|
|
30
|
+
{
|
|
31
|
+
tag: [flowchartTags.nodeText, flowchartTags.nodeEdgeText, flowchartTags.string, flowchartTags.number],
|
|
32
|
+
class: 'text-accent',
|
|
33
|
+
},
|
|
34
|
+
{ tag: [flowchartTags.lineComment], class: 'text-description' },
|
|
35
|
+
]);
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Mermaid language support for a document that is entirely mermaid. For a fenced block inside
|
|
39
|
+
* markdown use `createMarkdownExtensions`, which registers mermaid as a fenced-code language.
|
|
40
|
+
*/
|
|
41
|
+
export const createMermaidExtensions = (options: MermaidHighlightOptions = {}): Extension[] => [
|
|
42
|
+
mermaidLanguage(),
|
|
43
|
+
syntaxHighlighting(mermaidHighlightStyle(options)),
|
|
44
|
+
];
|
|
@@ -7,7 +7,7 @@ a `WidgetType.toDOM()` creates a DOM placeholder, and React portals render conte
|
|
|
7
7
|
|
|
8
8
|
## `xmlTags` / `StubWidget`
|
|
9
9
|
|
|
10
|
-
**Source:** `packages/ui/ui-editor/src/extensions/
|
|
10
|
+
**Source:** `packages/ui/ui-editor/src/extensions/language/xml/xml-tags.ts`
|
|
11
11
|
|
|
12
12
|
**How it works:**
|
|
13
13
|
|
|
@@ -37,14 +37,14 @@ a `WidgetType.toDOM()` creates a DOM placeholder, and React portals render conte
|
|
|
37
37
|
|
|
38
38
|
| File | Role |
|
|
39
39
|
| ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
|
|
40
|
-
| `packages/ui/ui-editor/src/extensions/
|
|
40
|
+
| `packages/ui/ui-editor/src/extensions/language/xml/xml-tags.ts` | Definition |
|
|
41
41
|
| `packages/ui/react-ui-markdown/src/MarkdownStream/MarkdownStream.tsx` | Chat thread renderer — XML tags + dxn:/echo: url-scheme widgets |
|
|
42
42
|
| `packages/plugins/plugin-assistant/src/components/ChatThread/registry.tsx` | Defines component registry (summary, surface, toolCall, toolResult, toolkit, json, inline factories) |
|
|
43
43
|
| `packages/plugins/plugin-markdown/src/hooks/useExtensions.tsx` | Editor — registers `dxn-preview` (block) and `link-preview` (inline) url-scheme widgets |
|
|
44
44
|
| `packages/plugins/plugin-inbox/src/components/MarkdownViewer/MarkdownViewer.tsx` | Read-only viewer — inline anchor chips via url-scheme registry |
|
|
45
45
|
| `packages/ui/react-ui-transcription/src/components/Transcription/Transcription.tsx` | Transcription viewer — inline anchor chips via url-scheme registry |
|
|
46
46
|
| `packages/ui/react-ui-editor/src/stories/Widgets.stories.tsx` | Stories: `XmlTags` (XML tag registry) and `Preview` (url-scheme registry with `EditorPreviewProvider`) |
|
|
47
|
-
| `packages/ui/ui-editor/src/extensions/
|
|
47
|
+
| `packages/ui/ui-editor/src/extensions/language/xml/xml-tags.test.ts` | Unit tests |
|
|
48
48
|
| `packages/ui/react-ui-markdown/src/MarkdownStream/MarkdownStream.stories.tsx` | Story defining dom-widget (factory) and react-widget (Component) |
|
|
49
49
|
|
|
50
50
|
---
|
|
@@ -10,6 +10,7 @@ import { describe, test } from 'vitest';
|
|
|
10
10
|
import { trim } from '@dxos/util';
|
|
11
11
|
|
|
12
12
|
import { extendedMarkdown } from './extended-markdown';
|
|
13
|
+
import { type XmlWidgetRegistry } from './xml-tags';
|
|
13
14
|
import { nodeToJson } from './xml-util';
|
|
14
15
|
|
|
15
16
|
const testRegistry = {
|
|
@@ -26,7 +27,7 @@ const testRegistry = {
|
|
|
26
27
|
};
|
|
27
28
|
|
|
28
29
|
describe('extended-markdown', () => {
|
|
29
|
-
const createEditorState = (doc: string, registry?:
|
|
30
|
+
const createEditorState = (doc: string, registry?: XmlWidgetRegistry) => {
|
|
30
31
|
return EditorState.create({
|
|
31
32
|
doc,
|
|
32
33
|
extensions: [extendedMarkdown({ registry: registry ?? testRegistry })],
|
|
@@ -7,6 +7,7 @@ import { type Extension } from '@codemirror/state';
|
|
|
7
7
|
import { type ParseWrapper, parseMixed } from '@lezer/common';
|
|
8
8
|
import { type BlockParser } from '@lezer/markdown';
|
|
9
9
|
|
|
10
|
+
import { escapeRegExpSource } from '../../../util';
|
|
10
11
|
import { createMarkdownExtensions } from '../markdown';
|
|
11
12
|
import { type XmlWidgetRegistry } from './xml-tags';
|
|
12
13
|
|
|
@@ -14,9 +15,6 @@ export type ExtendedMarkdownOptions = {
|
|
|
14
15
|
registry?: XmlWidgetRegistry;
|
|
15
16
|
};
|
|
16
17
|
|
|
17
|
-
/** Escapes a string for safe embedding in RegExp source. */
|
|
18
|
-
const escapeRegExpSource = (value: string) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
19
|
-
|
|
20
18
|
/**
|
|
21
19
|
* Extended markdown parser with mixed parser for custom rendering of XML tags.
|
|
22
20
|
*/
|
|
@@ -120,7 +118,7 @@ const xmlBlockParsers = (registry?: XmlWidgetRegistry): BlockParser[] => {
|
|
|
120
118
|
*/
|
|
121
119
|
const mixedParser = (registry?: XmlWidgetRegistry): ParseWrapper => {
|
|
122
120
|
const customTags = Object.keys(registry ?? {});
|
|
123
|
-
const tagPattern = new RegExp(`<(${customTags.join('|')})`);
|
|
121
|
+
const tagPattern = new RegExp(`<(${customTags.map(escapeRegExpSource).join('|')})`);
|
|
124
122
|
|
|
125
123
|
return parseMixed((node, input) => {
|
|
126
124
|
switch (node.name) {
|