@dxos/react-ui-editor 0.8.4-main.ead640a → 0.8.4-main.ef1bc66f44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/index.mjs +1143 -8466
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +1143 -8465
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/components/Editor/Editor.d.ts +43 -30
- package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
- package/dist/types/src/components/Editor/Editor.stories.d.ts +16 -20
- package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -1
- package/dist/types/src/components/EditorContent/EditorContent.d.ts +31 -0
- package/dist/types/src/components/EditorContent/EditorContent.d.ts.map +1 -0
- package/dist/types/src/components/EditorContent/controller.d.ts +10 -0
- package/dist/types/src/components/EditorContent/controller.d.ts.map +1 -0
- package/dist/types/src/components/EditorContent/index.d.ts +3 -0
- package/dist/types/src/components/EditorContent/index.d.ts.map +1 -0
- package/dist/types/src/{extensions/popover/PopoverMenuProvider.d.ts → components/EditorMenuProvider/EditorMenuProvider.d.ts} +6 -6
- package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -0
- package/dist/types/src/components/EditorMenuProvider/index.d.ts +6 -0
- package/dist/types/src/components/EditorMenuProvider/index.d.ts.map +1 -0
- package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts +4 -0
- package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -0
- package/dist/types/src/components/EditorMenuProvider/menu.d.ts +28 -0
- package/dist/types/src/components/EditorMenuProvider/menu.d.ts.map +1 -0
- package/dist/types/src/{extensions/popover → components/EditorMenuProvider}/popover.d.ts +1 -2
- package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -0
- package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts +34 -0
- package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -0
- package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +16 -0
- package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -0
- package/dist/types/src/components/EditorPreviewProvider/index.d.ts +2 -0
- package/dist/types/src/components/EditorPreviewProvider/index.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +28 -2
- package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/actions.d.ts +24 -0
- package/dist/types/src/components/EditorToolbar/actions.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/blocks.d.ts +8 -7
- package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/formatting.d.ts +8 -7
- package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/headings.d.ts +8 -7
- package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/image.d.ts +4 -11
- package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/index.d.ts +2 -1
- package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/search.d.ts +4 -11
- package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts +11 -0
- package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/view-mode.d.ts +9 -8
- package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +4 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useTextEditor.d.ts +2 -2
- package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +0 -8
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/{extensions/automerge/automerge.stories.d.ts → stories/Automerge.stories.d.ts} +5 -9
- package/dist/types/src/stories/Automerge.stories.d.ts.map +1 -0
- package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Comments.stories.d.ts +4 -3
- package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
- package/dist/types/src/stories/EditorToolbar.stories.d.ts +4 -4
- package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Experimental.stories.d.ts +4 -3
- package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Markdown.stories.d.ts +4 -3
- package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Popover.stories.d.ts +2 -2
- package/dist/types/src/stories/Popover.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Preview.stories.d.ts +5 -3
- package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Tags.stories.d.ts.map +1 -1
- package/dist/types/src/stories/TextEditor.stories.d.ts +4 -3
- package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Theme.stories.d.ts +8 -0
- package/dist/types/src/stories/Theme.stories.d.ts.map +1 -0
- package/dist/types/src/stories/components/EditorStory.d.ts +10 -19
- package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
- package/dist/types/src/stories/components/util.d.ts +3 -3
- package/dist/types/src/stories/components/util.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +5 -5
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/util/index.d.ts +0 -5
- package/dist/types/src/util/index.d.ts.map +1 -1
- package/dist/types/src/util/react.d.ts +5 -1
- package/dist/types/src/util/react.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +63 -68
- package/src/components/Editor/Editor.stories.tsx +76 -50
- package/src/components/Editor/Editor.tsx +166 -63
- package/src/components/EditorContent/EditorContent.tsx +83 -0
- package/src/components/EditorContent/controller.ts +50 -0
- package/src/components/EditorContent/index.ts +6 -0
- package/src/{extensions/popover/PopoverMenuProvider.tsx → components/EditorMenuProvider/EditorMenuProvider.tsx} +30 -20
- package/src/components/EditorMenuProvider/index.ts +10 -0
- package/src/{extensions/popover → components/EditorMenuProvider}/menu-presets.ts +19 -19
- package/src/{extensions/popover → components/EditorMenuProvider}/menu.ts +21 -18
- package/src/{extensions/popover → components/EditorMenuProvider}/popover.ts +3 -9
- package/src/{extensions/popover/usePopoverMenu.ts → components/EditorMenuProvider/useEditorMenu.ts} +21 -21
- package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +79 -0
- package/src/components/EditorPreviewProvider/index.ts +5 -0
- package/src/components/EditorToolbar/EditorToolbar.tsx +104 -92
- package/src/components/EditorToolbar/{lists.ts → actions.ts} +48 -17
- package/src/components/EditorToolbar/blocks.ts +5 -5
- package/src/components/EditorToolbar/formatting.ts +5 -5
- package/src/components/EditorToolbar/headings.ts +11 -8
- package/src/components/EditorToolbar/image.ts +9 -2
- package/src/components/EditorToolbar/index.ts +3 -7
- package/src/components/EditorToolbar/search.ts +9 -2
- package/src/components/EditorToolbar/useEditorToolbar.ts +20 -0
- package/src/components/EditorToolbar/view-mode.ts +5 -4
- package/src/components/index.ts +6 -1
- package/src/hooks/useTextEditor.ts +13 -7
- package/src/index.ts +0 -10
- package/src/stories/Automerge.stories.tsx +175 -0
- package/src/stories/CommandDialog.stories.tsx +13 -10
- package/src/stories/Comments.stories.tsx +47 -43
- package/src/stories/EditorToolbar.stories.tsx +34 -19
- package/src/stories/Experimental.stories.tsx +5 -7
- package/src/stories/Markdown.stories.tsx +15 -15
- package/src/stories/Outliner.stories.tsx +17 -25
- package/src/stories/Popover.stories.tsx +41 -46
- package/src/stories/Preview.stories.tsx +94 -84
- package/src/stories/Tags.stories.tsx +33 -10
- package/src/stories/TextEditor.stories.tsx +14 -20
- package/src/stories/Theme.stories.tsx +61 -0
- package/src/stories/components/EditorStory.tsx +34 -27
- package/src/stories/components/util.tsx +43 -11
- package/src/translations.ts +4 -4
- package/src/util/index.ts +1 -6
- package/src/util/react.tsx +6 -2
- package/dist/lib/browser/chunk-HL3YF6WC.mjs +0 -22
- package/dist/lib/browser/chunk-HL3YF6WC.mjs.map +0 -7
- package/dist/lib/browser/testing/index.mjs +0 -76
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/browser/types/index.mjs +0 -13
- package/dist/lib/browser/types/index.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-YJZGD3LY.mjs +0 -24
- package/dist/lib/node-esm/chunk-YJZGD3LY.mjs.map +0 -7
- package/dist/lib/node-esm/testing/index.mjs +0 -78
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
- package/dist/lib/node-esm/types/index.mjs +0 -14
- package/dist/lib/node-esm/types/index.mjs.map +0 -7
- package/dist/types/src/components/EditorToolbar/lists.d.ts +0 -19
- package/dist/types/src/components/EditorToolbar/lists.d.ts.map +0 -1
- package/dist/types/src/components/EditorToolbar/util.d.ts +0 -51
- package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
- package/dist/types/src/defaults.d.ts +0 -14
- package/dist/types/src/defaults.d.ts.map +0 -1
- package/dist/types/src/extensions/annotations.d.ts +0 -9
- package/dist/types/src/extensions/annotations.d.ts.map +0 -1
- package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +0 -26
- package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +0 -1
- package/dist/types/src/extensions/autocomplete/index.d.ts +0 -5
- package/dist/types/src/extensions/autocomplete/index.d.ts.map +0 -1
- package/dist/types/src/extensions/autocomplete/match.d.ts +0 -13
- package/dist/types/src/extensions/autocomplete/match.d.ts.map +0 -1
- package/dist/types/src/extensions/autocomplete/placeholder.d.ts +0 -20
- package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +0 -1
- package/dist/types/src/extensions/autocomplete/typeahead.d.ts +0 -10
- package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +0 -1
- package/dist/types/src/extensions/automerge/automerge.d.ts +0 -4
- package/dist/types/src/extensions/automerge/automerge.d.ts.map +0 -1
- package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +0 -1
- package/dist/types/src/extensions/automerge/automerge.test.d.ts +0 -2
- package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +0 -1
- package/dist/types/src/extensions/automerge/cursor.d.ts +0 -4
- package/dist/types/src/extensions/automerge/cursor.d.ts.map +0 -1
- package/dist/types/src/extensions/automerge/defs.d.ts +0 -17
- 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 +0 -17
- package/dist/types/src/extensions/automerge/sync.d.ts.map +0 -1
- package/dist/types/src/extensions/automerge/update-automerge.d.ts +0 -6
- package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +0 -1
- package/dist/types/src/extensions/automerge/update-codemirror.d.ts +0 -5
- package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +0 -1
- package/dist/types/src/extensions/autoscroll.d.ts +0 -10
- package/dist/types/src/extensions/autoscroll.d.ts.map +0 -1
- package/dist/types/src/extensions/awareness/awareness-provider.d.ts +0 -31
- package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +0 -1
- package/dist/types/src/extensions/awareness/awareness.d.ts +0 -46
- package/dist/types/src/extensions/awareness/awareness.d.ts.map +0 -1
- package/dist/types/src/extensions/awareness/index.d.ts +0 -3
- package/dist/types/src/extensions/awareness/index.d.ts.map +0 -1
- package/dist/types/src/extensions/blast.d.ts +0 -25
- package/dist/types/src/extensions/blast.d.ts.map +0 -1
- package/dist/types/src/extensions/comments.d.ts +0 -95
- package/dist/types/src/extensions/comments.d.ts.map +0 -1
- package/dist/types/src/extensions/debug.d.ts +0 -3
- package/dist/types/src/extensions/debug.d.ts.map +0 -1
- package/dist/types/src/extensions/dnd.d.ts +0 -9
- package/dist/types/src/extensions/dnd.d.ts.map +0 -1
- package/dist/types/src/extensions/factories.d.ts +0 -83
- package/dist/types/src/extensions/factories.d.ts.map +0 -1
- package/dist/types/src/extensions/focus.d.ts +0 -7
- package/dist/types/src/extensions/focus.d.ts.map +0 -1
- package/dist/types/src/extensions/folding.d.ts +0 -7
- 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/index.d.ts +0 -26
- package/dist/types/src/extensions/index.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 +0 -11
- package/dist/types/src/extensions/listener.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/action.d.ts +0 -12
- package/dist/types/src/extensions/markdown/action.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/bundle.d.ts +0 -22
- package/dist/types/src/extensions/markdown/bundle.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/changes.d.ts +0 -10
- package/dist/types/src/extensions/markdown/changes.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/changes.test.d.ts +0 -2
- package/dist/types/src/extensions/markdown/changes.test.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/debug.d.ts +0 -11
- package/dist/types/src/extensions/markdown/debug.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/decorate.d.ts +0 -25
- package/dist/types/src/extensions/markdown/decorate.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/formatting.d.ts +0 -63
- package/dist/types/src/extensions/markdown/formatting.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/formatting.test.d.ts +0 -3
- package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/highlight.d.ts +0 -37
- package/dist/types/src/extensions/markdown/highlight.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/image.d.ts +0 -7
- package/dist/types/src/extensions/markdown/image.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/index.d.ts +0 -10
- 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 +0 -2
- package/dist/types/src/extensions/markdown/parser.test.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/styles.d.ts +0 -4
- package/dist/types/src/extensions/markdown/styles.d.ts.map +0 -1
- package/dist/types/src/extensions/markdown/table.d.ts +0 -8
- package/dist/types/src/extensions/markdown/table.d.ts.map +0 -1
- package/dist/types/src/extensions/mention.d.ts +0 -7
- package/dist/types/src/extensions/mention.d.ts.map +0 -1
- package/dist/types/src/extensions/modes.d.ts +0 -10
- 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 +0 -5
- package/dist/types/src/extensions/outliner/editor.d.ts.map +0 -1
- package/dist/types/src/extensions/outliner/editor.test.d.ts +0 -2
- package/dist/types/src/extensions/outliner/editor.test.d.ts.map +0 -1
- package/dist/types/src/extensions/outliner/index.d.ts +0 -4
- package/dist/types/src/extensions/outliner/index.d.ts.map +0 -1
- package/dist/types/src/extensions/outliner/menu.d.ts +0 -8
- package/dist/types/src/extensions/outliner/menu.d.ts.map +0 -1
- package/dist/types/src/extensions/outliner/outliner.d.ts +0 -11
- package/dist/types/src/extensions/outliner/outliner.d.ts.map +0 -1
- package/dist/types/src/extensions/outliner/outliner.test.d.ts +0 -2
- 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 +0 -79
- package/dist/types/src/extensions/outliner/tree.d.ts.map +0 -1
- package/dist/types/src/extensions/outliner/tree.test.d.ts +0 -2
- package/dist/types/src/extensions/outliner/tree.test.d.ts.map +0 -1
- package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts.map +0 -1
- package/dist/types/src/extensions/popover/index.d.ts +0 -8
- package/dist/types/src/extensions/popover/index.d.ts.map +0 -1
- package/dist/types/src/extensions/popover/menu-presets.d.ts +0 -4
- package/dist/types/src/extensions/popover/menu-presets.d.ts.map +0 -1
- package/dist/types/src/extensions/popover/menu.d.ts +0 -24
- package/dist/types/src/extensions/popover/menu.d.ts.map +0 -1
- package/dist/types/src/extensions/popover/modal.d.ts +0 -7
- package/dist/types/src/extensions/popover/modal.d.ts.map +0 -1
- package/dist/types/src/extensions/popover/popover.d.ts.map +0 -1
- package/dist/types/src/extensions/popover/usePopoverMenu.d.ts +0 -34
- package/dist/types/src/extensions/popover/usePopoverMenu.d.ts.map +0 -1
- package/dist/types/src/extensions/popover/util.d.ts +0 -8
- package/dist/types/src/extensions/popover/util.d.ts.map +0 -1
- package/dist/types/src/extensions/preview/index.d.ts +0 -2
- package/dist/types/src/extensions/preview/index.d.ts.map +0 -1
- package/dist/types/src/extensions/preview/preview.d.ts +0 -28
- package/dist/types/src/extensions/preview/preview.d.ts.map +0 -1
- package/dist/types/src/extensions/selection.d.ts +0 -24
- package/dist/types/src/extensions/selection.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/tags/extended-markdown.d.ts +0 -10
- package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +0 -1
- package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +0 -2
- package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +0 -1
- package/dist/types/src/extensions/tags/index.d.ts +0 -4
- package/dist/types/src/extensions/tags/index.d.ts.map +0 -1
- package/dist/types/src/extensions/tags/streamer.d.ts +0 -12
- package/dist/types/src/extensions/tags/streamer.d.ts.map +0 -1
- package/dist/types/src/extensions/tags/xml-tags.d.ts +0 -72
- package/dist/types/src/extensions/tags/xml-tags.d.ts.map +0 -1
- package/dist/types/src/extensions/tags/xml-util.d.ts +0 -10
- package/dist/types/src/extensions/tags/xml-util.d.ts.map +0 -1
- package/dist/types/src/extensions/typewriter.d.ts +0 -10
- package/dist/types/src/extensions/typewriter.d.ts.map +0 -1
- package/dist/types/src/styles/index.d.ts +0 -4
- package/dist/types/src/styles/index.d.ts.map +0 -1
- package/dist/types/src/styles/markdown.d.ts +0 -8
- package/dist/types/src/styles/markdown.d.ts.map +0 -1
- package/dist/types/src/styles/theme.d.ts +0 -38
- package/dist/types/src/styles/theme.d.ts.map +0 -1
- package/dist/types/src/styles/tokens.d.ts +0 -3
- package/dist/types/src/styles/tokens.d.ts.map +0 -1
- package/dist/types/src/testing/PreviewPopover.d.ts +0 -20
- package/dist/types/src/testing/PreviewPopover.d.ts.map +0 -1
- package/dist/types/src/testing/index.d.ts +0 -3
- package/dist/types/src/testing/index.d.ts.map +0 -1
- package/dist/types/src/testing/util.d.ts +0 -3
- package/dist/types/src/testing/util.d.ts.map +0 -1
- package/dist/types/src/types/index.d.ts +0 -2
- package/dist/types/src/types/index.d.ts.map +0 -1
- package/dist/types/src/types/types.d.ts +0 -21
- package/dist/types/src/types/types.d.ts.map +0 -1
- package/dist/types/src/util/cursor.d.ts +0 -31
- package/dist/types/src/util/cursor.d.ts.map +0 -1
- package/dist/types/src/util/debug.d.ts +0 -17
- package/dist/types/src/util/debug.d.ts.map +0 -1
- package/dist/types/src/util/decorations.d.ts +0 -4
- package/dist/types/src/util/decorations.d.ts.map +0 -1
- package/dist/types/src/util/dom.d.ts +0 -10
- package/dist/types/src/util/dom.d.ts.map +0 -1
- package/dist/types/src/util/facet.d.ts +0 -3
- package/dist/types/src/util/facet.d.ts.map +0 -1
- package/src/components/EditorToolbar/util.ts +0 -76
- package/src/defaults.ts +0 -52
- package/src/extensions/annotations.ts +0 -55
- package/src/extensions/autocomplete/autocomplete.ts +0 -220
- package/src/extensions/autocomplete/index.ts +0 -8
- package/src/extensions/autocomplete/match.ts +0 -46
- package/src/extensions/autocomplete/placeholder.ts +0 -117
- package/src/extensions/autocomplete/typeahead.ts +0 -87
- package/src/extensions/automerge/automerge.stories.tsx +0 -149
- package/src/extensions/automerge/automerge.test.tsx +0 -78
- package/src/extensions/automerge/automerge.ts +0 -105
- package/src/extensions/automerge/cursor.ts +0 -28
- package/src/extensions/automerge/defs.ts +0 -31
- package/src/extensions/automerge/index.ts +0 -5
- package/src/extensions/automerge/sync.ts +0 -79
- package/src/extensions/automerge/update-automerge.ts +0 -50
- package/src/extensions/automerge/update-codemirror.ts +0 -115
- package/src/extensions/autoscroll.ts +0 -157
- package/src/extensions/awareness/awareness-provider.ts +0 -127
- package/src/extensions/awareness/awareness.ts +0 -315
- package/src/extensions/awareness/index.ts +0 -6
- package/src/extensions/blast.ts +0 -363
- package/src/extensions/comments.ts +0 -597
- package/src/extensions/debug.ts +0 -15
- package/src/extensions/dnd.ts +0 -37
- package/src/extensions/factories.ts +0 -276
- package/src/extensions/focus.ts +0 -36
- package/src/extensions/folding.tsx +0 -44
- package/src/extensions/hashtag.tsx +0 -68
- package/src/extensions/index.ts +0 -29
- package/src/extensions/json.ts +0 -57
- package/src/extensions/listener.ts +0 -38
- package/src/extensions/markdown/action.ts +0 -117
- package/src/extensions/markdown/bundle.ts +0 -105
- package/src/extensions/markdown/changes.test.ts +0 -26
- package/src/extensions/markdown/changes.ts +0 -149
- package/src/extensions/markdown/debug.ts +0 -44
- package/src/extensions/markdown/decorate.ts +0 -601
- package/src/extensions/markdown/formatting.test.ts +0 -498
- package/src/extensions/markdown/formatting.ts +0 -1267
- package/src/extensions/markdown/highlight.ts +0 -183
- package/src/extensions/markdown/image.ts +0 -118
- package/src/extensions/markdown/index.ts +0 -13
- package/src/extensions/markdown/link.ts +0 -50
- package/src/extensions/markdown/parser.test.ts +0 -75
- package/src/extensions/markdown/styles.ts +0 -135
- package/src/extensions/markdown/table.ts +0 -150
- package/src/extensions/mention.ts +0 -41
- package/src/extensions/modes.ts +0 -41
- package/src/extensions/outliner/commands.ts +0 -270
- package/src/extensions/outliner/editor.test.ts +0 -33
- package/src/extensions/outliner/editor.ts +0 -184
- package/src/extensions/outliner/index.ts +0 -7
- package/src/extensions/outliner/menu.ts +0 -128
- package/src/extensions/outliner/outliner.test.ts +0 -100
- package/src/extensions/outliner/outliner.ts +0 -167
- package/src/extensions/outliner/selection.ts +0 -50
- package/src/extensions/outliner/tree.test.ts +0 -168
- package/src/extensions/outliner/tree.ts +0 -317
- package/src/extensions/popover/index.ts +0 -12
- package/src/extensions/popover/modal.ts +0 -24
- package/src/extensions/popover/util.ts +0 -29
- package/src/extensions/preview/index.ts +0 -5
- package/src/extensions/preview/preview.ts +0 -188
- package/src/extensions/selection.ts +0 -100
- package/src/extensions/state.ts +0 -7
- package/src/extensions/tags/extended-markdown.test.ts +0 -261
- package/src/extensions/tags/extended-markdown.ts +0 -78
- package/src/extensions/tags/index.ts +0 -7
- package/src/extensions/tags/streamer.ts +0 -243
- package/src/extensions/tags/xml-tags.ts +0 -393
- package/src/extensions/tags/xml-util.ts +0 -94
- package/src/extensions/typewriter.ts +0 -68
- package/src/styles/index.ts +0 -7
- package/src/styles/markdown.ts +0 -26
- package/src/styles/theme.ts +0 -269
- package/src/styles/tokens.ts +0 -17
- package/src/testing/PreviewPopover.tsx +0 -80
- package/src/testing/index.ts +0 -6
- package/src/testing/util.ts +0 -7
- package/src/types/index.ts +0 -5
- package/src/types/types.ts +0 -32
- package/src/util/cursor.ts +0 -56
- package/src/util/debug.ts +0 -64
- package/src/util/decorations.ts +0 -21
- package/src/util/dom.ts +0 -34
- package/src/util/facet.ts +0 -13
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2024 DXOS.org
|
|
3
|
-
// Copyright 2024 Automerge
|
|
4
|
-
// Ref: https://github.com/automerge/automerge-codemirror
|
|
5
|
-
//
|
|
6
|
-
|
|
7
|
-
import { next as A } from '@automerge/automerge';
|
|
8
|
-
import { type Extension, StateField, Transaction } from '@codemirror/state';
|
|
9
|
-
import { EditorView, ViewPlugin } from '@codemirror/view';
|
|
10
|
-
|
|
11
|
-
import { DocAccessor } from '@dxos/react-client/echo';
|
|
12
|
-
|
|
13
|
-
import { Cursor } from '../../util';
|
|
14
|
-
import { initialSync } from '../state';
|
|
15
|
-
|
|
16
|
-
import { cursorConverter } from './cursor';
|
|
17
|
-
import { type State, isReconcile, updateHeadsEffect } from './defs';
|
|
18
|
-
import { Syncer } from './sync';
|
|
19
|
-
|
|
20
|
-
export const automerge = (accessor: DocAccessor): Extension => {
|
|
21
|
-
const syncState = StateField.define<State>({
|
|
22
|
-
create: () => {
|
|
23
|
-
return {
|
|
24
|
-
path: accessor.path.slice(),
|
|
25
|
-
lastHeads: A.getHeads(accessor.handle.doc()!),
|
|
26
|
-
unreconciledTransactions: [],
|
|
27
|
-
};
|
|
28
|
-
},
|
|
29
|
-
|
|
30
|
-
update: (value, tr) => {
|
|
31
|
-
const result: State = {
|
|
32
|
-
path: accessor.path.slice(),
|
|
33
|
-
lastHeads: value.lastHeads,
|
|
34
|
-
unreconciledTransactions: value.unreconciledTransactions.slice(),
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
let clearUnreconciled = false;
|
|
38
|
-
for (const effect of tr.effects) {
|
|
39
|
-
if (effect.is(updateHeadsEffect)) {
|
|
40
|
-
result.lastHeads = effect.value.newHeads;
|
|
41
|
-
clearUnreconciled = true;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
if (clearUnreconciled) {
|
|
46
|
-
result.unreconciledTransactions = [];
|
|
47
|
-
} else {
|
|
48
|
-
if (!isReconcile(tr)) {
|
|
49
|
-
result.unreconciledTransactions.push(tr);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return result;
|
|
54
|
-
},
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
const syncer = new Syncer(accessor.handle, syncState);
|
|
58
|
-
|
|
59
|
-
return [
|
|
60
|
-
Cursor.converter.of(cursorConverter(accessor)),
|
|
61
|
-
|
|
62
|
-
// Track heads.
|
|
63
|
-
syncState,
|
|
64
|
-
|
|
65
|
-
// Reconcile external updates.
|
|
66
|
-
ViewPlugin.fromClass(
|
|
67
|
-
class {
|
|
68
|
-
constructor(private readonly _view: EditorView) {
|
|
69
|
-
accessor.handle.addListener('change', this._handleChange);
|
|
70
|
-
|
|
71
|
-
requestAnimationFrame(() => {
|
|
72
|
-
const value = DocAccessor.getValue<string>(accessor);
|
|
73
|
-
const current = this._view.state.doc.toString();
|
|
74
|
-
if (value !== current) {
|
|
75
|
-
// TODO(burdon): This attempts to set the initial state, but creates problems.
|
|
76
|
-
// this._view.dispatch({
|
|
77
|
-
// changes: { from: 0, to: this._view.state.doc.length, insert: value },
|
|
78
|
-
// annotations: initialSync,
|
|
79
|
-
// });
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
destroy() {
|
|
85
|
-
accessor.handle.removeListener('change', this._handleChange);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
readonly _handleChange = () => {
|
|
89
|
-
syncer.reconcile(this._view, false);
|
|
90
|
-
};
|
|
91
|
-
},
|
|
92
|
-
),
|
|
93
|
-
|
|
94
|
-
// Reconcile local updates.
|
|
95
|
-
EditorView.updateListener.of(({ view, changes, transactions }) => {
|
|
96
|
-
if (!changes.empty) {
|
|
97
|
-
// Only reconcile if it's not an initial sync (to avoid loops)
|
|
98
|
-
const isInitialSync = transactions.some((tr) => tr.annotation(Transaction.userEvent) === initialSync.value);
|
|
99
|
-
if (!isInitialSync) {
|
|
100
|
-
syncer.reconcile(view, true);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}),
|
|
104
|
-
];
|
|
105
|
-
};
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2024 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { log } from '@dxos/log';
|
|
6
|
-
import { type DocAccessor, fromCursor, toCursor } from '@dxos/react-client/echo';
|
|
7
|
-
|
|
8
|
-
import { type CursorConverter } from '../../util';
|
|
9
|
-
|
|
10
|
-
export const cursorConverter = (accessor: DocAccessor): CursorConverter => ({
|
|
11
|
-
toCursor: (pos, assoc) => {
|
|
12
|
-
try {
|
|
13
|
-
return toCursor(accessor, pos, assoc);
|
|
14
|
-
} catch (err) {
|
|
15
|
-
log.catch(err);
|
|
16
|
-
return ''; // In case of invalid request (e.g., wrong document).
|
|
17
|
-
}
|
|
18
|
-
},
|
|
19
|
-
|
|
20
|
-
fromCursor: (cursor) => {
|
|
21
|
-
try {
|
|
22
|
-
return fromCursor(accessor, cursor);
|
|
23
|
-
} catch (err) {
|
|
24
|
-
log.catch(err);
|
|
25
|
-
return 0; // In case of invalid request (e.g., wrong document).
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
});
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2023 DXOS.org
|
|
3
|
-
// Copyright 2024 Automerge
|
|
4
|
-
// Ref: https://github.com/automerge/automerge-codemirror
|
|
5
|
-
//
|
|
6
|
-
|
|
7
|
-
import { type Heads, type Prop } from '@automerge/automerge';
|
|
8
|
-
import { Annotation, type EditorState, StateEffect, type StateField, type Transaction } from '@codemirror/state';
|
|
9
|
-
|
|
10
|
-
export type State = {
|
|
11
|
-
path: Prop[];
|
|
12
|
-
lastHeads: Heads;
|
|
13
|
-
unreconciledTransactions: Transaction[];
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export const getPath = (state: EditorState, field: StateField<State>): Prop[] => state.field(field).path;
|
|
17
|
-
export const getLastHeads = (state: EditorState, field: StateField<State>): Heads => state.field(field).lastHeads;
|
|
18
|
-
|
|
19
|
-
export type UpdateHeads = {
|
|
20
|
-
newHeads: Heads;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export const updateHeadsEffect = StateEffect.define<UpdateHeads>({});
|
|
24
|
-
|
|
25
|
-
export const updateHeads = (newHeads: Heads): StateEffect<UpdateHeads> => updateHeadsEffect.of({ newHeads });
|
|
26
|
-
|
|
27
|
-
export const reconcileAnnotation = Annotation.define<boolean>();
|
|
28
|
-
|
|
29
|
-
export const isReconcile = (tr: Transaction): boolean => {
|
|
30
|
-
return !!tr.annotation(reconcileAnnotation);
|
|
31
|
-
};
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2023 DXOS.org
|
|
3
|
-
// Copyright 2024 Automerge
|
|
4
|
-
// Ref: https://github.com/automerge/automerge-codemirror
|
|
5
|
-
//
|
|
6
|
-
|
|
7
|
-
import { next as A } from '@automerge/automerge';
|
|
8
|
-
import { type StateField } from '@codemirror/state';
|
|
9
|
-
import { type EditorView } from '@codemirror/view';
|
|
10
|
-
|
|
11
|
-
import { log } from '@dxos/log';
|
|
12
|
-
import { type IDocHandle } from '@dxos/react-client/echo';
|
|
13
|
-
|
|
14
|
-
import { type State, getLastHeads, getPath, isReconcile, reconcileAnnotation, updateHeads } from './defs';
|
|
15
|
-
import { updateAutomerge } from './update-automerge';
|
|
16
|
-
import { updateCodeMirror } from './update-codemirror';
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Implements three-way merge (on each mutation).
|
|
20
|
-
*/
|
|
21
|
-
export class Syncer {
|
|
22
|
-
private _pending = false;
|
|
23
|
-
|
|
24
|
-
// prettier-ignore
|
|
25
|
-
constructor(
|
|
26
|
-
private readonly _handle: IDocHandle,
|
|
27
|
-
private readonly _state: StateField<State>
|
|
28
|
-
) {}
|
|
29
|
-
|
|
30
|
-
reconcile(view: EditorView, editor: boolean): void {
|
|
31
|
-
if (this._pending) {
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
this._pending = true;
|
|
36
|
-
if (editor) {
|
|
37
|
-
this.onEditorChange(view);
|
|
38
|
-
} else {
|
|
39
|
-
this.onAutomergeChange(view);
|
|
40
|
-
}
|
|
41
|
-
this._pending = false;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
private onEditorChange(view: EditorView): void {
|
|
45
|
-
log('onEditorChange');
|
|
46
|
-
|
|
47
|
-
// Apply the unreconciled transactions to the document.
|
|
48
|
-
const transactions = view.state.field(this._state).unreconciledTransactions.filter((tx) => !isReconcile(tx));
|
|
49
|
-
const newHeads = updateAutomerge(this._state, this._handle, transactions, view.state);
|
|
50
|
-
|
|
51
|
-
if (newHeads) {
|
|
52
|
-
view.dispatch({
|
|
53
|
-
effects: updateHeads(newHeads),
|
|
54
|
-
annotations: reconcileAnnotation.of(false),
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
private onAutomergeChange(view: EditorView): void {
|
|
60
|
-
log('onAutomergeChange');
|
|
61
|
-
|
|
62
|
-
// Get the diff between the updated state of the document and the heads and apply that to the codemirror doc.
|
|
63
|
-
const oldHeads = getLastHeads(view.state, this._state);
|
|
64
|
-
const newHeads = A.getHeads(this._handle.doc()!);
|
|
65
|
-
const diff = A.equals(oldHeads, newHeads) ? [] : A.diff(this._handle.doc()!, oldHeads, newHeads);
|
|
66
|
-
|
|
67
|
-
const selection = view.state.selection;
|
|
68
|
-
const path = getPath(view.state, this._state);
|
|
69
|
-
updateCodeMirror(view, selection, path, diff);
|
|
70
|
-
|
|
71
|
-
// TODO(burdon): Test conflicts?
|
|
72
|
-
// A.getConflicts(this._handle.doc()!, path[0]);
|
|
73
|
-
|
|
74
|
-
view.dispatch({
|
|
75
|
-
effects: updateHeads(newHeads),
|
|
76
|
-
annotations: reconcileAnnotation.of(false),
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2023 DXOS.org
|
|
3
|
-
// Copyright 2024 Automerge
|
|
4
|
-
// Ref: https://github.com/automerge/automerge-codemirror
|
|
5
|
-
//
|
|
6
|
-
|
|
7
|
-
import { next as A, type Heads } from '@automerge/automerge';
|
|
8
|
-
import { type EditorState, type StateField, type Text, type Transaction } from '@codemirror/state';
|
|
9
|
-
|
|
10
|
-
import { type IDocHandle } from '@dxos/react-client/echo';
|
|
11
|
-
|
|
12
|
-
import { type State } from './defs';
|
|
13
|
-
|
|
14
|
-
export const updateAutomerge = (
|
|
15
|
-
field: StateField<State>,
|
|
16
|
-
handle: IDocHandle,
|
|
17
|
-
transactions: Transaction[],
|
|
18
|
-
state: EditorState, // TODO(burdon): Just pass in the state field value?
|
|
19
|
-
): Heads | undefined => {
|
|
20
|
-
const { lastHeads, path } = state.field(field);
|
|
21
|
-
|
|
22
|
-
// We don't want to call `automerge.updateAt` if there are no changes.
|
|
23
|
-
// Otherwise, later on `automerge.diff` will return empty patches that result in a no-op but still mess up the selection.
|
|
24
|
-
let hasChanges = false;
|
|
25
|
-
for (const tr of transactions) {
|
|
26
|
-
tr.changes.iterChanges(() => {
|
|
27
|
-
hasChanges = true;
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
if (!hasChanges) {
|
|
32
|
-
return undefined;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const newHeads = handle.changeAt(lastHeads, (doc: A.Doc<unknown>) => {
|
|
36
|
-
const invertedTransactions: { from: number; del: number; insert: Text }[] = [];
|
|
37
|
-
for (const tr of transactions) {
|
|
38
|
-
tr.changes.iterChanges((fromA, toA, _fromB, _toB, insert) => {
|
|
39
|
-
invertedTransactions.push({ from: fromA, del: toA - fromA, insert });
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// TODO(burdon): Hack to apply in reverse order to properly apply range.
|
|
44
|
-
invertedTransactions.reverse().forEach(({ from, del, insert }) => {
|
|
45
|
-
A.splice(doc, path.slice(), from, del, insert.toString());
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
return newHeads ?? undefined;
|
|
50
|
-
};
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2023 DXOS.org
|
|
3
|
-
// Copyright 2024 Automerge
|
|
4
|
-
// Ref: https://github.com/automerge/automerge-codemirror
|
|
5
|
-
//
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
type DelPatch,
|
|
9
|
-
type InsertPatch,
|
|
10
|
-
type Patch,
|
|
11
|
-
type Prop,
|
|
12
|
-
type PutPatch,
|
|
13
|
-
type SpliceTextPatch,
|
|
14
|
-
} from '@automerge/automerge';
|
|
15
|
-
import { ChangeSet, type ChangeSpec, type EditorSelection, type EditorState } from '@codemirror/state';
|
|
16
|
-
import { type EditorView } from '@codemirror/view';
|
|
17
|
-
|
|
18
|
-
import { reconcileAnnotation } from './defs';
|
|
19
|
-
|
|
20
|
-
export const updateCodeMirror = (view: EditorView, selection: EditorSelection, target: Prop[], patches: Patch[]) => {
|
|
21
|
-
for (const patch of patches) {
|
|
22
|
-
const changeSpec = handlePatch(patch, target, view.state);
|
|
23
|
-
if (changeSpec != null) {
|
|
24
|
-
const changeSet = ChangeSet.of(changeSpec, view.state.doc.length, '\n');
|
|
25
|
-
selection = selection.map(changeSet, 1);
|
|
26
|
-
view.dispatch({
|
|
27
|
-
changes: changeSet,
|
|
28
|
-
annotations: reconcileAnnotation.of(false),
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
view.dispatch({
|
|
34
|
-
selection,
|
|
35
|
-
annotations: reconcileAnnotation.of(false),
|
|
36
|
-
});
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
const handlePatch = (patch: Patch, target: Prop[], state: EditorState): ChangeSpec | null => {
|
|
40
|
-
if (patch.action === 'insert') {
|
|
41
|
-
return handleInsert(target, patch);
|
|
42
|
-
} else if (patch.action === 'splice') {
|
|
43
|
-
return handleSplice(target, patch);
|
|
44
|
-
} else if (patch.action === 'del') {
|
|
45
|
-
return handleDel(target, patch);
|
|
46
|
-
} else if (patch.action === 'put') {
|
|
47
|
-
return handlePut(target, patch, state);
|
|
48
|
-
} else {
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
const handleInsert = (target: Prop[], patch: InsertPatch): Array<ChangeSpec> => {
|
|
54
|
-
const index = charPath(target, patch.path);
|
|
55
|
-
if (index == null) {
|
|
56
|
-
return [];
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const text = patch.values.map((value) => (value ? value.toString() : '')).join('');
|
|
60
|
-
return [{ from: index, to: index, insert: text }];
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
const handleSplice = (target: Prop[], patch: SpliceTextPatch): Array<ChangeSpec> => {
|
|
64
|
-
const index = charPath(target, patch.path);
|
|
65
|
-
if (index == null) {
|
|
66
|
-
return [];
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return [{ from: index, insert: patch.value }];
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
const handleDel = (target: Prop[], patch: DelPatch): Array<ChangeSpec> => {
|
|
73
|
-
const index = charPath(target, patch.path);
|
|
74
|
-
if (index == null) {
|
|
75
|
-
return [];
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const length = patch.length || 1;
|
|
79
|
-
return [{ from: index, to: index + length }];
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
const handlePut = (target: Prop[], patch: PutPatch, state: EditorState): Array<ChangeSpec> => {
|
|
83
|
-
const index = charPath(target, [...patch.path, 0]);
|
|
84
|
-
if (index == null) {
|
|
85
|
-
return [];
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const length = state.doc.length;
|
|
89
|
-
if (typeof patch.value !== 'string') {
|
|
90
|
-
return []; // TODO(dmaretskyi): How to handle non-string values?
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return [{ from: 0, to: length, insert: patch.value as any }];
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
// If the path of the patch is of the form [path, <index>] then we know this is a path to a character
|
|
97
|
-
// within the sequence given by path.
|
|
98
|
-
const charPath = (textPath: Prop[], candidatePath: Prop[]): number | null => {
|
|
99
|
-
if (candidatePath.length !== textPath.length + 1) {
|
|
100
|
-
return null;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
for (let i = 0; i < textPath.length; i++) {
|
|
104
|
-
if (textPath[i] !== candidatePath[i]) {
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const index = candidatePath[candidatePath.length - 1];
|
|
110
|
-
if (typeof index === 'number') {
|
|
111
|
-
return index;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
return null;
|
|
115
|
-
};
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2025 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { StateEffect } from '@codemirror/state';
|
|
6
|
-
import { EditorView, ViewPlugin } from '@codemirror/view';
|
|
7
|
-
|
|
8
|
-
import { Domino } from '@dxos/react-ui';
|
|
9
|
-
|
|
10
|
-
const lineHeight = 24;
|
|
11
|
-
|
|
12
|
-
export const scrollToBottomEffect = StateEffect.define<any>();
|
|
13
|
-
|
|
14
|
-
export type AutoScrollOptions = {
|
|
15
|
-
overscroll?: number;
|
|
16
|
-
throttle?: number;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Extension that supports pinning the scroll position and automatically scrolls to the bottom when content is added.
|
|
21
|
-
*/
|
|
22
|
-
// TODO(burdon): Reconcile with transcript-extension.
|
|
23
|
-
export const autoScroll = ({ overscroll = 4 * lineHeight, throttle = 2_000 }: Partial<AutoScrollOptions> = {}) => {
|
|
24
|
-
let isThrottled = false;
|
|
25
|
-
let isPinned = true;
|
|
26
|
-
let timeout: NodeJS.Timeout | undefined;
|
|
27
|
-
let buttonContainer: HTMLDivElement | undefined;
|
|
28
|
-
let lastScrollTop = 0;
|
|
29
|
-
let scrollCounter = 0;
|
|
30
|
-
|
|
31
|
-
const hideScrollbar = (view: EditorView) => {
|
|
32
|
-
view.scrollDOM.classList.add('cm-hide-scrollbar');
|
|
33
|
-
clearTimeout(timeout);
|
|
34
|
-
timeout = setTimeout(() => {
|
|
35
|
-
view.scrollDOM.classList.remove('cm-hide-scrollbar');
|
|
36
|
-
}, 1_000);
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
const scrollToBottom = (view: EditorView) => {
|
|
40
|
-
isPinned = true;
|
|
41
|
-
scrollCounter = 0;
|
|
42
|
-
buttonContainer?.classList.add('opacity-0');
|
|
43
|
-
requestAnimationFrame(() => {
|
|
44
|
-
hideScrollbar(view);
|
|
45
|
-
view.scrollDOM.scrollTo({
|
|
46
|
-
top: view.scrollDOM.scrollHeight,
|
|
47
|
-
behavior: 'smooth',
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
return [
|
|
53
|
-
// Update listener for logging when scrolling is needed.
|
|
54
|
-
EditorView.updateListener.of((update) => {
|
|
55
|
-
// Listen for effects.
|
|
56
|
-
update.transactions.forEach((transaction) => {
|
|
57
|
-
for (const effect of transaction.effects) {
|
|
58
|
-
if (effect.is(scrollToBottomEffect)) {
|
|
59
|
-
scrollToBottom(update.view);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
// Maybe scroll if doc changed and pinned.
|
|
65
|
-
if (update.docChanged && isPinned && !isThrottled) {
|
|
66
|
-
const distanceFromBottom = calcDistance(update.view.scrollDOM);
|
|
67
|
-
if (distanceFromBottom >= overscroll) {
|
|
68
|
-
isThrottled = true;
|
|
69
|
-
requestAnimationFrame(() => {
|
|
70
|
-
scrollToBottom(update.view);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
// Reset throttle.
|
|
74
|
-
setTimeout(() => {
|
|
75
|
-
isThrottled = false;
|
|
76
|
-
scrollToBottom(update.view);
|
|
77
|
-
}, throttle);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}),
|
|
81
|
-
|
|
82
|
-
// Detect user scroll.
|
|
83
|
-
// NOTE: Multiple scroll events are triggered during programmatic smooth scrolling.
|
|
84
|
-
EditorView.domEventHandlers({
|
|
85
|
-
scroll: (event, view) => {
|
|
86
|
-
const scroller = view.scrollDOM;
|
|
87
|
-
// Suspect delta goes positive when rendering widgets, so count positive deltas.
|
|
88
|
-
// TODO(burdon): Detect user scroll directly (wheel, touch, keys, etc.)
|
|
89
|
-
if (lastScrollTop > scroller.scrollTop) {
|
|
90
|
-
scrollCounter++;
|
|
91
|
-
}
|
|
92
|
-
lastScrollTop = scroller.scrollTop;
|
|
93
|
-
const distanceFromBottom = calcDistance(scroller);
|
|
94
|
-
if (distanceFromBottom === 0) {
|
|
95
|
-
// Pin to bottom.
|
|
96
|
-
isPinned = true;
|
|
97
|
-
buttonContainer?.classList.add('opacity-0');
|
|
98
|
-
scrollCounter = 0;
|
|
99
|
-
} else if (scrollCounter > 3) {
|
|
100
|
-
// Break pin if user scrolls up.
|
|
101
|
-
isPinned = false;
|
|
102
|
-
buttonContainer?.classList.remove('opacity-0');
|
|
103
|
-
}
|
|
104
|
-
},
|
|
105
|
-
}),
|
|
106
|
-
|
|
107
|
-
// Scroll button.
|
|
108
|
-
ViewPlugin.fromClass(
|
|
109
|
-
class {
|
|
110
|
-
constructor(view: EditorView) {
|
|
111
|
-
const scroller = view.scrollDOM.parentElement;
|
|
112
|
-
buttonContainer = Domino.of('div')
|
|
113
|
-
.classNames(true && 'cm-scroll-button transition-opacity duration-300 opacity-0')
|
|
114
|
-
.children(
|
|
115
|
-
Domino.of('button')
|
|
116
|
-
.classNames('dx-button bg-accentSurface')
|
|
117
|
-
.data('density', 'fine')
|
|
118
|
-
.children(Domino.of<any>('dx-icon').attributes({ icon: 'ph--arrow-down--regular' }))
|
|
119
|
-
.on('click', () => {
|
|
120
|
-
scrollToBottom(view);
|
|
121
|
-
}),
|
|
122
|
-
)
|
|
123
|
-
.build();
|
|
124
|
-
scroller?.appendChild(buttonContainer);
|
|
125
|
-
}
|
|
126
|
-
},
|
|
127
|
-
),
|
|
128
|
-
|
|
129
|
-
// Styles.
|
|
130
|
-
EditorView.theme({
|
|
131
|
-
'.cm-scroller': {
|
|
132
|
-
paddingBottom: `${overscroll}px`,
|
|
133
|
-
scrollbarWidth: 'thin',
|
|
134
|
-
},
|
|
135
|
-
'.cm-scroller.cm-hide-scrollbar': {
|
|
136
|
-
scrollbarWidth: 'none',
|
|
137
|
-
},
|
|
138
|
-
'.cm-scroller.cm-hide-scrollbar::-webkit-scrollbar': {
|
|
139
|
-
display: 'none',
|
|
140
|
-
},
|
|
141
|
-
|
|
142
|
-
'.cm-scroll-button': {
|
|
143
|
-
position: 'absolute',
|
|
144
|
-
bottom: '0.5rem',
|
|
145
|
-
right: '1rem',
|
|
146
|
-
},
|
|
147
|
-
}),
|
|
148
|
-
];
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
const calcDistance = (scroller: HTMLElement) => {
|
|
152
|
-
const scrollTop = scroller.scrollTop;
|
|
153
|
-
const scrollHeight = scroller.scrollHeight;
|
|
154
|
-
const clientHeight = scroller.clientHeight;
|
|
155
|
-
const distanceFromBottom = scrollHeight - (scrollTop + clientHeight);
|
|
156
|
-
return distanceFromBottom;
|
|
157
|
-
};
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2024 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { DeferredTask, Event, sleep } from '@dxos/async';
|
|
6
|
-
import { Context } from '@dxos/context';
|
|
7
|
-
import { invariant } from '@dxos/invariant';
|
|
8
|
-
import { log } from '@dxos/log';
|
|
9
|
-
import { type Space } from '@dxos/react-client/echo';
|
|
10
|
-
import { type GossipMessage } from '@dxos/react-client/mesh';
|
|
11
|
-
|
|
12
|
-
import { type AwarenessInfo, type AwarenessPosition, type AwarenessProvider, type AwarenessState } from './awareness';
|
|
13
|
-
|
|
14
|
-
type ProtocolMessage =
|
|
15
|
-
| {
|
|
16
|
-
kind: 'query';
|
|
17
|
-
}
|
|
18
|
-
| {
|
|
19
|
-
kind: 'post';
|
|
20
|
-
state: AwarenessState;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
const DEBOUNCE_INTERVAL = 100; // ms
|
|
24
|
-
|
|
25
|
-
export type AwarenessProviderParams = {
|
|
26
|
-
space: Space;
|
|
27
|
-
channel: string;
|
|
28
|
-
peerId: string;
|
|
29
|
-
info: AwarenessInfo;
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Receives and broadcasts profile and cursor position.
|
|
34
|
-
*/
|
|
35
|
-
export class SpaceAwarenessProvider implements AwarenessProvider {
|
|
36
|
-
private readonly _remoteStates = new Map<string, AwarenessState>();
|
|
37
|
-
|
|
38
|
-
private readonly _space: Space;
|
|
39
|
-
private readonly _channel: string;
|
|
40
|
-
private readonly _peerId: string;
|
|
41
|
-
private readonly _info: AwarenessInfo;
|
|
42
|
-
|
|
43
|
-
private _ctx?: Context;
|
|
44
|
-
private _postTask?: DeferredTask;
|
|
45
|
-
private _localState?: AwarenessState;
|
|
46
|
-
|
|
47
|
-
public readonly remoteStateChange = new Event<void>();
|
|
48
|
-
|
|
49
|
-
constructor(params: AwarenessProviderParams) {
|
|
50
|
-
this._space = params.space;
|
|
51
|
-
this._channel = params.channel;
|
|
52
|
-
this._peerId = params.peerId;
|
|
53
|
-
this._info = params.info;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
open(): void {
|
|
57
|
-
this._ctx = new Context();
|
|
58
|
-
this._postTask = new DeferredTask(this._ctx, async () => {
|
|
59
|
-
if (this._localState) {
|
|
60
|
-
await this._space.postMessage(this._channel, {
|
|
61
|
-
kind: 'post',
|
|
62
|
-
state: this._localState,
|
|
63
|
-
} satisfies ProtocolMessage);
|
|
64
|
-
|
|
65
|
-
// TODO(burdon): Replace with throttle.
|
|
66
|
-
// TODO(burdon): Send heads?
|
|
67
|
-
await sleep(DEBOUNCE_INTERVAL);
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
this._ctx.onDispose(
|
|
72
|
-
this._space.listen(this._channel, (message: GossipMessage) => {
|
|
73
|
-
switch (message.payload.kind) {
|
|
74
|
-
case 'query': {
|
|
75
|
-
this._handleQueryMessage();
|
|
76
|
-
break;
|
|
77
|
-
}
|
|
78
|
-
case 'post': {
|
|
79
|
-
this._handlePostMessage(message.payload);
|
|
80
|
-
break;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}),
|
|
84
|
-
);
|
|
85
|
-
|
|
86
|
-
void this._space
|
|
87
|
-
.postMessage(this._channel, {
|
|
88
|
-
kind: 'query',
|
|
89
|
-
} satisfies ProtocolMessage)
|
|
90
|
-
.catch((err) => {
|
|
91
|
-
log.debug('failed to query awareness', { err });
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
close(): void {
|
|
96
|
-
void this._ctx?.dispose();
|
|
97
|
-
this._ctx = undefined;
|
|
98
|
-
this._postTask = undefined;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
getRemoteStates(): AwarenessState[] {
|
|
102
|
-
return Array.from(this._remoteStates.values());
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
update(position: AwarenessPosition | undefined): void {
|
|
106
|
-
invariant(this._postTask);
|
|
107
|
-
this._localState = {
|
|
108
|
-
peerId: this._peerId,
|
|
109
|
-
position,
|
|
110
|
-
info: this._info,
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
this._postTask.schedule();
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
private _handleQueryMessage(): void {
|
|
117
|
-
invariant(this._postTask);
|
|
118
|
-
this._postTask.schedule();
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
private _handlePostMessage(message: ProtocolMessage): void {
|
|
122
|
-
invariant(message.kind === 'post');
|
|
123
|
-
// TODO(wittjosiah): Is it helpful or confusing to show cursors for self on other devices?
|
|
124
|
-
this._remoteStates.set(message.state.peerId, message.state);
|
|
125
|
-
this.remoteStateChange.emit();
|
|
126
|
-
}
|
|
127
|
-
}
|