From 50557002b7777172ad434dcbe7610a63082146d8 Mon Sep 17 00:00:00 2001 From: Min Idzelis Date: Wed, 15 Apr 2026 21:19:18 -0400 Subject: [PATCH] fix(web): stale adaptive image when original overlays preview (#27621) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AdaptiveImage stacks quality layers (thumbnail → preview → original) as they load. Without compositor layer promotion on the container, the browser could render a stale frame when the original-quality layer was overlaid on top of the preview-quality layer. Add `will-change: transform` as a class on AdaptiveImage's root element so it gets a dedicated compositor layer from first paint. This also subsumes the imperative `style.willChange = 'transform'` that zoomImageAction was applying to the same element (the zoom target from photo-viewer is the AdaptiveImage root), so drop that now-redundant code. Change-Id: Icd866a2bb5a5fce299c36404547fa0546a6a6964 --- web/src/lib/actions/zoom-image.ts | 6 ------ web/src/lib/components/AdaptiveImage.svelte | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/web/src/lib/actions/zoom-image.ts b/web/src/lib/actions/zoom-image.ts index 07c44569cd..cd8b79c9ba 100644 --- a/web/src/lib/actions/zoom-image.ts +++ b/web/src/lib/actions/zoom-image.ts @@ -124,9 +124,6 @@ export const zoomImageAction = (node: HTMLElement, options?: { zoomTarget?: HTML { capture: true, signal }, ); - if (options?.zoomTarget) { - options.zoomTarget.style.willChange = 'transform'; - } node.style.overflow = 'visible'; node.style.touchAction = 'none'; return { @@ -138,9 +135,6 @@ export const zoomImageAction = (node: HTMLElement, options?: { zoomTarget?: HTML }, destroy() { controller.abort(); - if (options?.zoomTarget) { - options.zoomTarget.style.willChange = ''; - } for (const unsubscribe of unsubscribes) { unsubscribe(); } diff --git a/web/src/lib/components/AdaptiveImage.svelte b/web/src/lib/components/AdaptiveImage.svelte index ed574cbe39..c51ef10c11 100644 --- a/web/src/lib/components/AdaptiveImage.svelte +++ b/web/src/lib/components/AdaptiveImage.svelte @@ -148,7 +148,7 @@ }); -
+
{@render backdrop?.()}