feat: add keyboard turn navigation

Navigate chat turns with ArrowUp and ArrowDown
Only triggers when the chat area is focused
Supports scrolling to the latest visible turn
This commit is contained in:
Bohdan Triapitsyn
2026-04-26 18:17:13 +03:00
parent c8eb9a6c5f
commit a3b300f7a9
3 changed files with 149 additions and 18 deletions
+15 -15
View File
@@ -1474,21 +1474,22 @@ const MessageList = React.forwardRef<MessageListHandle, MessageListProps>(({
return false;
}
const targetIsTail = trailingStreamingEntry !== undefined && index >= historyEntries.length;
if (targetIsTail) {
return false;
}
const container = resolveScrollContainer();
if (!container) {
return false;
}
const turnElement = container.querySelector<HTMLElement>(`[data-turn-id="${turnId}"]`);
if (!turnElement) {
return scrollHistoryIndexIntoView(index, behavior);
if (turnElement) {
turnElement.scrollIntoView({ behavior, block: 'start' });
return true;
}
turnElement.scrollIntoView({ behavior, block: 'start' });
return true;
const targetIsTail = trailingStreamingEntry !== undefined && index >= historyEntries.length;
if (targetIsTail) {
return false;
}
return scrollHistoryIndexIntoView(index, behavior);
},
scrollToMessageId: (messageId: string, options?: { behavior?: ScrollBehavior }) => {
@@ -1498,13 +1499,12 @@ const MessageList = React.forwardRef<MessageListHandle, MessageListProps>(({
return false;
}
const targetIsTail = trailingStreamingEntry !== undefined && index >= historyEntries.length;
if (targetIsTail) {
return false;
}
return scrollMessageElementIntoView(messageId, behavior)
|| scrollHistoryIndexIntoView(index, behavior);
|| (
trailingStreamingEntry !== undefined && index >= historyEntries.length
? false
: scrollHistoryIndexIntoView(index, behavior)
);
},
captureViewportAnchor: () => {