summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-01-22 06:51:17 -0600
committerAdam <[email protected]>2026-01-22 07:16:01 -0600
commit09997bb6c8db0c01fc9b699798d0bbbc7265b14c (patch)
tree3e55b6c2cbeefcff1ea74e413477ff96cd283081
parentaa17729008cfeb94c550c0b1b0f14aeae54a372a (diff)
downloadopencode-09997bb6c8db0c01fc9b699798d0bbbc7265b14c.tar.gz
opencode-09997bb6c8db0c01fc9b699798d0bbbc7265b14c.zip
fix(app): auto-scroll
-rw-r--r--packages/app/src/pages/session.tsx30
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)
}}