From 7d3efb8513589aa093c0adb36004d8b41bc777f5 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 9 May 2026 16:37:19 +0900 Subject: [PATCH 1/2] refac --- src/lib/components/chat/Chat.svelte | 23 +++++++++++++++++++++++ src/lib/components/chat/Messages.svelte | 11 ++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 49e59dd181..751c49bed9 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -1463,6 +1463,29 @@ top: messagesContainerElement.scrollHeight, behavior }); + + // content-visibility: auto causes the initial scrollHeight to be based on + // estimated sizes (contain-intrinsic-size). After we scroll, previously + // off-screen messages become visible and the browser resolves their actual + // heights, which shifts scrollHeight. Re-layouts can cascade across frames + // (new sizes reveal more content, triggering further size resolution), so + // we re-scroll across two animation frames to land at the true bottom. + requestAnimationFrame(() => { + if (messagesContainerElement) { + messagesContainerElement.scrollTo({ + top: messagesContainerElement.scrollHeight, + behavior + }); + requestAnimationFrame(() => { + if (messagesContainerElement) { + messagesContainerElement.scrollTo({ + top: messagesContainerElement.scrollHeight, + behavior + }); + } + }); + } + }); } }; diff --git a/src/lib/components/chat/Messages.svelte b/src/lib/components/chat/Messages.svelte index ea6c89034d..d525e5a8a4 100644 --- a/src/lib/components/chat/Messages.svelte +++ b/src/lib/components/chat/Messages.svelte @@ -140,7 +140,16 @@ const scrollToBottom = () => { const element = document.getElementById('messages-container'); - element.scrollTop = element.scrollHeight; + if (element) { + element.scrollTop = element.scrollHeight; + + // Follow-up scroll to account for content-visibility: auto re-layouts + requestAnimationFrame(() => { + if (element) { + element.scrollTop = element.scrollHeight; + } + }); + } }; export const scrollToTop = async () => { From 0f07af1bb822a584a5b139b162b07dae4c8fd8be Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 9 May 2026 16:41:01 +0900 Subject: [PATCH 2/2] fix: bump to 0.9.4, changelog for scroll fix --- CHANGELOG.md | 6 ++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4781c8e56d..6a76993b2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.9.4] - 2026-05-09 + +### Fixed + +- 📜 **Chat scroll position on load.** Opening a chat conversation now reliably scrolls to the bottom of the message history, fixing a regression caused by `content-visibility: auto` where estimated element sizes prevented the initial scroll from reaching the true bottom. + ## [0.9.3] - 2026-05-09 ### Added diff --git a/package-lock.json b/package-lock.json index bd0b78c051..cbca943492 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "open-webui", - "version": "0.9.3", + "version": "0.9.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "open-webui", - "version": "0.9.3", + "version": "0.9.4", "dependencies": { "@azure/msal-browser": "^4.5.0", "@codemirror/lang-javascript": "^6.2.2", diff --git a/package.json b/package.json index cab5be2b05..08b50a26bb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "open-webui", - "version": "0.9.3", + "version": "0.9.4", "private": true, "scripts": { "dev": "npm run pyodide:fetch && vite dev --host",