Improve scrolling behaviour

- Focusing a document or terminal scrolls it into view
- Automatic scrolling leaves some room around the target
- Aside: fix terminal shortcut giving input to xtermjs
This commit is contained in:
Quinten Kock 2025-11-30 00:40:27 +01:00
parent 62d5af3b1e
commit 8d935eb90e
3 changed files with 17 additions and 6 deletions

View File

@ -44,6 +44,7 @@ const fixedHeightEditor = EditorView.theme({
minWidth: "8em", minWidth: "8em",
flex: "none", flex: "none",
fontSize: "16px", fontSize: "16px",
scrollMargin: "100px",
}, },
".cm-scroller": { overflow: "auto scroll" }, ".cm-scroller": { overflow: "auto scroll" },
}); });
@ -144,6 +145,7 @@ export class Editor implements Displayable {
// lintKeymap, // lintKeymap,
], ],
}); });
this.view.dom.addEventListener("focusin", () => this.focus());
van.derive(() => { van.derive(() => {
LanguageDescription.matchFilename(languages, file.filePath.val) LanguageDescription.matchFilename(languages, file.filePath.val)
@ -169,7 +171,7 @@ export class Editor implements Displayable {
} }
focus() { focus() {
this.view.dom.scrollIntoView(); this.view.dom.scrollIntoView({ behavior: "smooth", });
this.view.focus(); this.view.focus();
} }

View File

@ -91,8 +91,15 @@ export const EditorTabs = v.div(
vanX.list(TabBar, editors, TabHeader); vanX.list(TabBar, editors, TabHeader);
vanX.list(EditorTabs, editors, EditorGrid); vanX.list(EditorTabs, editors, EditorGrid);
document.addEventListener("keyup", (e) => { function shortcutHandler(e: KeyboardEvent) {
if (e.key === "t" && e.altKey) { if (e.key === "t" && e.altKey) {
addTerminal(); if (e.type === "keydown") {
addTerminal();
}
e.preventDefault();
} }
}); }
document.addEventListener("keyup", shortcutHandler, { capture: true, });
document.addEventListener("keydown", shortcutHandler, { capture: true, });

View File

@ -33,7 +33,9 @@ export class Terminal implements Displayable {
this.fitAddon = new FitAddon(); this.fitAddon = new FitAddon();
this.term.loadAddon(this.fitAddon); this.term.loadAddon(this.fitAddon);
this.dom = v.div({ class: "h-full w-lg resize-x overflow-x-hidden" }); this.dom = v.div({ class: "h-full w-lg resize-x overflow-x-hidden scroll-m-[100px]" });
this.dom.addEventListener("focusin", () => this.focus());
const loaded = van.state(false); const loaded = van.state(false);
van.derive(() => { van.derive(() => {
@ -108,7 +110,7 @@ export class Terminal implements Displayable {
} }
focus() { focus() {
this.dom.scrollIntoView(); this.dom.scrollIntoView({ behavior: "smooth" });
this.term.focus(); this.term.focus();
} }