Skip to content

Commit 7d3efb8

Browse files
committed
refac
1 parent 413dcae commit 7d3efb8

2 files changed

Lines changed: 33 additions & 1 deletion

File tree

src/lib/components/chat/Chat.svelte

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1463,6 +1463,29 @@
14631463
top: messagesContainerElement.scrollHeight,
14641464
behavior
14651465
});
1466+
1467+
// content-visibility: auto causes the initial scrollHeight to be based on
1468+
// estimated sizes (contain-intrinsic-size). After we scroll, previously
1469+
// off-screen messages become visible and the browser resolves their actual
1470+
// heights, which shifts scrollHeight. Re-layouts can cascade across frames
1471+
// (new sizes reveal more content, triggering further size resolution), so
1472+
// we re-scroll across two animation frames to land at the true bottom.
1473+
requestAnimationFrame(() => {
1474+
if (messagesContainerElement) {
1475+
messagesContainerElement.scrollTo({
1476+
top: messagesContainerElement.scrollHeight,
1477+
behavior
1478+
});
1479+
requestAnimationFrame(() => {
1480+
if (messagesContainerElement) {
1481+
messagesContainerElement.scrollTo({
1482+
top: messagesContainerElement.scrollHeight,
1483+
behavior
1484+
});
1485+
}
1486+
});
1487+
}
1488+
});
14661489
}
14671490
};
14681491

src/lib/components/chat/Messages.svelte

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,16 @@
140140
141141
const scrollToBottom = () => {
142142
const element = document.getElementById('messages-container');
143-
element.scrollTop = element.scrollHeight;
143+
if (element) {
144+
element.scrollTop = element.scrollHeight;
145+
146+
// Follow-up scroll to account for content-visibility: auto re-layouts
147+
requestAnimationFrame(() => {
148+
if (element) {
149+
element.scrollTop = element.scrollHeight;
150+
}
151+
});
152+
}
144153
};
145154
146155
export const scrollToTop = async () => {

0 commit comments

Comments
 (0)