diff options
| author | Shoubhit Dash <[email protected]> | 2026-04-03 18:42:01 +0530 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-04-03 08:12:01 -0500 |
| commit | c307505f8b3629a3ffda291fa8496f474c3e097d (patch) | |
| tree | 92fe96bac34d1b86abefc7f9523348a12d0a9f66 /packages/app/src | |
| parent | 6359d00fb41cefefe3d418d0360473b9f1d52df2 (diff) | |
| download | opencode-c307505f8b3629a3ffda291fa8496f474c3e097d.tar.gz opencode-c307505f8b3629a3ffda291fa8496f474c3e097d.zip | |
fix(session): delay jump-to-bottom button (#20853)
Diffstat (limited to 'packages/app/src')
| -rw-r--r-- | packages/app/src/pages/session.tsx | 11 | ||||
| -rw-r--r-- | packages/app/src/pages/session/message-timeline.tsx | 7 |
2 files changed, 11 insertions, 7 deletions
diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 98d06fda7..ae895adbe 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -347,6 +347,7 @@ export default function Page() { scroll: { overflow: false, bottom: true, + jump: false, }, }) @@ -1247,13 +1248,17 @@ export default function Page() { let scrollStateTarget: HTMLDivElement | undefined let fillFrame: number | undefined + const jumpThreshold = (el: HTMLDivElement) => Math.max(400, el.clientHeight) + const updateScrollState = (el: HTMLDivElement) => { const max = el.scrollHeight - el.clientHeight + const distance = max - el.scrollTop const overflow = max > 1 - const bottom = !overflow || el.scrollTop >= max - 2 + const bottom = !overflow || distance <= 2 + const jump = overflow && distance > jumpThreshold(el) - if (ui.scroll.overflow === overflow && ui.scroll.bottom === bottom) return - setUi("scroll", { overflow, bottom }) + if (ui.scroll.overflow === overflow && ui.scroll.bottom === bottom && ui.scroll.jump === jump) return + setUi("scroll", { overflow, bottom, jump }) } const scheduleScrollState = (el: HTMLDivElement) => { diff --git a/packages/app/src/pages/session/message-timeline.tsx b/packages/app/src/pages/session/message-timeline.tsx index a246abaf3..e1d6da195 100644 --- a/packages/app/src/pages/session/message-timeline.tsx +++ b/packages/app/src/pages/session/message-timeline.tsx @@ -200,7 +200,7 @@ export function MessageTimeline(props: { mobileChanges: boolean mobileFallback: JSX.Element actions?: UserActions - scroll: { overflow: boolean; bottom: boolean } + scroll: { overflow: boolean; bottom: boolean; jump: boolean } onResumeScroll: () => void setScrollRef: (el: HTMLDivElement | undefined) => void onScheduleScrollState: (el: HTMLDivElement) => void @@ -568,10 +568,9 @@ export function MessageTimeline(props: { <div class="absolute left-1/2 -translate-x-1/2 bottom-6 z-[60] pointer-events-none transition-all duration-200 ease-out" classList={{ - "opacity-100 translate-y-0 scale-100": - props.scroll.overflow && !props.scroll.bottom && !staging.isStaging(), + "opacity-100 translate-y-0 scale-100": props.scroll.overflow && props.scroll.jump && !staging.isStaging(), "opacity-0 translate-y-2 scale-95 pointer-events-none": - !props.scroll.overflow || props.scroll.bottom || staging.isStaging(), + !props.scroll.overflow || !props.scroll.jump || staging.isStaging(), }} > <button |
