summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorFilip <[email protected]>2026-02-25 15:57:13 +0100
committerGitHub <[email protected]>2026-02-25 08:57:13 -0600
commit45191ad144f6546c051fb3a94f9f3cb1e2c00ed3 (patch)
tree3bc16bef606b64c42f656fc59838baa2d204cbda
parent286992269623bcb410f0de89e128ff14361d5e97 (diff)
downloadopencode-45191ad144f6546c051fb3a94f9f3cb1e2c00ed3.tar.gz
opencode-45191ad144f6546c051fb3a94f9f3cb1e2c00ed3.zip
fix(app): keyboard navigation previous/next message (#15047)
-rw-r--r--packages/app/src/pages/session.tsx11
-rw-r--r--packages/app/src/pages/session/message-timeline.tsx1
-rw-r--r--packages/app/src/pages/session/use-session-hash-scroll.ts4
3 files changed, 10 insertions, 6 deletions
diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx
index e0ef92682..2e440a6b0 100644
--- a/packages/app/src/pages/session.tsx
+++ b/packages/app/src/pages/session.tsx
@@ -254,12 +254,13 @@ export default function Page() {
const msgs = visibleUserMessages()
if (msgs.length === 0) return
- const current = activeMessage()
- const currentIndex = current ? msgs.findIndex((m) => m.id === current.id) : -1
- const targetIndex = currentIndex === -1 ? (offset > 0 ? 0 : msgs.length - 1) : currentIndex + offset
- if (targetIndex < 0 || targetIndex >= msgs.length) return
+ const current = store.messageId
+ const base = current ? msgs.findIndex((m) => m.id === current) : msgs.length
+ const currentIndex = base === -1 ? msgs.length : base
+ const targetIndex = currentIndex + offset
+ if (targetIndex < 0 || targetIndex > msgs.length) return
- if (targetIndex === msgs.length - 1) {
+ if (targetIndex === msgs.length) {
resumeScroll()
return
}
diff --git a/packages/app/src/pages/session/message-timeline.tsx b/packages/app/src/pages/session/message-timeline.tsx
index 615d1a0be..b84109035 100644
--- a/packages/app/src/pages/session/message-timeline.tsx
+++ b/packages/app/src/pages/session/message-timeline.tsx
@@ -376,6 +376,7 @@ export function MessageTimeline(props: {
>
<Show when={showHeader()}>
<div
+ data-session-title
classList={{
"sticky top-0 z-30 bg-[linear-gradient(to_bottom,var(--background-stronger)_48px,transparent)]": true,
"w-full": true,
diff --git a/packages/app/src/pages/session/use-session-hash-scroll.ts b/packages/app/src/pages/session/use-session-hash-scroll.ts
index 555761ad1..b704e460b 100644
--- a/packages/app/src/pages/session/use-session-hash-scroll.ts
+++ b/packages/app/src/pages/session/use-session-hash-scroll.ts
@@ -45,7 +45,9 @@ export const useSessionHashScroll = (input: {
const a = el.getBoundingClientRect()
const b = root.getBoundingClientRect()
- const top = a.top - b.top + root.scrollTop
+ const sticky = root.querySelector("[data-session-title]")
+ const inset = sticky instanceof HTMLElement ? sticky.offsetHeight : 0
+ const top = Math.max(0, a.top - b.top + root.scrollTop - inset)
root.scrollTo({ top, behavior })
return true
}