summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src
diff options
context:
space:
mode:
authorShoubhit Dash <[email protected]>2026-04-03 18:42:01 +0530
committerGitHub <[email protected]>2026-04-03 08:12:01 -0500
commitc307505f8b3629a3ffda291fa8496f474c3e097d (patch)
tree92fe96bac34d1b86abefc7f9523348a12d0a9f66 /packages/app/src
parent6359d00fb41cefefe3d418d0360473b9f1d52df2 (diff)
downloadopencode-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.tsx11
-rw-r--r--packages/app/src/pages/session/message-timeline.tsx7
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