diff --git a/src/lib/components/chat/Messages/Message.svelte b/src/lib/components/chat/Messages/Message.svelte index 9d1bb0672c..97c8cd69a4 100644 --- a/src/lib/components/chat/Messages/Message.svelte +++ b/src/lib/components/chat/Messages/Message.svelte @@ -49,16 +49,20 @@ export let topPadding = false; export let onInsertToNote: ((content: string) => void) | null = null; - // Safari's content-visibility implementation has paint bugs that leave + // WebKit's content-visibility implementation has paint bugs that leave // on-screen messages blank (#26712), so skip virtualization there - const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); + // iOS WebViews and home screen apps carry no Safari token, hence the vendor check + const isWebKit = + navigator.vendor === 'Apple Computer, Inc.' || + /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
{#if history.messages[messageId]} {#if history.messages[messageId].role === 'user'} @@ -154,7 +158,7 @@ /* Browser-native virtualization: skip rendering of off-screen messages without destroying their component trees. Replaces the JS-based culling that caused catastrophic mount/destroy thrashing. */ - .message-listitem { + .message-virtualized { content-visibility: auto; contain-intrinsic-size: auto 150px; } diff --git a/src/lib/components/layout/Navbar/Menu.svelte b/src/lib/components/layout/Navbar/Menu.svelte index f4f03052d2..d862580ab5 100644 --- a/src/lib/components/layout/Navbar/Menu.svelte +++ b/src/lib/components/layout/Navbar/Menu.svelte @@ -105,7 +105,7 @@ document.body.appendChild(clonedElement); // Override content-visibility so html2canvas can capture all messages - clonedElement.querySelectorAll('.message-listitem').forEach((el) => { + clonedElement.querySelectorAll('.message-virtualized').forEach((el) => { el.style.contentVisibility = 'visible'; }); diff --git a/src/lib/components/layout/Sidebar/ChatMenu.svelte b/src/lib/components/layout/Sidebar/ChatMenu.svelte index c591f46e07..17e8cc4403 100644 --- a/src/lib/components/layout/Sidebar/ChatMenu.svelte +++ b/src/lib/components/layout/Sidebar/ChatMenu.svelte @@ -120,7 +120,7 @@ document.body.appendChild(clonedElement); // Override content-visibility so html2canvas can capture all messages - clonedElement.querySelectorAll('.message-listitem').forEach((el) => { + clonedElement.querySelectorAll('.message-virtualized').forEach((el) => { el.style.contentVisibility = 'visible'; });