diff options
| author | Adam <[email protected]> | 2026-01-22 06:51:17 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2026-01-22 07:16:01 -0600 |
| commit | 09997bb6c8db0c01fc9b699798d0bbbc7265b14c (patch) | |
| tree | 3e55b6c2cbeefcff1ea74e413477ff96cd283081 | |
| parent | aa17729008cfeb94c550c0b1b0f14aeae54a372a (diff) | |
| download | opencode-09997bb6c8db0c01fc9b699798d0bbbc7265b14c.tar.gz opencode-09997bb6c8db0c01fc9b699798d0bbbc7265b14c.zip | |
fix(app): auto-scroll
| -rw-r--r-- | packages/app/src/pages/session.tsx | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 26721bf92..b84e8a1f5 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -381,6 +381,22 @@ export default function Page() { let promptDock: HTMLDivElement | undefined let scroller: HTMLDivElement | undefined + const [scrollGesture, setScrollGesture] = createSignal(0) + const scrollGestureWindowMs = 250 + + const markScrollGesture = (target?: EventTarget | null) => { + const root = scroller + if (!root) return + + const el = target instanceof Element ? target : undefined + const nested = el?.closest("[data-scrollable]") + if (nested && nested !== root) return + + setScrollGesture(Date.now()) + } + + const hasScrollGesture = () => Date.now() - scrollGesture() < scrollGestureWindowMs + createEffect(() => { if (!params.id) return sync.session.sync(params.id) @@ -795,6 +811,12 @@ export default function Page() { // Don't autofocus chat if terminal panel is open if (view().terminal.opened()) return + // Only treat explicit scroll keys as potential "user scroll" gestures. + if (event.key === "PageUp" || event.key === "PageDown" || event.key === "Home" || event.key === "End") { + markScrollGesture() + return + } + if (event.key.length === 1 && event.key !== "Unidentified" && !(event.ctrlKey || event.metaKey)) { inputRef?.focus() } @@ -1385,7 +1407,15 @@ export default function Page() { </div> <div ref={setScrollRef} + onWheel={(e) => markScrollGesture(e.target)} + onTouchMove={(e) => markScrollGesture(e.target)} + onPointerDown={(e) => { + if (e.target !== e.currentTarget) return + markScrollGesture(e.target) + }} onScroll={(e) => { + if (!hasScrollGesture()) return + setScrollGesture(Date.now()) autoScroll.handleScroll() if (isDesktop() && autoScroll.userScrolled()) scheduleScrollSpy(e.currentTarget) }} |
