@dxos/ui-editor 0.10.0 → 0.11.1
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
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# Outliner rebuilt on `blocks` — DESIGN
|
|
2
|
+
|
|
3
|
+
## Motivation
|
|
4
|
+
|
|
5
|
+
`blocks` (`../blocks`) is the precise, tested foundation for the gutter drag grip,
|
|
6
|
+
whole-block selection, the selection highlight, and block clipboard. The outliner
|
|
7
|
+
predates it and still carries its **own** selection (`selection.ts`,
|
|
8
|
+
`selectionFacet`), drag wiring (`outlinerDnd`), and selection decorations
|
|
9
|
+
(`outliner.ts` `decorations()`). Those now duplicate and fight `blocks`:
|
|
10
|
+
|
|
11
|
+
- **Two disconnected selection models** — `selectionFacet` (item indices; keyboard
|
|
12
|
+
commands; `.cm-list-item` border) vs `blockSelectionField` (anchors; grip
|
|
13
|
+
click/drag; `RectangleMarker` highlight). They never sync, so grip selection and
|
|
14
|
+
keyboard selection are invisible to each other, and `Cmd+A` then `Cmd+C` copies
|
|
15
|
+
nothing (clipboard reads the empty block selection).
|
|
16
|
+
- **Redundant, misaligned highlight** — `outlinerDnd` layers
|
|
17
|
+
`createBlockSelectionHighlight` on top of the outliner's own border with different
|
|
18
|
+
geometry → the highlight sits off the row.
|
|
19
|
+
- **Grip above the checkbox** — the grip anchors to the line-block top, but the
|
|
20
|
+
outliner row adds `paddingTop`/`marginTop`, pushing the checkbox down ~6px.
|
|
21
|
+
|
|
22
|
+
**Plan:** rebuild the outliner as _structure + editing on top of `blocks`_.
|
|
23
|
+
`blocks` owns selection, drag, highlight, and clipboard; the outliner keeps only
|
|
24
|
+
what is genuinely hierarchy/markdown-specific.
|
|
25
|
+
|
|
26
|
+
## Goals
|
|
27
|
+
|
|
28
|
+
- One selection model: `blockSelectionField`.
|
|
29
|
+
- The grip centers on the checkbox.
|
|
30
|
+
- Selecting or dragging an item covers its **whole subtree**.
|
|
31
|
+
- A **subtle** current-item (caret) indicator, distinct from the accent selection.
|
|
32
|
+
- Preserve outliner structure/editing: tree parsing, edit constraints, commands, menu.
|
|
33
|
+
|
|
34
|
+
## Non-goals
|
|
35
|
+
|
|
36
|
+
- Rewriting `tree.ts` parsing or the `editor.ts` edit constraints.
|
|
37
|
+
- Cross-document drag, virtualization, multi-select rectangle.
|
|
38
|
+
|
|
39
|
+
## Block model (the crux)
|
|
40
|
+
|
|
41
|
+
Subtree-as-block and per-item grips pull in opposite directions: subtree ranges
|
|
42
|
+
**overlap** (a parent contains its children), but the gutter/drag ordering needs
|
|
43
|
+
**non-overlapping** ranges. Resolve by separating the two:
|
|
44
|
+
|
|
45
|
+
- **`getBlocks`** (gutter grips + drag ordering) = each item's **own lines**,
|
|
46
|
+
non-overlapping, one grip per item.
|
|
47
|
+
`from = item.lineRange.from`; `to = firstChild ? firstChild.lineRange.from − 1 : item.lineRange.to`.
|
|
48
|
+
- **Block extent** (selection highlight, drag collapse/preview, clipboard) = the
|
|
49
|
+
item's **subtree**: `getRange(tree, item) = [item.lineRange.from, lastDescendant.lineRange.to]`.
|
|
50
|
+
Overlap between a selected parent and a selected child is acceptable — the
|
|
51
|
+
highlight just draws overlapping boxes.
|
|
52
|
+
|
|
53
|
+
### `blocks` change: extent hook
|
|
54
|
+
|
|
55
|
+
Add an optional `getBlockExtent(state, block) => { from, to }` to the `blocks`
|
|
56
|
+
core, defaulting to the block's own range. It is consulted by:
|
|
57
|
+
|
|
58
|
+
- `createBlockSelectionHighlight` — the marker for a selected block spans its extent.
|
|
59
|
+
- `createBlockDrag` — the collapse decoration, floating preview, and placeholder
|
|
60
|
+
size use the extent (so dragging a parent visually moves the whole subtree).
|
|
61
|
+
|
|
62
|
+
Markdown blocks pass no hook (extent = own range, unchanged). The outliner passes
|
|
63
|
+
the subtree mapper. This keeps `blocks` generic and leaves markdown behavior
|
|
64
|
+
byte-for-byte identical.
|
|
65
|
+
|
|
66
|
+
## Drag reindent — drop level rules
|
|
67
|
+
|
|
68
|
+
Dragging an item moves its whole subtree (`getExtent`). On drop the subtree is
|
|
69
|
+
**re-indented** to a target level; the drag preview shows that level live so the
|
|
70
|
+
drop is predictable. The subtlety is at a **branch boundary** — dropping into the
|
|
71
|
+
gap before an item that is _shallower_ than the item above the gap. Example:
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
- A
|
|
75
|
+
- B
|
|
76
|
+
- C
|
|
77
|
+
- D
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Dropping `B` into the gap between `C` and `D` is ambiguous:
|
|
81
|
+
|
|
82
|
+
- **(i)** `B` stays a child of `A` (a sibling of `C`), or
|
|
83
|
+
- **(ii)** `B` becomes a sibling of `A` (aligned with `D`).
|
|
84
|
+
|
|
85
|
+
### Rule
|
|
86
|
+
|
|
87
|
+
For a drop into the slot before `target` (the item at the drop index), let
|
|
88
|
+
`above` be the last item before the slot that is not part of the dragged subtree,
|
|
89
|
+
and `unit = getIndentUnit`. Working in leading-space counts:
|
|
90
|
+
|
|
91
|
+
- `min = indent(target)` — shallowest: a sibling of `target` (leave the branch).
|
|
92
|
+
- `max = indent(above) + unit` — deepest: a child of `above`.
|
|
93
|
+
- **default (i)** `stay = clamp(indent(source), min, max)` — the dragged item keeps
|
|
94
|
+
its **own** level (staying in its branch), clamped so it is at most a child of
|
|
95
|
+
`above` and at least a sibling of `target`.
|
|
96
|
+
- **(ii)** applies only at a real branch boundary (`min < stay`) **and** only while
|
|
97
|
+
the pointer is vertically **over the `target` row** (`pointerY ≥ target.top`);
|
|
98
|
+
then the level drops to `min` (a sibling of `target`).
|
|
99
|
+
|
|
100
|
+
So the default is always (i) — the dragged item keeps its place in the current
|
|
101
|
+
branch — and it outdents to (ii) only when the pointer moves down onto the
|
|
102
|
+
shallower next item (`D`). At the end of the document, or with no `target`, the
|
|
103
|
+
level stays at `above`'s branch.
|
|
104
|
+
|
|
105
|
+
### Preview + wiring
|
|
106
|
+
|
|
107
|
+
`blocks/drag.ts` stays hierarchy-agnostic. The outliner supplies an optional
|
|
108
|
+
`getDropIndent(view, sourceIndices, dropIndex, pointerY)` hook returning
|
|
109
|
+
`{ indent, offset }` — the target leading-space count and the horizontal pixel
|
|
110
|
+
offset for the preview (`(indent − sourceIndent) / unit × bulletListIndentationWidth`).
|
|
111
|
+
The drag plugin shifts the floating preview by `offset` each pointer move and, on
|
|
112
|
+
drop, passes `indent` to `moveBlocks` so the committed re-indent matches the
|
|
113
|
+
preview. Markdown blocks pass no hook (no reindent, preview unshifted).
|
|
114
|
+
|
|
115
|
+
## Selection (single model)
|
|
116
|
+
|
|
117
|
+
- `blockSelectionField` is the only selection state.
|
|
118
|
+
- Grip click / shift-click / drag populate it (unchanged `blocks` behavior).
|
|
119
|
+
- Outliner `selectAll` / `selectUp` / `selectDown` are retargeted to
|
|
120
|
+
`blockSelectionField` (tree traversal → block anchors), replacing the
|
|
121
|
+
`selectionFacet` versions. `selectUp`/`selectDown` (today no-op stubs) get real
|
|
122
|
+
implementations: extend the block selection to the previous/next item.
|
|
123
|
+
- Clipboard (cut/copy/paste) via `createBlockSelection` with the outliner
|
|
124
|
+
`BlockOps` (subtree-aware `serialize`/`replaceBlocks`).
|
|
125
|
+
- **Remove** `selection.ts` (`selectionFacet`, `selectionCompartment`,
|
|
126
|
+
`selectAll/None/Up/Down`) and the selection branch of `outliner.ts`
|
|
127
|
+
`decorations()`.
|
|
128
|
+
|
|
129
|
+
## Current-item indicator
|
|
130
|
+
|
|
131
|
+
- A subtle border on the caret item's **subtree extent**, visually distinct from
|
|
132
|
+
the accent selection highlight (e.g. `--color-focus-ring-subtle`).
|
|
133
|
+
- Rendered by a minimal outliner layer/decoration driven by `tree.find(caretPos)`
|
|
134
|
+
→ subtree extent. This is the one piece of the old `decorations()` we keep, but
|
|
135
|
+
scoped to the current item only (no selection role).
|
|
136
|
+
|
|
137
|
+
## Grip ↔ checkbox alignment
|
|
138
|
+
|
|
139
|
+
Generalize in `blocks` (per the decision), kept cheap:
|
|
140
|
+
|
|
141
|
+
- The grip currently top-anchors and sizes to the first row height. Offset it down
|
|
142
|
+
by the first line's rendered top padding so it centers on the row content.
|
|
143
|
+
- Preferred: derive the offset without per-frame layout reads (no `coordsAtPos`
|
|
144
|
+
during update). If a clean generic measurement proves costly, fall back to a
|
|
145
|
+
`gripInsetTop?: number` option on `createBlockDrag` that the outliner sets to its
|
|
146
|
+
known row padding. Decide during implementation; do not regress markdown
|
|
147
|
+
centering (heading vs body).
|
|
148
|
+
|
|
149
|
+
## Module changes
|
|
150
|
+
|
|
151
|
+
| Module | Action |
|
|
152
|
+
| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
153
|
+
| `tree.ts` | keep |
|
|
154
|
+
| `editor.ts` | keep (constraints + `initialize`; add teardown for the `setTimeout` in `initialize`) |
|
|
155
|
+
| `commands.ts` | keep; retarget select commands to `blockSelectionField` |
|
|
156
|
+
| `menu.ts` | keep |
|
|
157
|
+
| `dnd.ts` | keep the `BlockOps` adapter (subtree move + reindent, serialize, replace); add the subtree `getBlockExtent`; **drop** the `outlinerDnd` highlight/selection wrapper |
|
|
158
|
+
| `selection.ts` | **remove** |
|
|
159
|
+
| `outliner.ts` | compose `blocks()` (drag + selection + highlight + clipboard) + tree + editor + commands + menu + current-item indicator; **drop** the selection decorations |
|
|
160
|
+
| `blocks/drag.ts`, `blocks/selection.ts` | add `getBlockExtent` hook; generalize grip alignment |
|
|
161
|
+
|
|
162
|
+
### Incidental cleanups (in scope)
|
|
163
|
+
|
|
164
|
+
- Dead theme tokens in `drag.ts`: `--dx-description`, `--dx-base-surface` → real
|
|
165
|
+
`--color-*` tokens (or drop the fallback).
|
|
166
|
+
- `editor.ts` `initialize()` `setTimeout` — guard against dispatch on a destroyed view.
|
|
167
|
+
|
|
168
|
+
## Risks / open questions
|
|
169
|
+
|
|
170
|
+
- Overlapping subtree highlights when a parent and descendant are both selected —
|
|
171
|
+
accepted as visually fine; confirm on review.
|
|
172
|
+
- Grip-alignment generalization must not add a per-line layout read on the hot path.
|
|
173
|
+
- Interaction of `editor.ts` edit constraints with subtree moves (re-indent) —
|
|
174
|
+
covered by existing move logic but needs a test.
|
|
175
|
+
|
|
176
|
+
## Test plan
|
|
177
|
+
|
|
178
|
+
- Reuse `tree.test.ts`, `editor.test.ts`, `outliner.test.ts`.
|
|
179
|
+
- Add headless tests: subtree `getBlockExtent`; `selectAll/Up/Down` populate
|
|
180
|
+
`blockSelectionField`; clipboard cut/copy/paste over a subtree; single-item drag
|
|
181
|
+
relocates the subtree and keeps it selected.
|
|
182
|
+
- Storybook (`Outliner.stories.tsx`): grip centered on the checkbox; selecting an
|
|
183
|
+
item highlights its subtree; current-item border distinct from selection.
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: org.dxos.ui-editor.outliner
|
|
3
|
+
name: Outliner
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
The outliner is a CodeMirror extension (`outliner()`) that turns a plain markdown
|
|
8
|
+
task/bullet list into a structured, hierarchical outline editor. The document is
|
|
9
|
+
always valid markdown — nesting is leading-whitespace indentation, items are
|
|
10
|
+
`- [ ] ` tasks or `- ` bullets — so the same text round-trips through any markdown
|
|
11
|
+
tool and syncs as ordinary text.
|
|
12
|
+
|
|
13
|
+
It is built **on top of `../blocks`**, which owns whole-block selection, the gutter
|
|
14
|
+
drag grip, the selection highlight, and the clipboard. The outliner contributes only
|
|
15
|
+
what is hierarchy/markdown-specific: tree parsing, edit constraints, structural
|
|
16
|
+
commands, the drag re-indent rule, and the item menu. See `DESIGN.md` for the
|
|
17
|
+
rebuild rationale and the drag-reindent derivation; this spec is the normative
|
|
18
|
+
behavior.
|
|
19
|
+
|
|
20
|
+
## Extensions
|
|
21
|
+
|
|
22
|
+
The following extension dialects are used in this document.
|
|
23
|
+
|
|
24
|
+
| Term | URI |
|
|
25
|
+
| -------- | ------------------------- |
|
|
26
|
+
| `module` | `org.dxos.mdl.module@1.0` |
|
|
27
|
+
| `feat` | `org.dxos.mdl.feat@1.0` |
|
|
28
|
+
| `test` | `org.dxos.mdl.test@1.0` |
|
|
29
|
+
|
|
30
|
+
## Modules
|
|
31
|
+
|
|
32
|
+
`outliner()` composes these modules (source files under `src/extensions/structure/outliner/`);
|
|
33
|
+
selection, drag, highlight, and clipboard come from `../blocks`.
|
|
34
|
+
|
|
35
|
+
```mdl
|
|
36
|
+
module tree
|
|
37
|
+
desc: |
|
|
38
|
+
Parses the markdown list into an item Tree, recomputed as a facet on doc change. Items expose
|
|
39
|
+
lineRange (own lines), contentRange (text after the marker), level, type, and child/sibling links.
|
|
40
|
+
api:
|
|
41
|
+
Item: interface # { type: 'task'|'bullet'; level; lineRange; contentRange; children; ... }.
|
|
42
|
+
Tree: interface # find(pos) | traverse(item?, cb) | prev/next | siblings | lastDescendant.
|
|
43
|
+
treeFacet: Facet<Tree> # the current parse, read by every other module.
|
|
44
|
+
getRange: (tree, item) => [from, to] # the item's whole subtree span (item + descendants).
|
|
45
|
+
outlinerTree: () => Extension # installs the parser + facet.
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
```mdl
|
|
49
|
+
module editor
|
|
50
|
+
desc: |
|
|
51
|
+
A transactionFilter constraining edits to a valid outline: snaps the caret out of the marker into
|
|
52
|
+
the content range, allows whole-line deletes, and guards marker/continuation edits. Seeds an empty
|
|
53
|
+
document with a first item.
|
|
54
|
+
api:
|
|
55
|
+
editor: () => Extension
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
```mdl
|
|
59
|
+
module commands
|
|
60
|
+
desc: |
|
|
61
|
+
Keymap + exported structural commands. Indent/outdent and move operate on the whole subtree;
|
|
62
|
+
delete/toggle operate on the action scope (see feat F-6).
|
|
63
|
+
api:
|
|
64
|
+
indentItemMore / indentItemLess: Command # Tab / Shift-Tab — re-indent the caret item + descendants.
|
|
65
|
+
moveItemUp / moveItemDown: Command # swap the item (with its subtree) past a sibling.
|
|
66
|
+
deleteItem: Command # delete the action scope's subtree(s); clears selection.
|
|
67
|
+
toggleTask: Command # toggle the action scope between task and bullet.
|
|
68
|
+
getActionScope: (state) => Item[] # the block selection (subtrees), else the caret item.
|
|
69
|
+
commands: () => Extension # the outliner keymap.
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
```mdl
|
|
73
|
+
module dnd
|
|
74
|
+
desc: |
|
|
75
|
+
Adapts `../blocks` drag/selection to the outline: per-item grips, subtree extent, subtree move with
|
|
76
|
+
re-indent, and the drop-level rule. Also the selection commands over blockSelectionField.
|
|
77
|
+
api:
|
|
78
|
+
getBlocks: (state) => Block[] # per-item own-lines (non-overlapping) for grips/ordering.
|
|
79
|
+
getExtent: (state, block) => Block # the block's whole subtree (selection/collapse/preview).
|
|
80
|
+
moveBlocks: (view, sources, dropIndex, indent?) => void # subtree move + re-indent to indent.
|
|
81
|
+
replaceBlocks: (view, indices, text|null) => void # clipboard cut/paste over item lines.
|
|
82
|
+
getDropIndent: (view, sources, dropIndex, pointerY) => { indent, offset } | null # feat F-5 rule.
|
|
83
|
+
selectAllItems / selectNoneItems / selectUp / selectDown: Command # over blockSelectionField.
|
|
84
|
+
outlinerDnd: () => Extension
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
```mdl
|
|
88
|
+
module menu
|
|
89
|
+
desc: |
|
|
90
|
+
A floating per-item trigger (⋮) pinned in the right margin, hidden while dragging. Activating it
|
|
91
|
+
opens the host popover; its actions run over the action scope (feat F-6).
|
|
92
|
+
api:
|
|
93
|
+
menu: (options?) => Extension
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Features
|
|
97
|
+
|
|
98
|
+
```mdl
|
|
99
|
+
feat F-1: Document model
|
|
100
|
+
|
|
101
|
+
req F-1.1:
|
|
102
|
+
when: text is a markdown list of `- [ ] ` tasks and `- ` bullets, nested by 2-space indentation
|
|
103
|
+
then: it parses to a Tree of items, each with a level, type, own line range, and subtree
|
|
104
|
+
|
|
105
|
+
req F-1.2:
|
|
106
|
+
when: the document changes
|
|
107
|
+
then: the Tree is recomputed and exposed via treeFacet; the document stays valid markdown text
|
|
108
|
+
|
|
109
|
+
req F-1.3:
|
|
110
|
+
when: the document is empty
|
|
111
|
+
then: a first item (`- [ ] `) is seeded and the caret placed in its content
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
```mdl
|
|
115
|
+
feat F-2: Editing constraints
|
|
116
|
+
|
|
117
|
+
req F-2.1:
|
|
118
|
+
when: the caret is moved into an item's marker (before its content start)
|
|
119
|
+
then: it snaps to a valid position — content start when moving down/into, content end when moving
|
|
120
|
+
up, the previous line end when moving left across the marker
|
|
121
|
+
|
|
122
|
+
req F-2.2:
|
|
123
|
+
when: a whole item line is deleted
|
|
124
|
+
then: the edit is allowed; marker-internal edits that would break the item are constrained
|
|
125
|
+
|
|
126
|
+
req F-2.3:
|
|
127
|
+
when: task-marker atomicity is required (backspace removing a whole marker, continuation indent)
|
|
128
|
+
then: it is enforced by the markdown keymap that shapes the change, not by raw edits
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
```mdl
|
|
132
|
+
feat F-3: Selection (single model, subtree unit)
|
|
133
|
+
|
|
134
|
+
req F-3.1:
|
|
135
|
+
when: an item is selected via grip click / shift-click / keyboard
|
|
136
|
+
then: the sole selection state is blockSelectionField (anchors); there is no second model
|
|
137
|
+
|
|
138
|
+
req F-3.2:
|
|
139
|
+
when: an item is selected or dragged
|
|
140
|
+
then: its visual/operational extent is its whole subtree (getExtent = getRange), so a parent
|
|
141
|
+
covers its descendants
|
|
142
|
+
|
|
143
|
+
req F-3.3:
|
|
144
|
+
when: the caret sits in an item and nothing is selected
|
|
145
|
+
then: a subtle current-item border marks that item's subtree, distinct from the selection accent
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
```mdl
|
|
149
|
+
feat F-4: Structural commands
|
|
150
|
+
|
|
151
|
+
req F-4.1:
|
|
152
|
+
when: Tab / Shift-Tab is pressed on an item
|
|
153
|
+
then: the item AND all its descendants re-indent together (the subtree moves with its parent); Tab
|
|
154
|
+
is a no-op with no shallower-or-equal previous item to nest under
|
|
155
|
+
|
|
156
|
+
req F-4.2:
|
|
157
|
+
when: an item is moved up/down
|
|
158
|
+
then: it swaps with the adjacent sibling as whole subtrees
|
|
159
|
+
|
|
160
|
+
req F-4.3:
|
|
161
|
+
when: toggleTask runs
|
|
162
|
+
then: every item in the action scope flips uniformly between task and bullet, preserving indent
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
```mdl
|
|
166
|
+
feat F-5: Drag and drop re-indent
|
|
167
|
+
|
|
168
|
+
req F-5.1:
|
|
169
|
+
when: an item is dragged
|
|
170
|
+
then: its whole subtree lifts (collapsed out) and a floating preview follows the pointer; the
|
|
171
|
+
static grip is hidden and the preview carries its own grip; the menu is hidden
|
|
172
|
+
|
|
173
|
+
req F-5.2:
|
|
174
|
+
when: the pointer hovers a drop slot (before target T, with A the item above the slot)
|
|
175
|
+
then: the target level defaults to the dragged item's own level, clamped to
|
|
176
|
+
[sibling-of-T, child-of-A] — it stays in its branch (i)
|
|
177
|
+
|
|
178
|
+
req F-5.3:
|
|
179
|
+
when: the slot is a branch boundary (T shallower than the default) AND the pointer is over T's row
|
|
180
|
+
then: the level drops to a sibling of T — it outdents to leave the branch (ii)
|
|
181
|
+
|
|
182
|
+
req F-5.4:
|
|
183
|
+
when: the target level differs from the source level
|
|
184
|
+
then: the preview shifts horizontally to preview it, and on drop the subtree re-roots to exactly
|
|
185
|
+
that level (preview and result agree)
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
```mdl
|
|
189
|
+
feat F-6: Menu / action scope
|
|
190
|
+
|
|
191
|
+
req F-6.1:
|
|
192
|
+
when: a menu command runs with a block selection
|
|
193
|
+
then: it acts over every selected item's whole subtree (the action scope)
|
|
194
|
+
|
|
195
|
+
req F-6.2:
|
|
196
|
+
when: a menu command runs with no selection
|
|
197
|
+
then: it acts over the caret item's subtree
|
|
198
|
+
|
|
199
|
+
req F-6.3:
|
|
200
|
+
when: delete runs
|
|
201
|
+
then: each scope subtree (with its trailing separator) is removed, overlapping ranges merged, and
|
|
202
|
+
the selection cleared — generalizing to any scope-based command
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## Acceptance
|
|
206
|
+
|
|
207
|
+
```mdl
|
|
208
|
+
test T-indent-subtree
|
|
209
|
+
given: |
|
|
210
|
+
- [ ] A
|
|
211
|
+
- [ ] B
|
|
212
|
+
- [ ] C
|
|
213
|
+
- [ ] D
|
|
214
|
+
when: Tab on "C"
|
|
215
|
+
then: |
|
|
216
|
+
- [ ] A
|
|
217
|
+
- [ ] B
|
|
218
|
+
- [ ] C
|
|
219
|
+
- [ ] D
|
|
220
|
+
tags: [F-4.1]
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
```mdl
|
|
224
|
+
test T-drop-stays-in-branch
|
|
225
|
+
given: |
|
|
226
|
+
- A
|
|
227
|
+
- B
|
|
228
|
+
- C
|
|
229
|
+
- D
|
|
230
|
+
when: B is dragged into the slot before D with the pointer above D's row
|
|
231
|
+
then: |
|
|
232
|
+
- A
|
|
233
|
+
- C
|
|
234
|
+
- B
|
|
235
|
+
- D
|
|
236
|
+
tags: [F-5.2]
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
```mdl
|
|
240
|
+
test T-drop-outdents-over-target
|
|
241
|
+
given: |
|
|
242
|
+
- A
|
|
243
|
+
- B
|
|
244
|
+
- C
|
|
245
|
+
- D
|
|
246
|
+
when: B is dragged into the slot before D with the pointer over D's row
|
|
247
|
+
then: |
|
|
248
|
+
- A
|
|
249
|
+
- C
|
|
250
|
+
- B
|
|
251
|
+
- D
|
|
252
|
+
tags: [F-5.3]
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
```mdl
|
|
256
|
+
test T-delete-subtree
|
|
257
|
+
given: |
|
|
258
|
+
- [ ] 1
|
|
259
|
+
- [ ] 2
|
|
260
|
+
- [ ] 2.1
|
|
261
|
+
- [ ] 2.2
|
|
262
|
+
- [ ] 3
|
|
263
|
+
when: deleteItem with "2" selected (or the caret in it)
|
|
264
|
+
then: |
|
|
265
|
+
- [ ] 1
|
|
266
|
+
- [ ] 3
|
|
267
|
+
tags: [F-6.1, F-6.3]
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## Appendix: Extension Definitions
|
|
273
|
+
|
|
274
|
+
```mdl
|
|
275
|
+
ext module
|
|
276
|
+
uri: org.dxos.mdl.module@1.0
|
|
277
|
+
desc: |
|
|
278
|
+
A source module of the outliner extension (a file under src/extensions/structure/outliner/). The
|
|
279
|
+
file path is inferred from the block name (`commands` -> `commands.ts`). Members are the module's
|
|
280
|
+
public exports.
|
|
281
|
+
fields:
|
|
282
|
+
desc?: Prose
|
|
283
|
+
api: ApiMap # public exports (name: TypeExpr # comment)
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
```mdl
|
|
287
|
+
ext feat
|
|
288
|
+
uri: org.dxos.mdl.feat@1.0
|
|
289
|
+
desc: A named feature grouping one or more requirements.
|
|
290
|
+
fields:
|
|
291
|
+
desc?: Prose
|
|
292
|
+
req: RequirementList
|
|
293
|
+
nesting: self
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
```mdl
|
|
297
|
+
ext test
|
|
298
|
+
uri: org.dxos.mdl.test@1.0
|
|
299
|
+
desc: An acceptance scenario expressed as given / when / then steps.
|
|
300
|
+
fields:
|
|
301
|
+
given?: Step | Step[]
|
|
302
|
+
when?: Step | Step[]
|
|
303
|
+
then: Step | Step[]
|
|
304
|
+
tags?: TagList
|
|
305
|
+
```
|